LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICogCiAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgogKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgogKgogKgogKiAKICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogKiAKICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAogKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAogKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgogKiAKICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCiAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAqCiAqCiAqIENvZGUgY2hhbmdlIG5vdGVzOgogKiAKICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSmFuIEvkbGxtYW4JCUFkZGVkCQkxMC1TRVAtMjAwOQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLlRleHQ7CnVzaW5nIFN5c3RlbS5JTzsKdXNpbmcgT2ZmaWNlT3BlblhtbDsKCm5hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCnsKCS8vLyA8c3VtbWFyeT4KCS8vLyBTaW1wbHkgb3BlbnMgYW4gZXhpc3RpbmcgZmlsZSBhbmQgcmVhZHMgc29tZSB2YWx1ZXMgYW5kIHByb3BlcnRpZXMKCS8vLyA8L3N1bW1hcnk+CgljbGFzcyBTYW1wbGUyCgl7CgkJcHVibGljIHN0YXRpYyB2b2lkIFJ1blNhbXBsZTIoc3RyaW5nIEZpbGVQYXRoKQoJCXsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoIlJlYWRpbmcgY29sdW1uIDIgb2YgezB9IiwgRmlsZVBhdGgpOwoJCQlDb25zb2xlLldyaXRlTGluZSgpOwoKCQkJRmlsZUluZm8gZXhpc3RpbmdGaWxlID0gbmV3IEZpbGVJbmZvKEZpbGVQYXRoKTsKCQkJdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShleGlzdGluZ0ZpbGUpKQoJCQl7CgkJCQkvLyBnZXQgdGhlIGZpcnN0IHdvcmtzaGVldCBpbiB0aGUgd29ya2Jvb2sKCQkJCUV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKICAgICAgICAgICAgICAgIGludCBjb2wgPSAyOyAvL1RoZSBpdGVtIGRlc2NyaXB0aW9uCgkJCQkvLyBvdXRwdXQgdGhlIGRhdGEgaW4gY29sdW1uIDIKCQkJCWZvciAoaW50IHJvdyA9IDI7IHJvdyA8IDU7IHJvdysrKQoJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJcdENlbGwoezB9LHsxfSkuVmFsdWU9ezJ9Iiwgcm93LCBjb2wsIHdvcmtzaGVldC5DZWxsc1tyb3csIGNvbF0uVmFsdWUpOwoKCQkJCS8vIG91dHB1dCB0aGUgZm9ybXVsYSBpbiByb3cgNQoJCQkJQ29uc29sZS5Xcml0ZUxpbmUoIlx0Q2VsbCh7MH0sezF9KS5Gb3JtdWxhPXsyfSIsIDMsIDUsIHdvcmtzaGVldC5DZWxsc1szLCA1XS5Gb3JtdWxhKTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiXHRDZWxsKHswfSx7MX0pLkZvcm11bGFSMUMxPXsyfSIsIDMsIDUsIHdvcmtzaGVldC5DZWxsc1szLCA1XS5Gb3JtdWxhUjFDMSk7CgogICAgICAgICAgICAgICAgLy8gb3V0cHV0IHRoZSBmb3JtdWxhIGluIHJvdyA1CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiXHRDZWxsKHswfSx7MX0pLkZvcm11bGE9ezJ9IiwgNSwgMywgd29ya3NoZWV0LkNlbGxzWzUsIDNdLkZvcm11bGEpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlx0Q2VsbCh7MH0sezF9KS5Gb3JtdWxhUjFDMT17Mn0iLCA1LCAzLCB3b3Jrc2hlZXQuQ2VsbHNbNSwgM10uRm9ybXVsYVIxQzEpOwoKICAgICAgICAgICAgfSAvLyB0aGUgdXNpbmcgc3RhdGVtZW50IGF1dG9tYXRpY2FsbHkgY2FsbHMgRGlzcG9zZSgpIHdoaWNoIGNsb3NlcyB0aGUgcGFja2FnZS4KCgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCJTYW1wbGUgMiBjb21wbGV0ZSIpOwoJCQlDb25zb2xlLldyaXRlTGluZSgpOwoJCX0KCX0KfQo=