LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDb3B5cmlnaHQgKGMpIDIwMjEgQ2VudHJhbGVTdXBlbGVjLCBDRUEtTElTVAoqCiogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwoqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wCiogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLwoqCiogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKgoqIENvbnRyaWJ1dG9yczoKKiBFcndhbiBNYWjpIChDZW50cmFsZVN1cGVsZWMpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKdXNlIGNyYXRlOjpjb3JlOjpjb250ZXh0OjpnZW5lcmFsOjpHZW5lcmFsQ29udGV4dDsKdXNlIGNyYXRlOjpjb3JlOjpjb250ZXh0OjpleGVjdXRpb246OkV4ZWN1dGlvbkNvbnRleHQ7CnVzZSBjcmF0ZTo6Y29yZTo6c3ludGF4OjppbnRlcmFjdGlvbjo6KjsKdXNlIGNyYXRlOjpjb3JlOjpzeW50YXg6OmFjdGlvbjo6KjsKdXNlIGNyYXRlOjpjb3JlOjpzeW50YXg6OmRhdGE6OmdlbmVyaWM6OlREX0dlbmVyaWM7CnVzZSBjcmF0ZTo6Y29yZTo6c3ludGF4OjpkYXRhOjp0ZF90eXBlOjpURF9EYXRhVHlwZTsKCnVzZSBjcmF0ZTo6dG9vbHM6OmZvbGRfdmVjX3RvX3N0cmluZzsKCnVzZSBjcmF0ZTo6eGxpYTo6eGxpYV9idWlsZF9uYW1lX3Rvb2xzOjoqOwp1c2UgY3JhdGU6OnhsaWE6OmRhdGE6Ont0ZF9nZW5lcmljX3RvX3hsaWEsdGRfYm9vbF90b194bGlhfTsKdXNlIGNyYXRlOjp4bGlhOjptb2RlbF9pbml0aWFsaXphdGlvbjo6bWFrZV9saWZlbGluZV9pbml0aWFsaXphdGlvbl9hY3Rpb247CnVzZSBjcmF0ZTo6cHJvY2Vzczo6aGlib3VfcHJvY2Vzczo6SGlib3VQcm9jZXNzVGVtcG9yYWxpdHk7CgpwdWIgZm4gZ2VuZXJhdGVfeGxpYV9tb2RlbChnZW5fY3R4IDogJkdlbmVyYWxDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBleGVfY3R4IDogJkV4ZWN1dGlvbkNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uIDogJkludGVyYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbGl0eSA6ICZIaWJvdVByb2Nlc3NUZW1wb3JhbGl0eSkgLT4gU3RyaW5nIHsKICAgIGxldCBtdXQgeGxpYV9tb2RlbCA6IFN0cmluZyA9IHIjIkB4bGlhPCBzeXN0ZW0gLCAxLjAgPjoiIy50b19zdHJpbmcoKTsKICAgIHhsaWFfbW9kZWwucHVzaF9zdHIoIlxuIik7CiAgICBtYXRjaCB0ZW1wb3JhbGl0eSB7CiAgICAgICAgSGlib3VQcm9jZXNzVGVtcG9yYWxpdHk6OlRpbWVkID0+IHsKICAgICAgICAgICAgeGxpYV9tb2RlbC5wdXNoX3N0cigidGltZWQgc3lzdGVtIDxvcj4gSElCT1Uge1xuIik7CiAgICAgICAgfSwKICAgICAgICBIaWJvdVByb2Nlc3NUZW1wb3JhbGl0eTo6VW5UaW1lZCA9PiB7CiAgICAgICAgICAgIHhsaWFfbW9kZWwucHVzaF9zdHIoInN5c3RlbSA8b3I+IEhJQk9VIHtcbiIpOwogICAgICAgIH0KICAgIH0KCiAgICAvL3hsaWFfbW9kZWwucHVzaF9zdHIoIkBwdWJsaWM6XG4iKTsKCgogICAgbGV0IG11dCB2YXJpYWJsZV9kZWNsYXJhdGlvbiA6IFN0cmluZyA9ICJcdEBwcm9wZXJ0eTpcbiIudG9fc3RyaW5nKCk7CgogICAgLy8gKioqCiAgICBtYXRjaCB0ZW1wb3JhbGl0eSB7CiAgICAgICAgSGlib3VQcm9jZXNzVGVtcG9yYWxpdHk6OlRpbWVkID0+IHsKICAgICAgICAgICAgdmFyaWFibGVfZGVjbGFyYXRpb24ucHVzaF9zdHIoIlx0dmFyIGNsb2NrIGxhc3RfbGZfY29tcGFyZV9jbG9jaztcbiIpOwogICAgICAgICAgICB2YXJpYWJsZV9kZWNsYXJhdGlvbi5wdXNoX3N0cigiXHR2YXIgZmxvYXQgdHJhY2VfZGVsYXk7XG4iKTsKICAgICAgICB9LAogICAgICAgIEhpYm91UHJvY2Vzc1RlbXBvcmFsaXR5OjpVblRpbWVkID0+IHsKICAgICAgICAgICAgLy8gbm90aGluZwogICAgICAgIH0KICAgIH0KCiAgICAvLyAqKioKICAgIGxldCBtdXQgdHJhY2VfY29tcGFyZV9hY3Rpb25zIDogVmVjPFN0cmluZz4gPSBWZWM6Om5ldygpOwogICAgbGV0IG11dCBtc19pZCA6IHVzaXplID0gMDsKICAgIGZvciAobXNfbmFtZSxtc19hcmdzKSBpbiBnZW5fY3R4LmdldF9tc19zcGVjcygpIHsKICAgICAgICAvL2xldCBtdXQgc2lnbmFsX3N0cmluZyA6IFN0cmluZyA9IGZvcm1hdCEoIlx0c2lnbmFsIHt9Iixtc19uYW1lKTsKICAgICAgICBsZXQgbXV0IGNvbXBhcmVfYWN0aW9uX3N0cmluZyA9IGZvcm1hdCEoIlx0bWFjaGluZSBhY3Rpb25fY29tcGFyZV9tc197fSB7e1xuIiwgbXNfbmFtZSk7CiAgICAgICAgY29tcGFyZV9hY3Rpb25fc3RyaW5nLnB1c2hfc3RyKCJcdEBtb2U6XG4iKTsKICAgICAgICBjb21wYXJlX2FjdGlvbl9zdHJpbmcucHVzaF9zdHIoIlx0XHRAcnVue1xuIik7CiAgICAgICAgbWF0Y2ggdGVtcG9yYWxpdHkgewogICAgICAgICAgICBIaWJvdVByb2Nlc3NUZW1wb3JhbGl0eTo6VGltZWQgPT4gewogICAgICAgICAgICAgICAgY29tcGFyZV9hY3Rpb25fc3RyaW5nLnB1c2hfc3RyKCJcdFx0XHQvLyB0aW1lIGRvZXMgbm90IGZsb3cgaW4gdGhpcyBhY3Rpb25cbiIpOwogICAgICAgICAgICAgICAgY29tcGFyZV9hY3Rpb25fc3RyaW5nLnB1c2hfc3RyKCAiXHRcdFx0Z3VhcmQoJGRlbGF5ID09IDAuMCk7XG4iICk7CiAgICAgICAgICAgICAgICBjb21wYXJlX2FjdGlvbl9zdHJpbmcucHVzaF9zdHIoIlx0XHRcdC8vIHRvIGNvbXBhcmUgdGltZWQgdHJhY2UgZGVsYXlcbiIpOwogICAgICAgICAgICAgICAgY29tcGFyZV9hY3Rpb25fc3RyaW5nLnB1c2hfc3RyKCAiXHRcdFx0Z3VhcmQoIGxhc3RfbGZfY29tcGFyZV9jbG9jayA9PSB0cmFjZV9kZWxheSApO1xuIiApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBIaWJvdVByb2Nlc3NUZW1wb3JhbGl0eTo6VW5UaW1lZCA9PiB7CiAgICAgICAgICAgICAgICAvLyBub3RoaW5nCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29tcGFyZV9hY3Rpb25fc3RyaW5nLnB1c2hfc3RyKCJcdFx0XHQvLyB2YWx1ZXMgb2YgbXNfTV9wcl9QIGtlcHQgZnJvbSBsYXN0IHN5bWJvbGljIHN0ZXBcbiIpOwogICAgICAgIGNvbXBhcmVfYWN0aW9uX3N0cmluZy5wdXNoX3N0cigiXHRcdFx0Ly8gdmFsdWVzIG9mIHRyYWNlX21zX01fcHJfUCBwcm92aWRlZCBieSBISUJPVVxuIik7CiAgICAgICAgbGV0IG11dCBhcmdfY291bnQgPSAwOwogICAgICAgIGlmIG1zX2FyZ3MubGVuKCkgPiAwIHsKICAgICAgICAgICAgZm9yICggYXJnX3R5cGUsIF8pIGluIG1zX2FyZ3MgewogICAgICAgICAgICAgICAgLy8gKioqCiAgICAgICAgICAgICAgICBsZXQgeGxpYV9hcmdfdHlwZSA9IGFyZ190eXBlLmFzX3hsaWFfc3RyKCk7CiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyX2RpdmVyc2l0eV9uYW1lID0gbWVzc2FnZV9wYXJhbWV0ZXJfZGl2ZXJzaXR5X25hbWUoZ2VuX2N0eCxtc19pZCxhcmdfY291bnQpOwogICAgICAgICAgICAgICAgdmFyaWFibGVfZGVjbGFyYXRpb24ucHVzaF9zdHIoJmZvcm1hdCEoIlx0dmFyIHt9IHt9O1xuIix4bGlhX2FyZ190eXBlLHBhcmFtZXRlcl9kaXZlcnNpdHlfbmFtZSkpOwogICAgICAgICAgICAgICAgbGV0IHRyYWNlX3BhcmFtZXRlcl9kaXZlcnNpdHlfbmFtZSA9IHRyYWNlX21lc3NhZ2VfcGFyYW1ldGVyX2RpdmVyc2l0eV9uYW1lKGdlbl9jdHgsbXNfaWQsYXJnX2NvdW50KTsKICAgICAgICAgICAgICAgIHZhcmlhYmxlX2RlY2xhcmF0aW9uLnB1c2hfc3RyKCZmb3JtYXQhKCJcdHZhciB7fSB7fTtcbiIseGxpYV9hcmdfdHlwZSx0cmFjZV9wYXJhbWV0ZXJfZGl2ZXJzaXR5X25hbWUpKTsKICAgICAgICAgICAgICAgIC8vICoqKgogICAgICAgICAgICAgICAgY29tcGFyZV9hY3Rpb25fc3RyaW5nLnB1c2hfc3RyKCAmZm9ybWF0ISgiXHRcdFx0Z3VhcmQoe30gPT0ge30pO1xuIiwgcGFyYW1ldGVyX2RpdmVyc2l0eV9uYW1lLCB0cmFjZV9wYXJhbWV0ZXJfZGl2ZXJzaXR5X25hbWUpICApOwogICAgICAgICAgICAgICAgLy8gKioqCiAgICAgICAgICAgICAgICAvKnNpZ25hbF9zdHJpbmcucHVzaF9zdHIoJmFyZ190eXBlLmFzX3hsaWFfc3RyKCkpOwogICAgICAgICAgICAgICAgaWYgYXJnX2NvdW50IDwgbXNfYXJncy5sZW4oKSB7CiAgICAgICAgICAgICAgICAgICAgc2lnbmFsX3N0cmluZy5wdXNoX3N0cigiLCIpOwogICAgICAgICAgICAgICAgfSovCiAgICAgICAgICAgICAgICBhcmdfY291bnQgPSBhcmdfY291bnQgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vc2lnbmFsX3N0cmluZy5wdXNoX3N0cigiKSIpOwogICAgICAgIH0KICAgICAgICAvLyAqKioKICAgICAgICBtYXRjaCB0ZW1wb3JhbGl0eSB7CiAgICAgICAgICAgIEhpYm91UHJvY2Vzc1RlbXBvcmFsaXR5OjpUaW1lZCA9PiB7CiAgICAgICAgICAgICAgICBjb21wYXJlX2FjdGlvbl9zdHJpbmcucHVzaF9zdHIoIlx0XHRcdC8vIHdlIG5vdyByZXNldCB0aGUgbGFzdF9sZl9jb21wYXJlX2Nsb2NrIGJlY2F1c2Ugd2UgYXJlIGluIHRoZSBtb21lbnQgb2YgdGhlIGxhdGVzdCB2aXNpYmxlIGFjdGlvbiBvbiB0aGF0IGxpZmVsaW5lIFxuIik7CiAgICAgICAgICAgICAgICBjb21wYXJlX2FjdGlvbl9zdHJpbmcucHVzaF9zdHIoIlx0XHRcdGxhc3RfbGZfY29tcGFyZV9jbG9jayA6PSAwLjA7XG4iKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSGlib3VQcm9jZXNzVGVtcG9yYWxpdHk6OlVuVGltZWQgPT4gewogICAgICAgICAgICAgICAgLy8gbm90aGluZwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vICoqKgogICAgICAgIGNvbXBhcmVfYWN0aW9uX3N0cmluZy5wdXNoX3N0cigiXHRcdH1cbiIpOwogICAgICAgIGNvbXBhcmVfYWN0aW9uX3N0cmluZy5wdXNoX3N0cigiXHR9XG4iKTsKICAgICAgICB0cmFjZV9jb21wYXJlX2FjdGlvbnMucHVzaChjb21wYXJlX2FjdGlvbl9zdHJpbmcpOwogICAgICAgIC8vc2lnbmFsX3N0cmluZy5wdXNoX3N0cigiO1xuIik7CiAgICAgICAgLy94bGlhX21vZGVsLnB1c2hfc3RyKCZzaWduYWxfc3RyaW5nKTsKICAgICAgICBtc19pZCA9IG1zX2lkICsxOwogICAgfQoKICAgIGxldCBtdXQgb3Blbl9zY29wZV9hY3Rpb25fc3RyaW5nICA9ICJcdG1hY2hpbmUgPHN0YXJ0PiBhY3Rpb25fb3Blbl9zY29wZXMge1xuIi50b19zdHJpbmcoKTsKICAgIG9wZW5fc2NvcGVfYWN0aW9uX3N0cmluZy5wdXNoX3N0cigiXHRAbW9lOlxuIik7CiAgICBvcGVuX3Njb3BlX2FjdGlvbl9zdHJpbmcucHVzaF9zdHIoIlx0XHRAcnVue1xuIik7CiAgICBvcGVuX3Njb3BlX2FjdGlvbl9zdHJpbmcucHVzaF9zdHIoIlx0XHRcdC8vIGNyZWF0ZXMgYSBuZXcgcGxhY2UgaW4gZWFjaCBtZXRhLXZhcmlhYmxlIHZlY3RvciBhbGxvd2luZyBkZXNpZ25hdGlvbiBvZiBzY29wZWQgdmFyaWFibGVzXG4iKTsKICAgIG9wZW5fc2NvcGVfYWN0aW9uX3N0cmluZy5wdXNoX3N0cigiXHRcdFx0Ly8gY2FsbGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBzbyB0aGF0IGV2ZXJ5IHZhcmlhYmxlIHZlY3RvciBpbiB0aGUgRElWRVJTSVRZIG1vZGVsIGhhcyBleGFjdGx5IG9uZSBwbGFjZSBmb3IgdGhlIG9yaWdpbmFsIGluc3RhbmNlIG9mIHRoZSBISUJPVSBtZXRhLXZhcmlhYmxlXG4iKTsKICAgIG9wZW5fc2NvcGVfYWN0aW9uX3N0cmluZy5wdXNoX3N0cigiXHRcdFx0Ly8gY2FsbGVkIGxhdGVyIGV2ZXJ5IHRpbWUgYSBzY29wZSBvcGVyYXRvciBpcyBvcGVuZWQgaW4gdGhlIGV4ZWN1dGlvblxuIik7CiAgICBsZXQgdnJfbmFtZXMgPSBnZW5fY3R4LmdldF92cl9uYW1lcygpOwogICAgbGV0IHZyX3R5cGVzID0gZ2VuX2N0eC5nZXRfdnJfdHlwZXMoKTsKICAgIGZvciB2cl9pZCBpbiAwLi52cl9uYW1lcy5sZW4oKSB7CiAgICAgICAgbGV0IHZyX2luZGV4X25hbWUgPSB2YXJpYWJsZV9hcnJheV9pbmRleF9kaXZlcnNpdHlfbmFtZShnZW5fY3R4LHZyX2lkKTsKICAgICAgICBsZXQgdnJfdmVjdG9yX25hbWUgPSB2YXJpYWJsZV92ZWN0b3JfZGl2ZXJzaXR5X25hbWUoZ2VuX2N0eCx2cl9pZCk7CiAgICAgICAgbGV0IHZyX2Jhc2VfZm9yX25ld2ZyZXNoX25hbWUgPSB2YXJpYWJsZV9iYXNlX2Zvcl9uZXdmcmVzaF9kaXZlcnNpdHlfbmFtZShnZW5fY3R4LHZyX2lkKTsKCiAgICAgICAgLy8gKioqCiAgICAgICAgbGV0IHZyX3R5cGVfeGxpYV9zdHIgOiBTdHJpbmc7CiAgICAgICAgaWYgZ2VuX2N0eC5pc19jbG9jayggdnJfaWQgKSB7CiAgICAgICAgICAgIHZyX3R5cGVfeGxpYV9zdHIgPSAiY2xvY2siLnRvX3N0cmluZygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxldCB2cl90eXBlIDogJlREX0RhdGFUeXBlID0gdnJfdHlwZXMuZ2V0KHZyX2lkKS51bndyYXAoKTsKICAgICAgICAgICAgdnJfdHlwZV94bGlhX3N0ciA9IHZyX3R5cGUuYXNfeGxpYV9zdHIoKTsKICAgICAgICB9CiAgICAgICAgLy8gKioqCiAgICAgICAgbGV0IHZyX2Jhc2VfZm9yX25ld2ZyZXNoX3hsaWFfZGVjID0gZm9ybWF0ISgiXHR2YXIge30ge307XG4iLHZyX3R5cGVfeGxpYV9zdHIsdnJfYmFzZV9mb3JfbmV3ZnJlc2hfbmFtZSk7CiAgICAgICAgdmFyaWFibGVfZGVjbGFyYXRpb24ucHVzaF9zdHIoJnZyX2Jhc2VfZm9yX25ld2ZyZXNoX3hsaWFfZGVjKTsKICAgICAgICAvLyAqKioKICAgICAgICBsZXQgdmFyX3ZlY3Rvcl94bGlhX2RlYyA9IGZvcm1hdCEoIlx0dmFyIHZlY3Rvcjx7fT4ge307XG4iLHZyX3R5cGVfeGxpYV9zdHIsdnJfdmVjdG9yX25hbWUpOwogICAgICAgIHZhcmlhYmxlX2RlY2xhcmF0aW9uLnB1c2hfc3RyKCZ2YXJfdmVjdG9yX3hsaWFfZGVjKTsKICAgICAgICAvLyAqKioKICAgICAgICBsZXQgdmFyX2luZGV4X2RlYyAgPSBmb3JtYXQhKCJcdHZhciBpbnQge307XG4iLCB2cl9pbmRleF9uYW1lKTsKICAgICAgICB2YXJpYWJsZV9kZWNsYXJhdGlvbi5wdXNoX3N0cigmdmFyX2luZGV4X2RlYyk7CiAgICAgICAgLy8gKioqCiAgICAgICAgb3Blbl9zY29wZV9hY3Rpb25fc3RyaW5nLnB1c2hfc3RyKCAmZm9ybWF0ISgiXHRcdFx0e30gPD08IG5ld2ZyZXNoKHt9KTtcbiIsIHZyX3ZlY3Rvcl9uYW1lLCB2cl9iYXNlX2Zvcl9uZXdmcmVzaF9uYW1lKSApOwogICAgfQogICAgb3Blbl9zY29wZV9hY3Rpb25fc3RyaW5nLnB1c2hfc3RyKCJcdFx0fVxuIik7CiAgICBvcGVuX3Njb3BlX2FjdGlvbl9zdHJpbmcucHVzaF9zdHIoIlx0fVxuIik7CgogICAgeGxpYV9tb2RlbC5wdXNoX3N0cigiQGNvbXBvc2l0ZToiKTsKICAgIHhsaWFfbW9kZWwucHVzaF9zdHIoIlxuIik7CgogICAgbGV0IG11dCBsaWZlbGluZXNfYWN0aW9ucyA6IEhhc2hNYXA8dXNpemUsVmVjPFN0cmluZz4+ID0gSGFzaE1hcDo6bmV3KCk7CiAgICBnZW5lcmF0ZV94bGlhX2xpZmVsaW5lcyhnZW5fY3R4LCBleGVfY3R4LCBpbnRlcmFjdGlvbiwgJm11dCBsaWZlbGluZXNfYWN0aW9ucywgVmVjOjpuZXcoKSk7CgogICAgZm9yIGxmX2lkIGluIDAuLmdlbl9jdHguZ2V0X2xmX251bSgpIHsKICAgICAgICBsZXQgbGZfbmFtZSA9IGdlbl9jdHguZ2V0X2xmX25hbWUobGZfaWQpLnVud3JhcCgpOwogICAgICAgIGxldCBtdXQgbGlmZWxpbmVfc3RyaW5nIDogU3RyaW5nID0gZm9ybWF0ISgiXHRsaWZlbGluZSBtYWNoaW5lIDxvcj4ge30ge3tcbiIsbGZfbmFtZSk7CiAgICAgICAgLy8gKioqCiAgICAgICAgbGlmZWxpbmVfc3RyaW5nLnB1c2hfc3RyKCJcdEBwdWJsaWM6XG4iKTsKICAgICAgICBsaWZlbGluZV9zdHJpbmcucHVzaF9zdHIoIlx0XHRwb3J0IG91dHB1dCBoZXZlbnQoc3RyaW5nKTtcbiIpOwogICAgICAgIC8vICoqKgogICAgICAgIGxpZmVsaW5lX3N0cmluZy5wdXNoX3N0cigmdmFyaWFibGVfZGVjbGFyYXRpb24pOwogICAgICAgIGxpZmVsaW5lX3N0cmluZy5wdXNoX3N0cigiXHRAY29tcG9zaXRlOlxuIik7CiAgICAgICAgLy8gKioqCiAgICAgICAgbGlmZWxpbmVfc3RyaW5nLnB1c2hfc3RyKCAmb3Blbl9zY29wZV9hY3Rpb25fc3RyaW5nICk7CiAgICAgICAgbGlmZWxpbmVfc3RyaW5nLnB1c2hfc3RyKCAmbWFrZV9saWZlbGluZV9pbml0aWFsaXphdGlvbl9hY3Rpb24oZ2VuX2N0eCxleGVfY3R4LGxmX2lkKSApOwogICAgICAgIC8vICoqKgogICAgICAgIG1hdGNoIGxpZmVsaW5lc19hY3Rpb25zLmdldCgmbGZfaWQpIHsKICAgICAgICAgICAgTm9uZSA9PiB7fSwKICAgICAgICAgICAgU29tZShsZl9hY3Rpb25zKSA9PiB7CiAgICAgICAgICAgICAgICBmb3IgbGZfYWN0IGluIGxmX2FjdGlvbnMgewogICAgICAgICAgICAgICAgICAgIGxpZmVsaW5lX3N0cmluZy5wdXNoX3N0cihsZl9hY3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vICoqKgogICAgICAgIGZvciBsZl90cmFjZV9jb21wYXJlX2FjdCBpbiAmdHJhY2VfY29tcGFyZV9hY3Rpb25zIHsKICAgICAgICAgICAgbGlmZWxpbmVfc3RyaW5nLnB1c2hfc3RyKGxmX3RyYWNlX2NvbXBhcmVfYWN0KTsKICAgICAgICB9CiAgICAgICAgLy8gKioqCiAgICAgICAgbGlmZWxpbmVfc3RyaW5nLnB1c2hfc3RyKCJcdH1cbiIpOwogICAgICAgIC8vICoqKgogICAgICAgIHhsaWFfbW9kZWwucHVzaF9zdHIoJmxpZmVsaW5lX3N0cmluZyk7CiAgICB9CgogICAgeGxpYV9tb2RlbC5wdXNoX3N0cigiQGNvbTpcbiIpOwogICAgeGxpYV9tb2RlbC5wdXNoX3N0cigiXHRjb25uZWN0PGVudj57XG4iKTsKICAgIGZvciBsZl9pZCBpbiAwLi5nZW5fY3R4LmdldF9sZl9udW0oKSB7CiAgICAgICAgbGV0IGxmX25hbWUgPSBnZW5fY3R4LmdldF9sZl9uYW1lKGxmX2lkKS51bndyYXAoKTsKICAgICAgICB4bGlhX21vZGVsLnB1c2hfc3RyKCZmb3JtYXQhKCJcdFx0b3V0cHV0IHt9LT5oZXZlbnQ7XG4iLGxmX25hbWUpICk7CiAgICB9CiAgICB4bGlhX21vZGVsLnB1c2hfc3RyKCJcdH1cbiIpOwogICAgeGxpYV9tb2RlbC5wdXNoX3N0cigifSIpOwoKICAgIHJldHVybiB4bGlhX21vZGVsOwp9CgoKZm4gdXBkYXRlX3hsaWFfbGlmZWxpbmVzX2Zyb21fbGZfYWN0KGdlbl9jdHggOiAmR2VuZXJhbENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlX2N0eCA6ICZFeGVjdXRpb25Db250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxmX2lkIDogdXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYW1ibGUgOiAmVmVjPEFjdGlvbkFtYmxlSXRlbT4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdGFtYmxlIDogJlZlYzxBY3Rpb25BbWJsZUl0ZW0+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zX2lkIDogdXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zIDogJlZlYzxWYWx1ZU9yTmV3RnJlc2g+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2VtaXNzaW9uIDogYm9vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc190YXJnZXQgOiBib29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVsaW5lc19hY3Rpb25zIDogJm11dCBIYXNoTWFwPHVzaXplLFZlYzxTdHJpbmc+PiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZV9wb3NpdGlvbiA6IFZlYzx1MzI+KSB7CgogICAgLy8gKioqCiAgICBsZXQgYWN0aW9uX25hbWUgPSBhY3Rpb25fZGl2ZXJzaXR5X25hbWUoJnJlbGF0aXZlX3Bvc2l0aW9uKTsKICAgIC8vcHJpbnRsbiEoImNyZWF0aW5nIG9uIGxpZmVsaW5lIHt9IGFjdGlvbiBvbiBwb3NpdGlvbiB7fSIsbGZfbmFtZSxhY3Rpb25fbmFtZSk7CiAgICAvLyAqKioKICAgIGxldCBtdXQgeGxpYV9hY3Rpb25fc3RyIDogU3RyaW5nID0gZm9ybWF0ISgiXHRtYWNoaW5lIHt9IHt7XG4iLGFjdGlvbl9uYW1lKTsKICAgIC8vICoqKgogICAgeGxpYV9hY3Rpb25fc3RyLnB1c2hfc3RyKCJcdEBtb2U6XG4iKTsKICAgIHhsaWFfYWN0aW9uX3N0ci5wdXNoX3N0cigiXHRcdEBydW57XG4iKTsKICAgIHhsaWFfYWN0aW9uX3N0ci5wdXNoX3N0cigiXHRcdC8vIHZhbHVlcyBvZiBpbmRleF9WIHByb3ZpZGVkIGJ5IEhJQk9VXG4iKTsKICAgIC8vICoqKgogICAgeGxpYV9hY3Rpb25fc3RyLnB1c2hfc3RyKCJcdFx0XHQvLyBQcmUtQW1ibGVcbiIpOwogICAgZm9yIGFtYmxlX2l0ZW0gaW4gcHJlYW1ibGUgewogICAgICAgIG1hdGNoIGFtYmxlX2l0ZW0gewogICAgICAgICAgICBBY3Rpb25BbWJsZUl0ZW06OkFzc2lnbm1lbnQoIHZyX2lkLCB2YWx1ZV9vcl9uZXdfZnJlc2ggKSA9PiB7CiAgICAgICAgICAgICAgICBtYXRjaCB2YWx1ZV9vcl9uZXdfZnJlc2ggewogICAgICAgICAgICAgICAgICAgIFZhbHVlT3JOZXdGcmVzaDo6TmV3RnJlc2ggPT4gewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdnJfYmFzZV9mb3JfbmV3ZnJlc2hfbmFtZSA9IHZhcmlhYmxlX2Jhc2VfZm9yX25ld2ZyZXNoX2RpdmVyc2l0eV9uYW1lKGdlbl9jdHgsKnZyX2lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZyX2NvbXBsZXRlX25hbWVfd2l0aGluX2FycmF5ID0gdmFyaWFibGVfZGl2ZXJzaXR5X25hbWUoZ2VuX2N0eCwqdnJfaWQpOwogICAgICAgICAgICAgICAgICAgICAgICB4bGlhX2FjdGlvbl9zdHIucHVzaF9zdHIoICZmb3JtYXQhKCJcdFx0XHR7fSA9IG5ld2ZyZXNoKHt9KTtcbiIsIHZyX2NvbXBsZXRlX25hbWVfd2l0aGluX2FycmF5LCB2cl9iYXNlX2Zvcl9uZXdmcmVzaF9uYW1lKSApOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWVPck5ld0ZyZXNoOjpWYWx1ZSggdGRfZ2VuICkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB4bGlhX2FjdGlvbl9zdHIucHVzaF9zdHIoICZmb3JtYXQhKCJcdFx0XHR7fSA9IHt9O1xuIix2YXJpYWJsZV9kaXZlcnNpdHlfbmFtZShnZW5fY3R4LCp2cl9pZCksdGRfZ2VuZXJpY190b194bGlhKGdlbl9jdHgsdGRfZ2VuKSkgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgQWN0aW9uQW1ibGVJdGVtOjpHdWFyZCggdGRfYm9vbCApID0+IHsKICAgICAgICAgICAgICAgIHhsaWFfYWN0aW9uX3N0ci5wdXNoX3N0ciggJmZvcm1hdCEoIlx0XHRcdGd1YXJkKHt9KTtcbiIsdGRfYm9vbF90b194bGlhKGdlbl9jdHgsdGRfYm9vbCkpICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQWN0aW9uQW1ibGVJdGVtOjpSZXNldCggdnJfaWQgKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgdnJfY29tcGxldGVfbmFtZV93aXRoaW5fYXJyYXkgPSB2YXJpYWJsZV9kaXZlcnNpdHlfbmFtZShnZW5fY3R4LCp2cl9pZCk7CiAgICAgICAgICAgICAgICAvL3hsaWFfYWN0aW9uX3N0ci5wdXNoX3N0ciggJmZvcm1hdCEoIlx0XHRcdHJlc2V0KHt9KTtcbiIsIHZyX2NvbXBsZXRlX25hbWVfd2l0aGluX2FycmF5KSAgICk7CiAgICAgICAgICAgICAgICB4bGlhX2FjdGlvbl9zdHIucHVzaF9zdHIoICZmb3JtYXQhKCJcdFx0XHR7fSA6PSAwLjA7XG4iLCB2cl9jb21wbGV0ZV9uYW1lX3dpdGhpbl9hcnJheSkgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBfID0+IHsKICAgICAgICAgICAgICAgIHBhbmljISgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8gKioqCiAgICBpZiBpc19lbWlzc2lvbiB7CiAgICAgICAgeGxpYV9hY3Rpb25fc3RyLnB1c2hfc3RyKCJcdFx0XHQvLyBFbWlzc2lvbiAtIHZhbHVlcyBvZiBtc19NX3ByX1AgY29tcHV0ZWQgYnkgRElWRVJTSVRZIC0gbGF0ZXIgcXVlcmllZCBieSBISUJPVVxuIik7CiAgICAgICAgLy9sZXQgbXV0IHBhcmFtc19kaXZlcnNpdHlfbmFtZXMgOiBWZWM8U3RyaW5nPiA9CiAgICAgICAgZm9yIGlkeCBpbiAwLi5wYXJhbXMubGVuKCkgewogICAgICAgICAgICBsZXQgcGFyYW1ldGVyX2RpdmVyc2l0eV9uYW1lID0gbWVzc2FnZV9wYXJhbWV0ZXJfZGl2ZXJzaXR5X25hbWUoZ2VuX2N0eCxtc19pZCxpZHgpOwogICAgICAgICAgICBsZXQgcGFyYW1fdmFsID0gcGFyYW1zLmdldChpZHgpLnVud3JhcCgpOwogICAgICAgICAgICBtYXRjaCBwYXJhbV92YWwgewogICAgICAgICAgICAgICAgVmFsdWVPck5ld0ZyZXNoOjpOZXdGcmVzaCA9PiB7CiAgICAgICAgICAgICAgICAgICAgeGxpYV9hY3Rpb25fc3RyLnB1c2hfc3RyKCAmZm9ybWF0ISgiXHRcdFx0bmV3ZnJlc2goe30pO1xuIiwgcGFyYW1ldGVyX2RpdmVyc2l0eV9uYW1lKSAgICk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVmFsdWVPck5ld0ZyZXNoOjpWYWx1ZSggdGRfZ2VuICkgPT4gewogICAgICAgICAgICAgICAgICAgIHhsaWFfYWN0aW9uX3N0ci5wdXNoX3N0ciggJmZvcm1hdCEoIlx0XHRcdHt9ID0ge307XG4iLHBhcmFtZXRlcl9kaXZlcnNpdHlfbmFtZSx0ZF9nZW5lcmljX3RvX3hsaWEoZ2VuX2N0eCx0ZF9nZW4pKSAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IGhldmVudF9zdHIgPSBmb3JtYXQhKCJcIiF7fVwiIiwgZ2VuX2N0eC5nZXRfbXNfbmFtZShtc19pZCkudW53cmFwKCkpOwogICAgICAgIHhsaWFfYWN0aW9uX3N0ci5wdXNoX3N0ciggJmZvcm1hdCEoIlx0XHRcdG91dHB1dCBoZXZlbnQgKHt9KTtcbiIsIGhldmVudF9zdHIgKSAgICk7CiAgICB9IGVsc2UgewogICAgICAgIHhsaWFfYWN0aW9uX3N0ci5wdXNoX3N0cigiXHRcdFx0Ly8gUmVjZXB0aW9uIC0gdmFsdWVzIG9mIG1zX01fcHJfUCBwcm92aWRlZCBieSBISUJPVSAtXG4iKTsKICAgICAgICBmb3IgaWR4IGluIDAuLnBhcmFtcy5sZW4oKSB7CiAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJfZGl2ZXJzaXR5X25hbWUgPSBtZXNzYWdlX3BhcmFtZXRlcl9kaXZlcnNpdHlfbmFtZShnZW5fY3R4LG1zX2lkLGlkeCk7CiAgICAgICAgICAgIGxldCBwYXJhbV92YWwgPSBwYXJhbXMuZ2V0KGlkeCkudW53cmFwKCk7CiAgICAgICAgICAgIG1hdGNoIHBhcmFtX3ZhbCB7CiAgICAgICAgICAgICAgICBWYWx1ZU9yTmV3RnJlc2g6Ok5ld0ZyZXNoID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiBpc190YXJnZXQgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgeGxpYV9hY3Rpb25fc3RyLnB1c2hfc3RyKCJcdFx0XHQvLyBuZXdmcmVzaCBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbiBhIHJlY2VwdGlvbiB0aGF0IGlzbid0IGEgdGFyZ2V0IG9mIGFuIGVtaXNzaW9uIG1vZGVsbGVkIGluIHRoZSBEU1xuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHhsaWFfYWN0aW9uX3N0ci5wdXNoX3N0ciggJmZvcm1hdCEoIlx0XHRcdG5ld2ZyZXNoKHt9KTtcbiIsIHBhcmFtZXRlcl9kaXZlcnNpdHlfbmFtZSkgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBWYWx1ZU9yTmV3RnJlc2g6OlZhbHVlKCB0ZF9nZW4gKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBoZXZlbnRfc3RyID0gZm9ybWF0ISgiXCI/e31cIiIsIGdlbl9jdHguZ2V0X21zX25hbWUobXNfaWQpLnVud3JhcCgpKTsKICAgICAgICB4bGlhX2FjdGlvbl9zdHIucHVzaF9zdHIoICZmb3JtYXQhKCJcdFx0XHRvdXRwdXQgaGV2ZW50ICh7fSk7XG4iLCBoZXZlbnRfc3RyICkgICApOwogICAgfQogICAgLy8gKioqCiAgICB4bGlhX2FjdGlvbl9zdHIucHVzaF9zdHIoIlx0XHRcdC8vIFBvc3QtQW1ibGVcbiIpOwogICAgZm9yIGFtYmxlX2l0ZW0gaW4gcG9zdGFtYmxlIHsKICAgICAgICBtYXRjaCBhbWJsZV9pdGVtIHsKICAgICAgICAgICAgQWN0aW9uQW1ibGVJdGVtOjpBc3NpZ25tZW50KCB2cl9pZCwgdmFsdWVfb3JfbmV3X2ZyZXNoICkgPT4gewogICAgICAgICAgICAgICAgbWF0Y2ggdmFsdWVfb3JfbmV3X2ZyZXNoIHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZU9yTmV3RnJlc2g6Ok5ld0ZyZXNoID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZyX2Jhc2VfZm9yX25ld2ZyZXNoX25hbWUgPSB2YXJpYWJsZV9iYXNlX2Zvcl9uZXdmcmVzaF9kaXZlcnNpdHlfbmFtZShnZW5fY3R4LCp2cl9pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2cl9jb21wbGV0ZV9uYW1lX3dpdGhpbl9hcnJheSA9IHZhcmlhYmxlX2RpdmVyc2l0eV9uYW1lKGdlbl9jdHgsKnZyX2lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGxpYV9hY3Rpb25fc3RyLnB1c2hfc3RyKCAmZm9ybWF0ISgiXHRcdFx0e30gPSBuZXdmcmVzaCh7fSk7XG4iLCB2cl9jb21wbGV0ZV9uYW1lX3dpdGhpbl9hcnJheSwgdnJfYmFzZV9mb3JfbmV3ZnJlc2hfbmFtZSkgKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlT3JOZXdGcmVzaDo6VmFsdWUoIHRkX2dlbiApID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgeGxpYV9hY3Rpb25fc3RyLnB1c2hfc3RyKCAmZm9ybWF0ISgiXHRcdFx0e30gPSB7fTtcbiIsdmFyaWFibGVfZGl2ZXJzaXR5X25hbWUoZ2VuX2N0eCwqdnJfaWQpLHRkX2dlbmVyaWNfdG9feGxpYShnZW5fY3R4LHRkX2dlbikpICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFjdGlvbkFtYmxlSXRlbTo6R3VhcmQoIHRkX2Jvb2wgKSA9PiB7CiAgICAgICAgICAgICAgICB4bGlhX2FjdGlvbl9zdHIucHVzaF9zdHIoICZmb3JtYXQhKCJcdFx0XHRndWFyZCh7fSk7XG4iLHRkX2Jvb2xfdG9feGxpYShnZW5fY3R4LHRkX2Jvb2wpKSAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFjdGlvbkFtYmxlSXRlbTo6UmVzZXQoIHZyX2lkICkgPT4gewogICAgICAgICAgICAgICAgbGV0IHZyX2NvbXBsZXRlX25hbWVfd2l0aGluX2FycmF5ID0gdmFyaWFibGVfZGl2ZXJzaXR5X25hbWUoZ2VuX2N0eCwqdnJfaWQpOwogICAgICAgICAgICAgICAgeGxpYV9hY3Rpb25fc3RyLnB1c2hfc3RyKCAmZm9ybWF0ISgiXHRcdFx0cmVzZXQoe30pO1xuIiwgdnJfY29tcGxldGVfbmFtZV93aXRoaW5fYXJyYXkpICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgXyA9PiB7CiAgICAgICAgICAgICAgICBwYW5pYyEoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vICoqKgogICAgeGxpYV9hY3Rpb25fc3RyLnB1c2hfc3RyKCJcdFx0fVxuIik7CiAgICB4bGlhX2FjdGlvbl9zdHIucHVzaF9zdHIoIlx0fVxuIik7CiAgICAvLyAqKioKICAgIG1hdGNoIGxpZmVsaW5lc19hY3Rpb25zLmdldCgmbGZfaWQpIHsKICAgICAgICBOb25lID0+IHsKICAgICAgICAgICAgbGlmZWxpbmVzX2FjdGlvbnMuaW5zZXJ0KGxmX2lkLHZlYyFbeGxpYV9hY3Rpb25fc3RyXSApOwogICAgICAgIH0sCiAgICAgICAgU29tZSggYWN0aW9uX3N0cmluZ3NfdmVjICkgPT4gewogICAgICAgICAgICBsZXQgbXV0IGFjdF9zdHJfdmVjID0gYWN0aW9uX3N0cmluZ3NfdmVjLmNsb25lKCk7CiAgICAgICAgICAgIGFjdF9zdHJfdmVjLnB1c2goIHhsaWFfYWN0aW9uX3N0ciApOwogICAgICAgICAgICBsaWZlbGluZXNfYWN0aW9ucy5pbnNlcnQobGZfaWQsIGFjdF9zdHJfdmVjICk7CiAgICAgICAgfQogICAgfQp9CgpmbiBnZW5lcmF0ZV94bGlhX2xpZmVsaW5lcyhnZW5fY3R4IDogJkdlbmVyYWxDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlX2N0eCA6ICZFeGVjdXRpb25Db250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24gOiAmSW50ZXJhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlbGluZXNfYWN0aW9ucyA6ICZtdXQgSGFzaE1hcDx1c2l6ZSxWZWM8U3RyaW5nPj4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZV9wb3NpdGlvbiA6IFZlYzx1MzI+KSB7CiAgICBtYXRjaCBpbnRlcmFjdGlvbiB7CiAgICAgICAgSW50ZXJhY3Rpb246OkVtcHR5ID0+IHt9LAogICAgICAgIEludGVyYWN0aW9uOjpBY3Rpb24oIG9ic19hY3QgKSA9PiB7CiAgICAgICAgICAgIG1hdGNoICZvYnNfYWN0LmFjdF9raW5kIHsKICAgICAgICAgICAgICAgIE9ic2VydmFibGVBY3Rpb25LaW5kOjpFbWlzc2lvbiggdGFyZ2V0cyApID0+IHsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVfeGxpYV9saWZlbGluZXNfZnJvbV9sZl9hY3QoZ2VuX2N0eCxleGVfY3R4LG9ic19hY3QubGZfYWN0LmxmX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JzX2FjdC5sZl9hY3QucHJlYW1ibGUsJm9ic19hY3QubGZfYWN0LnBvc3RhbWJsZSxvYnNfYWN0Lm1zX2lkLCZvYnNfYWN0LnBhcmFtcyx0cnVlLGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlbGluZXNfYWN0aW9ucyxyZWxhdGl2ZV9wb3NpdGlvbi5jbG9uZSgpKTsKICAgICAgICAgICAgICAgICAgICAvLyAqKioKICAgICAgICAgICAgICAgICAgICBsZXQgbXV0IHRhcmdldF9jb3VudGVyIDogdTMyID0gMTsKICAgICAgICAgICAgICAgICAgICBmb3IgdGFyZ2V0IGluIHRhcmdldHMgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXV0IHJlbF9wb3MgPSByZWxhdGl2ZV9wb3NpdGlvbi5jbG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZWxfcG9zLnB1c2godGFyZ2V0X2NvdW50ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2NvdW50ZXIgPSB0YXJnZXRfY291bnRlciArMTsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3hsaWFfbGlmZWxpbmVzX2Zyb21fbGZfYWN0KGdlbl9jdHgsZXhlX2N0eCx0YXJnZXQubGZfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LnByZWFtYmxlLCZ0YXJnZXQucG9zdGFtYmxlLG9ic19hY3QubXNfaWQsJm9ic19hY3QucGFyYW1zLGZhbHNlLHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlbGluZXNfYWN0aW9ucyxyZWxfcG9zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT2JzZXJ2YWJsZUFjdGlvbktpbmQ6OlJlY2VwdGlvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3hsaWFfbGlmZWxpbmVzX2Zyb21fbGZfYWN0KGdlbl9jdHgsZXhlX2N0eCxvYnNfYWN0LmxmX2FjdC5sZl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9ic19hY3QubGZfYWN0LnByZWFtYmxlLCZvYnNfYWN0LmxmX2FjdC5wb3N0YW1ibGUsb2JzX2FjdC5tc19pZCwmb2JzX2FjdC5wYXJhbXMsZmFsc2UsZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVsaW5lc19hY3Rpb25zLHJlbGF0aXZlX3Bvc2l0aW9uLmNsb25lKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbnRlcmFjdGlvbjo6U2NvcGUoXyxzdWJfaW50ZXJhY3Rpb24pID0+IHsKICAgICAgICAgICAgbGV0IG11dCByZWxfcG9zID0gcmVsYXRpdmVfcG9zaXRpb24uY2xvbmUoKTsKICAgICAgICAgICAgcmVsX3Bvcy5wdXNoKDEgKTsKICAgICAgICAgICAgZ2VuZXJhdGVfeGxpYV9saWZlbGluZXMoZ2VuX2N0eCxleGVfY3R4LHN1Yl9pbnRlcmFjdGlvbixsaWZlbGluZXNfYWN0aW9ucyxyZWxfcG9zKTsKICAgICAgICB9LAogICAgICAgIEludGVyYWN0aW9uOjpMb29wKF8sc3ViX2ludGVyYWN0aW9uKSA9PiB7CiAgICAgICAgICAgIGxldCBtdXQgcmVsX3BvcyA9IHJlbGF0aXZlX3Bvc2l0aW9uLmNsb25lKCk7CiAgICAgICAgICAgIHJlbF9wb3MucHVzaCgxICk7CiAgICAgICAgICAgIGdlbmVyYXRlX3hsaWFfbGlmZWxpbmVzKGdlbl9jdHgsZXhlX2N0eCxzdWJfaW50ZXJhY3Rpb24sbGlmZWxpbmVzX2FjdGlvbnMscmVsX3Bvcyk7CiAgICAgICAgfSwKICAgICAgICBJbnRlcmFjdGlvbjo6U3RyaWN0KHN1YmludDEsc3ViaW50MikgPT4gewogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsZXQgbXV0IHJlbF9wb3MgPSByZWxhdGl2ZV9wb3NpdGlvbi5jbG9uZSgpOwogICAgICAgICAgICAgICAgcmVsX3Bvcy5wdXNoKDEgKTsKICAgICAgICAgICAgICAgIGdlbmVyYXRlX3hsaWFfbGlmZWxpbmVzKGdlbl9jdHgsZXhlX2N0eCxzdWJpbnQxLGxpZmVsaW5lc19hY3Rpb25zLHJlbF9wb3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxldCBtdXQgcmVsX3BvcyA9IHJlbGF0aXZlX3Bvc2l0aW9uLmNsb25lKCk7CiAgICAgICAgICAgICAgICByZWxfcG9zLnB1c2goMiApOwogICAgICAgICAgICAgICAgZ2VuZXJhdGVfeGxpYV9saWZlbGluZXMoZ2VuX2N0eCxleGVfY3R4LHN1YmludDIsbGlmZWxpbmVzX2FjdGlvbnMscmVsX3Bvcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEludGVyYWN0aW9uOjpTZXEoc3ViaW50MSxzdWJpbnQyKSA9PiB7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxldCBtdXQgcmVsX3BvcyA9IHJlbGF0aXZlX3Bvc2l0aW9uLmNsb25lKCk7CiAgICAgICAgICAgICAgICByZWxfcG9zLnB1c2goMSApOwogICAgICAgICAgICAgICAgZ2VuZXJhdGVfeGxpYV9saWZlbGluZXMoZ2VuX2N0eCxleGVfY3R4LHN1YmludDEsbGlmZWxpbmVzX2FjdGlvbnMscmVsX3Bvcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGV0IG11dCByZWxfcG9zID0gcmVsYXRpdmVfcG9zaXRpb24uY2xvbmUoKTsKICAgICAgICAgICAgICAgIHJlbF9wb3MucHVzaCgyICk7CiAgICAgICAgICAgICAgICBnZW5lcmF0ZV94bGlhX2xpZmVsaW5lcyhnZW5fY3R4LGV4ZV9jdHgsc3ViaW50MixsaWZlbGluZXNfYWN0aW9ucyxyZWxfcG9zKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgSW50ZXJhY3Rpb246OkFsdChzdWJpbnQxLHN1YmludDIpID0+IHsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGV0IG11dCByZWxfcG9zID0gcmVsYXRpdmVfcG9zaXRpb24uY2xvbmUoKTsKICAgICAgICAgICAgICAgIHJlbF9wb3MucHVzaCgxICk7CiAgICAgICAgICAgICAgICBnZW5lcmF0ZV94bGlhX2xpZmVsaW5lcyhnZW5fY3R4LGV4ZV9jdHgsc3ViaW50MSxsaWZlbGluZXNfYWN0aW9ucyxyZWxfcG9zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsZXQgbXV0IHJlbF9wb3MgPSByZWxhdGl2ZV9wb3NpdGlvbi5jbG9uZSgpOwogICAgICAgICAgICAgICAgcmVsX3Bvcy5wdXNoKDIgKTsKICAgICAgICAgICAgICAgIGdlbmVyYXRlX3hsaWFfbGlmZWxpbmVzKGdlbl9jdHgsZXhlX2N0eCxzdWJpbnQyLGxpZmVsaW5lc19hY3Rpb25zLHJlbF9wb3MpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbnRlcmFjdGlvbjo6UGFyKHN1YmludDEsc3ViaW50MikgPT4gewogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsZXQgbXV0IHJlbF9wb3MgPSByZWxhdGl2ZV9wb3NpdGlvbi5jbG9uZSgpOwogICAgICAgICAgICAgICAgcmVsX3Bvcy5wdXNoKDEgKTsKICAgICAgICAgICAgICAgIGdlbmVyYXRlX3hsaWFfbGlmZWxpbmVzKGdlbl9jdHgsZXhlX2N0eCxzdWJpbnQxLGxpZmVsaW5lc19hY3Rpb25zLHJlbF9wb3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxldCBtdXQgcmVsX3BvcyA9IHJlbGF0aXZlX3Bvc2l0aW9uLmNsb25lKCk7CiAgICAgICAgICAgICAgICByZWxfcG9zLnB1c2goMiApOwogICAgICAgICAgICAgICAgZ2VuZXJhdGVfeGxpYV9saWZlbGluZXMoZ2VuX2N0eCxleGVfY3R4LHN1YmludDIsbGlmZWxpbmVzX2FjdGlvbnMscmVsX3Bvcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0K