LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDb3B5cmlnaHQgKGMpIDIwMjEgQ2VudHJhbGVTdXBlbGVjLCBDRUEtTElTVAoqCiogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwoqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wCiogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLwoqCiogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKgoqIENvbnRyaWJ1dG9yczoKKiBFcndhbiBNYWjpIChDZW50cmFsZVN1cGVsZWMpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp1c2Ugc3RkOjpjb2xsZWN0aW9uczo6e0hhc2hNYXAsSGFzaFNldH07CnVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpidHJlZV9tYXA6OkJUcmVlTWFwOwoKdXNlIGNyYXRlOjpjb3JlOjpjb250ZXh0OjpleGVjdXRpb246OkV4ZWN1dGlvbkNvbnRleHQ7CnVzZSBjcmF0ZTo6Y29yZTo6ZXJyb3I6OkhpYm91Q29yZUVycm9yOwp1c2UgY3JhdGU6OmNvcmU6OnN5bnRheDo6YWN0aW9uOjpWYWx1ZU9yTmV3RnJlc2g7CnVzZSBjcmF0ZTo6Y29yZTo6c3ludGF4OjpkYXRhOjp0ZF90eXBlOjpURF9EYXRhVHlwZTsKdXNlIGNyYXRlOjpjb3JlOjpzeW50YXg6OmRhdGE6OnZhcl9yZWY6OlZhcmlhYmxlUmVmZXJlbmNlOwp1c2UgY3JhdGU6OmNvcmU6OnN5bnRheDo6ZGF0YTo6Z2VuZXJpYzo6VERfR2VuZXJpYzsKdXNlIGNyYXRlOjpjb3JlOjpzZW1hbnRpY3M6OnZhcm1hcDo6VmFyTWFwQWJsZTsKdXNlIGNyYXRlOjpjb3JlOjpzeW50YXg6OmRhdGE6OmJ1aWx0aW46Om51bWJlcjo6KjsKCgojW2Rlcml2ZShDbG9uZSwgUGFydGlhbEVxLCBEZWJ1ZyldCnB1YiBlbnVtIFREX0ludGVnZXIgewogICAgVmFsdWUoaTY0KSwKICAgIE1pbnVzKEJveDxURF9JbnRlZ2VyPiksCiAgICBGYWN0b3IoVmVjPChBUklUSF9GQUNUT1JfU0lHTixURF9JbnRlZ2VyKT4pLAogICAgQWRkKFZlYzwoQVJJVEhfQUREX1NJR04sVERfSW50ZWdlcik+KSwKICAgIFJlZmVyZW5jZShWYXJpYWJsZVJlZmVyZW5jZSkKfQoKaW1wbCBURF9JbnRlZ2VyIHsKCiAgICBwdWIgZm4gZ2V0X29jY3VyaW5nX3ZhcmlhYmxlcygmc2VsZikgLT4gSGFzaFNldDx1c2l6ZT4gewogICAgICAgIG1hdGNoIHNlbGYgewogICAgICAgICAgICBURF9JbnRlZ2VyOjpWYWx1ZShfKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gSGFzaFNldDo6bmV3KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFREX0ludGVnZXI6Ok1pbnVzKHN1Yl9pbnQpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAoKnN1Yl9pbnQpLmdldF9vY2N1cmluZ192YXJpYWJsZXMoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVERfSW50ZWdlcjo6RmFjdG9yKHN1Yl9pbnRzKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbXV0IG9jY3MgOiBIYXNoU2V0PHVzaXplPiA9IEhhc2hTZXQ6Om5ldygpOwogICAgICAgICAgICAgICAgZm9yIChfLHN1Yl9pbnQpIGluIHN1Yl9pbnRzIHsKICAgICAgICAgICAgICAgICAgICBvY2NzLmV4dGVuZChzdWJfaW50LmdldF9vY2N1cmluZ192YXJpYWJsZXMoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb2NjczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVERfSW50ZWdlcjo6QWRkKHN1Yl9pbnRzKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbXV0IG9jY3MgOiBIYXNoU2V0PHVzaXplPiA9IEhhc2hTZXQ6Om5ldygpOwogICAgICAgICAgICAgICAgZm9yIChfLHN1Yl9pbnQpIGluIHN1Yl9pbnRzIHsKICAgICAgICAgICAgICAgICAgICBvY2NzLmV4dGVuZChzdWJfaW50LmdldF9vY2N1cmluZ192YXJpYWJsZXMoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb2NjczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVERfSW50ZWdlcjo6UmVmZXJlbmNlKHZhcl9yZWYpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB2YXJfcmVmLmdldF9vY2N1cmluZ192YXJpYWJsZXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW1wbCBWYXJNYXBBYmxlIGZvciBURF9JbnRlZ2VyIHsKCiAgICBmbiBhcHBseV92YXJpYWJsZV9tYXBwaW5nKCZzZWxmLCBtYXBwaW5nIDogJkhhc2hNYXA8dXNpemUsdXNpemU+KSAtPiBURF9JbnRlZ2VyIHsKICAgICAgICBtYXRjaCBzZWxmIHsKICAgICAgICAgICAgVERfSW50ZWdlcjo6VmFsdWUoIHZhbCApID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBURF9JbnRlZ2VyOjpWYWx1ZSggKnZhbCApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBURF9JbnRlZ2VyOjpNaW51cyggYm94ZWRfaW52ICkgPT4gewogICAgICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGJveGVkX2ludi5hcHBseV92YXJpYWJsZV9tYXBwaW5nKG1hcHBpbmcpOwogICAgICAgICAgICAgICAgcmV0dXJuIFREX0ludGVnZXI6Ok1pbnVzKCBCb3g6Om5ldyhtYXBwZWQpICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFREX0ludGVnZXI6OkZhY3RvciggZmFjdG9ycyApID0+IHsKICAgICAgICAgICAgICAgIGxldCBtdXQgbWFwcGVkX2ZhY3RvcnMgOiBWZWM8KEFSSVRIX0ZBQ1RPUl9TSUdOLFREX0ludGVnZXIpPiA9IFZlYzo6bmV3KCk7CiAgICAgICAgICAgICAgICBmb3IgKHNpZ24sbnVtYmVyKSBpbiBmYWN0b3JzIHsKICAgICAgICAgICAgICAgICAgICBtYXBwZWRfZmFjdG9ycy5wdXNoKCAoc2lnbi5jbG9uZSgpLCBudW1iZXIuYXBwbHlfdmFyaWFibGVfbWFwcGluZyhtYXBwaW5nKSkgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBURF9JbnRlZ2VyOjpGYWN0b3IoIG1hcHBlZF9mYWN0b3JzICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBURF9JbnRlZ2VyOjpBZGQoIGFkZHMgKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbXV0IG1hcHBlZF9hZGRzIDogVmVjPChBUklUSF9BRERfU0lHTixURF9JbnRlZ2VyKT4gPSBWZWM6Om5ldygpOwogICAgICAgICAgICAgICAgZm9yIChzaWduLG51bWJlcikgaW4gYWRkcyB7CiAgICAgICAgICAgICAgICAgICAgbWFwcGVkX2FkZHMucHVzaCggKHNpZ24uY2xvbmUoKSwgbnVtYmVyLmFwcGx5X3ZhcmlhYmxlX21hcHBpbmcobWFwcGluZykpICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gVERfSW50ZWdlcjo6QWRkKCBtYXBwZWRfYWRkcyApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBURF9JbnRlZ2VyOjpSZWZlcmVuY2UoIHZhcl9yZWYgKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gVERfSW50ZWdlcjo6UmVmZXJlbmNlKCB2YXJfcmVmLmFwcGx5X3ZhcmlhYmxlX21hcHBpbmcobWFwcGluZykgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoK