Menu

[r9998]: / trunk / django-json-rpc / jsonrpc / mochikit.py  Maximize  Restore  History

Download this file

4 lines (3 with data), 261.5 kB

1
2
3
4
from base64 import b64decode
mochikit = b64decode(r"""LyoqKg0KDQogICAgTW9jaGlLaXQuTW9jaGlLaXQgMS41IDogUEFDS0VEIFZFUlNJT04NCg0KICAgIFRISVMgRklMRSBJUyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRC4gIElmIGNyZWF0aW5nIHBhdGNoZXMsIHBsZWFzZQ0KICAgIGRpZmYgYWdhaW5zdCB0aGUgc291cmNlIHRyZWUsIG5vdCB0aGlzIGZpbGUuDQoNCiAgICBTZWUgPGh0dHA6Ly9tb2NoaWtpdC5jb20vPiBmb3IgZG9jdW1lbnRhdGlvbiwgZG93bmxvYWRzLCBsaWNlbnNlLCBldGMuDQoNCiAgICAoYykgMjAwNSBCb2IgSXBwb2xpdG8uICBBbGwgcmlnaHRzIFJlc2VydmVkLg0KDQoqKiovDQoNCmlmKHR5cGVvZiAoTW9jaGlLaXQpPT0idW5kZWZpbmVkIil7DQpNb2NoaUtpdD17fTsNCn0NCmlmKHR5cGVvZiAoTW9jaGlLaXQuX19leHBvcnRfXyk9PSJ1bmRlZmluZWQiKXsNCk1vY2hpS2l0Ll9fZXhwb3J0X189dHJ1ZTsNCn0NCmlmKHR5cGVvZiAoTW9jaGlLaXQuQmFzZSk9PSJ1bmRlZmluZWQiKXsNCk1vY2hpS2l0LkJhc2U9e307DQp9DQpNb2NoaUtpdC5CYXNlLl9tb2R1bGU9ZnVuY3Rpb24oXzEsXzIsXzMpew0KaWYoIShfMSBpbiBNb2NoaUtpdCkpew0KTW9jaGlLaXRbXzFdPXt9Ow0KfQ0KdmFyIF80PU1vY2hpS2l0W18xXTsNCl80Lk5BTUU9Ik1vY2hpS2l0LiIrXzE7DQpfNC5WRVJTSU9OPV8yOw0KXzQuX19yZXByX189ZnVuY3Rpb24oKXsNCnJldHVybiAiWyIrdGhpcy5OQU1FKyIgIit0aGlzLlZFUlNJT04rIl0iOw0KfTsNCl80LnRvU3RyaW5nPWZ1bmN0aW9uKCl7DQpyZXR1cm4gdGhpcy5fX3JlcHJfXygpOw0KfTsNCmZvcih2YXIgaT0wO2k8XzMubGVuZ3RoO2krKyl7DQppZighKF8zW2ldIGluIE1vY2hpS2l0KSl7DQp0aHJvdyAiTW9jaGlLaXQuIitfMSsiIGRlcGVuZHMgb24gTW9jaGlLaXQuIitfM1tpXSsiISI7DQp9DQp9DQp9Ow0KTW9jaGlLaXQuQmFzZS5fbW9kdWxlKCJCYXNlIiwiMS41IixbXSk7DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZT1mdW5jdGlvbihfNixfNyl7DQppZihfNj09PW51bGx8fF82PT09dW5kZWZpbmVkKXsNCl82PXt9Ow0KfQ0KZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7DQp2YXIgbz1hcmd1bWVudHNbaV07DQppZih0eXBlb2YgKG8pIT0idW5kZWZpbmVkIiYmbyE9PW51bGwpew0KZm9yKHZhciBrIGluIG8pew0KXzZba109b1trXTsNCn0NCn0NCn0NCnJldHVybiBfNjsNCn07DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5CYXNlLHtjYW1lbGl6ZTpmdW5jdGlvbihfYil7DQp2YXIgX2M9X2Iuc3BsaXQoIi0iKTsNCnZhciBjYz1fY1swXTsNCmZvcih2YXIgaT0xO2k8X2MubGVuZ3RoO2krKyl7DQpjYys9X2NbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrX2NbaV0uc3Vic3RyaW5nKDEpOw0KfQ0KcmV0dXJuIGNjOw0KfSxjb3VudGVyOmZ1bmN0aW9uKG4pew0KaWYoYXJndW1lbnRzLmxlbmd0aD09PTApew0Kbj0xOw0KfQ0KcmV0dXJuIGZ1bmN0aW9uKCl7DQpyZXR1cm4gbisrOw0KfTsNCn0sY2xvbmU6ZnVuY3Rpb24ob2JqKXsNCnZhciBtZT1hcmd1bWVudHMuY2FsbGVlOw0KaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7DQptZS5wcm90b3R5cGU9b2JqOw0KcmV0dXJuIG5ldyBtZSgpOw0KfQ0KfSxfZmxhdHRlbkFycmF5OmZ1bmN0aW9uKHJlcyxsc3Qpew0KZm9yKHZhciBpPTA7aTxsc3QubGVuZ3RoO2krKyl7DQp2YXIgbz1sc3RbaV07DQppZihvIGluc3RhbmNlb2YgQXJyYXkpew0KYXJndW1lbnRzLmNhbGxlZShyZXMsbyk7DQp9ZWxzZXsNCnJlcy5wdXNoKG8pOw0KfQ0KfQ0KcmV0dXJuIHJlczsNCn0sZmxhdHRlbkFycmF5OmZ1bmN0aW9uKGxzdCl7DQpyZXR1cm4gTW9jaGlLaXQuQmFzZS5fZmxhdHRlbkFycmF5KFtdLGxzdCk7DQp9LGZsYXR0ZW5Bcmd1bWVudHM6ZnVuY3Rpb24obHN0KXsNCnZhciByZXM9W107DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KdmFyIF8xYT1tLmV4dGVuZChudWxsLGFyZ3VtZW50cyk7DQp3aGlsZShfMWEubGVuZ3RoKXsNCnZhciBvPV8xYS5zaGlmdCgpOw0KaWYobyYmdHlwZW9mIChvKT09Im9iamVjdCImJnR5cGVvZiAoby5sZW5ndGgpPT0ibnVtYmVyIil7DQpmb3IodmFyIGk9by5sZW5ndGgtMTtpPj0wO2ktLSl7DQpfMWEudW5zaGlmdChvW2ldKTsNCn0NCn1lbHNlew0KcmVzLnB1c2gobyk7DQp9DQp9DQpyZXR1cm4gcmVzOw0KfSxleHRlbmQ6ZnVuY3Rpb24oXzFkLG9iaixfMWYpew0KaWYoIV8xZil7DQpfMWY9MDsNCn0NCmlmKG9iail7DQp2YXIgbD1vYmoubGVuZ3RoOw0KaWYodHlwZW9mIChsKSE9Im51bWJlciIpew0KaWYodHlwZW9mIChNb2NoaUtpdC5JdGVyKSE9InVuZGVmaW5lZCIpew0Kb2JqPU1vY2hpS2l0Lkl0ZXIubGlzdChvYmopOw0KbD1vYmoubGVuZ3RoOw0KfWVsc2V7DQp0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBub3QgYW4gYXJyYXktbGlrZSBhbmQgTW9jaGlLaXQuSXRlciBub3QgcHJlc2VudCIpOw0KfQ0KfQ0KaWYoIV8xZCl7DQpfMWQ9W107DQp9DQpmb3IodmFyIGk9XzFmO2k8bDtpKyspew0KXzFkLnB1c2gob2JqW2ldKTsNCn0NCn0NCnJldHVybiBfMWQ7DQp9LHVwZGF0ZXRyZWU6ZnVuY3Rpb24oXzIyLG9iail7DQppZihfMjI9PT1udWxsfHxfMjI9PT11bmRlZmluZWQpew0KXzIyPXt9Ow0KfQ0KZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7DQp2YXIgbz1hcmd1bWVudHNbaV07DQppZih0eXBlb2YgKG8pIT0idW5kZWZpbmVkIiYmbyE9PW51bGwpew0KZm9yKHZhciBrIGluIG8pew0KdmFyIHY9b1trXTsNCmlmKHR5cGVvZiAoXzIyW2tdKT09Im9iamVjdCImJnR5cGVvZiAodik9PSJvYmplY3QiKXsNCmFyZ3VtZW50cy5jYWxsZWUoXzIyW2tdLHYpOw0KfWVsc2V7DQpfMjJba109djsNCn0NCn0NCn0NCn0NCnJldHVybiBfMjI7DQp9LHNldGRlZmF1bHQ6ZnVuY3Rpb24oXzI4LG9iail7DQppZihfMjg9PT1udWxsfHxfMjg9PT11bmRlZmluZWQpew0KXzI4PXt9Ow0KfQ0KZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7DQp2YXIgbz1hcmd1bWVudHNbaV07DQpmb3IodmFyIGsgaW4gbyl7DQppZighKGsgaW4gXzI4KSl7DQpfMjhba109b1trXTsNCn0NCn0NCn0NCnJldHVybiBfMjg7DQp9LGtleXM6ZnVuY3Rpb24ob2JqKXsNCnZhciBfMmU9W107DQpmb3IodmFyIF8yZiBpbiBvYmopew0KXzJlLnB1c2goXzJmKTsNCn0NCnJldHVybiBfMmU7DQp9LHZhbHVlczpmdW5jdGlvbihvYmopew0KdmFyIF8zMT1bXTsNCmZvcih2YXIgXzMyIGluIG9iail7DQpfMzEucHVzaChvYmpbXzMyXSk7DQp9DQpyZXR1cm4gXzMxOw0KfSxpdGVtczpmdW5jdGlvbihvYmopew0KdmFyIF8zND1bXTsNCnZhciBlOw0KZm9yKHZhciBfMzYgaW4gb2JqKXsNCnZhciB2Ow0KdHJ5ew0Kdj1vYmpbXzM2XTsNCn0NCmNhdGNoKGUpew0KY29udGludWU7DQp9DQpfMzQucHVzaChbXzM2LHZdKTsNCn0NCnJldHVybiBfMzQ7DQp9LF9uZXdOYW1lZEVycm9yOmZ1bmN0aW9uKF8zOCxfMzksXzNhKXsNCl8zYS5wcm90b3R5cGU9bmV3IE1vY2hpS2l0LkJhc2UuTmFtZWRFcnJvcihfMzguTkFNRSsiLiIrXzM5KTsNCl8zOFtfMzldPV8zYTsNCn0sb3BlcmF0b3I6e3RydXRoOmZ1bmN0aW9uKGEpew0KcmV0dXJuICEhYTsNCn0sbG9nbm90OmZ1bmN0aW9uKGEpew0KcmV0dXJuICFhOw0KfSxpZGVudGl0eTpmdW5jdGlvbihhKXsNCnJldHVybiBhOw0KfSxub3Q6ZnVuY3Rpb24oYSl7DQpyZXR1cm4gfmE7DQp9LG5lZzpmdW5jdGlvbihhKXsNCnJldHVybiAtYTsNCn0sYWRkOmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYStiOw0KfSxzdWI6ZnVuY3Rpb24oYSxiKXsNCnJldHVybiBhLWI7DQp9LGRpdjpmdW5jdGlvbihhLGIpew0KcmV0dXJuIGEvYjsNCn0sbW9kOmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYSViOw0KfSxtdWw6ZnVuY3Rpb24oYSxiKXsNCnJldHVybiBhKmI7DQp9LGFuZDpmdW5jdGlvbihhLGIpew0KcmV0dXJuIGEmYjsNCn0sb3I6ZnVuY3Rpb24oYSxiKXsNCnJldHVybiBhfGI7DQp9LHhvcjpmdW5jdGlvbihhLGIpew0KcmV0dXJuIGFeYjsNCn0sbHNoaWZ0OmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYTw8YjsNCn0scnNoaWZ0OmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYT4+YjsNCn0senJzaGlmdDpmdW5jdGlvbihhLGIpew0KcmV0dXJuIGE+Pj5iOw0KfSxlcTpmdW5jdGlvbihhLGIpew0KcmV0dXJuIGE9PWI7DQp9LG5lOmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYSE9YjsNCn0sZ3Q6ZnVuY3Rpb24oYSxiKXsNCnJldHVybiBhPmI7DQp9LGdlOmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYT49YjsNCn0sbHQ6ZnVuY3Rpb24oYSxiKXsNCnJldHVybiBhPGI7DQp9LGxlOmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYTw9YjsNCn0sc2VxOmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYT09PWI7DQp9LHNuZTpmdW5jdGlvbihhLGIpew0KcmV0dXJuIGEhPT1iOw0KfSxjZXE6ZnVuY3Rpb24oYSxiKXsNCnJldHVybiBNb2NoaUtpdC5CYXNlLmNvbXBhcmUoYSxiKT09PTA7DQp9LGNuZTpmdW5jdGlvbihhLGIpew0KcmV0dXJuIE1vY2hpS2l0LkJhc2UuY29tcGFyZShhLGIpIT09MDsNCn0sY2d0OmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gTW9jaGlLaXQuQmFzZS5jb21wYXJlKGEsYik9PTE7DQp9LGNnZTpmdW5jdGlvbihhLGIpew0KcmV0dXJuIE1vY2hpS2l0LkJhc2UuY29tcGFyZShhLGIpIT0tMTsNCn0sY2x0OmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gTW9jaGlLaXQuQmFzZS5jb21wYXJlKGEsYik9PS0xOw0KfSxjbGU6ZnVuY3Rpb24oYSxiKXsNCnJldHVybiBNb2NoaUtpdC5CYXNlLmNvbXBhcmUoYSxiKSE9MTsNCn0sbG9nYW5kOmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYSYmYjsNCn0sbG9nb3I6ZnVuY3Rpb24oYSxiKXsNCnJldHVybiBhfHxiOw0KfSxjb250YWluczpmdW5jdGlvbihhLGIpew0KcmV0dXJuIGIgaW4gYTsNCn19LGZvcndhcmRDYWxsOmZ1bmN0aW9uKF83OCl7DQpyZXR1cm4gZnVuY3Rpb24oKXsNCnJldHVybiB0aGlzW183OF0uYXBwbHkodGhpcyxhcmd1bWVudHMpOw0KfTsNCn0saXRlbWdldHRlcjpmdW5jdGlvbihfNzkpew0KcmV0dXJuIGZ1bmN0aW9uKGFyZyl7DQpyZXR1cm4gYXJnW183OV07DQp9Ow0KfSxib29sOmZ1bmN0aW9uKF83Yil7DQppZih0eXBlb2YgKF83Yik9PT0iYm9vbGVhbiJ8fF83YiBpbnN0YW5jZW9mIEJvb2xlYW4pew0KcmV0dXJuIF83Yi52YWx1ZU9mKCk7DQp9ZWxzZXsNCmlmKHR5cGVvZiAoXzdiKT09PSJzdHJpbmcifHxfN2IgaW5zdGFuY2VvZiBTdHJpbmcpew0KcmV0dXJuIF83Yi5sZW5ndGg+MCYmXzdiIT0iZmFsc2UiJiZfN2IhPSJudWxsIiYmXzdiIT0idW5kZWZpbmVkIiYmXzdiIT0iMCI7DQp9ZWxzZXsNCmlmKHR5cGVvZiAoXzdiKT09PSJudW1iZXIifHxfN2IgaW5zdGFuY2VvZiBOdW1iZXIpew0KcmV0dXJuICFpc05hTihfN2IpJiZfN2IhPTA7DQp9ZWxzZXsNCmlmKF83YiE9bnVsbCYmdHlwZW9mIChfN2IubGVuZ3RoKT09PSJudW1iZXIiKXsNCnJldHVybiBfN2IubGVuZ3RoIT09MDsNCn1lbHNlew0KcmV0dXJuIF83YiE9bnVsbDsNCn0NCn0NCn0NCn0NCn0sdHlwZU1hdGNoZXI6ZnVuY3Rpb24oKXsNCnZhciBfN2M9e307DQpmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsNCnZhciB0eXA9YXJndW1lbnRzW2ldOw0KXzdjW3R5cF09dHlwOw0KfQ0KcmV0dXJuIGZ1bmN0aW9uKCl7DQpmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsNCmlmKCEodHlwZW9mIChhcmd1bWVudHNbaV0pIGluIF83Yykpew0KcmV0dXJuIGZhbHNlOw0KfQ0KfQ0KcmV0dXJuIHRydWU7DQp9Ow0KfSxpc051bGw6ZnVuY3Rpb24oKXsNCmZvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspew0KaWYoYXJndW1lbnRzW2ldIT09bnVsbCl7DQpyZXR1cm4gZmFsc2U7DQp9DQp9DQpyZXR1cm4gdHJ1ZTsNCn0saXNVbmRlZmluZWRPck51bGw6ZnVuY3Rpb24oKXsNCmZvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspew0KdmFyIG89YXJndW1lbnRzW2ldOw0KaWYoISh0eXBlb2YgKG8pPT0idW5kZWZpbmVkInx8bz09PW51bGwpKXsNCnJldHVybiBmYWxzZTsNCn0NCn0NCnJldHVybiB0cnVlOw0KfSxpc0VtcHR5OmZ1bmN0aW9uKG9iail7DQpyZXR1cm4gIU1vY2hpS2l0LkJhc2UuaXNOb3RFbXB0eS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7DQp9LGlzTm90RW1wdHk6ZnVuY3Rpb24ob2JqKXsNCmZvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspew0KdmFyIG89YXJndW1lbnRzW2ldOw0KaWYoIShvJiZvLmxlbmd0aCkpew0KcmV0dXJuIGZhbHNlOw0KfQ0KfQ0KcmV0dXJuIHRydWU7DQp9LGlzQXJyYXlMaWtlOmZ1bmN0aW9uKCl7DQpmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsNCnZhciBvPWFyZ3VtZW50c1tpXTsNCnZhciB0eXA9dHlwZW9mIChvKTsNCmlmKCh0eXAhPSJvYmplY3QiJiYhKHR5cD09ImZ1bmN0aW9uIiYmdHlwZW9mIChvLml0ZW0pPT0iZnVuY3Rpb24iKSl8fG89PT1udWxsfHx0eXBlb2YgKG8ubGVuZ3RoKSE9Im51bWJlciJ8fG8ubm9kZVR5cGU9PT0zfHxvLm5vZGVUeXBlPT09NCl7DQpyZXR1cm4gZmFsc2U7DQp9DQp9DQpyZXR1cm4gdHJ1ZTsNCn0saXNEYXRlTGlrZTpmdW5jdGlvbigpew0KZm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7DQp2YXIgbz1hcmd1bWVudHNbaV07DQppZih0eXBlb2YgKG8pIT0ib2JqZWN0Inx8bz09PW51bGx8fHR5cGVvZiAoby5nZXRUaW1lKSE9ImZ1bmN0aW9uIil7DQpyZXR1cm4gZmFsc2U7DQp9DQp9DQpyZXR1cm4gdHJ1ZTsNCn0seG1hcDpmdW5jdGlvbihmbil7DQppZihmbj09PW51bGwpew0KcmV0dXJuIE1vY2hpS2l0LkJhc2UuZXh0ZW5kKG51bGwsYXJndW1lbnRzLDEpOw0KfQ0KdmFyIF84ZD1bXTsNCmZvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspew0KXzhkLnB1c2goZm4oYXJndW1lbnRzW2ldKSk7DQp9DQpyZXR1cm4gXzhkOw0KfSxtYXA6ZnVuY3Rpb24oZm4sbHN0KXsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQp2YXIgaXRyPU1vY2hpS2l0Lkl0ZXI7DQp2YXIgXzkzPW0uaXNBcnJheUxpa2U7DQppZihhcmd1bWVudHMubGVuZ3RoPD0yKXsNCmlmKCFfOTMobHN0KSl7DQppZihpdHIpew0KbHN0PWl0ci5saXN0KGxzdCk7DQppZihmbj09PW51bGwpew0KcmV0dXJuIGxzdDsNCn0NCn1lbHNlew0KdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbm90IGFuIGFycmF5LWxpa2UgYW5kIE1vY2hpS2l0Lkl0ZXIgbm90IHByZXNlbnQiKTsNCn0NCn0NCmlmKGZuPT09bnVsbCl7DQpyZXR1cm4gbS5leHRlbmQobnVsbCxsc3QpOw0KfQ0KdmFyIF85ND1bXTsNCmZvcih2YXIgaT0wO2k8bHN0Lmxlbmd0aDtpKyspew0KXzk0LnB1c2goZm4obHN0W2ldKSk7DQp9DQpyZXR1cm4gXzk0Ow0KfWVsc2V7DQppZihmbj09PW51bGwpew0KZm49QXJyYXk7DQp9DQp2YXIgXzk2PW51bGw7DQpmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsNCmlmKCFfOTMoYXJndW1lbnRzW2ldKSl7DQppZihpdHIpew0KcmV0dXJuIGl0ci5saXN0KGl0ci5pbWFwLmFwcGx5KG51bGwsYXJndW1lbnRzKSk7DQp9ZWxzZXsNCnRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG5vdCBhbiBhcnJheS1saWtlIGFuZCBNb2NoaUtpdC5JdGVyIG5vdCBwcmVzZW50Iik7DQp9DQp9DQp2YXIgbD1hcmd1bWVudHNbaV0ubGVuZ3RoOw0KaWYoXzk2PT09bnVsbHx8Xzk2Pmwpew0KXzk2PWw7DQp9DQp9DQpfOTQ9W107DQpmb3IodmFyIGk9MDtpPF85NjtpKyspew0KdmFyIF85OD1bXTsNCmZvcih2YXIgaj0xO2o8YXJndW1lbnRzLmxlbmd0aDtqKyspew0KXzk4LnB1c2goYXJndW1lbnRzW2pdW2ldKTsNCn0NCl85NC5wdXNoKGZuLmFwcGx5KHRoaXMsXzk4KSk7DQp9DQpyZXR1cm4gXzk0Ow0KfQ0KfSx4ZmlsdGVyOmZ1bmN0aW9uKGZuKXsNCnZhciBfOWI9W107DQppZihmbj09PW51bGwpew0KZm49TW9jaGlLaXQuQmFzZS5vcGVyYXRvci50cnV0aDsNCn0NCmZvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspew0KdmFyIG89YXJndW1lbnRzW2ldOw0KaWYoZm4obykpew0KXzliLnB1c2gobyk7DQp9DQp9DQpyZXR1cm4gXzliOw0KfSxmaWx0ZXI6ZnVuY3Rpb24oZm4sbHN0LF9hMCl7DQp2YXIgX2ExPVtdOw0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCmlmKCFtLmlzQXJyYXlMaWtlKGxzdCkpew0KaWYoTW9jaGlLaXQuSXRlcil7DQpsc3Q9TW9jaGlLaXQuSXRlci5saXN0KGxzdCk7DQp9ZWxzZXsNCnRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG5vdCBhbiBhcnJheS1saWtlIGFuZCBNb2NoaUtpdC5JdGVyIG5vdCBwcmVzZW50Iik7DQp9DQp9DQppZihmbj09PW51bGwpew0KZm49bS5vcGVyYXRvci50cnV0aDsNCn0NCmlmKHR5cGVvZiAoQXJyYXkucHJvdG90eXBlLmZpbHRlcik9PSJmdW5jdGlvbiIpew0KcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChsc3QsZm4sX2EwKTsNCn1lbHNlew0KaWYodHlwZW9mIChfYTApPT0idW5kZWZpbmVkInx8X2EwPT09bnVsbCl7DQpmb3IodmFyIGk9MDtpPGxzdC5sZW5ndGg7aSsrKXsNCnZhciBvPWxzdFtpXTsNCmlmKGZuKG8pKXsNCl9hMS5wdXNoKG8pOw0KfQ0KfQ0KfWVsc2V7DQpmb3IodmFyIGk9MDtpPGxzdC5sZW5ndGg7aSsrKXsNCm89bHN0W2ldOw0KaWYoZm4uY2FsbChfYTAsbykpew0KX2ExLnB1c2gobyk7DQp9DQp9DQp9DQp9DQpyZXR1cm4gX2ExOw0KfSxfd3JhcER1bWJGdW5jdGlvbjpmdW5jdGlvbihfYTUpew0KcmV0dXJuIGZ1bmN0aW9uKCl7DQpzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7DQpjYXNlIDA6DQpyZXR1cm4gX2E1KCk7DQpjYXNlIDE6DQpyZXR1cm4gX2E1KGFyZ3VtZW50c1swXSk7DQpjYXNlIDI6DQpyZXR1cm4gX2E1KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOw0KY2FzZSAzOg0KcmV0dXJuIF9hNShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7DQp9DQp2YXIgX2E2PVtdOw0KZm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7DQpfYTYucHVzaCgiYXJndW1lbnRzWyIraSsiXSIpOw0KfQ0KcmV0dXJuIGV2YWwoIihmdW5jKCIrX2E2LmpvaW4oIiwiKSsiKSkiKTsNCn07DQp9LG1ldGhvZGNhbGxlcjpmdW5jdGlvbihfYTgpew0KdmFyIF9hOT1Nb2NoaUtpdC5CYXNlLmV4dGVuZChudWxsLGFyZ3VtZW50cywxKTsNCmlmKHR5cGVvZiAoX2E4KT09ImZ1bmN0aW9uIil7DQpyZXR1cm4gZnVuY3Rpb24ob2JqKXsNCnJldHVybiBfYTguYXBwbHkob2JqLF9hOSk7DQp9Ow0KfWVsc2V7DQpyZXR1cm4gZnVuY3Rpb24ob2JqKXsNCnJldHVybiBvYmpbX2E4XS5hcHBseShvYmosX2E5KTsNCn07DQp9DQp9LG1ldGhvZDpmdW5jdGlvbihfYWMsX2FkKXsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQpyZXR1cm4gbS5iaW5kLmFwcGx5KHRoaXMsbS5leHRlbmQoW19hZCxfYWNdLGFyZ3VtZW50cywyKSk7DQp9LGNvbXBvc2U6ZnVuY3Rpb24oZjEsZjIpew0KdmFyIF9iMT1bXTsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQppZihhcmd1bWVudHMubGVuZ3RoPT09MCl7DQp0aHJvdyBuZXcgVHlwZUVycm9yKCJjb21wb3NlKCkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Iik7DQp9DQpmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsNCnZhciBmbj1hcmd1bWVudHNbaV07DQppZih0eXBlb2YgKGZuKSE9ImZ1bmN0aW9uIil7DQp0aHJvdyBuZXcgVHlwZUVycm9yKG0ucmVwcihmbikrIiBpcyBub3QgYSBmdW5jdGlvbiIpOw0KfQ0KX2IxLnB1c2goZm4pOw0KfQ0KcmV0dXJuIGZ1bmN0aW9uKCl7DQp2YXIgX2I1PWFyZ3VtZW50czsNCmZvcih2YXIgaT1fYjEubGVuZ3RoLTE7aT49MDtpLS0pew0KX2I1PVtfYjFbaV0uYXBwbHkodGhpcyxfYjUpXTsNCn0NCnJldHVybiBfYjVbMF07DQp9Ow0KfSxiaW5kOmZ1bmN0aW9uKF9iNyxfYjgpew0KaWYodHlwZW9mIChfYjcpPT0ic3RyaW5nIil7DQpfYjc9X2I4W19iN107DQp9DQp2YXIgX2I5PV9iNy5pbV9mdW5jOw0KdmFyIF9iYT1fYjcuaW1fcHJlYXJnczsNCnZhciBfYmI9X2I3LmltX3NlbGY7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KaWYodHlwZW9mIChfYjcpPT0iZnVuY3Rpb24iJiZ0eXBlb2YgKF9iNy5hcHBseSk9PSJ1bmRlZmluZWQiKXsNCl9iNz1tLl93cmFwRHVtYkZ1bmN0aW9uKF9iNyk7DQp9DQppZih0eXBlb2YgKF9iOSkhPSJmdW5jdGlvbiIpew0KX2I5PV9iNzsNCn0NCmlmKHR5cGVvZiAoX2I4KSE9InVuZGVmaW5lZCIpew0KX2JiPV9iODsNCn0NCmlmKHR5cGVvZiAoX2JhKT09InVuZGVmaW5lZCIpew0KX2JhPVtdOw0KfWVsc2V7DQpfYmE9X2JhLnNsaWNlKCk7DQp9DQptLmV4dGVuZChfYmEsYXJndW1lbnRzLDIpOw0KdmFyIF9iZD1mdW5jdGlvbigpew0KdmFyIF9iZT1hcmd1bWVudHM7DQp2YXIgbWU9YXJndW1lbnRzLmNhbGxlZTsNCmlmKG1lLmltX3ByZWFyZ3MubGVuZ3RoPjApew0KX2JlPW0uY29uY2F0KG1lLmltX3ByZWFyZ3MsX2JlKTsNCn0NCnZhciBfYzA9bWUuaW1fc2VsZjsNCmlmKCFfYzApew0KX2MwPXRoaXM7DQp9DQpyZXR1cm4gbWUuaW1fZnVuYy5hcHBseShfYzAsX2JlKTsNCn07DQpfYmQuaW1fc2VsZj1fYmI7DQpfYmQuaW1fZnVuYz1fYjk7DQpfYmQuaW1fcHJlYXJncz1fYmE7DQpyZXR1cm4gX2JkOw0KfSxiaW5kTGF0ZTpmdW5jdGlvbihfYzEsX2MyKXsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQp2YXIgX2M0PWFyZ3VtZW50czsNCmlmKHR5cGVvZiAoX2MxKT09PSJzdHJpbmciKXsNCl9jND1tLmV4dGVuZChbbS5mb3J3YXJkQ2FsbChfYzEpXSxhcmd1bWVudHMsMSk7DQpyZXR1cm4gbS5iaW5kLmFwcGx5KHRoaXMsX2M0KTsNCn0NCnJldHVybiBtLmJpbmQuYXBwbHkodGhpcyxfYzQpOw0KfSxiaW5kTWV0aG9kczpmdW5jdGlvbihfYzUpew0KdmFyIF9jNj1Nb2NoaUtpdC5CYXNlLmJpbmQ7DQpmb3IodmFyIGsgaW4gX2M1KXsNCnZhciBfYzg9X2M1W2tdOw0KaWYodHlwZW9mIChfYzgpPT0iZnVuY3Rpb24iKXsNCl9jNVtrXT1fYzYoX2M4LF9jNSk7DQp9DQp9DQp9LHJlZ2lzdGVyQ29tcGFyYXRvcjpmdW5jdGlvbihfYzksX2NhLF9jYixfY2Mpew0KTW9jaGlLaXQuQmFzZS5jb21wYXJhdG9yUmVnaXN0cnkucmVnaXN0ZXIoX2M5LF9jYSxfY2IsX2NjKTsNCn0sX3ByaW1pdGl2ZXM6eyJib29sZWFuIjp0cnVlLCJzdHJpbmciOnRydWUsIm51bWJlciI6dHJ1ZX0sY29tcGFyZTpmdW5jdGlvbihhLGIpew0KaWYoYT09Yil7DQpyZXR1cm4gMDsNCn0NCnZhciBfY2Y9KHR5cGVvZiAoYSk9PSJ1bmRlZmluZWQifHxhPT09bnVsbCk7DQp2YXIgX2QwPSh0eXBlb2YgKGIpPT0idW5kZWZpbmVkInx8Yj09PW51bGwpOw0KaWYoX2NmJiZfZDApew0KcmV0dXJuIDA7DQp9ZWxzZXsNCmlmKF9jZil7DQpyZXR1cm4gLTE7DQp9ZWxzZXsNCmlmKF9kMCl7DQpyZXR1cm4gMTsNCn0NCn0NCn0NCnZhciBtPU1vY2hpS2l0LkJhc2U7DQp2YXIgX2QyPW0uX3ByaW1pdGl2ZXM7DQppZighKHR5cGVvZiAoYSkgaW4gX2QyJiZ0eXBlb2YgKGIpIGluIF9kMikpew0KdHJ5ew0KcmV0dXJuIG0uY29tcGFyYXRvclJlZ2lzdHJ5Lm1hdGNoKGEsYik7DQp9DQpjYXRjaChlKXsNCmlmKGUhPW0uTm90Rm91bmQpew0KdGhyb3cgZTsNCn0NCn0NCn0NCmlmKGE8Yil7DQpyZXR1cm4gLTE7DQp9ZWxzZXsNCmlmKGE+Yil7DQpyZXR1cm4gMTsNCn0NCn0NCnZhciBfZDM9bS5yZXByOw0KdGhyb3cgbmV3IFR5cGVFcnJvcihfZDMoYSkrIiBhbmQgIitfZDMoYikrIiBjYW4gbm90IGJlIGNvbXBhcmVkIik7DQp9LGNvbXBhcmVEYXRlTGlrZTpmdW5jdGlvbihhLGIpew0KcmV0dXJuIE1vY2hpS2l0LkJhc2UuY29tcGFyZShhLmdldFRpbWUoKSxiLmdldFRpbWUoKSk7DQp9LGNvbXBhcmVBcnJheUxpa2U6ZnVuY3Rpb24oYSxiKXsNCnZhciBfZDg9TW9jaGlLaXQuQmFzZS5jb21wYXJlOw0KdmFyIF9kOT1hLmxlbmd0aDsNCnZhciBfZGE9MDsNCmlmKF9kOT5iLmxlbmd0aCl7DQpfZGE9MTsNCl9kOT1iLmxlbmd0aDsNCn1lbHNlew0KaWYoX2Q5PGIubGVuZ3RoKXsNCl9kYT0tMTsNCn0NCn0NCmZvcih2YXIgaT0wO2k8X2Q5O2krKyl7DQp2YXIgY21wPV9kOChhW2ldLGJbaV0pOw0KaWYoY21wKXsNCnJldHVybiBjbXA7DQp9DQp9DQpyZXR1cm4gX2RhOw0KfSxyZWdpc3RlclJlcHI6ZnVuY3Rpb24oX2RkLF9kZSxfZGYsX2UwKXsNCk1vY2hpS2l0LkJhc2UucmVwclJlZ2lzdHJ5LnJlZ2lzdGVyKF9kZCxfZGUsX2RmLF9lMCk7DQp9LHJlcHI6ZnVuY3Rpb24obyl7DQppZih0eXBlb2YgKG8pPT0idW5kZWZpbmVkIil7DQpyZXR1cm4gInVuZGVmaW5lZCI7DQp9ZWxzZXsNCmlmKG89PT1udWxsKXsNCnJldHVybiAibnVsbCI7DQp9DQp9DQp0cnl7DQppZih0eXBlb2YgKG8uX19yZXByX18pPT0iZnVuY3Rpb24iKXsNCnJldHVybiBvLl9fcmVwcl9fKCk7DQp9ZWxzZXsNCmlmKHR5cGVvZiAoby5yZXByKT09ImZ1bmN0aW9uIiYmby5yZXByIT1hcmd1bWVudHMuY2FsbGVlKXsNCnJldHVybiBvLnJlcHIoKTsNCn0NCn0NCnJldHVybiBNb2NoaUtpdC5CYXNlLnJlcHJSZWdpc3RyeS5tYXRjaChvKTsNCn0NCmNhdGNoKGUpew0KdHJ5ew0KaWYodHlwZW9mIChvLk5BTUUpPT0ic3RyaW5nIiYmKG8udG9TdHJpbmc9PUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZ3x8by50b1N0cmluZz09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykpew0KcmV0dXJuIG8uTkFNRTsNCn0NCn0NCmNhdGNoKGlnbm9yZSl7DQp9DQp9DQp0cnl7DQp2YXIgX2UyPShvKyIiKTsNCn0NCmNhdGNoKGUpew0KcmV0dXJuICJbIit0eXBlb2YgKG8pKyJdIjsNCn0NCmlmKHR5cGVvZiAobyk9PSJmdW5jdGlvbiIpew0KX2UyPV9lMi5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrL2csIiAiKTsNCl9lMj1fZTIucmVwbGFjZSgvLChcUykvLCIsICQxIik7DQp2YXIgaWR4PV9lMi5pbmRleE9mKCJ7Iik7DQppZihpZHghPS0xKXsNCl9lMj1fZTIuc3Vic3RyKDAsaWR4KSsiey4uLn0iOw0KfQ0KfQ0KcmV0dXJuIF9lMjsNCn0scmVwckFycmF5TGlrZTpmdW5jdGlvbihvKXsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQpyZXR1cm4gIlsiK20ubWFwKG0ucmVwcixvKS5qb2luKCIsICIpKyJdIjsNCn0scmVwclN0cmluZzpmdW5jdGlvbihvKXsNCnJldHVybiAoIlwiIitvLnJlcGxhY2UoLyhbIlxcXSkvZywiXFwkMSIpKyJcIiIpLnJlcGxhY2UoL1tcZl0vZywiXFxmIikucmVwbGFjZSgvW1xiXS9nLCJcXGIiKS5yZXBsYWNlKC9bXG5dL2csIlxcbiIpLnJlcGxhY2UoL1tcdF0vZywiXFx0IikucmVwbGFjZSgvW1x2XS9nLCJcXHYiKS5yZXBsYWNlKC9bXHJdL2csIlxcciIpOw0KfSxyZXByTnVtYmVyOmZ1bmN0aW9uKG8pew0KcmV0dXJuIG8rIiI7DQp9LHJlZ2lzdGVySlNPTjpmdW5jdGlvbihfZTgsX2U5LF9lYSxfZWIpew0KTW9jaGlLaXQuQmFzZS5qc29uUmVnaXN0cnkucmVnaXN0ZXIoX2U4LF9lOSxfZWEsX2ViKTsNCn0sZXZhbEpTT046ZnVuY3Rpb24oKXsNCnJldHVybiBldmFsKCIoIitNb2NoaUtpdC5CYXNlLl9maWx0ZXJKU09OKGFyZ3VtZW50c1swXSkrIikiKTsNCn0sX2ZpbHRlckpTT046ZnVuY3Rpb24ocyl7DQp2YXIgbT1zLm1hdGNoKC9eXHMqXC9cKiguKilcKlwvXHMqJC8pOw0KaWYobSl7DQpyZXR1cm4gbVsxXTsNCn0NCnJldHVybiBzOw0KfSxzZXJpYWxpemVKU09OOmZ1bmN0aW9uKG8pew0KdmFyIF9lZj10eXBlb2YgKG8pOw0KaWYoX2VmPT0ibnVtYmVyInx8X2VmPT0iYm9vbGVhbiIpew0KcmV0dXJuIG8rIiI7DQp9ZWxzZXsNCmlmKG89PT1udWxsKXsNCnJldHVybiAibnVsbCI7DQp9ZWxzZXsNCmlmKF9lZj09InN0cmluZyIpew0KdmFyIHJlcz0iIjsNCmZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSsrKXsNCnZhciBjPW8uY2hhckF0KGkpOw0KaWYoYz09IlwiIil7DQpyZXMrPSJcXFwiIjsNCn1lbHNlew0KaWYoYz09IlxcIil7DQpyZXMrPSJcXFxcIjsNCn1lbHNlew0KaWYoYz09IlxiIil7DQpyZXMrPSJcXGIiOw0KfWVsc2V7DQppZihjPT0iXGYiKXsNCnJlcys9IlxcZiI7DQp9ZWxzZXsNCmlmKGM9PSJcbiIpew0KcmVzKz0iXFxuIjsNCn1lbHNlew0KaWYoYz09IlxyIil7DQpyZXMrPSJcXHIiOw0KfWVsc2V7DQppZihjPT0iXHQiKXsNCnJlcys9IlxcdCI7DQp9ZWxzZXsNCmlmKG8uY2hhckNvZGVBdChpKTw9MzEpew0KdmFyIGhleD1vLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpOw0KaWYoaGV4Lmxlbmd0aDwyKXsNCmhleD0iMCIraGV4Ow0KfQ0KcmVzKz0iXFx1MDAiK2hleC50b1VwcGVyQ2FzZSgpOw0KfWVsc2V7DQpyZXMrPWM7DQp9DQp9DQp9DQp9DQp9DQp9DQp9DQp9DQp9DQpyZXR1cm4gIlwiIityZXMrIlwiIjsNCn0NCn0NCn0NCnZhciBtZT1hcmd1bWVudHMuY2FsbGVlOw0KdmFyIF9mNTsNCmlmKHR5cGVvZiAoby5fX2pzb25fXyk9PSJmdW5jdGlvbiIpew0KX2Y1PW8uX19qc29uX18oKTsNCmlmKG8hPT1fZjUpew0KcmV0dXJuIG1lKF9mNSk7DQp9DQp9DQppZih0eXBlb2YgKG8uanNvbik9PSJmdW5jdGlvbiIpew0KX2Y1PW8uanNvbigpOw0KaWYobyE9PV9mNSl7DQpyZXR1cm4gbWUoX2Y1KTsNCn0NCn0NCmlmKF9lZiE9ImZ1bmN0aW9uIiYmdHlwZW9mIChvLmxlbmd0aCk9PSJudW1iZXIiKXsNCnZhciByZXM9W107DQpmb3IodmFyIGk9MDtpPG8ubGVuZ3RoO2krKyl7DQp2YXIgdmFsPW1lKG9baV0pOw0KaWYodHlwZW9mICh2YWwpIT0ic3RyaW5nIil7DQpjb250aW51ZTsNCn0NCnJlcy5wdXNoKHZhbCk7DQp9DQpyZXR1cm4gIlsiK3Jlcy5qb2luKCIsICIpKyJdIjsNCn0NCnZhciBtPU1vY2hpS2l0LkJhc2U7DQp0cnl7DQpfZjU9bS5qc29uUmVnaXN0cnkubWF0Y2gobyk7DQppZihvIT09X2Y1KXsNCnJldHVybiBtZShfZjUpOw0KfQ0KfQ0KY2F0Y2goZSl7DQppZihlIT1tLk5vdEZvdW5kKXsNCnRocm93IGU7DQp9DQp9DQppZihfZWY9PSJ1bmRlZmluZWQiKXsNCnRocm93IG5ldyBUeXBlRXJyb3IoInVuZGVmaW5lZCBjYW4gbm90IGJlIHNlcmlhbGl6ZWQgYXMgSlNPTiIpOw0KfQ0KaWYoX2VmPT0iZnVuY3Rpb24iKXsNCnJldHVybiBudWxsOw0KfQ0KcmVzPVtdOw0KZm9yKHZhciBrIGluIG8pew0KdmFyIF9mOTsNCmlmKHR5cGVvZiAoayk9PSJudW1iZXIiKXsNCl9mOT0iXCIiK2srIlwiIjsNCn1lbHNlew0KaWYodHlwZW9mIChrKT09InN0cmluZyIpew0KX2Y5PW1lKGspOw0KfWVsc2V7DQpjb250aW51ZTsNCn0NCn0NCnZhbD1tZShvW2tdKTsNCmlmKHR5cGVvZiAodmFsKSE9InN0cmluZyIpew0KY29udGludWU7DQp9DQpyZXMucHVzaChfZjkrIjoiK3ZhbCk7DQp9DQpyZXR1cm4gInsiK3Jlcy5qb2luKCIsICIpKyJ9IjsNCn0sb2JqRXF1YWw6ZnVuY3Rpb24oYSxiKXsNCnJldHVybiAoTW9jaGlLaXQuQmFzZS5jb21wYXJlKGEsYik9PT0wKTsNCn0sYXJyYXlFcXVhbDpmdW5jdGlvbihfZmMsYXJyKXsNCmlmKF9mYy5sZW5ndGghPWFyci5sZW5ndGgpew0KcmV0dXJuIGZhbHNlOw0KfQ0KcmV0dXJuIChNb2NoaUtpdC5CYXNlLmNvbXBhcmUoX2ZjLGFycik9PT0wKTsNCn0sY29uY2F0OmZ1bmN0aW9uKCl7DQp2YXIgX2ZlPVtdOw0KdmFyIF9mZj1Nb2NoaUtpdC5CYXNlLmV4dGVuZDsNCmZvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspew0KX2ZmKF9mZSxhcmd1bWVudHNbaV0pOw0KfQ0KcmV0dXJuIF9mZTsNCn0sa2V5Q29tcGFyYXRvcjpmdW5jdGlvbihrZXkpew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnZhciBfMTAzPW0uY29tcGFyZTsNCmlmKGFyZ3VtZW50cy5sZW5ndGg9PTEpew0KcmV0dXJuIGZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gXzEwMyhhW2tleV0sYltrZXldKTsNCn07DQp9DQp2YXIgXzEwNj1tLmV4dGVuZChudWxsLGFyZ3VtZW50cyk7DQpyZXR1cm4gZnVuY3Rpb24oYSxiKXsNCnZhciBydmFsPTA7DQpmb3IodmFyIGk9MDsocnZhbD09PTApJiYoaTxfMTA2Lmxlbmd0aCk7aSsrKXsNCnZhciBrZXk9XzEwNltpXTsNCnJ2YWw9XzEwMyhhW2tleV0sYltrZXldKTsNCn0NCnJldHVybiBydmFsOw0KfTsNCn0scmV2ZXJzZUtleUNvbXBhcmF0b3I6ZnVuY3Rpb24oa2V5KXsNCnZhciBfMTBkPU1vY2hpS2l0LkJhc2Uua2V5Q29tcGFyYXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7DQpyZXR1cm4gZnVuY3Rpb24oYSxiKXsNCnJldHVybiBfMTBkKGIsYSk7DQp9Ow0KfSxwYXJ0aWFsOmZ1bmN0aW9uKGZ1bmMpew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnJldHVybiBtLmJpbmQuYXBwbHkodGhpcyxtLmV4dGVuZChbZnVuYyx1bmRlZmluZWRdLGFyZ3VtZW50cywxKSk7DQp9LGxpc3RNaW5NYXg6ZnVuY3Rpb24oXzExMixsc3Qpew0KaWYobHN0Lmxlbmd0aD09PTApew0KcmV0dXJuIG51bGw7DQp9DQp2YXIgY3VyPWxzdFswXTsNCnZhciBfMTE1PU1vY2hpS2l0LkJhc2UuY29tcGFyZTsNCmZvcih2YXIgaT0xO2k8bHN0Lmxlbmd0aDtpKyspew0KdmFyIG89bHN0W2ldOw0KaWYoXzExNShvLGN1cik9PV8xMTIpew0KY3VyPW87DQp9DQp9DQpyZXR1cm4gY3VyOw0KfSxvYmpNYXg6ZnVuY3Rpb24oKXsNCnJldHVybiBNb2NoaUtpdC5CYXNlLmxpc3RNaW5NYXgoMSxhcmd1bWVudHMpOw0KfSxvYmpNaW46ZnVuY3Rpb24oKXsNCnJldHVybiBNb2NoaUtpdC5CYXNlLmxpc3RNaW5NYXgoLTEsYXJndW1lbnRzKTsNCn0sZmluZElkZW50aWNhbDpmdW5jdGlvbihsc3QsXzExOSxfMTFhLGVuZCl7DQppZih0eXBlb2YgKGVuZCk9PSJ1bmRlZmluZWQifHxlbmQ9PT1udWxsKXsNCmVuZD1sc3QubGVuZ3RoOw0KfQ0KaWYodHlwZW9mIChfMTFhKT09InVuZGVmaW5lZCJ8fF8xMWE9PT1udWxsKXsNCl8xMWE9MDsNCn0NCmZvcih2YXIgaT1fMTFhO2k8ZW5kO2krKyl7DQppZihsc3RbaV09PT1fMTE5KXsNCnJldHVybiBpOw0KfQ0KfQ0KcmV0dXJuIC0xOw0KfSxtZWFuOmZ1bmN0aW9uKCl7DQp2YXIgc3VtPTA7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KdmFyIGFyZ3M9bS5leHRlbmQobnVsbCxhcmd1bWVudHMpOw0KdmFyIF8xMjA9YXJncy5sZW5ndGg7DQp3aGlsZShhcmdzLmxlbmd0aCl7DQp2YXIgbz1hcmdzLnNoaWZ0KCk7DQppZihvJiZ0eXBlb2YgKG8pPT0ib2JqZWN0IiYmdHlwZW9mIChvLmxlbmd0aCk9PSJudW1iZXIiKXsNCl8xMjArPW8ubGVuZ3RoLTE7DQpmb3IodmFyIGk9by5sZW5ndGgtMTtpPj0wO2ktLSl7DQpzdW0rPW9baV07DQp9DQp9ZWxzZXsNCnN1bSs9bzsNCn0NCn0NCmlmKF8xMjA8PTApew0KdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbigpIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCIpOw0KfQ0KcmV0dXJuIHN1bS9fMTIwOw0KfSxtZWRpYW46ZnVuY3Rpb24oKXsNCnZhciBkYXRhPU1vY2hpS2l0LkJhc2UuZmxhdHRlbkFyZ3VtZW50cyhhcmd1bWVudHMpOw0KaWYoZGF0YS5sZW5ndGg9PT0wKXsNCnRocm93IG5ldyBUeXBlRXJyb3IoIm1lZGlhbigpIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCIpOw0KfQ0KZGF0YS5zb3J0KGNvbXBhcmUpOw0KaWYoZGF0YS5sZW5ndGglMj09MCl7DQp2YXIgXzEyND1kYXRhLmxlbmd0aC8yOw0KcmV0dXJuIChkYXRhW18xMjRdK2RhdGFbXzEyNC0xXSkvMjsNCn1lbHNlew0KcmV0dXJuIGRhdGFbKGRhdGEubGVuZ3RoLTEpLzJdOw0KfQ0KfSxmaW5kVmFsdWU6ZnVuY3Rpb24obHN0LF8xMjYsXzEyNyxlbmQpew0KaWYodHlwZW9mIChlbmQpPT0idW5kZWZpbmVkInx8ZW5kPT09bnVsbCl7DQplbmQ9bHN0Lmxlbmd0aDsNCn0NCmlmKHR5cGVvZiAoXzEyNyk9PSJ1bmRlZmluZWQifHxfMTI3PT09bnVsbCl7DQpfMTI3PTA7DQp9DQp2YXIgY21wPU1vY2hpS2l0LkJhc2UuY29tcGFyZTsNCmZvcih2YXIgaT1fMTI3O2k8ZW5kO2krKyl7DQppZihjbXAobHN0W2ldLF8xMjYpPT09MCl7DQpyZXR1cm4gaTsNCn0NCn0NCnJldHVybiAtMTsNCn0sbm9kZVdhbGs6ZnVuY3Rpb24obm9kZSxfMTJjKXsNCnZhciBfMTJkPVtub2RlXTsNCnZhciBfMTJlPU1vY2hpS2l0LkJhc2UuZXh0ZW5kOw0Kd2hpbGUoXzEyZC5sZW5ndGgpew0KdmFyIHJlcz1fMTJjKF8xMmQuc2hpZnQoKSk7DQppZihyZXMpew0KXzEyZShfMTJkLHJlcyk7DQp9DQp9DQp9LG5hbWVGdW5jdGlvbnM6ZnVuY3Rpb24oXzEzMCl7DQp2YXIgYmFzZT1fMTMwLk5BTUU7DQppZih0eXBlb2YgKGJhc2UpPT0idW5kZWZpbmVkIil7DQpiYXNlPSIiOw0KfWVsc2V7DQpiYXNlPWJhc2UrIi4iOw0KfQ0KZm9yKHZhciBuYW1lIGluIF8xMzApew0KdmFyIG89XzEzMFtuYW1lXTsNCmlmKHR5cGVvZiAobyk9PSJmdW5jdGlvbiImJnR5cGVvZiAoby5OQU1FKT09InVuZGVmaW5lZCIpew0KdHJ5ew0Kby5OQU1FPWJhc2UrbmFtZTsNCn0NCmNhdGNoKGUpew0KfQ0KfQ0KfQ0KfSxxdWVyeVN0cmluZzpmdW5jdGlvbihfMTM0LF8xMzUpew0KaWYodHlwZW9mIChNb2NoaUtpdC5ET00pIT0idW5kZWZpbmVkIiYmYXJndW1lbnRzLmxlbmd0aD09MSYmKHR5cGVvZiAoXzEzNCk9PSJzdHJpbmcifHwodHlwZW9mIChfMTM0Lm5vZGVUeXBlKSE9InVuZGVmaW5lZCImJl8xMzQubm9kZVR5cGU+MCkpKXsNCnZhciBrdj1Nb2NoaUtpdC5ET00uZm9ybUNvbnRlbnRzKF8xMzQpOw0KXzEzND1rdlswXTsNCl8xMzU9a3ZbMV07DQp9ZWxzZXsNCmlmKGFyZ3VtZW50cy5sZW5ndGg9PTEpew0KaWYodHlwZW9mIChfMTM0Lmxlbmd0aCk9PSJudW1iZXIiJiZfMTM0Lmxlbmd0aD09Mil7DQpyZXR1cm4gYXJndW1lbnRzLmNhbGxlZShfMTM0WzBdLF8xMzRbMV0pOw0KfQ0KdmFyIG89XzEzNDsNCl8xMzQ9W107DQpfMTM1PVtdOw0KZm9yKHZhciBrIGluIG8pew0KdmFyIHY9b1trXTsNCmlmKHR5cGVvZiAodik9PSJmdW5jdGlvbiIpew0KY29udGludWU7DQp9ZWxzZXsNCmlmKE1vY2hpS2l0LkJhc2UuaXNBcnJheUxpa2Uodikpew0KZm9yKHZhciBpPTA7aTx2Lmxlbmd0aDtpKyspew0KXzEzNC5wdXNoKGspOw0KXzEzNS5wdXNoKHZbaV0pOw0KfQ0KfWVsc2V7DQpfMTM0LnB1c2goayk7DQpfMTM1LnB1c2godik7DQp9DQp9DQp9DQp9DQp9DQp2YXIgcnZhbD1bXTsNCnZhciBsZW49TWF0aC5taW4oXzEzNC5sZW5ndGgsXzEzNS5sZW5ndGgpOw0KdmFyIF8xM2Q9TW9jaGlLaXQuQmFzZS51cmxFbmNvZGU7DQpmb3IodmFyIGk9MDtpPGxlbjtpKyspew0Kdj1fMTM1W2ldOw0KaWYodHlwZW9mICh2KSE9InVuZGVmaW5lZCImJnYhPT1udWxsKXsNCnJ2YWwucHVzaChfMTNkKF8xMzRbaV0pKyI9IitfMTNkKHYpKTsNCn0NCn0NCnJldHVybiBydmFsLmpvaW4oIiYiKTsNCn0scGFyc2VRdWVyeVN0cmluZzpmdW5jdGlvbihfMTNlLF8xM2Ypew0KdmFyIHFzdHI9KF8xM2UuY2hhckF0KDApPT0iPyIpP18xM2Uuc3Vic3RyaW5nKDEpOl8xM2U7DQp2YXIgXzE0MT1xc3RyLnJlcGxhY2UoL1wrL2csIiUyMCIpLnNwbGl0KC9cJmFtcFw7fFwmXCMzOFw7fFwmI3gyNjt8XCYvKTsNCnZhciBvPXt9Ow0KdmFyIF8xNDM7DQppZih0eXBlb2YgKGRlY29kZVVSSUNvbXBvbmVudCkhPSJ1bmRlZmluZWQiKXsNCl8xNDM9ZGVjb2RlVVJJQ29tcG9uZW50Ow0KfWVsc2V7DQpfMTQzPXVuZXNjYXBlOw0KfQ0KaWYoXzEzZil7DQpmb3IodmFyIGk9MDtpPF8xNDEubGVuZ3RoO2krKyl7DQp2YXIgcGFpcj1fMTQxW2ldLnNwbGl0KCI9Iik7DQp2YXIgbmFtZT1fMTQzKHBhaXIuc2hpZnQoKSk7DQppZighbmFtZSl7DQpjb250aW51ZTsNCn0NCnZhciBhcnI9b1tuYW1lXTsNCmlmKCEoYXJyIGluc3RhbmNlb2YgQXJyYXkpKXsNCmFycj1bXTsNCm9bbmFtZV09YXJyOw0KfQ0KYXJyLnB1c2goXzE0MyhwYWlyLmpvaW4oIj0iKSkpOw0KfQ0KfWVsc2V7DQpmb3IodmFyIGk9MDtpPF8xNDEubGVuZ3RoO2krKyl7DQpwYWlyPV8xNDFbaV0uc3BsaXQoIj0iKTsNCnZhciBuYW1lPXBhaXIuc2hpZnQoKTsNCmlmKCFuYW1lKXsNCmNvbnRpbnVlOw0KfQ0Kb1tfMTQzKG5hbWUpXT1fMTQzKHBhaXIuam9pbigiPSIpKTsNCn0NCn0NCnJldHVybiBvOw0KfX0pOw0KTW9jaGlLaXQuQmFzZS5BZGFwdGVyUmVnaXN0cnk9ZnVuY3Rpb24oKXsNCnRoaXMucGFpcnM9W107DQp9Ow0KTW9jaGlLaXQuQmFzZS5BZGFwdGVyUmVnaXN0cnkucHJvdG90eXBlPXtyZWdpc3RlcjpmdW5jdGlvbihuYW1lLF8xNDksd3JhcCxfMTRiKXsNCmlmKF8xNGIpew0KdGhpcy5wYWlycy51bnNoaWZ0KFtuYW1lLF8xNDksd3JhcF0pOw0KfWVsc2V7DQp0aGlzLnBhaXJzLnB1c2goW25hbWUsXzE0OSx3cmFwXSk7DQp9DQp9LG1hdGNoOmZ1bmN0aW9uKCl7DQpmb3IodmFyIGk9MDtpPHRoaXMucGFpcnMubGVuZ3RoO2krKyl7DQp2YXIgcGFpcj10aGlzLnBhaXJzW2ldOw0KaWYocGFpclsxXS5hcHBseSh0aGlzLGFyZ3VtZW50cykpew0KcmV0dXJuIHBhaXJbMl0uYXBwbHkodGhpcyxhcmd1bWVudHMpOw0KfQ0KfQ0KdGhyb3cgTW9jaGlLaXQuQmFzZS5Ob3RGb3VuZDsNCn0sdW5yZWdpc3RlcjpmdW5jdGlvbihuYW1lKXsNCmZvcih2YXIgaT0wO2k8dGhpcy5wYWlycy5sZW5ndGg7aSsrKXsNCnZhciBwYWlyPXRoaXMucGFpcnNbaV07DQppZihwYWlyWzBdPT1uYW1lKXsNCnRoaXMucGFpcnMuc3BsaWNlKGksMSk7DQpyZXR1cm4gdHJ1ZTsNCn0NCn0NCnJldHVybiBmYWxzZTsNCn19Ow0KTW9jaGlLaXQuQmFzZS5fZXhwb3J0U3ltYm9scz1mdW5jdGlvbihfMTUxLF8xNTIpew0KaWYoTW9jaGlLaXQuX19leHBvcnRfXz09PWZhbHNlfHxfMTUyLl9fZXhwb3J0X189PT1mYWxzZSl7DQpyZXR1cm47DQp9DQpmb3IodmFyIGsgaW4gXzE1Mil7DQp2YXIgdj1fMTUyW2tdOw0KaWYodiE9bnVsbCl7DQp2YXIgXzE1NT0oa1swXSE9PSJfIiYmayE9PSJ0b1N0cmluZyIpOw0KaWYodi5fX2V4cG9ydF9fPT09dHJ1ZXx8KHYuX19leHBvcnRfXyE9PWZhbHNlJiZfMTU1KSl7DQpfMTUxW2tdPV8xNTJba107DQp9DQp9DQp9DQp9Ow0KTW9jaGlLaXQuQmFzZS5fZGVwcmVjYXRlZD1mdW5jdGlvbihfMTU2LG5hbWUsXzE1OCxfMTU5LF8xNWEpew0KaWYodHlwZW9mIChfMTU2KT09PSJzdHJpbmciKXsNCmlmKF8xNTYuaW5kZXhPZigiTW9jaGlLaXQuIik9PT0wKXsNCl8xNTY9XzE1Ni5zdWJzdHJpbmcoOSk7DQp9DQpfMTU2PU1vY2hpS2l0W18xNTZdOw0KfQ0KdmFyIF8xNWI9XzE1OC5zcGxpdCgiLiIpWzFdOw0KdmFyIF8xNWM9XzE1OC5zcGxpdCgiLiIpWzJdOw0KdmFyIGZ1bmM9ZnVuY3Rpb24oKXsNCnZhciBzZWxmPWFyZ3VtZW50cy5jYWxsZWU7DQp2YXIgbXNnPV8xNTYuTkFNRSsiLiIrbmFtZSsiIGlzIGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAiK18xNTkrIi4gVXNlICIrXzE1OCsiIGluc3RlYWQuIjsNCmlmKHNlbGYubG9nZ2VkIT09dHJ1ZSl7DQpzZWxmLmxvZ2dlZD10cnVlOw0KaWYoTW9jaGlLaXQuTG9nZ2luZyl7DQpNb2NoaUtpdC5Mb2dnaW5nLmxvZ0RlYnVnKG1zZyk7DQp9ZWxzZXsNCmlmKGNvbnNvbGUmJmNvbnNvbGUubG9nKXsNCmNvbnNvbGUubG9nKG1zZyk7DQp9DQp9DQp9DQppZighTW9jaGlLaXRbXzE1Yl0pew0KdGhyb3cgbmV3IEVycm9yKG1zZyk7DQp9DQpyZXR1cm4gTW9jaGlLaXRbXzE1Yl1bXzE1Y10uYXBwbHkodGhpcyxhcmd1bWVudHMpOw0KfTsNCmZ1bmMuX19leHBvcnRfXz0oXzE1YT09PXRydWUpOw0KXzE1NltuYW1lXT1mdW5jOw0KfTsNCk1vY2hpS2l0LkJhc2UuX19uZXdfXz1mdW5jdGlvbigpew0KdmFyIG09dGhpczsNCm0ubm9vcD1tLm9wZXJhdG9yLmlkZW50aXR5Ow0KbS5fZGVwcmVjYXRlZChtLCJmb3J3YXJkIiwiTW9jaGlLaXQuQmFzZS5mb3J3YXJkQ2FsbCIsIjEuMyIpOw0KbS5fZGVwcmVjYXRlZChtLCJmaW5kIiwiTW9jaGlLaXQuQmFzZS5maW5kVmFsdWUiLCIxLjMiKTsNCmlmKHR5cGVvZiAoZW5jb2RlVVJJQ29tcG9uZW50KSE9InVuZGVmaW5lZCIpew0KbS51cmxFbmNvZGU9ZnVuY3Rpb24oXzE2MSl7DQpyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KF8xNjEpLnJlcGxhY2UoL1wnL2csIiUyNyIpOw0KfTsNCn1lbHNlew0KbS51cmxFbmNvZGU9ZnVuY3Rpb24oXzE2Mil7DQpyZXR1cm4gZXNjYXBlKF8xNjIpLnJlcGxhY2UoL1wrL2csIiUyQiIpLnJlcGxhY2UoL1wiL2csIiUyMiIpLnJ2YWwucmVwbGFjZSgvXCcvZywiJTI3Iik7DQp9Ow0KfQ0KbS5OYW1lZEVycm9yPWZ1bmN0aW9uKG5hbWUpew0KdGhpcy5tZXNzYWdlPW5hbWU7DQp0aGlzLm5hbWU9bmFtZTsNCn07DQptLk5hbWVkRXJyb3IucHJvdG90eXBlPW5ldyBFcnJvcigpOw0KbS51cGRhdGUobS5OYW1lZEVycm9yLnByb3RvdHlwZSx7cmVwcjpmdW5jdGlvbigpew0KaWYodGhpcy5tZXNzYWdlJiZ0aGlzLm1lc3NhZ2UhPXRoaXMubmFtZSl7DQpyZXR1cm4gdGhpcy5uYW1lKyIoIittLnJlcHIodGhpcy5tZXNzYWdlKSsiKSI7DQp9ZWxzZXsNCnJldHVybiB0aGlzLm5hbWUrIigpIjsNCn0NCn0sdG9TdHJpbmc6bS5mb3J3YXJkQ2FsbCgicmVwciIpfSk7DQptLk5vdEZvdW5kPW5ldyBtLk5hbWVkRXJyb3IoIk1vY2hpS2l0LkJhc2UuTm90Rm91bmQiKTsNCm0ubGlzdE1heD1tLnBhcnRpYWwobS5saXN0TWluTWF4LDEpOw0KbS5saXN0TWluPW0ucGFydGlhbChtLmxpc3RNaW5NYXgsLTEpOw0KbS5pc0NhbGxhYmxlPW0udHlwZU1hdGNoZXIoImZ1bmN0aW9uIik7DQptLmlzVW5kZWZpbmVkPW0udHlwZU1hdGNoZXIoInVuZGVmaW5lZCIpOw0KbS5tZXJnZT1tLnBhcnRpYWwobS51cGRhdGUsbnVsbCk7DQptLnppcD1tLnBhcnRpYWwobS5tYXAsbnVsbCk7DQptLmF2ZXJhZ2U9bS5tZWFuOw0KbS5jb21wYXJhdG9yUmVnaXN0cnk9bmV3IG0uQWRhcHRlclJlZ2lzdHJ5KCk7DQptLnJlZ2lzdGVyQ29tcGFyYXRvcigiZGF0ZUxpa2UiLG0uaXNEYXRlTGlrZSxtLmNvbXBhcmVEYXRlTGlrZSk7DQptLnJlZ2lzdGVyQ29tcGFyYXRvcigiYXJyYXlMaWtlIixtLmlzQXJyYXlMaWtlLG0uY29tcGFyZUFycmF5TGlrZSk7DQptLnJlcHJSZWdpc3RyeT1uZXcgbS5BZGFwdGVyUmVnaXN0cnkoKTsNCm0ucmVnaXN0ZXJSZXByKCJhcnJheUxpa2UiLG0uaXNBcnJheUxpa2UsbS5yZXByQXJyYXlMaWtlKTsNCm0ucmVnaXN0ZXJSZXByKCJzdHJpbmciLG0udHlwZU1hdGNoZXIoInN0cmluZyIpLG0ucmVwclN0cmluZyk7DQptLnJlZ2lzdGVyUmVwcigibnVtYmVycyIsbS50eXBlTWF0Y2hlcigibnVtYmVyIiwiYm9vbGVhbiIpLG0ucmVwck51bWJlcik7DQptLmpzb25SZWdpc3RyeT1uZXcgbS5BZGFwdGVyUmVnaXN0cnkoKTsNCm0ubmFtZUZ1bmN0aW9ucyh0aGlzKTsNCn07DQpNb2NoaUtpdC5CYXNlLl9fbmV3X18oKTsNCmlmKE1vY2hpS2l0Ll9fZXhwb3J0X18pew0KY29tcGFyZT1Nb2NoaUtpdC5CYXNlLmNvbXBhcmU7DQpjb21wb3NlPU1vY2hpS2l0LkJhc2UuY29tcG9zZTsNCnNlcmlhbGl6ZUpTT049TW9jaGlLaXQuQmFzZS5zZXJpYWxpemVKU09OOw0KbWVhbj1Nb2NoaUtpdC5CYXNlLm1lYW47DQptZWRpYW49TW9jaGlLaXQuQmFzZS5tZWRpYW47DQp9DQpNb2NoaUtpdC5CYXNlLl9leHBvcnRTeW1ib2xzKHRoaXMsTW9jaGlLaXQuQmFzZSk7DQpNb2NoaUtpdC5CYXNlLl9tb2R1bGUoIkl0ZXIiLCIxLjUiLFsiQmFzZSJdKTsNCk1vY2hpS2l0LkJhc2UudXBkYXRlKE1vY2hpS2l0Lkl0ZXIse3JlZ2lzdGVySXRlcmF0b3JGYWN0b3J5OmZ1bmN0aW9uKG5hbWUsXzE2NSxfMTY2LF8xNjcpew0KTW9jaGlLaXQuSXRlci5pdGVyYXRvclJlZ2lzdHJ5LnJlZ2lzdGVyKG5hbWUsXzE2NSxfMTY2LF8xNjcpOw0KfSxpc0l0ZXJhYmxlOmZ1bmN0aW9uKG8pew0KcmV0dXJuIG8hPW51bGwmJih0eXBlb2YgKG8ubmV4dCk9PSJmdW5jdGlvbiJ8fHR5cGVvZiAoby5pdGVyKT09ImZ1bmN0aW9uIik7DQp9LGl0ZXI6ZnVuY3Rpb24oXzE2OSxfMTZhKXsNCnZhciBzZWxmPU1vY2hpS2l0Lkl0ZXI7DQppZihhcmd1bWVudHMubGVuZ3RoPT0yKXsNCnJldHVybiBzZWxmLnRha2V3aGlsZShmdW5jdGlvbihhKXsNCnJldHVybiBhIT1fMTZhOw0KfSxfMTY5KTsNCn0NCmlmKHR5cGVvZiAoXzE2OS5uZXh0KT09ImZ1bmN0aW9uIil7DQpyZXR1cm4gXzE2OTsNCn1lbHNlew0KaWYodHlwZW9mIChfMTY5Lml0ZXIpPT0iZnVuY3Rpb24iKXsNCnJldHVybiBfMTY5Lml0ZXIoKTsNCn0NCn0NCnRyeXsNCnJldHVybiBzZWxmLml0ZXJhdG9yUmVnaXN0cnkubWF0Y2goXzE2OSk7DQp9DQpjYXRjaChlKXsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQppZihlPT1tLk5vdEZvdW5kKXsNCmU9bmV3IFR5cGVFcnJvcih0eXBlb2YgKF8xNjkpKyI6ICIrbS5yZXByKF8xNjkpKyIgaXMgbm90IGl0ZXJhYmxlIik7DQp9DQp0aHJvdyBlOw0KfQ0KfSxjb3VudDpmdW5jdGlvbihuKXsNCmlmKCFuKXsNCm49MDsNCn0NCnZhciBtPU1vY2hpS2l0LkJhc2U7DQpyZXR1cm4ge3JlcHI6ZnVuY3Rpb24oKXsNCnJldHVybiAiY291bnQoIituKyIpIjsNCn0sdG9TdHJpbmc6bS5mb3J3YXJkQ2FsbCgicmVwciIpLG5leHQ6bS5jb3VudGVyKG4pfTsNCn0sY3ljbGU6ZnVuY3Rpb24ocCl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5JdGVyOw0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnZhciBsc3Q9W107DQp2YXIgXzE3ND1zZWxmLml0ZXIocCk7DQpyZXR1cm4ge3JlcHI6ZnVuY3Rpb24oKXsNCnJldHVybiAiY3ljbGUoLi4uKSI7DQp9LHRvU3RyaW5nOm0uZm9yd2FyZENhbGwoInJlcHIiKSxuZXh0OmZ1bmN0aW9uKCl7DQp0cnl7DQp2YXIgcnZhbD1fMTc0Lm5leHQoKTsNCmxzdC5wdXNoKHJ2YWwpOw0KcmV0dXJuIHJ2YWw7DQp9DQpjYXRjaChlKXsNCmlmKGUhPXNlbGYuU3RvcEl0ZXJhdGlvbil7DQp0aHJvdyBlOw0KfQ0KaWYobHN0Lmxlbmd0aD09PTApew0KdGhpcy5uZXh0PWZ1bmN0aW9uKCl7DQp0aHJvdyBzZWxmLlN0b3BJdGVyYXRpb247DQp9Ow0KfWVsc2V7DQp2YXIgaT0tMTsNCnRoaXMubmV4dD1mdW5jdGlvbigpew0KaT0oaSsxKSVsc3QubGVuZ3RoOw0KcmV0dXJuIGxzdFtpXTsNCn07DQp9DQpyZXR1cm4gdGhpcy5uZXh0KCk7DQp9DQp9fTsNCn0scmVwZWF0OmZ1bmN0aW9uKGVsZW0sbil7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KaWYodHlwZW9mIChuKT09InVuZGVmaW5lZCIpew0KcmV0dXJuIHtyZXByOmZ1bmN0aW9uKCl7DQpyZXR1cm4gInJlcGVhdCgiK20ucmVwcihlbGVtKSsiKSI7DQp9LHRvU3RyaW5nOm0uZm9yd2FyZENhbGwoInJlcHIiKSxuZXh0OmZ1bmN0aW9uKCl7DQpyZXR1cm4gZWxlbTsNCn19Ow0KfQ0KcmV0dXJuIHtyZXByOmZ1bmN0aW9uKCl7DQpyZXR1cm4gInJlcGVhdCgiK20ucmVwcihlbGVtKSsiLCAiK24rIikiOw0KfSx0b1N0cmluZzptLmZvcndhcmRDYWxsKCJyZXByIiksbmV4dDpmdW5jdGlvbigpew0KaWYobjw9MCl7DQp0aHJvdyBNb2NoaUtpdC5JdGVyLlN0b3BJdGVyYXRpb247DQp9DQpuLT0xOw0KcmV0dXJuIGVsZW07DQp9fTsNCn0sbmV4dDpmdW5jdGlvbihfMTdhKXsNCnJldHVybiBfMTdhLm5leHQoKTsNCn0saXppcDpmdW5jdGlvbihwLHEpew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnZhciBzZWxmPU1vY2hpS2l0Lkl0ZXI7DQp2YXIgbmV4dD1zZWxmLm5leHQ7DQp2YXIgXzE4MD1tLm1hcChzZWxmLml0ZXIsYXJndW1lbnRzKTsNCnJldHVybiB7cmVwcjpmdW5jdGlvbigpew0KcmV0dXJuICJpemlwKC4uLikiOw0KfSx0b1N0cmluZzptLmZvcndhcmRDYWxsKCJyZXByIiksbmV4dDpmdW5jdGlvbigpew0KcmV0dXJuIG0ubWFwKG5leHQsXzE4MCk7DQp9fTsNCn0saWZpbHRlcjpmdW5jdGlvbihwcmVkLHNlcSl7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0Kc2VxPU1vY2hpS2l0Lkl0ZXIuaXRlcihzZXEpOw0KaWYocHJlZD09PW51bGwpew0KcHJlZD1tLm9wZXJhdG9yLnRydXRoOw0KfQ0KcmV0dXJuIHtyZXByOmZ1bmN0aW9uKCl7DQpyZXR1cm4gImlmaWx0ZXIoLi4uKSI7DQp9LHRvU3RyaW5nOm0uZm9yd2FyZENhbGwoInJlcHIiKSxuZXh0OmZ1bmN0aW9uKCl7DQp3aGlsZSh0cnVlKXsNCnZhciBydmFsPXNlcS5uZXh0KCk7DQppZihwcmVkKHJ2YWwpKXsNCnJldHVybiBydmFsOw0KfQ0KfQ0KcmV0dXJuIHVuZGVmaW5lZDsNCn19Ow0KfSxpZmlsdGVyZmFsc2U6ZnVuY3Rpb24ocHJlZCxzZXEpew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnNlcT1Nb2NoaUtpdC5JdGVyLml0ZXIoc2VxKTsNCmlmKHByZWQ9PT1udWxsKXsNCnByZWQ9bS5vcGVyYXRvci50cnV0aDsNCn0NCnJldHVybiB7cmVwcjpmdW5jdGlvbigpew0KcmV0dXJuICJpZmlsdGVyZmFsc2UoLi4uKSI7DQp9LHRvU3RyaW5nOm0uZm9yd2FyZENhbGwoInJlcHIiKSxuZXh0OmZ1bmN0aW9uKCl7DQp3aGlsZSh0cnVlKXsNCnZhciBydmFsPXNlcS5uZXh0KCk7DQppZighcHJlZChydmFsKSl7DQpyZXR1cm4gcnZhbDsNCn0NCn0NCnJldHVybiB1bmRlZmluZWQ7DQp9fTsNCn0saXNsaWNlOmZ1bmN0aW9uKHNlcSl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5JdGVyOw0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnNlcT1zZWxmLml0ZXIoc2VxKTsNCnZhciBfMThjPTA7DQp2YXIgc3RvcD0wOw0KdmFyIHN0ZXA9MTsNCnZhciBpPS0xOw0KaWYoYXJndW1lbnRzLmxlbmd0aD09Mil7DQpzdG9wPWFyZ3VtZW50c1sxXTsNCn1lbHNlew0KaWYoYXJndW1lbnRzLmxlbmd0aD09Myl7DQpfMThjPWFyZ3VtZW50c1sxXTsNCnN0b3A9YXJndW1lbnRzWzJdOw0KfWVsc2V7DQpfMThjPWFyZ3VtZW50c1sxXTsNCnN0b3A9YXJndW1lbnRzWzJdOw0Kc3RlcD1hcmd1bWVudHNbM107DQp9DQp9DQpyZXR1cm4ge3JlcHI6ZnVuY3Rpb24oKXsNCnJldHVybiAiaXNsaWNlKCIrWyIuLi4iLF8xOGMsc3RvcCxzdGVwXS5qb2luKCIsICIpKyIpIjsNCn0sdG9TdHJpbmc6bS5mb3J3YXJkQ2FsbCgicmVwciIpLG5leHQ6ZnVuY3Rpb24oKXsNCnZhciBydmFsOw0Kd2hpbGUoaTxfMThjKXsNCnJ2YWw9c2VxLm5leHQoKTsNCmkrKzsNCn0NCmlmKF8xOGM+PXN0b3Apew0KdGhyb3cgc2VsZi5TdG9wSXRlcmF0aW9uOw0KfQ0KXzE4Yys9c3RlcDsNCnJldHVybiBydmFsOw0KfX07DQp9LGltYXA6ZnVuY3Rpb24oZnVuLHAscSl7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KdmFyIHNlbGY9TW9jaGlLaXQuSXRlcjsNCnZhciBfMTk2PW0ubWFwKHNlbGYuaXRlcixtLmV4dGVuZChudWxsLGFyZ3VtZW50cywxKSk7DQp2YXIgbWFwPW0ubWFwOw0KdmFyIG5leHQ9c2VsZi5uZXh0Ow0KcmV0dXJuIHtyZXByOmZ1bmN0aW9uKCl7DQpyZXR1cm4gImltYXAoLi4uKSI7DQp9LHRvU3RyaW5nOm0uZm9yd2FyZENhbGwoInJlcHIiKSxuZXh0OmZ1bmN0aW9uKCl7DQpyZXR1cm4gZnVuLmFwcGx5KHRoaXMsbWFwKG5leHQsXzE5NikpOw0KfX07DQp9LGFwcGx5bWFwOmZ1bmN0aW9uKGZ1bixzZXEsc2VsZil7DQpzZXE9TW9jaGlLaXQuSXRlci5pdGVyKHNlcSk7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KcmV0dXJuIHtyZXByOmZ1bmN0aW9uKCl7DQpyZXR1cm4gImFwcGx5bWFwKC4uLikiOw0KfSx0b1N0cmluZzptLmZvcndhcmRDYWxsKCJyZXByIiksbmV4dDpmdW5jdGlvbigpew0KcmV0dXJuIGZ1bi5hcHBseShzZWxmLHNlcS5uZXh0KCkpOw0KfX07DQp9LGNoYWluOmZ1bmN0aW9uKHAscSl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5JdGVyOw0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCmlmKGFyZ3VtZW50cy5sZW5ndGg9PTEpew0KcmV0dXJuIHNlbGYuaXRlcihhcmd1bWVudHNbMF0pOw0KfQ0KdmFyIF8xYTE9bS5tYXAoc2VsZi5pdGVyLGFyZ3VtZW50cyk7DQpyZXR1cm4ge3JlcHI6ZnVuY3Rpb24oKXsNCnJldHVybiAiY2hhaW4oLi4uKSI7DQp9LHRvU3RyaW5nOm0uZm9yd2FyZENhbGwoInJlcHIiKSxuZXh0OmZ1bmN0aW9uKCl7DQp3aGlsZShfMWExLmxlbmd0aD4xKXsNCnRyeXsNCnZhciBfMWEyPV8xYTFbMF0ubmV4dCgpOw0KcmV0dXJuIF8xYTI7DQp9DQpjYXRjaChlKXsNCmlmKGUhPXNlbGYuU3RvcEl0ZXJhdGlvbil7DQp0aHJvdyBlOw0KfQ0KXzFhMS5zaGlmdCgpOw0KdmFyIF8xYTI9XzFhMVswXS5uZXh0KCk7DQpyZXR1cm4gXzFhMjsNCn0NCn0NCmlmKF8xYTEubGVuZ3RoPT0xKXsNCnZhciBhcmc9XzFhMS5zaGlmdCgpOw0KdGhpcy5uZXh0PW0uYmluZCgibmV4dCIsYXJnKTsNCnJldHVybiB0aGlzLm5leHQoKTsNCn0NCnRocm93IHNlbGYuU3RvcEl0ZXJhdGlvbjsNCn19Ow0KfSx0YWtld2hpbGU6ZnVuY3Rpb24ocHJlZCxzZXEpew0KdmFyIHNlbGY9TW9jaGlLaXQuSXRlcjsNCnNlcT1zZWxmLml0ZXIoc2VxKTsNCnJldHVybiB7cmVwcjpmdW5jdGlvbigpew0KcmV0dXJuICJ0YWtld2hpbGUoLi4uKSI7DQp9LHRvU3RyaW5nOk1vY2hpS2l0LkJhc2UuZm9yd2FyZENhbGwoInJlcHIiKSxuZXh0OmZ1bmN0aW9uKCl7DQp2YXIgcnZhbD1zZXEubmV4dCgpOw0KaWYoIXByZWQocnZhbCkpew0KdGhpcy5uZXh0PWZ1bmN0aW9uKCl7DQp0aHJvdyBzZWxmLlN0b3BJdGVyYXRpb247DQp9Ow0KdGhpcy5uZXh0KCk7DQp9DQpyZXR1cm4gcnZhbDsNCn19Ow0KfSxkcm9wd2hpbGU6ZnVuY3Rpb24ocHJlZCxzZXEpew0Kc2VxPU1vY2hpS2l0Lkl0ZXIuaXRlcihzZXEpOw0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnZhciBiaW5kPW0uYmluZDsNCnJldHVybiB7InJlcHIiOmZ1bmN0aW9uKCl7DQpyZXR1cm4gImRyb3B3aGlsZSguLi4pIjsNCn0sInRvU3RyaW5nIjptLmZvcndhcmRDYWxsKCJyZXByIiksIm5leHQiOmZ1bmN0aW9uKCl7DQp3aGlsZSh0cnVlKXsNCnZhciBydmFsPXNlcS5uZXh0KCk7DQppZighcHJlZChydmFsKSl7DQpicmVhazsNCn0NCn0NCnRoaXMubmV4dD1iaW5kKCJuZXh0IixzZXEpOw0KcmV0dXJuIHJ2YWw7DQp9fTsNCn0sX3RlZTpmdW5jdGlvbihfMWFkLHN5bmMsXzFhZil7DQpzeW5jLnBvc1tfMWFkXT0tMTsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQp2YXIgXzFiMT1tLmxpc3RNaW47DQpyZXR1cm4ge3JlcHI6ZnVuY3Rpb24oKXsNCnJldHVybiAidGVlKCIrXzFhZCsiLCAuLi4pIjsNCn0sdG9TdHJpbmc6bS5mb3J3YXJkQ2FsbCgicmVwciIpLG5leHQ6ZnVuY3Rpb24oKXsNCnZhciBydmFsOw0KdmFyIGk9c3luYy5wb3NbXzFhZF07DQppZihpPT1zeW5jLm1heCl7DQpydmFsPV8xYWYubmV4dCgpOw0Kc3luYy5kZXF1ZS5wdXNoKHJ2YWwpOw0Kc3luYy5tYXgrPTE7DQpzeW5jLnBvc1tfMWFkXSs9MTsNCn1lbHNlew0KcnZhbD1zeW5jLmRlcXVlW2ktc3luYy5taW5dOw0Kc3luYy5wb3NbXzFhZF0rPTE7DQppZihpPT1zeW5jLm1pbiYmXzFiMShzeW5jLnBvcykhPXN5bmMubWluKXsNCnN5bmMubWluKz0xOw0Kc3luYy5kZXF1ZS5zaGlmdCgpOw0KfQ0KfQ0KcmV0dXJuIHJ2YWw7DQp9fTsNCn0sdGVlOmZ1bmN0aW9uKF8xYjQsbil7DQp2YXIgcnZhbD1bXTsNCnZhciBzeW5jPXsicG9zIjpbXSwiZGVxdWUiOltdLCJtYXgiOi0xLCJtaW4iOi0xfTsNCmlmKGFyZ3VtZW50cy5sZW5ndGg9PTF8fHR5cGVvZiAobik9PSJ1bmRlZmluZWQifHxuPT09bnVsbCl7DQpuPTI7DQp9DQp2YXIgc2VsZj1Nb2NoaUtpdC5JdGVyOw0KXzFiND1zZWxmLml0ZXIoXzFiNCk7DQp2YXIgX3RlZT1zZWxmLl90ZWU7DQpmb3IodmFyIGk9MDtpPG47aSsrKXsNCnJ2YWwucHVzaChfdGVlKGksc3luYyxfMWI0KSk7DQp9DQpyZXR1cm4gcnZhbDsNCn0sbGlzdDpmdW5jdGlvbihfMWJiKXsNCnZhciBydmFsOw0KaWYoXzFiYiBpbnN0YW5jZW9mIEFycmF5KXsNCnJldHVybiBfMWJiLnNsaWNlKCk7DQp9DQppZih0eXBlb2YgKF8xYmIpPT0iZnVuY3Rpb24iJiYhKF8xYmIgaW5zdGFuY2VvZiBGdW5jdGlvbikmJnR5cGVvZiAoXzFiYi5sZW5ndGgpPT0ibnVtYmVyIil7DQpydmFsPVtdOw0KZm9yKHZhciBpPTA7aTxfMWJiLmxlbmd0aDtpKyspew0KcnZhbC5wdXNoKF8xYmJbaV0pOw0KfQ0KcmV0dXJuIHJ2YWw7DQp9DQp2YXIgc2VsZj1Nb2NoaUtpdC5JdGVyOw0KXzFiYj1zZWxmLml0ZXIoXzFiYik7DQp2YXIgcnZhbD1bXTsNCnZhciBfMWJmOw0KdHJ5ew0Kd2hpbGUodHJ1ZSl7DQpfMWJmPV8xYmIubmV4dCgpOw0KcnZhbC5wdXNoKF8xYmYpOw0KfQ0KfQ0KY2F0Y2goZSl7DQppZihlIT1zZWxmLlN0b3BJdGVyYXRpb24pew0KdGhyb3cgZTsNCn0NCnJldHVybiBydmFsOw0KfQ0KcmV0dXJuIHVuZGVmaW5lZDsNCn0scmVkdWNlOmZ1bmN0aW9uKGZuLF8xYzEsXzFjMil7DQp2YXIgaT0wOw0KdmFyIHg9XzFjMjsNCnZhciBzZWxmPU1vY2hpS2l0Lkl0ZXI7DQpfMWMxPXNlbGYuaXRlcihfMWMxKTsNCmlmKGFyZ3VtZW50cy5sZW5ndGg8Myl7DQp0cnl7DQp4PV8xYzEubmV4dCgpOw0KfQ0KY2F0Y2goZSl7DQppZihlPT1zZWxmLlN0b3BJdGVyYXRpb24pew0KZT1uZXcgVHlwZUVycm9yKCJyZWR1Y2UoKSBvZiBlbXB0eSBzZXF1ZW5jZSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTsNCn0NCnRocm93IGU7DQp9DQppKys7DQp9DQp0cnl7DQp3aGlsZSh0cnVlKXsNCng9Zm4oeCxfMWMxLm5leHQoKSk7DQp9DQp9DQpjYXRjaChlKXsNCmlmKGUhPXNlbGYuU3RvcEl0ZXJhdGlvbil7DQp0aHJvdyBlOw0KfQ0KfQ0KcmV0dXJuIHg7DQp9LHJhbmdlOmZ1bmN0aW9uKCl7DQp2YXIgXzFjNj0wOw0KdmFyIHN0b3A9MDsNCnZhciBzdGVwPTE7DQppZihhcmd1bWVudHMubGVuZ3RoPT0xKXsNCnN0b3A9YXJndW1lbnRzWzBdOw0KfWVsc2V7DQppZihhcmd1bWVudHMubGVuZ3RoPT0yKXsNCl8xYzY9YXJndW1lbnRzWzBdOw0Kc3RvcD1hcmd1bWVudHNbMV07DQp9ZWxzZXsNCmlmKGFyZ3VtZW50cy5sZW5ndGg9PTMpew0KXzFjNj1hcmd1bWVudHNbMF07DQpzdG9wPWFyZ3VtZW50c1sxXTsNCnN0ZXA9YXJndW1lbnRzWzJdOw0KfWVsc2V7DQp0aHJvdyBuZXcgVHlwZUVycm9yKCJyYW5nZSgpIHRha2VzIDEsIDIsIG9yIDMgYXJndW1lbnRzISIpOw0KfQ0KfQ0KfQ0KaWYoc3RlcD09PTApew0KdGhyb3cgbmV3IFR5cGVFcnJvcigicmFuZ2UoKSBzdGVwIG11c3Qgbm90IGJlIDAiKTsNCn0NCnJldHVybiB7bmV4dDpmdW5jdGlvbigpew0KaWYoKHN0ZXA+MCYmXzFjNj49c3RvcCl8fChzdGVwPDAmJl8xYzY8PXN0b3ApKXsNCnRocm93IE1vY2hpS2l0Lkl0ZXIuU3RvcEl0ZXJhdGlvbjsNCn0NCnZhciBydmFsPV8xYzY7DQpfMWM2Kz1zdGVwOw0KcmV0dXJuIHJ2YWw7DQp9LHJlcHI6ZnVuY3Rpb24oKXsNCnJldHVybiAicmFuZ2UoIitbXzFjNixzdG9wLHN0ZXBdLmpvaW4oIiwgIikrIikiOw0KfSx0b1N0cmluZzpNb2NoaUtpdC5CYXNlLmZvcndhcmRDYWxsKCJyZXByIil9Ow0KfSxzdW06ZnVuY3Rpb24oXzFjYSxfMWNiKXsNCmlmKHR5cGVvZiAoXzFjYik9PSJ1bmRlZmluZWQifHxfMWNiPT09bnVsbCl7DQpfMWNiPTA7DQp9DQp2YXIgeD1fMWNiOw0KdmFyIHNlbGY9TW9jaGlLaXQuSXRlcjsNCl8xY2E9c2VsZi5pdGVyKF8xY2EpOw0KdHJ5ew0Kd2hpbGUodHJ1ZSl7DQp4Kz1fMWNhLm5leHQoKTsNCn0NCn0NCmNhdGNoKGUpew0KaWYoZSE9c2VsZi5TdG9wSXRlcmF0aW9uKXsNCnRocm93IGU7DQp9DQp9DQpyZXR1cm4geDsNCn0sZXhoYXVzdDpmdW5jdGlvbihfMWNlKXsNCnZhciBzZWxmPU1vY2hpS2l0Lkl0ZXI7DQpfMWNlPXNlbGYuaXRlcihfMWNlKTsNCnRyeXsNCndoaWxlKHRydWUpew0KXzFjZS5uZXh0KCk7DQp9DQp9DQpjYXRjaChlKXsNCmlmKGUhPXNlbGYuU3RvcEl0ZXJhdGlvbil7DQp0aHJvdyBlOw0KfQ0KfQ0KfSxmb3JFYWNoOmZ1bmN0aW9uKF8xZDAsZnVuYyxvYmopew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnZhciBzZWxmPU1vY2hpS2l0Lkl0ZXI7DQppZihhcmd1bWVudHMubGVuZ3RoPjIpew0KZnVuYz1tLmJpbmQoZnVuYyxvYmopOw0KfQ0KaWYobS5pc0FycmF5TGlrZShfMWQwKSYmIXNlbGYuaXNJdGVyYWJsZShfMWQwKSl7DQp0cnl7DQpmb3IodmFyIGk9MDtpPF8xZDAubGVuZ3RoO2krKyl7DQpmdW5jKF8xZDBbaV0pOw0KfQ0KfQ0KY2F0Y2goZSl7DQppZihlIT1zZWxmLlN0b3BJdGVyYXRpb24pew0KdGhyb3cgZTsNCn0NCn0NCn1lbHNlew0Kc2VsZi5leGhhdXN0KHNlbGYuaW1hcChmdW5jLF8xZDApKTsNCn0NCn0sZXZlcnk6ZnVuY3Rpb24oXzFkNixmdW5jKXsNCnZhciBzZWxmPU1vY2hpS2l0Lkl0ZXI7DQp0cnl7DQpzZWxmLmlmaWx0ZXJmYWxzZShmdW5jLF8xZDYpLm5leHQoKTsNCnJldHVybiBmYWxzZTsNCn0NCmNhdGNoKGUpew0KaWYoZSE9c2VsZi5TdG9wSXRlcmF0aW9uKXsNCnRocm93IGU7DQp9DQpyZXR1cm4gdHJ1ZTsNCn0NCn0sc29ydGVkOmZ1bmN0aW9uKF8xZDksY21wKXsNCnZhciBydmFsPU1vY2hpS2l0Lkl0ZXIubGlzdChfMWQ5KTsNCmlmKGFyZ3VtZW50cy5sZW5ndGg9PTEpew0KY21wPU1vY2hpS2l0LkJhc2UuY29tcGFyZTsNCn0NCnJ2YWwuc29ydChjbXApOw0KcmV0dXJuIHJ2YWw7DQp9LHJldmVyc2VkOmZ1bmN0aW9uKF8xZGMpew0KdmFyIHJ2YWw9TW9jaGlLaXQuSXRlci5saXN0KF8xZGMpOw0KcnZhbC5yZXZlcnNlKCk7DQpyZXR1cm4gcnZhbDsNCn0sc29tZTpmdW5jdGlvbihfMWRlLGZ1bmMpew0KdmFyIHNlbGY9TW9jaGlLaXQuSXRlcjsNCnRyeXsNCnNlbGYuaWZpbHRlcihmdW5jLF8xZGUpLm5leHQoKTsNCnJldHVybiB0cnVlOw0KfQ0KY2F0Y2goZSl7DQppZihlIT1zZWxmLlN0b3BJdGVyYXRpb24pew0KdGhyb3cgZTsNCn0NCnJldHVybiBmYWxzZTsNCn0NCn0saWV4dGVuZDpmdW5jdGlvbihsc3QsXzFlMil7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KdmFyIHNlbGY9TW9jaGlLaXQuSXRlcjsNCmlmKG0uaXNBcnJheUxpa2UoXzFlMikmJiFzZWxmLmlzSXRlcmFibGUoXzFlMikpew0KZm9yKHZhciBpPTA7aTxfMWUyLmxlbmd0aDtpKyspew0KbHN0LnB1c2goXzFlMltpXSk7DQp9DQp9ZWxzZXsNCl8xZTI9c2VsZi5pdGVyKF8xZTIpOw0KdHJ5ew0Kd2hpbGUodHJ1ZSl7DQpsc3QucHVzaChfMWUyLm5leHQoKSk7DQp9DQp9DQpjYXRjaChlKXsNCmlmKGUhPXNlbGYuU3RvcEl0ZXJhdGlvbil7DQp0aHJvdyBlOw0KfQ0KfQ0KfQ0KcmV0dXJuIGxzdDsNCn0sZ3JvdXBieTpmdW5jdGlvbihfMWU2LF8xZTcpew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnZhciBzZWxmPU1vY2hpS2l0Lkl0ZXI7DQppZihhcmd1bWVudHMubGVuZ3RoPDIpew0KXzFlNz1tLm9wZXJhdG9yLmlkZW50aXR5Ow0KfQ0KXzFlNj1zZWxmLml0ZXIoXzFlNik7DQp2YXIgcGs9dW5kZWZpbmVkOw0KdmFyIGs9dW5kZWZpbmVkOw0KdmFyIHY7DQpmdW5jdGlvbiBmZXRjaCgpew0Kdj1fMWU2Lm5leHQoKTsNCms9XzFlNyh2KTsNCn0NCmZ1bmN0aW9uIGVhdCgpew0KdmFyIHJldD12Ow0Kdj11bmRlZmluZWQ7DQpyZXR1cm4gcmV0Ow0KfQ0KdmFyIF8xZWU9dHJ1ZTsNCnZhciBfMWVmPW0uY29tcGFyZTsNCnJldHVybiB7cmVwcjpmdW5jdGlvbigpew0KcmV0dXJuICJncm91cGJ5KC4uLikiOw0KfSxuZXh0OmZ1bmN0aW9uKCl7DQp3aGlsZShfMWVmKGsscGspPT09MCl7DQpmZXRjaCgpOw0KaWYoXzFlZSl7DQpfMWVlPWZhbHNlOw0KYnJlYWs7DQp9DQp9DQpwaz1rOw0KcmV0dXJuIFtrLHtuZXh0OmZ1bmN0aW9uKCl7DQppZih2PT11bmRlZmluZWQpew0KZmV0Y2goKTsNCn0NCmlmKF8xZWYoayxwaykhPT0wKXsNCnRocm93IHNlbGYuU3RvcEl0ZXJhdGlvbjsNCn0NCnJldHVybiBlYXQoKTsNCn19XTsNCn19Ow0KfSxncm91cGJ5X2FzX2FycmF5OmZ1bmN0aW9uKF8xZjAsXzFmMSl7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KdmFyIHNlbGY9TW9jaGlLaXQuSXRlcjsNCmlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7DQpfMWYxPW0ub3BlcmF0b3IuaWRlbnRpdHk7DQp9DQpfMWYwPXNlbGYuaXRlcihfMWYwKTsNCnZhciBfMWY0PVtdOw0KdmFyIF8xZjU9dHJ1ZTsNCnZhciBfMWY2Ow0KdmFyIF8xZjc9bS5jb21wYXJlOw0Kd2hpbGUodHJ1ZSl7DQp0cnl7DQp2YXIgXzFmOD1fMWYwLm5leHQoKTsNCnZhciBrZXk9XzFmMShfMWY4KTsNCn0NCmNhdGNoKGUpew0KaWYoZT09c2VsZi5TdG9wSXRlcmF0aW9uKXsNCmJyZWFrOw0KfQ0KdGhyb3cgZTsNCn0NCmlmKF8xZjV8fF8xZjcoa2V5LF8xZjYpIT09MCl7DQp2YXIgXzFmYT1bXTsNCl8xZjQucHVzaChba2V5LF8xZmFdKTsNCn0NCl8xZmEucHVzaChfMWY4KTsNCl8xZjU9ZmFsc2U7DQpfMWY2PWtleTsNCn0NCnJldHVybiBfMWY0Ow0KfSxhcnJheUxpa2VJdGVyOmZ1bmN0aW9uKF8xZmIpew0KdmFyIGk9MDsNCnJldHVybiB7cmVwcjpmdW5jdGlvbigpew0KcmV0dXJuICJhcnJheUxpa2VJdGVyKC4uLikiOw0KfSx0b1N0cmluZzpNb2NoaUtpdC5CYXNlLmZvcndhcmRDYWxsKCJyZXByIiksbmV4dDpmdW5jdGlvbigpew0KaWYoaT49XzFmYi5sZW5ndGgpew0KdGhyb3cgTW9jaGlLaXQuSXRlci5TdG9wSXRlcmF0aW9uOw0KfQ0KcmV0dXJuIF8xZmJbaSsrXTsNCn19Ow0KfSxoYXNJdGVyYXRlTmV4dDpmdW5jdGlvbihfMWZkKXsNCnJldHVybiAoXzFmZCYmdHlwZW9mIChfMWZkLml0ZXJhdGVOZXh0KT09ImZ1bmN0aW9uIik7DQp9LGl0ZXJhdGVOZXh0SXRlcjpmdW5jdGlvbihfMWZlKXsNCnJldHVybiB7cmVwcjpmdW5jdGlvbigpew0KcmV0dXJuICJpdGVyYXRlTmV4dEl0ZXIoLi4uKSI7DQp9LHRvU3RyaW5nOk1vY2hpS2l0LkJhc2UuZm9yd2FyZENhbGwoInJlcHIiKSxuZXh0OmZ1bmN0aW9uKCl7DQp2YXIgcnZhbD1fMWZlLml0ZXJhdGVOZXh0KCk7DQppZihydmFsPT09bnVsbHx8cnZhbD09PXVuZGVmaW5lZCl7DQp0aHJvdyBNb2NoaUtpdC5JdGVyLlN0b3BJdGVyYXRpb247DQp9DQpyZXR1cm4gcnZhbDsNCn19Ow0KfX0pOw0KTW9jaGlLaXQuSXRlci5fX25ld19fPWZ1bmN0aW9uKCl7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KaWYodHlwZW9mIChTdG9wSXRlcmF0aW9uKSE9InVuZGVmaW5lZCIpew0KdGhpcy5TdG9wSXRlcmF0aW9uPVN0b3BJdGVyYXRpb247DQp9ZWxzZXsNCnRoaXMuU3RvcEl0ZXJhdGlvbj1uZXcgbS5OYW1lZEVycm9yKCJTdG9wSXRlcmF0aW9uIik7DQp9DQp0aGlzLml0ZXJhdG9yUmVnaXN0cnk9bmV3IG0uQWRhcHRlclJlZ2lzdHJ5KCk7DQp0aGlzLnJlZ2lzdGVySXRlcmF0b3JGYWN0b3J5KCJhcnJheUxpa2UiLG0uaXNBcnJheUxpa2UsdGhpcy5hcnJheUxpa2VJdGVyKTsNCnRoaXMucmVnaXN0ZXJJdGVyYXRvckZhY3RvcnkoIml0ZXJhdGVOZXh0Iix0aGlzLmhhc0l0ZXJhdGVOZXh0LHRoaXMuaXRlcmF0ZU5leHRJdGVyKTsNCm0ubmFtZUZ1bmN0aW9ucyh0aGlzKTsNCn07DQpNb2NoaUtpdC5JdGVyLl9fbmV3X18oKTsNCmlmKE1vY2hpS2l0Ll9fZXhwb3J0X18pew0KcmVkdWNlPU1vY2hpS2l0Lkl0ZXIucmVkdWNlOw0KfQ0KTW9jaGlLaXQuQmFzZS5fZXhwb3J0U3ltYm9scyh0aGlzLE1vY2hpS2l0Lkl0ZXIpOw0KTW9jaGlLaXQuQmFzZS5fbW9kdWxlKCJMb2dnaW5nIiwiMS41IixbIkJhc2UiXSk7DQpNb2NoaUtpdC5Mb2dnaW5nLkxvZ01lc3NhZ2U9ZnVuY3Rpb24obnVtLF8yMDIsaW5mbyl7DQp0aGlzLm51bT1udW07DQp0aGlzLmxldmVsPV8yMDI7DQp0aGlzLmluZm89aW5mbzsNCnRoaXMudGltZXN0YW1wPW5ldyBEYXRlKCk7DQp9Ow0KTW9jaGlLaXQuTG9nZ2luZy5Mb2dNZXNzYWdlLnByb3RvdHlwZT17cmVwcjpmdW5jdGlvbigpew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnJldHVybiAiTG9nTWVzc2FnZSgiK20ubWFwKG0ucmVwcixbdGhpcy5udW0sdGhpcy5sZXZlbCx0aGlzLmluZm9dKS5qb2luKCIsICIpKyIpIjsNCn0sdG9TdHJpbmc6TW9jaGlLaXQuQmFzZS5mb3J3YXJkQ2FsbCgicmVwciIpfTsNCk1vY2hpS2l0LkJhc2UudXBkYXRlKE1vY2hpS2l0LkxvZ2dpbmcse2xvZ0xldmVsQXRMZWFzdDpmdW5jdGlvbihfMjA1KXsNCnZhciBzZWxmPU1vY2hpS2l0LkxvZ2dpbmc7DQppZih0eXBlb2YgKF8yMDUpPT0ic3RyaW5nIil7DQpfMjA1PXNlbGYuTG9nTGV2ZWxbXzIwNV07DQp9DQpyZXR1cm4gZnVuY3Rpb24obXNnKXsNCnZhciBfMjA4PW1zZy5sZXZlbDsNCmlmKHR5cGVvZiAoXzIwOCk9PSJzdHJpbmciKXsNCl8yMDg9c2VsZi5Mb2dMZXZlbFtfMjA4XTsNCn0NCnJldHVybiBfMjA4Pj1fMjA1Ow0KfTsNCn0saXNMb2dNZXNzYWdlOmZ1bmN0aW9uKCl7DQp2YXIgXzIwOT1Nb2NoaUtpdC5Mb2dnaW5nLkxvZ01lc3NhZ2U7DQpmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsNCmlmKCEoYXJndW1lbnRzW2ldIGluc3RhbmNlb2YgXzIwOSkpew0KcmV0dXJuIGZhbHNlOw0KfQ0KfQ0KcmV0dXJuIHRydWU7DQp9LGNvbXBhcmVMb2dNZXNzYWdlOmZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gTW9jaGlLaXQuQmFzZS5jb21wYXJlKFthLmxldmVsLGEuaW5mb10sW2IubGV2ZWwsYi5pbmZvXSk7DQp9LGFsZXJ0TGlzdGVuZXI6ZnVuY3Rpb24obXNnKXsNCmFsZXJ0KCJudW06ICIrbXNnLm51bSsiXG5sZXZlbDogIittc2cubGV2ZWwrIlxuaW5mbzogIittc2cuaW5mby5qb2luKCIgIikpOw0KfX0pOw0KTW9jaGlLaXQuTG9nZ2luZy5Mb2dnZXI9ZnVuY3Rpb24oXzIwZSl7DQp0aGlzLmNvdW50ZXI9MDsNCmlmKHR5cGVvZiAoXzIwZSk9PSJ1bmRlZmluZWQifHxfMjBlPT09bnVsbCl7DQpfMjBlPS0xOw0KfQ0KdGhpcy5tYXhTaXplPV8yMGU7DQp0aGlzLl9tZXNzYWdlcz1bXTsNCnRoaXMubGlzdGVuZXJzPXt9Ow0KdGhpcy51c2VOYXRpdmVDb25zb2xlPWZhbHNlOw0KfTsNCk1vY2hpS2l0LkxvZ2dpbmcuTG9nZ2VyLnByb3RvdHlwZT17Y2xlYXI6ZnVuY3Rpb24oKXsNCnRoaXMuX21lc3NhZ2VzLnNwbGljZSgwLHRoaXMuX21lc3NhZ2VzLmxlbmd0aCk7DQp9LGxvZ1RvQ29uc29sZTpmdW5jdGlvbihtc2cpew0KaWYodHlwZW9mICh3aW5kb3cpIT0idW5kZWZpbmVkIiYmd2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZyl7DQp3aW5kb3cuY29uc29sZS5sb2cobXNnLnJlcGxhY2UoLyUvZywiXHVmZjA1IikpOw0KfWVsc2V7DQppZih0eXBlb2YgKG9wZXJhKSE9InVuZGVmaW5lZCImJm9wZXJhLnBvc3RFcnJvcil7DQpvcGVyYS5wb3N0RXJyb3IobXNnKTsNCn1lbHNlew0KaWYodHlwZW9mIChEZWJ1ZykhPSJ1bmRlZmluZWQiJiZEZWJ1Zy53cml0ZWxuKXsNCkRlYnVnLndyaXRlbG4obXNnKTsNCn1lbHNlew0KaWYodHlwZW9mIChkZWJ1ZykhPSJ1bmRlZmluZWQiJiZkZWJ1Zy50cmFjZSl7DQpkZWJ1Zy50cmFjZShtc2cpOw0KfQ0KfQ0KfQ0KfQ0KfSxkaXNwYXRjaExpc3RlbmVyczpmdW5jdGlvbihtc2cpew0KZm9yKHZhciBrIGluIHRoaXMubGlzdGVuZXJzKXsNCnZhciBwYWlyPXRoaXMubGlzdGVuZXJzW2tdOw0KaWYocGFpci5pZGVudCE9a3x8KHBhaXJbMF0mJiFwYWlyWzBdKG1zZykpKXsNCmNvbnRpbnVlOw0KfQ0KcGFpclsxXShtc2cpOw0KfQ0KfSxhZGRMaXN0ZW5lcjpmdW5jdGlvbihfMjEzLF8yMTQsXzIxNSl7DQppZih0eXBlb2YgKF8yMTQpPT0ic3RyaW5nIil7DQpfMjE0PU1vY2hpS2l0LkxvZ2dpbmcubG9nTGV2ZWxBdExlYXN0KF8yMTQpOw0KfQ0KdmFyIF8yMTY9W18yMTQsXzIxNV07DQpfMjE2LmlkZW50PV8yMTM7DQp0aGlzLmxpc3RlbmVyc1tfMjEzXT1fMjE2Ow0KfSxyZW1vdmVMaXN0ZW5lcjpmdW5jdGlvbihfMjE3KXsNCmRlbGV0ZSB0aGlzLmxpc3RlbmVyc1tfMjE3XTsNCn0sYmFzZUxvZzpmdW5jdGlvbihfMjE4LF8yMTkpew0KaWYodHlwZW9mIChfMjE4KT09Im51bWJlciIpew0KaWYoXzIxOD49TW9jaGlLaXQuTG9nZ2luZy5Mb2dMZXZlbC5GQVRBTCl7DQpfMjE4PSJGQVRBTCI7DQp9ZWxzZXsNCmlmKF8yMTg+PU1vY2hpS2l0LkxvZ2dpbmcuTG9nTGV2ZWwuRVJST1Ipew0KXzIxOD0iRVJST1IiOw0KfWVsc2V7DQppZihfMjE4Pj1Nb2NoaUtpdC5Mb2dnaW5nLkxvZ0xldmVsLldBUk5JTkcpew0KXzIxOD0iV0FSTklORyI7DQp9ZWxzZXsNCmlmKF8yMTg+PU1vY2hpS2l0LkxvZ2dpbmcuTG9nTGV2ZWwuSU5GTyl7DQpfMjE4PSJJTkZPIjsNCn1lbHNlew0KXzIxOD0iREVCVUciOw0KfQ0KfQ0KfQ0KfQ0KfQ0KdmFyIG1zZz1uZXcgTW9jaGlLaXQuTG9nZ2luZy5Mb2dNZXNzYWdlKHRoaXMuY291bnRlcixfMjE4LE1vY2hpS2l0LkJhc2UuZXh0ZW5kKG51bGwsYXJndW1lbnRzLDEpKTsNCnRoaXMuX21lc3NhZ2VzLnB1c2gobXNnKTsNCnRoaXMuZGlzcGF0Y2hMaXN0ZW5lcnMobXNnKTsNCmlmKHRoaXMudXNlTmF0aXZlQ29uc29sZSl7DQp0aGlzLmxvZ1RvQ29uc29sZShtc2cubGV2ZWwrIjogIittc2cuaW5mby5qb2luKCIgIikpOw0KfQ0KdGhpcy5jb3VudGVyKz0xOw0Kd2hpbGUodGhpcy5tYXhTaXplPj0wJiZ0aGlzLl9tZXNzYWdlcy5sZW5ndGg+dGhpcy5tYXhTaXplKXsNCnRoaXMuX21lc3NhZ2VzLnNoaWZ0KCk7DQp9DQp9LGdldE1lc3NhZ2VzOmZ1bmN0aW9uKF8yMWIpew0KdmFyIF8yMWM9MDsNCmlmKCEodHlwZW9mIChfMjFiKT09InVuZGVmaW5lZCJ8fF8yMWI9PT1udWxsKSl7DQpfMjFjPU1hdGgubWF4KDAsdGhpcy5fbWVzc2FnZXMubGVuZ3RoLV8yMWIpOw0KfQ0KcmV0dXJuIHRoaXMuX21lc3NhZ2VzLnNsaWNlKF8yMWMpOw0KfSxnZXRNZXNzYWdlVGV4dDpmdW5jdGlvbihfMjFkKXsNCmlmKHR5cGVvZiAoXzIxZCk9PSJ1bmRlZmluZWQifHxfMjFkPT09bnVsbCl7DQpfMjFkPTMwOw0KfQ0KdmFyIF8yMWU9dGhpcy5nZXRNZXNzYWdlcyhfMjFkKTsNCmlmKF8yMWUubGVuZ3RoKXsNCnZhciBsc3Q9TW9jaGlLaXQuQmFzZS5tYXAoZnVuY3Rpb24obSl7DQpyZXR1cm4gIlxuICBbIittLm51bSsiXSAiK20ubGV2ZWwrIjogIittLmluZm8uam9pbigiICIpOw0KfSxfMjFlKTsNCmxzdC51bnNoaWZ0KCJMQVNUICIrXzIxZS5sZW5ndGgrIiBNRVNTQUdFUzoiKTsNCnJldHVybiBsc3Quam9pbigiIik7DQp9DQpyZXR1cm4gIiI7DQp9LGRlYnVnZ2luZ0Jvb2ttYXJrbGV0OmZ1bmN0aW9uKF8yMjEpew0KaWYodHlwZW9mIChNb2NoaUtpdC5Mb2dnaW5nUGFuZSk9PSJ1bmRlZmluZWQiKXsNCmFsZXJ0KHRoaXMuZ2V0TWVzc2FnZVRleHQoKSk7DQp9ZWxzZXsNCk1vY2hpS2l0LkxvZ2dpbmdQYW5lLmNyZWF0ZUxvZ2dpbmdQYW5lKF8yMjF8fGZhbHNlKTsNCn0NCn19Ow0KTW9jaGlLaXQuTG9nZ2luZy5fX25ld19fPWZ1bmN0aW9uKCl7DQp0aGlzLkxvZ0xldmVsPXtFUlJPUjo0MCxGQVRBTDo1MCxXQVJOSU5HOjMwLElORk86MjAsREVCVUc6MTB9Ow0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCm0ucmVnaXN0ZXJDb21wYXJhdG9yKCJMb2dNZXNzYWdlIix0aGlzLmlzTG9nTWVzc2FnZSx0aGlzLmNvbXBhcmVMb2dNZXNzYWdlKTsNCnZhciBfMjIzPW0ucGFydGlhbDsNCnZhciBfMjI0PXRoaXMuTG9nZ2VyOw0KdmFyIF8yMjU9XzIyNC5wcm90b3R5cGUuYmFzZUxvZzsNCm0udXBkYXRlKHRoaXMuTG9nZ2VyLnByb3RvdHlwZSx7ZGVidWc6XzIyMyhfMjI1LCJERUJVRyIpLGxvZzpfMjIzKF8yMjUsIklORk8iKSxlcnJvcjpfMjIzKF8yMjUsIkVSUk9SIiksZmF0YWw6XzIyMyhfMjI1LCJGQVRBTCIpLHdhcm5pbmc6XzIyMyhfMjI1LCJXQVJOSU5HIil9KTsNCnZhciBzZWxmPXRoaXM7DQp2YXIgXzIyNz1mdW5jdGlvbihuYW1lKXsNCnJldHVybiBmdW5jdGlvbigpew0Kc2VsZi5sb2dnZXJbbmFtZV0uYXBwbHkoc2VsZi5sb2dnZXIsYXJndW1lbnRzKTsNCn07DQp9Ow0KdGhpcy5sb2c9XzIyNygibG9nIik7DQp0aGlzLmxvZ0Vycm9yPV8yMjcoImVycm9yIik7DQp0aGlzLmxvZ0RlYnVnPV8yMjcoImRlYnVnIik7DQp0aGlzLmxvZ0ZhdGFsPV8yMjcoImZhdGFsIik7DQp0aGlzLmxvZ1dhcm5pbmc9XzIyNygid2FybmluZyIpOw0KdGhpcy5sb2dnZXI9bmV3IF8yMjQoKTsNCnRoaXMubG9nZ2VyLnVzZU5hdGl2ZUNvbnNvbGU9dHJ1ZTsNCm0ubmFtZUZ1bmN0aW9ucyh0aGlzKTsNCn07DQpNb2NoaUtpdC5Mb2dnaW5nLl9fbmV3X18oKTsNCk1vY2hpS2l0LkJhc2UuX2V4cG9ydFN5bWJvbHModGhpcyxNb2NoaUtpdC5Mb2dnaW5nKTsNCk1vY2hpS2l0LkJhc2UuX21vZHVsZSgiRGF0ZVRpbWUiLCIxLjUiLFsiQmFzZSJdKTsNCk1vY2hpS2l0LkRhdGVUaW1lLmlzb0RhdGU9ZnVuY3Rpb24oc3RyKXsNCnN0cj1zdHIrIiI7DQppZih0eXBlb2YgKHN0cikhPSJzdHJpbmcifHxzdHIubGVuZ3RoPT09MCl7DQpyZXR1cm4gbnVsbDsNCn0NCnZhciBpc289c3RyLnNwbGl0KCItIik7DQppZihpc28ubGVuZ3RoPT09MCl7DQpyZXR1cm4gbnVsbDsNCn0NCnZhciBkYXRlPW5ldyBEYXRlKGlzb1swXSxpc29bMV0tMSxpc29bMl0pOw0KZGF0ZS5zZXRGdWxsWWVhcihpc29bMF0pOw0KZGF0ZS5zZXRNb250aChpc29bMV0tMSk7DQpkYXRlLnNldERhdGUoaXNvWzJdKTsNCnJldHVybiBkYXRlOw0KfTsNCk1vY2hpS2l0LkRhdGVUaW1lLl9pc29SZWdleHA9LyhcZHs0LH0pKD86LShcZHsxLDJ9KSg/Oi0oXGR7MSwyfSkoPzpbVCBdKFxkezEsMn0pOihcZHsxLDJ9KSg/OjooXGR7MSwyfSkoPzpcLihcZCspKT8pPyg/OihaKXwoWystXSkoXGR7MSwyfSkoPzo6KFxkezEsMn0pKT8pPyk/KT8pPy87DQpNb2NoaUtpdC5EYXRlVGltZS5pc29UaW1lc3RhbXA9ZnVuY3Rpb24oc3RyKXsNCnN0cj1zdHIrIiI7DQppZih0eXBlb2YgKHN0cikhPSJzdHJpbmcifHxzdHIubGVuZ3RoPT09MCl7DQpyZXR1cm4gbnVsbDsNCn0NCnZhciByZXM9c3RyLm1hdGNoKE1vY2hpS2l0LkRhdGVUaW1lLl9pc29SZWdleHApOw0KaWYodHlwZW9mIChyZXMpPT0idW5kZWZpbmVkInx8cmVzPT09bnVsbCl7DQpyZXR1cm4gbnVsbDsNCn0NCnZhciB5ZWFyLF8yMmYsZGF5LGhvdXIsbWluLHNlYyxtc2VjOw0KeWVhcj1wYXJzZUludChyZXNbMV0sMTApOw0KaWYodHlwZW9mIChyZXNbMl0pPT0idW5kZWZpbmVkInx8cmVzWzJdPT09IiIpew0KcmV0dXJuIG5ldyBEYXRlKHllYXIpOw0KfQ0KXzIyZj1wYXJzZUludChyZXNbMl0sMTApLTE7DQpkYXk9cGFyc2VJbnQocmVzWzNdLDEwKTsNCmlmKHR5cGVvZiAocmVzWzRdKT09InVuZGVmaW5lZCJ8fHJlc1s0XT09PSIiKXsNCnJldHVybiBuZXcgRGF0ZSh5ZWFyLF8yMmYsZGF5KTsNCn0NCmhvdXI9cGFyc2VJbnQocmVzWzRdLDEwKTsNCm1pbj1wYXJzZUludChyZXNbNV0sMTApOw0Kc2VjPSh0eXBlb2YgKHJlc1s2XSkhPSJ1bmRlZmluZWQiJiZyZXNbNl0hPT0iIik/cGFyc2VJbnQocmVzWzZdLDEwKTowOw0KaWYodHlwZW9mIChyZXNbN10pIT0idW5kZWZpbmVkIiYmcmVzWzddIT09IiIpew0KbXNlYz1NYXRoLnJvdW5kKDEwMDAqcGFyc2VGbG9hdCgiMC4iK3Jlc1s3XSkpOw0KfWVsc2V7DQptc2VjPTA7DQp9DQppZigodHlwZW9mIChyZXNbOF0pPT0idW5kZWZpbmVkInx8cmVzWzhdPT09IiIpJiYodHlwZW9mIChyZXNbOV0pPT0idW5kZWZpbmVkInx8cmVzWzldPT09IiIpKXsNCnJldHVybiBuZXcgRGF0ZSh5ZWFyLF8yMmYsZGF5LGhvdXIsbWluLHNlYyxtc2VjKTsNCn0NCnZhciBvZnM7DQppZih0eXBlb2YgKHJlc1s5XSkhPSJ1bmRlZmluZWQiJiZyZXNbOV0hPT0iIil7DQpvZnM9cGFyc2VJbnQocmVzWzEwXSwxMCkqMzYwMDAwMDsNCmlmKHR5cGVvZiAocmVzWzExXSkhPSJ1bmRlZmluZWQiJiZyZXNbMTFdIT09IiIpew0Kb2ZzKz1wYXJzZUludChyZXNbMTFdLDEwKSo2MDAwMDsNCn0NCmlmKHJlc1s5XT09Ii0iKXsNCm9mcz0tb2ZzOw0KfQ0KfWVsc2V7DQpvZnM9MDsNCn0NCnJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLF8yMmYsZGF5LGhvdXIsbWluLHNlYyxtc2VjKS1vZnMpOw0KfTsNCk1vY2hpS2l0LkRhdGVUaW1lLnRvSVNPVGltZT1mdW5jdGlvbihkYXRlLF8yMzcpew0KaWYodHlwZW9mIChkYXRlKT09InVuZGVmaW5lZCJ8fGRhdGU9PT1udWxsKXsNCnJldHVybiBudWxsOw0KfQ0KdmFyIGhoPWRhdGUuZ2V0SG91cnMoKTsNCnZhciBtbT1kYXRlLmdldE1pbnV0ZXMoKTsNCnZhciBzcz1kYXRlLmdldFNlY29uZHMoKTsNCnZhciBsc3Q9WygoXzIzNyYmKGhoPDEwKSk/IjAiK2hoOmhoKSwoKG1tPDEwKT8iMCIrbW06bW0pLCgoc3M8MTApPyIwIitzczpzcyldOw0KcmV0dXJuIGxzdC5qb2luKCI6Iik7DQp9Ow0KTW9jaGlLaXQuRGF0ZVRpbWUudG9JU09UaW1lc3RhbXA9ZnVuY3Rpb24oZGF0ZSxfMjNkKXsNCmlmKHR5cGVvZiAoZGF0ZSk9PSJ1bmRlZmluZWQifHxkYXRlPT09bnVsbCl7DQpyZXR1cm4gbnVsbDsNCn0NCnZhciBzZXA9XzIzZD8iVCI6IiAiOw0KdmFyIGZvb3Q9XzIzZD8iWiI6IiI7DQppZihfMjNkKXsNCmRhdGU9bmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkrKGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSo2MDAwMCkpOw0KfQ0KcmV0dXJuIE1vY2hpS2l0LkRhdGVUaW1lLnRvSVNPRGF0ZShkYXRlKStzZXArTW9jaGlLaXQuRGF0ZVRpbWUudG9JU09UaW1lKGRhdGUsXzIzZCkrZm9vdDsNCn07DQpNb2NoaUtpdC5EYXRlVGltZS50b0lTT0RhdGU9ZnVuY3Rpb24oZGF0ZSl7DQppZih0eXBlb2YgKGRhdGUpPT0idW5kZWZpbmVkInx8ZGF0ZT09PW51bGwpew0KcmV0dXJuIG51bGw7DQp9DQp2YXIgXzI0MT1Nb2NoaUtpdC5EYXRlVGltZS5fcGFkVHdvOw0KdmFyIF8yNDI9TW9jaGlLaXQuRGF0ZVRpbWUuX3BhZEZvdXI7DQpyZXR1cm4gW18yNDIoZGF0ZS5nZXRGdWxsWWVhcigpKSxfMjQxKGRhdGUuZ2V0TW9udGgoKSsxKSxfMjQxKGRhdGUuZ2V0RGF0ZSgpKV0uam9pbigiLSIpOw0KfTsNCk1vY2hpS2l0LkRhdGVUaW1lLmFtZXJpY2FuRGF0ZT1mdW5jdGlvbihkKXsNCmQ9ZCsiIjsNCmlmKHR5cGVvZiAoZCkhPSJzdHJpbmcifHxkLmxlbmd0aD09PTApew0KcmV0dXJuIG51bGw7DQp9DQp2YXIgYT1kLnNwbGl0KCIvIik7DQpyZXR1cm4gbmV3IERhdGUoYVsyXSxhWzBdLTEsYVsxXSk7DQp9Ow0KTW9jaGlLaXQuRGF0ZVRpbWUuX3BhZFR3bz1mdW5jdGlvbihuKXsNCnJldHVybiAobj45KT9uOiIwIituOw0KfTsNCk1vY2hpS2l0LkRhdGVUaW1lLl9wYWRGb3VyPWZ1bmN0aW9uKG4pew0Kc3dpdGNoKG4udG9TdHJpbmcoKS5sZW5ndGgpew0KY2FzZSAxOg0KcmV0dXJuICIwMDAiK247DQpicmVhazsNCmNhc2UgMjoNCnJldHVybiAiMDAiK247DQpicmVhazsNCmNhc2UgMzoNCnJldHVybiAiMCIrbjsNCmJyZWFrOw0KY2FzZSA0Og0KZGVmYXVsdDoNCnJldHVybiBuOw0KfQ0KfTsNCk1vY2hpS2l0LkRhdGVUaW1lLnRvUGFkZGVkQW1lcmljYW5EYXRlPWZ1bmN0aW9uKGQpew0KaWYodHlwZW9mIChkKT09InVuZGVmaW5lZCJ8fGQ9PT1udWxsKXsNCnJldHVybiBudWxsOw0KfQ0KdmFyIF8yNDg9TW9jaGlLaXQuRGF0ZVRpbWUuX3BhZFR3bzsNCnJldHVybiBbXzI0OChkLmdldE1vbnRoKCkrMSksXzI0OChkLmdldERhdGUoKSksZC5nZXRGdWxsWWVhcigpXS5qb2luKCIvIik7DQp9Ow0KTW9jaGlLaXQuRGF0ZVRpbWUudG9BbWVyaWNhbkRhdGU9ZnVuY3Rpb24oZCl7DQppZih0eXBlb2YgKGQpPT0idW5kZWZpbmVkInx8ZD09PW51bGwpew0KcmV0dXJuIG51bGw7DQp9DQpyZXR1cm4gW2QuZ2V0TW9udGgoKSsxLGQuZ2V0RGF0ZSgpLGQuZ2V0RnVsbFllYXIoKV0uam9pbigiLyIpOw0KfTsNCk1vY2hpS2l0LkRhdGVUaW1lLl9fbmV3X189ZnVuY3Rpb24oKXsNCk1vY2hpS2l0LkJhc2UubmFtZUZ1bmN0aW9ucyh0aGlzKTsNCn07DQpNb2NoaUtpdC5EYXRlVGltZS5fX25ld19fKCk7DQpNb2NoaUtpdC5CYXNlLl9leHBvcnRTeW1ib2xzKHRoaXMsTW9jaGlLaXQuRGF0ZVRpbWUpOw0KTW9jaGlLaXQuQmFzZS5fbW9kdWxlKCJGb3JtYXQiLCIxLjUiLFsiQmFzZSJdKTsNCk1vY2hpS2l0LkZvcm1hdC5fbnVtYmVyRm9ybWF0dGVyPWZ1bmN0aW9uKF8yNGEsXzI0YixfMjRjLF8yNGQsXzI0ZSxfMjRmLF8yNTAsXzI1MSxfMjUyKXsNCnJldHVybiBmdW5jdGlvbihudW0pew0KbnVtPXBhcnNlRmxvYXQobnVtKTsNCmlmKHR5cGVvZiAobnVtKT09InVuZGVmaW5lZCJ8fG51bT09PW51bGx8fGlzTmFOKG51bSkpew0KcmV0dXJuIF8yNGE7DQp9DQp2YXIgXzI1ND1fMjRiOw0KdmFyIF8yNTU9XzI0YzsNCmlmKG51bTwwKXsNCm51bT0tbnVtOw0KfWVsc2V7DQpfMjU0PV8yNTQucmVwbGFjZSgvLS8sIiIpOw0KfQ0KdmFyIG1lPWFyZ3VtZW50cy5jYWxsZWU7DQp2YXIgZm10PU1vY2hpS2l0LkZvcm1hdC5mb3JtYXRMb2NhbGUoXzI0ZCk7DQppZihfMjRlKXsNCm51bT1udW0qMTAwOw0KXzI1NT1mbXQucGVyY2VudCtfMjU1Ow0KfQ0KbnVtPU1vY2hpS2l0LkZvcm1hdC5yb3VuZFRvRml4ZWQobnVtLF8yNGYpOw0KdmFyIF8yNTg9bnVtLnNwbGl0KC9cLi8pOw0KdmFyIF8yNTk9XzI1OFswXTsNCnZhciBmcmFjPShfMjU4Lmxlbmd0aD09MSk/IiI6XzI1OFsxXTsNCnZhciByZXM9IiI7DQp3aGlsZShfMjU5Lmxlbmd0aDxfMjUwKXsNCl8yNTk9IjAiK18yNTk7DQp9DQppZihfMjUxKXsNCndoaWxlKF8yNTkubGVuZ3RoPl8yNTEpew0KdmFyIGk9XzI1OS5sZW5ndGgtXzI1MTsNCnJlcz1mbXQuc2VwYXJhdG9yK18yNTkuc3Vic3RyaW5nKGksXzI1OS5sZW5ndGgpK3JlczsNCl8yNTk9XzI1OS5zdWJzdHJpbmcoMCxpKTsNCn0NCn0NCnJlcz1fMjU5K3JlczsNCmlmKF8yNGY+MCl7DQp3aGlsZShmcmFjLmxlbmd0aDxfMjUyKXsNCmZyYWM9ZnJhYysiMCI7DQp9DQpyZXM9cmVzK2ZtdC5kZWNpbWFsK2ZyYWM7DQp9DQpyZXR1cm4gXzI1NCtyZXMrXzI1NTsNCn07DQp9Ow0KTW9jaGlLaXQuRm9ybWF0Lm51bWJlckZvcm1hdHRlcj1mdW5jdGlvbihfMjVkLF8yNWUsXzI1Zil7DQppZih0eXBlb2YgKF8yNWUpPT0idW5kZWZpbmVkIil7DQpfMjVlPSIiOw0KfQ0KdmFyIF8yNjA9XzI1ZC5tYXRjaCgvKCg/OlswI10rLCk/WzAjXSspKD86XC4oWzAjXSspKT8oJSk/Lyk7DQppZighXzI2MCl7DQp0aHJvdyBUeXBlRXJyb3IoIkludmFsaWQgcGF0dGVybiIpOw0KfQ0KdmFyIF8yNjE9XzI1ZC5zdWJzdHIoMCxfMjYwLmluZGV4KTsNCnZhciBfMjYyPV8yNWQuc3Vic3RyKF8yNjAuaW5kZXgrXzI2MFswXS5sZW5ndGgpOw0KaWYoXzI2MS5zZWFyY2goLy0vKT09LTEpew0KXzI2MT1fMjYxKyItIjsNCn0NCnZhciBfMjYzPV8yNjBbMV07DQp2YXIgZnJhYz0odHlwZW9mIChfMjYwWzJdKT09InN0cmluZyImJl8yNjBbMl0hPSIiKT9fMjYwWzJdOiIiOw0KdmFyIF8yNjU9KHR5cGVvZiAoXzI2MFszXSk9PSJzdHJpbmciJiZfMjYwWzNdIT0iIik7DQp2YXIgdG1wPV8yNjMuc3BsaXQoLywvKTsNCnZhciBfMjY3Ow0KaWYodHlwZW9mIChfMjVmKT09InVuZGVmaW5lZCIpew0KXzI1Zj0iZGVmYXVsdCI7DQp9DQppZih0bXAubGVuZ3RoPT0xKXsNCl8yNjc9bnVsbDsNCn1lbHNlew0KXzI2Nz10bXBbMV0ubGVuZ3RoOw0KfQ0KdmFyIF8yNjg9XzI2My5sZW5ndGgtXzI2My5yZXBsYWNlKC8wL2csIiIpLmxlbmd0aDsNCnZhciBfMjY5PWZyYWMubGVuZ3RoLWZyYWMucmVwbGFjZSgvMC9nLCIiKS5sZW5ndGg7DQp2YXIgXzI2YT1mcmFjLmxlbmd0aDsNCnZhciBydmFsPU1vY2hpS2l0LkZvcm1hdC5fbnVtYmVyRm9ybWF0dGVyKF8yNWUsXzI2MSxfMjYyLF8yNWYsXzI2NSxfMjZhLF8yNjgsXzI2NyxfMjY5KTsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQppZihtKXsNCnZhciBmbj1hcmd1bWVudHMuY2FsbGVlOw0KdmFyIGFyZ3M9bS5jb25jYXQoYXJndW1lbnRzKTsNCnJ2YWwucmVwcj1mdW5jdGlvbigpew0KcmV0dXJuIFtzZWxmLk5BTUUsIigiLG1hcChtLnJlcHIsYXJncykuam9pbigiLCAiKSwiKSJdLmpvaW4oIiIpOw0KfTsNCn0NCnJldHVybiBydmFsOw0KfTsNCk1vY2hpS2l0LkZvcm1hdC5mb3JtYXRMb2NhbGU9ZnVuY3Rpb24oXzI2Zil7DQppZih0eXBlb2YgKF8yNmYpPT0idW5kZWZpbmVkInx8XzI2Zj09PW51bGwpew0KXzI2Zj0iZGVmYXVsdCI7DQp9DQppZih0eXBlb2YgKF8yNmYpPT0ic3RyaW5nIil7DQp2YXIgcnZhbD1Nb2NoaUtpdC5Gb3JtYXQuTE9DQUxFW18yNmZdOw0KaWYodHlwZW9mIChydmFsKT09InN0cmluZyIpew0KcnZhbD1hcmd1bWVudHMuY2FsbGVlKHJ2YWwpOw0KTW9jaGlLaXQuRm9ybWF0LkxPQ0FMRVtfMjZmXT1ydmFsOw0KfQ0KcmV0dXJuIHJ2YWw7DQp9ZWxzZXsNCnJldHVybiBfMjZmOw0KfQ0KfTsNCk1vY2hpS2l0LkZvcm1hdC50d29EaWdpdEF2ZXJhZ2U9ZnVuY3Rpb24oXzI3MSxfMjcyKXsNCmlmKF8yNzIpew0KdmFyIHJlcz1fMjcxL18yNzI7DQppZighaXNOYU4ocmVzKSl7DQpyZXR1cm4gTW9jaGlLaXQuRm9ybWF0LnR3b0RpZ2l0RmxvYXQocmVzKTsNCn0NCn0NCnJldHVybiAiMCI7DQp9Ow0KTW9jaGlLaXQuRm9ybWF0LnR3b0RpZ2l0RmxvYXQ9ZnVuY3Rpb24oXzI3NCl7DQp2YXIgcmVzPXJvdW5kVG9GaXhlZChfMjc0LDIpOw0KaWYocmVzLmluZGV4T2YoIi4wMCIpPjApew0KcmV0dXJuIHJlcy5zdWJzdHJpbmcoMCxyZXMubGVuZ3RoLTMpOw0KfWVsc2V7DQppZihyZXMuY2hhckF0KHJlcy5sZW5ndGgtMSk9PSIwIil7DQpyZXR1cm4gcmVzLnN1YnN0cmluZygwLHJlcy5sZW5ndGgtMSk7DQp9ZWxzZXsNCnJldHVybiByZXM7DQp9DQp9DQp9Ow0KTW9jaGlLaXQuRm9ybWF0LmxzdHJpcD1mdW5jdGlvbihzdHIsXzI3Nyl7DQpzdHI9c3RyKyIiOw0KaWYodHlwZW9mIChzdHIpIT0ic3RyaW5nIil7DQpyZXR1cm4gbnVsbDsNCn0NCmlmKCFfMjc3KXsNCnJldHVybiBzdHIucmVwbGFjZSgvXlxzKy8sIiIpOw0KfWVsc2V7DQpyZXR1cm4gc3RyLnJlcGxhY2UobmV3IFJlZ0V4cCgiXlsiK18yNzcrIl0rIiksIiIpOw0KfQ0KfTsNCk1vY2hpS2l0LkZvcm1hdC5yc3RyaXA9ZnVuY3Rpb24oc3RyLF8yNzkpew0Kc3RyPXN0cisiIjsNCmlmKHR5cGVvZiAoc3RyKSE9InN0cmluZyIpew0KcmV0dXJuIG51bGw7DQp9DQppZighXzI3OSl7DQpyZXR1cm4gc3RyLnJlcGxhY2UoL1xzKyQvLCIiKTsNCn1lbHNlew0KcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoIlsiK18yNzkrIl0rJCIpLCIiKTsNCn0NCn07DQpNb2NoaUtpdC5Gb3JtYXQuc3RyaXA9ZnVuY3Rpb24oc3RyLF8yN2Ipew0KdmFyIHNlbGY9TW9jaGlLaXQuRm9ybWF0Ow0KcmV0dXJuIHNlbGYucnN0cmlwKHNlbGYubHN0cmlwKHN0cixfMjdiKSxfMjdiKTsNCn07DQpNb2NoaUtpdC5Gb3JtYXQudHJ1bmNUb0ZpeGVkPWZ1bmN0aW9uKF8yN2QsXzI3ZSl7DQp2YXIgXzI3Zj1Nb2NoaUtpdC5Gb3JtYXQuX251bWJlclRvRml4ZWQoXzI3ZCxfMjdlKTsNCnZhciBfMjgwPV8yN2YuaW5kZXhPZigiLiIpOw0KaWYoXzI4MD4wJiZfMjgwK18yN2UrMTxfMjdmLmxlbmd0aCl7DQpfMjdmPV8yN2Yuc3Vic3RyaW5nKDAsXzI4MCtfMjdlKzEpOw0KXzI3Zj1Nb2NoaUtpdC5Gb3JtYXQuX3NoaWZ0TnVtYmVyKF8yN2YsMCk7DQp9DQpyZXR1cm4gXzI3ZjsNCn07DQpNb2NoaUtpdC5Gb3JtYXQucm91bmRUb0ZpeGVkPWZ1bmN0aW9uKF8yODEsXzI4Mil7DQp2YXIgXzI4Mz1Nb2NoaUtpdC5Gb3JtYXQuX251bWJlclRvRml4ZWQoXzI4MSxfMjgyKTsNCnZhciBfMjg0PV8yODMuaW5kZXhPZigiLiIpOw0KaWYoXzI4ND4wJiZfMjg0K18yODIrMTxfMjgzLmxlbmd0aCl7DQp2YXIgc3RyPU1vY2hpS2l0LkZvcm1hdC5fc2hpZnROdW1iZXIoXzI4MyxfMjgyKTsNCnN0cj1Nb2NoaUtpdC5Gb3JtYXQuX251bWJlclRvRml4ZWQoTWF0aC5yb3VuZChwYXJzZUZsb2F0KHN0cikpLDApOw0KXzI4Mz1Nb2NoaUtpdC5Gb3JtYXQuX3NoaWZ0TnVtYmVyKHN0ciwtXzI4Mik7DQp9DQpyZXR1cm4gXzI4MzsNCn07DQpNb2NoaUtpdC5Gb3JtYXQuX251bWJlclRvRml4ZWQ9ZnVuY3Rpb24oXzI4NixfMjg3KXsNCnZhciBzdHI9XzI4Ni50b1N0cmluZygpOw0KdmFyIF8yODk9c3RyLnNwbGl0KC9bZUVdLyk7DQp2YXIgZXhwPShfMjg5Lmxlbmd0aD09PTEpPzA6cGFyc2VJbnQoXzI4OVsxXSl8fDA7DQp2YXIgXzI4Yj1Nb2NoaUtpdC5Gb3JtYXQuX3NoaWZ0TnVtYmVyKF8yODlbMF0sZXhwKTsNCl8yODk9XzI4Yi5zcGxpdCgvXC4vKTsNCnZhciBfMjhjPV8yODlbMF07DQp2YXIgZnJhYz0oXzI4OS5sZW5ndGg9PT0xKT8iIjpfMjg5WzFdOw0Kd2hpbGUoZnJhYy5sZW5ndGg8XzI4Nyl7DQpmcmFjKz0iMCI7DQp9DQppZihmcmFjLmxlbmd0aD4wKXsNCnJldHVybiBfMjhjKyIuIitmcmFjOw0KfWVsc2V7DQpyZXR1cm4gXzI4YzsNCn0NCn07DQpNb2NoaUtpdC5Gb3JtYXQuX3NoaWZ0TnVtYmVyPWZ1bmN0aW9uKG51bSxleHApew0KdmFyIHBvcz1udW0uaW5kZXhPZigiLiIpOw0KaWYocG9zPDApew0KcG9zPW51bS5sZW5ndGg7DQp9ZWxzZXsNCm51bT1udW0uc3Vic3RyaW5nKDAscG9zKStudW0uc3Vic3RyaW5nKHBvcysxKTsNCn0NCnBvcys9ZXhwOw0Kd2hpbGUocG9zPD0wfHwocG9zPD0xJiZudW0uY2hhckF0KDApPT09Ii0iKSl7DQppZihudW0uY2hhckF0KDApPT09Ii0iKXsNCm51bT0iLTAiK251bS5zdWJzdHJpbmcoMSk7DQp9ZWxzZXsNCm51bT0iMCIrbnVtOw0KfQ0KcG9zKys7DQp9DQp3aGlsZShwb3M+bnVtLmxlbmd0aCl7DQpudW0rPSIwIjsNCn0NCmlmKHBvczxudW0ubGVuZ3RoKXsNCm51bT1udW0uc3Vic3RyaW5nKDAscG9zKSsiLiIrbnVtLnN1YnN0cmluZyhwb3MpOw0KfQ0Kd2hpbGUoL14wW14uXS8udGVzdChudW0pKXsNCm51bT1udW0uc3Vic3RyaW5nKDEpOw0KfQ0Kd2hpbGUoL14tMFteLl0vLnRlc3QobnVtKSl7DQpudW09Ii0iK251bS5zdWJzdHJpbmcoMik7DQp9DQpyZXR1cm4gbnVtOw0KfTsNCk1vY2hpS2l0LkZvcm1hdC5wZXJjZW50Rm9ybWF0PWZ1bmN0aW9uKF8yOTEpew0KcmV0dXJuIE1vY2hpS2l0LkZvcm1hdC50d29EaWdpdEZsb2F0KDEwMCpfMjkxKSsiJSI7DQp9Ow0KTW9jaGlLaXQuRm9ybWF0LkxPQ0FMRT17ZW5fVVM6e3NlcGFyYXRvcjoiLCIsZGVjaW1hbDoiLiIscGVyY2VudDoiJSJ9LGRlX0RFOntzZXBhcmF0b3I6Ii4iLGRlY2ltYWw6IiwiLHBlcmNlbnQ6IiUifSxwdF9CUjp7c2VwYXJhdG9yOiIuIixkZWNpbWFsOiIsIixwZXJjZW50OiIlIn0sZnJfRlI6e3NlcGFyYXRvcjoiICIsZGVjaW1hbDoiLCIscGVyY2VudDoiJSJ9LCJkZWZhdWx0IjoiZW5fVVMiLF9fZXhwb3J0X186ZmFsc2V9Ow0KTW9jaGlLaXQuRm9ybWF0Ll9fbmV3X189ZnVuY3Rpb24oKXsNCk1vY2hpS2l0LkJhc2UubmFtZUZ1bmN0aW9ucyh0aGlzKTsNCnZhciBiYXNlPXRoaXMuTkFNRSsiLiI7DQp2YXIgayx2LG87DQpmb3IoayBpbiB0aGlzLkxPQ0FMRSl7DQpvPXRoaXMuTE9DQUxFW2tdOw0KaWYodHlwZW9mIChvKT09Im9iamVjdCIpew0Kby5yZXByPWZ1bmN0aW9uKCl7DQpyZXR1cm4gdGhpcy5OQU1FOw0KfTsNCm8uTkFNRT1iYXNlKyJMT0NBTEUuIitrOw0KfQ0KfQ0KfTsNCk1vY2hpS2l0LkZvcm1hdC5fX25ld19fKCk7DQpNb2NoaUtpdC5CYXNlLl9leHBvcnRTeW1ib2xzKHRoaXMsTW9jaGlLaXQuRm9ybWF0KTsNCk1vY2hpS2l0LkJhc2UuX21vZHVsZSgiVGV4dCIsIjEuNSIsWyJCYXNlIiwiRm9ybWF0Il0pOw0KTW9jaGlLaXQuVGV4dC5zdGFydHNXaXRoPWZ1bmN0aW9uKF8yOTYsc3RyKXsNCnJldHVybiBzdHIhPW51bGwmJl8yOTYhPW51bGwmJnN0ci5pbmRleE9mKF8yOTYpPT0wOw0KfTsNCk1vY2hpS2l0LlRleHQuZW5kc1dpdGg9ZnVuY3Rpb24oXzI5OCxzdHIpew0KcmV0dXJuIHN0ciE9bnVsbCYmXzI5OCE9bnVsbCYmc3RyLmxhc3RJbmRleE9mKF8yOTgpPT1NYXRoLm1heChzdHIubGVuZ3RoLV8yOTgubGVuZ3RoLDApOw0KfTsNCk1vY2hpS2l0LlRleHQuY29udGFpbnM9ZnVuY3Rpb24oXzI5YSxzdHIpew0KcmV0dXJuIHN0ciE9bnVsbCYmXzI5YSE9bnVsbCYmc3RyLmluZGV4T2YoXzI5YSk+PTA7DQp9Ow0KTW9jaGlLaXQuVGV4dC5wYWRMZWZ0PWZ1bmN0aW9uKHN0cixfMjlkLF8yOWUpew0Kc3RyPXN0cnx8IiI7DQpfMjllPV8yOWV8fCIgIjsNCndoaWxlKHN0ci5sZW5ndGg8XzI5ZCl7DQpzdHI9XzI5ZStzdHI7DQp9DQpyZXR1cm4gc3RyOw0KfTsNCk1vY2hpS2l0LlRleHQucGFkUmlnaHQ9ZnVuY3Rpb24oc3RyLF8yYTAsXzJhMSl7DQpzdHI9c3RyfHwiIjsNCl8yYTE9XzJhMXx8IiAiOw0Kd2hpbGUoc3RyLmxlbmd0aDxfMmEwKXsNCnN0cis9XzJhMTsNCn0NCnJldHVybiBzdHI7DQp9Ow0KTW9jaGlLaXQuVGV4dC50cnVuY2F0ZT1mdW5jdGlvbihzdHIsXzJhMyx0YWlsKXsNCmlmKHN0cj09bnVsbHx8c3RyLmxlbmd0aDw9XzJhM3x8XzJhMzwwKXsNCnJldHVybiBzdHI7DQp9ZWxzZXsNCmlmKHRhaWwhPW51bGwpew0Kc3RyPXN0ci5zbGljZSgwLE1hdGgubWF4KDAsXzJhMy10YWlsLmxlbmd0aCkpOw0KaWYodHlwZW9mIChzdHIpPT0ic3RyaW5nIil7DQpyZXR1cm4gc3RyK3RhaWw7DQp9ZWxzZXsNCnJldHVybiBNb2NoaUtpdC5CYXNlLmV4dGVuZChzdHIsdGFpbCk7DQp9DQp9ZWxzZXsNCnJldHVybiBzdHIuc2xpY2UoMCxfMmEzKTsNCn0NCn0NCn07DQpNb2NoaUtpdC5UZXh0LnNwbGl0PWZ1bmN0aW9uKHN0cixfMmE2LG1heCl7DQppZihzdHI9PW51bGx8fHN0ci5sZW5ndGg9PTApew0KcmV0dXJuIHN0cjsNCn0NCl8yYTY9XzJhNnx8IlxuIjsNCnZhciBiaXRzPXN0ci5zcGxpdChfMmE2KTsNCmlmKCh0eXBlb2YgKG1heCk9PSJ1bmRlZmluZWQiKXx8bWF4Pj1iaXRzLmxlbmd0aC0xKXsNCnJldHVybiBiaXRzOw0KfQ0KYml0cy5zcGxpY2UobWF4LGJpdHMubGVuZ3RoLGJpdHMuc2xpY2UobWF4LGJpdHMubGVuZ3RoKS5qb2luKF8yYTYpKTsNCnJldHVybiBiaXRzOw0KfTsNCk1vY2hpS2l0LlRleHQucnNwbGl0PWZ1bmN0aW9uKHN0cixfMmFhLG1heCl7DQppZihzdHI9PW51bGx8fHN0ci5sZW5ndGg9PTApew0KcmV0dXJuIHN0cjsNCn0NCl8yYWE9XzJhYXx8IlxuIjsNCnZhciBiaXRzPXN0ci5zcGxpdChfMmFhKTsNCmlmKCh0eXBlb2YgKG1heCk9PSJ1bmRlZmluZWQiKXx8bWF4Pj1iaXRzLmxlbmd0aC0xKXsNCnJldHVybiBiaXRzOw0KfQ0KYml0cy5zcGxpY2UoMCxiaXRzLmxlbmd0aC1tYXgsYml0cy5zbGljZSgwLGJpdHMubGVuZ3RoLW1heCkuam9pbihfMmFhKSk7DQpyZXR1cm4gYml0czsNCn07DQpNb2NoaUtpdC5UZXh0LmZvcm1hdHRlcj1mdW5jdGlvbihfMmFkLF8yYWUpew0KaWYodHlwZW9mIChfMmFlKT09InVuZGVmaW5lZCIpew0KXzJhZT1Nb2NoaUtpdC5Gb3JtYXQuZm9ybWF0TG9jYWxlKCk7DQp9ZWxzZXsNCmlmKHR5cGVvZiAoXzJhZSk9PSJzdHJpbmciKXsNCl8yYWU9TW9jaGlLaXQuRm9ybWF0LmZvcm1hdExvY2FsZShfMmFlKTsNCn0NCn0NCnZhciBfMmFmPU1vY2hpS2l0LlRleHQuX3BhcnNlUGF0dGVybihfMmFkKTsNCnJldHVybiBmdW5jdGlvbigpew0KdmFyIF8yYjA9TW9jaGlLaXQuQmFzZS5leHRlbmQoW10sYXJndW1lbnRzKTsNCnZhciByZXM9W107DQpmb3IodmFyIGk9MDtpPF8yYWYubGVuZ3RoO2krKyl7DQppZih0eXBlb2YgKF8yYWZbaV0pPT0ic3RyaW5nIil7DQpyZXMucHVzaChfMmFmW2ldKTsNCn1lbHNlew0KcmVzLnB1c2goTW9jaGlLaXQuVGV4dC5mb3JtYXRWYWx1ZShfMmFmW2ldLF8yYjAsXzJhZSkpOw0KfQ0KfQ0KcmV0dXJuIHJlcy5qb2luKCIiKTsNCn07DQp9Ow0KTW9jaGlLaXQuVGV4dC5mb3JtYXQ9ZnVuY3Rpb24oXzJiMyl7DQp2YXIgZnVuYz1Nb2NoaUtpdC5UZXh0LmZvcm1hdHRlcihfMmIzKTsNCnJldHVybiBmdW5jLmFwcGx5KHRoaXMsTW9jaGlLaXQuQmFzZS5leHRlbmQoW10sYXJndW1lbnRzLDEpKTsNCn07DQpNb2NoaUtpdC5UZXh0LmZvcm1hdFZhbHVlPWZ1bmN0aW9uKHNwZWMsXzJiNixfMmI3KXsNCnZhciBzZWxmPU1vY2hpS2l0LlRleHQ7DQppZih0eXBlb2YgKHNwZWMpPT09InN0cmluZyIpew0Kc3BlYz1zZWxmLl9wYXJzZUZvcm1hdEZsYWdzKHNwZWMsMCxzcGVjLmxlbmd0aC0xKTsNCn0NCmZvcih2YXIgaT0wO3NwZWMucGF0aCE9bnVsbCYmaTxzcGVjLnBhdGgubGVuZ3RoO2krKyl7DQppZihfMmI2IT1udWxsKXsNCl8yYjY9XzJiNltzcGVjLnBhdGhbaV1dOw0KfQ0KfQ0KaWYodHlwZW9mIChfMmI3KT09InVuZGVmaW5lZCIpew0KXzJiNz1Nb2NoaUtpdC5Gb3JtYXQuZm9ybWF0TG9jYWxlKCk7DQp9ZWxzZXsNCmlmKHR5cGVvZiAoXzJiNyk9PSJzdHJpbmciKXsNCl8yYjc9TW9jaGlLaXQuRm9ybWF0LmZvcm1hdExvY2FsZShfMmI3KTsNCn0NCn0NCnZhciBzdHI9IiI7DQppZihzcGVjLm51bWVyaWMpew0KaWYodHlwZW9mIChfMmI2KSE9Im51bWJlciJ8fGlzTmFOKF8yYjYpKXsNCnN0cj0iIjsNCn1lbHNlew0KaWYoXzJiNj09PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSl7DQpzdHI9Ilx1MjIxZSI7DQp9ZWxzZXsNCmlmKF8yYjY9PT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpew0Kc3RyPSItXHUyMjFlIjsNCn1lbHNlew0KdmFyIHNpZ249KHNwZWMuc2lnbj09PSItIik/IiI6c3BlYy5zaWduOw0Kc2lnbj0oXzJiNjwwKT8iLSI6c2lnbjsNCl8yYjY9TWF0aC5hYnMoXzJiNik7DQppZihzcGVjLmZvcm1hdD09PSIlIil7DQpzdHI9c2VsZi5fdHJ1bmNUb1BlcmNlbnQoXzJiNixzcGVjLnByZWNpc2lvbik7DQp9ZWxzZXsNCmlmKHNwZWMuZm9ybWF0PT09ImQiKXsNCnN0cj1Nb2NoaUtpdC5Gb3JtYXQucm91bmRUb0ZpeGVkKF8yYjYsMCk7DQp9ZWxzZXsNCmlmKHNwZWMucmFkaXghPTEwKXsNCnN0cj1NYXRoLmZsb29yKF8yYjYpLnRvU3RyaW5nKHNwZWMucmFkaXgpOw0KaWYoc3BlYy5mb3JtYXQ9PT0ieCIpew0Kc3RyPXN0ci50b0xvd2VyQ2FzZSgpOw0KfWVsc2V7DQppZihzcGVjLmZvcm1hdD09PSJYIil7DQpzdHI9c3RyLnRvVXBwZXJDYXNlKCk7DQp9DQp9DQp9ZWxzZXsNCmlmKHNwZWMucHJlY2lzaW9uPj0wKXsNCnN0cj1Nb2NoaUtpdC5Gb3JtYXQucm91bmRUb0ZpeGVkKF8yYjYsc3BlYy5wcmVjaXNpb24pOw0KfWVsc2V7DQpzdHI9XzJiNi50b1N0cmluZygpOw0KfQ0KfQ0KfQ0KfQ0KaWYoc3BlYy5wYWRkaW5nPT09IjAiJiZzcGVjLmZvcm1hdD09PSIlIil7DQpzdHI9c2VsZi5wYWRMZWZ0KHN0cixzcGVjLndpZHRoLXNpZ24ubGVuZ3RoLTEsIjAiKTsNCn1lbHNlew0KaWYoc3BlYy5wYWRkaW5nPT0iMCIpew0Kc3RyPXNlbGYucGFkTGVmdChzdHIsc3BlYy53aWR0aC1zaWduLmxlbmd0aCwiMCIpOw0KfQ0KfQ0Kc3RyPXNlbGYuX2xvY2FsaXplTnVtYmVyKHN0cixfMmI3LHNwZWMuZ3JvdXBpbmcpOw0Kc3RyPXNpZ24rc3RyOw0KfQ0KfQ0KfQ0KaWYoc3RyIT09IiImJnNwZWMuZm9ybWF0PT09IiUiKXsNCnN0cj1zdHIrXzJiNy5wZXJjZW50Ow0KfQ0KfWVsc2V7DQppZihzcGVjLmZvcm1hdD09InIiKXsNCnN0cj1Nb2NoaUtpdC5CYXNlLnJlcHIoXzJiNik7DQp9ZWxzZXsNCnN0cj0oXzJiNj09bnVsbCk/Im51bGwiOl8yYjYudG9TdHJpbmcoKTsNCn0NCnN0cj1zZWxmLnRydW5jYXRlKHN0cixzcGVjLnByZWNpc2lvbik7DQp9DQppZihzcGVjLmFsaWduPT0iPCIpew0Kc3RyPXNlbGYucGFkUmlnaHQoc3RyLHNwZWMud2lkdGgpOw0KfWVsc2V7DQpzdHI9c2VsZi5wYWRMZWZ0KHN0cixzcGVjLndpZHRoKTsNCn0NCnJldHVybiBzdHI7DQp9Ow0KTW9jaGlLaXQuVGV4dC5fbG9jYWxpemVOdW1iZXI9ZnVuY3Rpb24obnVtLF8yYmQsXzJiZSl7DQp2YXIgXzJiZj1udW0uc3BsaXQoL1wuLyk7DQp2YXIgXzJjMD1fMmJmWzBdOw0KdmFyIGZyYWM9KF8yYmYubGVuZ3RoPT0xKT8iIjpfMmJmWzFdOw0KdmFyIHJlcz0oZnJhYy5sZW5ndGg+MCk/XzJiZC5kZWNpbWFsOiIiOw0Kd2hpbGUoXzJiZSYmZnJhYy5sZW5ndGg+Myl7DQpyZXM9cmVzK2ZyYWMuc3Vic3RyaW5nKDAsMykrXzJiZC5zZXBhcmF0b3I7DQpmcmFjPWZyYWMuc3Vic3RyaW5nKDMpOw0KaWYoXzJjMC5jaGFyQXQoMCk9PSIwIil7DQpfMmMwPV8yYzAuc3Vic3RyaW5nKDEpOw0KfQ0KfQ0KaWYoZnJhYy5sZW5ndGg+MCl7DQpyZXMrPWZyYWM7DQp9DQp3aGlsZShfMmJlJiZfMmMwLmxlbmd0aD4zKXsNCnZhciBwb3M9XzJjMC5sZW5ndGgtMzsNCnJlcz1fMmJkLnNlcGFyYXRvcitfMmMwLnN1YnN0cmluZyhwb3MpK3JlczsNCl8yYzA9XzJjMC5zdWJzdHJpbmcoKF8yYzAuY2hhckF0KDApPT0iMCIpPzE6MCxwb3MpOw0KfQ0KcmV0dXJuIF8yYzArcmVzOw0KfTsNCk1vY2hpS2l0LlRleHQuX3BhcnNlUGF0dGVybj1mdW5jdGlvbihfMmM0KXsNCnZhciBzZWxmPU1vY2hpS2l0LlRleHQ7DQp2YXIgXzJjNj1bXTsNCnZhciBfMmM3PTA7DQp2YXIgcG9zPTA7DQpmb3IocG9zPTA7cG9zPF8yYzQubGVuZ3RoO3BvcysrKXsNCmlmKF8yYzQuY2hhckF0KHBvcyk9PSJ7Iil7DQppZihwb3MrMT49XzJjNC5sZW5ndGgpew0KdmFyIG1zZz0idW5lc2NhcGVkIHsgY2hhciwgc2hvdWxkIGJlIGVzY2FwZWQgYXMge3siOw0KdGhyb3cgbmV3IHNlbGYuRm9ybWF0UGF0dGVybkVycm9yKF8yYzQscG9zLG1zZyk7DQp9ZWxzZXsNCmlmKF8yYzQuY2hhckF0KHBvcysxKT09InsiKXsNCl8yYzYucHVzaChfMmM0LnN1YnN0cmluZyhfMmM3LHBvcysxKSk7DQpfMmM3PXBvcysyOw0KcG9zKys7DQp9ZWxzZXsNCmlmKF8yYzc8cG9zKXsNCl8yYzYucHVzaChfMmM0LnN1YnN0cmluZyhfMmM3LHBvcykpOw0KfQ0KXzJjNz1fMmM0LmluZGV4T2YoIn0iLHBvcykrMTsNCmlmKF8yYzc8PTApew0KdmFyIG1zZz0idW5tYXRjaGVkIHsgY2hhciwgbm90IGZvbGxvd2VkIGJ5IGEgfSBjaGFyIjsNCnRocm93IG5ldyBzZWxmLkZvcm1hdFBhdHRlcm5FcnJvcihfMmM0LHBvcyxtc2cpOw0KfQ0KXzJjNi5wdXNoKHNlbGYuX3BhcnNlRm9ybWF0KF8yYzQscG9zKzEsXzJjNy0xKSk7DQpwb3M9XzJjNy0xOw0KfQ0KfQ0KfWVsc2V7DQppZihfMmM0LmNoYXJBdChwb3MpPT0ifSIpew0KaWYocG9zKzE+PV8yYzQubGVuZ3RofHxfMmM0LmNoYXJBdChwb3MrMSkhPSJ9Iil7DQp2YXIgbXNnPSJ1bmVzY2FwZWQgfSBjaGFyLCBzaG91bGQgYmUgZXNjYXBlZCBhcyB9fSI7DQp0aHJvdyBuZXcgc2VsZi5Gb3JtYXRQYXR0ZXJuRXJyb3IoXzJjNCxwb3MsbXNnKTsNCn0NCl8yYzYucHVzaChfMmM0LnN1YnN0cmluZyhfMmM3LHBvcysxKSk7DQpfMmM3PXBvcysyOw0KcG9zKys7DQp9DQp9DQp9DQppZihfMmM3PHBvcyl7DQpfMmM2LnB1c2goXzJjNC5zdWJzdHJpbmcoXzJjNyxwb3MpKTsNCn0NCnJldHVybiBfMmM2Ow0KfTsNCk1vY2hpS2l0LlRleHQuX3BhcnNlRm9ybWF0PWZ1bmN0aW9uKF8yY2EsXzJjYixfMmNjKXsNCnZhciBzZWxmPU1vY2hpS2l0LlRleHQ7DQp2YXIgdGV4dD1fMmNhLnN1YnN0cmluZyhfMmNiLF8yY2MpOw0KdmFyIGluZm87DQp2YXIgcG9zPXRleHQuaW5kZXhPZigiOiIpOw0KaWYocG9zPT0wKXsNCmluZm89c2VsZi5fcGFyc2VGb3JtYXRGbGFncyhfMmNhLF8yY2IrMSxfMmNjKTsNCmluZm8ucGF0aD1bXTsNCn1lbHNlew0KaWYocG9zPjApew0KaW5mbz1zZWxmLl9wYXJzZUZvcm1hdEZsYWdzKF8yY2EsXzJjYitwb3MrMSxfMmNjKTsNCmluZm8ucGF0aD10ZXh0LnN1YnN0cmluZygwLHBvcykuc3BsaXQoIi4iKTsNCn1lbHNlew0KaW5mbz1zZWxmLl9wYXJzZUZvcm1hdEZsYWdzKF8yY2EsXzJjYyxfMmNjKTsNCmluZm8ucGF0aD10ZXh0LnNwbGl0KCIuIik7DQp9DQp9DQp2YXIgXzJkMT0vXlxkKyQvOw0KZm9yKHZhciBpPTA7aTxpbmZvLnBhdGgubGVuZ3RoO2krKyl7DQp2YXIgZT1pbmZvLnBhdGhbaV07DQplPWUucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKTsNCmlmKGU9PSIiJiZpbmZvLnBhdGgubGVuZ3RoPT0xKXsNCmU9MDsNCn1lbHNlew0KaWYoZT09IiIpew0KdmFyIG1zZz0iZm9ybWF0IHZhbHVlIHBhdGggY29udGFpbnMgYmxhbmtzIjsNCnRocm93IG5ldyBzZWxmLkZvcm1hdFBhdHRlcm5FcnJvcihfMmNhLF8yY2IsbXNnKTsNCn1lbHNlew0KaWYoXzJkMS50ZXN0KGUpKXsNCmU9cGFyc2VJbnQoZSk7DQp9DQp9DQp9DQppbmZvLnBhdGhbaV09ZTsNCn0NCmlmKGluZm8ucGF0aC5sZW5ndGg8MHx8dHlwZW9mIChpbmZvLnBhdGhbMF0pIT0ibnVtYmVyIil7DQppbmZvLnBhdGgudW5zaGlmdCgwKTsNCn0NCnJldHVybiBpbmZvOw0KfTsNCk1vY2hpS2l0LlRleHQuX3BhcnNlRm9ybWF0RmxhZ3M9ZnVuY3Rpb24oXzJkNSxfMmQ2LF8yZDcpew0KdmFyIHNlbGY9TW9jaGlLaXQuVGV4dDsNCnZhciBpbmZvPXtudW1lcmljOmZhbHNlLGZvcm1hdDoicyIsd2lkdGg6MCxwcmVjaXNpb246LTEsYWxpZ246Ij4iLHNpZ246Ii0iLHBhZGRpbmc6IiAiLGdyb3VwaW5nOmZhbHNlfTsNCnZhciBfMmRhPV8yZDUuc3Vic3RyaW5nKF8yZDYsXzJkNykucmVwbGFjZSgvXHMrJC8sIiIpOw0Kd2hpbGUoXzJkYS5sZW5ndGg+MCl7DQpzd2l0Y2goXzJkYS5jaGFyQXQoMCkpew0KY2FzZSAiPiI6DQpjYXNlICI8IjoNCmluZm8uYWxpZ249XzJkYS5jaGFyQXQoMCk7DQpfMmRhPV8yZGEuc3Vic3RyaW5nKDEpOw0KYnJlYWs7DQpjYXNlICIrIjoNCmNhc2UgIi0iOg0KY2FzZSAiICI6DQppbmZvLnNpZ249XzJkYS5jaGFyQXQoMCk7DQpfMmRhPV8yZGEuc3Vic3RyaW5nKDEpOw0KYnJlYWs7DQpjYXNlICIsIjoNCmluZm8uZ3JvdXBpbmc9dHJ1ZTsNCl8yZGE9XzJkYS5zdWJzdHJpbmcoMSk7DQpicmVhazsNCmNhc2UgIi4iOg0KdmFyIF8yZGI9L15cZCovLmV4ZWMoXzJkYS5zdWJzdHJpbmcoMSkpWzBdOw0KaW5mby5wcmVjaXNpb249cGFyc2VJbnQoXzJkYik7DQpfMmRhPV8yZGEuc3Vic3RyaW5nKDErXzJkYi5sZW5ndGgpOw0KYnJlYWs7DQpjYXNlICIwIjoNCmluZm8ucGFkZGluZz1fMmRhLmNoYXJBdCgwKTsNCl8yZGE9XzJkYS5zdWJzdHJpbmcoMSk7DQpicmVhazsNCmNhc2UgIjEiOg0KY2FzZSAiMiI6DQpjYXNlICIzIjoNCmNhc2UgIjQiOg0KY2FzZSAiNSI6DQpjYXNlICI2IjoNCmNhc2UgIjciOg0KY2FzZSAiOCI6DQpjYXNlICI5IjoNCnZhciBfMmRiPS9eXGQqLy5leGVjKF8yZGEpWzBdOw0KaW5mby53aWR0aD1wYXJzZUludChfMmRiKTsNCl8yZGE9XzJkYS5zdWJzdHJpbmcoXzJkYi5sZW5ndGgpOw0KYnJlYWs7DQpjYXNlICJzIjoNCmNhc2UgInIiOg0KaW5mby5mb3JtYXQ9XzJkYS5jaGFyQXQoMCk7DQpfMmRhPV8yZGEuc3Vic3RyaW5nKDEpOw0KYnJlYWs7DQpjYXNlICJiIjoNCmNhc2UgImQiOg0KY2FzZSAibyI6DQpjYXNlICJ4IjoNCmNhc2UgIlgiOg0KY2FzZSAiZiI6DQpjYXNlICIlIjoNCmluZm8ubnVtZXJpYz10cnVlOw0KaW5mby5mb3JtYXQ9XzJkYS5jaGFyQXQoMCk7DQppbmZvLnJhZGl4PTEwOw0KaWYoaW5mby5mb3JtYXQ9PT0iYiIpew0KaW5mby5yYWRpeD0yOw0KfWVsc2V7DQppZihpbmZvLmZvcm1hdD09PSJvIil7DQppbmZvLnJhZGl4PTg7DQp9ZWxzZXsNCmlmKGluZm8uZm9ybWF0PT09IngifHxpbmZvLmZvcm1hdD09PSJYIil7DQppbmZvLnJhZGl4PTE2Ow0KfQ0KfQ0KfQ0KXzJkYT1fMmRhLnN1YnN0cmluZygxKTsNCmJyZWFrOw0KZGVmYXVsdDoNCnZhciBtc2c9InVuc3VwcG9ydGVkIGZvcm1hdCBmbGFnOiAiK18yZGEuY2hhckF0KDApOw0KdGhyb3cgbmV3IHNlbGYuRm9ybWF0UGF0dGVybkVycm9yKF8yZDUsXzJkNixtc2cpOw0KfQ0KfQ0KcmV0dXJuIGluZm87DQp9Ow0KTW9jaGlLaXQuVGV4dC5fdHJ1bmNUb1BlcmNlbnQ9ZnVuY3Rpb24oXzJkZCxfMmRlKXsNCnZhciBzdHI7DQppZihfMmRlPj0wKXsNCnN0cj1Nb2NoaUtpdC5Gb3JtYXQucm91bmRUb0ZpeGVkKF8yZGQsXzJkZSsyKTsNCn1lbHNlew0Kc3RyPShfMmRkPT1udWxsKT8iMCI6XzJkZC50b1N0cmluZygpOw0KfQ0KdmFyIGFycj1Nb2NoaUtpdC5UZXh0LnNwbGl0KHN0ciwiLiIsMik7DQp2YXIgZnJhYz1Nb2NoaUtpdC5UZXh0LnBhZFJpZ2h0KGFyclsxXSwyLCIwIik7DQp2YXIgXzJlMj1hcnJbMF0rZnJhYy5zdWJzdHJpbmcoMCwyKTsNCmZyYWM9ZnJhYy5zdWJzdHJpbmcoMik7DQp3aGlsZSgvXjBbMC05XS8udGVzdChfMmUyKSl7DQpfMmUyPV8yZTIuc3Vic3RyaW5nKDEpOw0KfQ0KcmV0dXJuIChmcmFjLmxlbmd0aDw9MCk/XzJlMjpfMmUyKyIuIitmcmFjOw0KfTsNCk1vY2hpS2l0LlRleHQuRm9ybWF0UGF0dGVybkVycm9yPWZ1bmN0aW9uKF8yZTMscG9zLF8yZTUpew0KdGhpcy5wYXR0ZXJuPV8yZTM7DQp0aGlzLnBvcz1wb3M7DQp0aGlzLm1lc3NhZ2U9XzJlNTsNCn07DQpNb2NoaUtpdC5UZXh0LkZvcm1hdFBhdHRlcm5FcnJvci5wcm90b3R5cGU9bmV3IE1vY2hpS2l0LkJhc2UuTmFtZWRFcnJvcigiTW9jaGlLaXQuVGV4dC5Gb3JtYXRQYXR0ZXJuRXJyb3IiKTsNCmlmKE1vY2hpS2l0Ll9fZXhwb3J0X18pew0KZm9ybWF0dGVyPU1vY2hpS2l0LlRleHQuZm9ybWF0dGVyOw0KZm9ybWF0PU1vY2hpS2l0LlRleHQuZm9ybWF0Ow0KZm9ybWF0VmFsdWU9TW9jaGlLaXQuVGV4dC5mb3JtYXRWYWx1ZTsNCn0NCk1vY2hpS2l0LkJhc2UubmFtZUZ1bmN0aW9ucyhNb2NoaUtpdC5UZXh0KTsNCk1vY2hpS2l0LkJhc2UuX2V4cG9ydFN5bWJvbHModGhpcyxNb2NoaUtpdC5UZXh0KTsNCk1vY2hpS2l0LkJhc2UuX21vZHVsZSgiQXN5bmMiLCIxLjUiLFsiQmFzZSJdKTsNCk1vY2hpS2l0LkFzeW5jLkRlZmVycmVkPWZ1bmN0aW9uKF8yZTYpew0KdGhpcy5jaGFpbj1bXTsNCnRoaXMuaWQ9dGhpcy5fbmV4dElkKCk7DQp0aGlzLmZpcmVkPS0xOw0KdGhpcy5wYXVzZWQ9MDsNCnRoaXMucmVzdWx0cz1bbnVsbCxudWxsXTsNCnRoaXMuY2FuY2VsbGVyPV8yZTY7DQp0aGlzLnNpbGVudGx5Q2FuY2VsbGVkPWZhbHNlOw0KdGhpcy5jaGFpbmVkPWZhbHNlOw0KdGhpcy5maW5hbGl6ZWQ9ZmFsc2U7DQp9Ow0KTW9jaGlLaXQuQXN5bmMuRGVmZXJyZWQucHJvdG90eXBlPXtyZXByOmZ1bmN0aW9uKCl7DQp2YXIgXzJlNzsNCmlmKHRoaXMuZmlyZWQ9PS0xKXsNCl8yZTc9InVuZmlyZWQiOw0KfWVsc2V7DQppZih0aGlzLmZpcmVkPT09MCl7DQpfMmU3PSJzdWNjZXNzIjsNCn1lbHNlew0KXzJlNz0iZXJyb3IiOw0KfQ0KfQ0KcmV0dXJuICJEZWZlcnJlZCgiK3RoaXMuaWQrIiwgIitfMmU3KyIpIjsNCn0sdG9TdHJpbmc6TW9jaGlLaXQuQmFzZS5mb3J3YXJkQ2FsbCgicmVwciIpLF9uZXh0SWQ6TW9jaGlLaXQuQmFzZS5jb3VudGVyKCksY2FuY2VsOmZ1bmN0aW9uKCl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5Bc3luYzsNCmlmKHRoaXMuZmlyZWQ9PS0xKXsNCmlmKHRoaXMuY2FuY2VsbGVyKXsNCnRoaXMuY2FuY2VsbGVyKHRoaXMpOw0KfWVsc2V7DQp0aGlzLnNpbGVudGx5Q2FuY2VsbGVkPXRydWU7DQp9DQppZih0aGlzLmZpcmVkPT0tMSl7DQp0aGlzLmVycmJhY2sobmV3IHNlbGYuQ2FuY2VsbGVkRXJyb3IodGhpcykpOw0KfQ0KfWVsc2V7DQppZigodGhpcy5maXJlZD09PTApJiYodGhpcy5yZXN1bHRzWzBdIGluc3RhbmNlb2Ygc2VsZi5EZWZlcnJlZCkpew0KdGhpcy5yZXN1bHRzWzBdLmNhbmNlbCgpOw0KfQ0KfQ0KfSxfcmVzYmFjazpmdW5jdGlvbihyZXMpew0KdGhpcy5maXJlZD0oKHJlcyBpbnN0YW5jZW9mIEVycm9yKT8xOjApOw0KdGhpcy5yZXN1bHRzW3RoaXMuZmlyZWRdPXJlczsNCmlmKHRoaXMucGF1c2VkPT09MCl7DQp0aGlzLl9maXJlKCk7DQp9DQp9LF9jaGVjazpmdW5jdGlvbigpew0KaWYodGhpcy5maXJlZCE9LTEpew0KaWYoIXRoaXMuc2lsZW50bHlDYW5jZWxsZWQpew0KdGhyb3cgbmV3IE1vY2hpS2l0LkFzeW5jLkFscmVhZHlDYWxsZWRFcnJvcih0aGlzKTsNCn0NCnRoaXMuc2lsZW50bHlDYW5jZWxsZWQ9ZmFsc2U7DQpyZXR1cm47DQp9DQp9LGNhbGxiYWNrOmZ1bmN0aW9uKHJlcyl7DQp0aGlzLl9jaGVjaygpOw0KaWYocmVzIGluc3RhbmNlb2YgTW9jaGlLaXQuQXN5bmMuRGVmZXJyZWQpew0KdGhyb3cgbmV3IEVycm9yKCJEZWZlcnJlZCBpbnN0YW5jZXMgY2FuIG9ubHkgYmUgY2hhaW5lZCBpZiB0aGV5IGFyZSB0aGUgcmVzdWx0IG9mIGEgY2FsbGJhY2siKTsNCn0NCnRoaXMuX3Jlc2JhY2socmVzKTsNCn0sZXJyYmFjazpmdW5jdGlvbihyZXMpew0KdGhpcy5fY2hlY2soKTsNCnZhciBzZWxmPU1vY2hpS2l0LkFzeW5jOw0KaWYocmVzIGluc3RhbmNlb2Ygc2VsZi5EZWZlcnJlZCl7DQp0aHJvdyBuZXcgRXJyb3IoIkRlZmVycmVkIGluc3RhbmNlcyBjYW4gb25seSBiZSBjaGFpbmVkIGlmIHRoZXkgYXJlIHRoZSByZXN1bHQgb2YgYSBjYWxsYmFjayIpOw0KfQ0KaWYoIShyZXMgaW5zdGFuY2VvZiBFcnJvcikpew0KcmVzPW5ldyBzZWxmLkdlbmVyaWNFcnJvcihyZXMpOw0KfQ0KdGhpcy5fcmVzYmFjayhyZXMpOw0KfSxhZGRCb3RoOmZ1bmN0aW9uKGZuKXsNCmlmKGFyZ3VtZW50cy5sZW5ndGg+MSl7DQpmbj1Nb2NoaUtpdC5CYXNlLnBhcnRpYWwuYXBwbHkobnVsbCxhcmd1bWVudHMpOw0KfQ0KcmV0dXJuIHRoaXMuYWRkQ2FsbGJhY2tzKGZuLGZuKTsNCn0sYWRkQ2FsbGJhY2s6ZnVuY3Rpb24oZm4pew0KaWYoYXJndW1lbnRzLmxlbmd0aD4xKXsNCmZuPU1vY2hpS2l0LkJhc2UucGFydGlhbC5hcHBseShudWxsLGFyZ3VtZW50cyk7DQp9DQpyZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MoZm4sbnVsbCk7DQp9LGFkZEVycmJhY2s6ZnVuY3Rpb24oZm4pew0KaWYoYXJndW1lbnRzLmxlbmd0aD4xKXsNCmZuPU1vY2hpS2l0LkJhc2UucGFydGlhbC5hcHBseShudWxsLGFyZ3VtZW50cyk7DQp9DQpyZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MobnVsbCxmbik7DQp9LGFkZENhbGxiYWNrczpmdW5jdGlvbihjYixlYil7DQppZih0aGlzLmNoYWluZWQpew0KdGhyb3cgbmV3IEVycm9yKCJDaGFpbmVkIERlZmVycmVkcyBjYW4gbm90IGJlIHJlLXVzZWQiKTsNCn0NCmlmKHRoaXMuZmluYWxpemVkKXsNCnRocm93IG5ldyBFcnJvcigiRmluYWxpemVkIERlZmVycmVkcyBjYW4gbm90IGJlIHJlLXVzZWQiKTsNCn0NCnRoaXMuY2hhaW4ucHVzaChbY2IsZWJdKTsNCmlmKHRoaXMuZmlyZWQ+PTApew0KdGhpcy5fZmlyZSgpOw0KfQ0KcmV0dXJuIHRoaXM7DQp9LHNldEZpbmFsaXplcjpmdW5jdGlvbihmbil7DQppZih0aGlzLmNoYWluZWQpew0KdGhyb3cgbmV3IEVycm9yKCJDaGFpbmVkIERlZmVycmVkcyBjYW4gbm90IGJlIHJlLXVzZWQiKTsNCn0NCmlmKHRoaXMuZmluYWxpemVkKXsNCnRocm93IG5ldyBFcnJvcigiRmluYWxpemVkIERlZmVycmVkcyBjYW4gbm90IGJlIHJlLXVzZWQiKTsNCn0NCmlmKGFyZ3VtZW50cy5sZW5ndGg+MSl7DQpmbj1Nb2NoaUtpdC5CYXNlLnBhcnRpYWwuYXBwbHkobnVsbCxhcmd1bWVudHMpOw0KfQ0KdGhpcy5fZmluYWxpemVyPWZuOw0KaWYodGhpcy5maXJlZD49MCl7DQp0aGlzLl9maXJlKCk7DQp9DQpyZXR1cm4gdGhpczsNCn0sX2ZpcmU6ZnVuY3Rpb24oKXsNCnZhciBfMmYzPXRoaXMuY2hhaW47DQp2YXIgXzJmND10aGlzLmZpcmVkOw0KdmFyIHJlcz10aGlzLnJlc3VsdHNbXzJmNF07DQp2YXIgc2VsZj10aGlzOw0KdmFyIGNiPW51bGw7DQp3aGlsZShfMmYzLmxlbmd0aD4wJiZ0aGlzLnBhdXNlZD09PTApew0KdmFyIHBhaXI9XzJmMy5zaGlmdCgpOw0KdmFyIGY9cGFpcltfMmY0XTsNCmlmKGY9PT1udWxsKXsNCmNvbnRpbnVlOw0KfQ0KdHJ5ew0KcmVzPWYocmVzKTsNCl8yZjQ9KChyZXMgaW5zdGFuY2VvZiBFcnJvcik/MTowKTsNCmlmKHJlcyBpbnN0YW5jZW9mIE1vY2hpS2l0LkFzeW5jLkRlZmVycmVkKXsNCmNiPWZ1bmN0aW9uKHJlcyl7DQpzZWxmLnBhdXNlZC0tOw0Kc2VsZi5fcmVzYmFjayhyZXMpOw0KfTsNCnRoaXMucGF1c2VkKys7DQp9DQp9DQpjYXRjaChlcnIpew0KXzJmND0xOw0KaWYoIShlcnIgaW5zdGFuY2VvZiBFcnJvcikpew0KZXJyPW5ldyBNb2NoaUtpdC5Bc3luYy5HZW5lcmljRXJyb3IoZXJyKTsNCn0NCnJlcz1lcnI7DQp9DQp9DQp0aGlzLmZpcmVkPV8yZjQ7DQp0aGlzLnJlc3VsdHNbXzJmNF09cmVzOw0KaWYodGhpcy5jaGFpbi5sZW5ndGg9PTAmJnRoaXMucGF1c2VkPT09MCYmdGhpcy5fZmluYWxpemVyKXsNCnRoaXMuZmluYWxpemVkPXRydWU7DQp0aGlzLl9maW5hbGl6ZXIocmVzKTsNCn0NCmlmKGNiJiZ0aGlzLnBhdXNlZCl7DQpyZXMuYWRkQm90aChjYik7DQpyZXMuY2hhaW5lZD10cnVlOw0KfQ0KfX07DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5Bc3luYyx7ZXZhbEpTT05SZXF1ZXN0OmZ1bmN0aW9uKHJlcSl7DQpyZXR1cm4gTW9jaGlLaXQuQmFzZS5ldmFsSlNPTihyZXEucmVzcG9uc2VUZXh0KTsNCn0sc3VjY2VlZDpmdW5jdGlvbihfMmZjKXsNCnZhciBkPW5ldyBNb2NoaUtpdC5Bc3luYy5EZWZlcnJlZCgpOw0KZC5jYWxsYmFjay5hcHBseShkLGFyZ3VtZW50cyk7DQpyZXR1cm4gZDsNCn0sZmFpbDpmdW5jdGlvbihfMmZlKXsNCnZhciBkPW5ldyBNb2NoaUtpdC5Bc3luYy5EZWZlcnJlZCgpOw0KZC5lcnJiYWNrLmFwcGx5KGQsYXJndW1lbnRzKTsNCnJldHVybiBkOw0KfSxnZXRYTUxIdHRwUmVxdWVzdDpmdW5jdGlvbigpew0KdmFyIHNlbGY9YXJndW1lbnRzLmNhbGxlZTsNCmlmKCFzZWxmLlhNTEh0dHBSZXF1ZXN0KXsNCnZhciBfMzAxPVtmdW5jdGlvbigpew0KcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KfSxmdW5jdGlvbigpew0KcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNc3htbDIuWE1MSFRUUCIpOw0KfSxmdW5jdGlvbigpew0KcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOw0KfSxmdW5jdGlvbigpew0KcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNc3htbDIuWE1MSFRUUC40LjAiKTsNCn0sZnVuY3Rpb24oKXsNCnRocm93IG5ldyBNb2NoaUtpdC5Bc3luYy5Ccm93c2VyQ29tcGxpYW5jZUVycm9yKCJCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QiKTsNCn1dOw0KZm9yKHZhciBpPTA7aTxfMzAxLmxlbmd0aDtpKyspew0KdmFyIGZ1bmM9XzMwMVtpXTsNCnRyeXsNCnNlbGYuWE1MSHR0cFJlcXVlc3Q9ZnVuYzsNCnJldHVybiBmdW5jKCk7DQp9DQpjYXRjaChlKXsNCn0NCn0NCn0NCnJldHVybiBzZWxmLlhNTEh0dHBSZXF1ZXN0KCk7DQp9LF94aHJfb25yZWFkeXN0YXRlY2hhbmdlOmZ1bmN0aW9uKGQpew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCmlmKHRoaXMucmVhZHlTdGF0ZT09NCl7DQp0cnl7DQp0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsOw0KfQ0KY2F0Y2goZSl7DQp0cnl7DQp0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZT1tLm5vb3A7DQp9DQpjYXRjaChlKXsNCn0NCn0NCnZhciBfMzA2PW51bGw7DQp0cnl7DQpfMzA2PXRoaXMuc3RhdHVzOw0KaWYoIV8zMDYmJm0uaXNOb3RFbXB0eSh0aGlzLnJlc3BvbnNlVGV4dCkpew0KXzMwNj0zMDQ7DQp9DQp9DQpjYXRjaChlKXsNCn0NCmlmKF8zMDY9PTIwMHx8XzMwNj09MjAxfHxfMzA2PT0yMDR8fF8zMDY9PTMwNHx8XzMwNj09MTIyMyl7DQpkLmNhbGxiYWNrKHRoaXMpOw0KfWVsc2V7DQp2YXIgZXJyPW5ldyBNb2NoaUtpdC5Bc3luYy5YTUxIdHRwUmVxdWVzdEVycm9yKHRoaXMsIlJlcXVlc3QgZmFpbGVkIik7DQppZihlcnIubnVtYmVyKXsNCmQuZXJyYmFjayhlcnIpOw0KfWVsc2V7DQpkLmVycmJhY2soZXJyKTsNCn0NCn0NCn0NCn0sX3hocl9jYW5jZWxsZXI6ZnVuY3Rpb24ocmVxKXsNCnRyeXsNCnJlcS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDsNCn0NCmNhdGNoKGUpew0KdHJ5ew0KcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZT1Nb2NoaUtpdC5CYXNlLm5vb3A7DQp9DQpjYXRjaChlKXsNCn0NCn0NCnJlcS5hYm9ydCgpOw0KfSxzZW5kWE1MSHR0cFJlcXVlc3Q6ZnVuY3Rpb24ocmVxLF8zMGEpew0KaWYodHlwZW9mIChfMzBhKT09InVuZGVmaW5lZCJ8fF8zMGE9PT1udWxsKXsNCl8zMGE9IiI7DQp9DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KdmFyIHNlbGY9TW9jaGlLaXQuQXN5bmM7DQp2YXIgZD1uZXcgc2VsZi5EZWZlcnJlZChtLnBhcnRpYWwoc2VsZi5feGhyX2NhbmNlbGxlcixyZXEpKTsNCnRyeXsNCnJlcS5vbnJlYWR5c3RhdGVjaGFuZ2U9bS5iaW5kKHNlbGYuX3hocl9vbnJlYWR5c3RhdGVjaGFuZ2UscmVxLGQpOw0KcmVxLnNlbmQoXzMwYSk7DQp9DQpjYXRjaChlKXsNCnRyeXsNCnJlcS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDsNCn0NCmNhdGNoKGlnbm9yZSl7DQp9DQpkLmVycmJhY2soZSk7DQp9DQpyZXR1cm4gZDsNCn0sZG9YSFI6ZnVuY3Rpb24odXJsLG9wdHMpew0KdmFyIHNlbGY9TW9jaGlLaXQuQXN5bmM7DQpyZXR1cm4gc2VsZi5jYWxsTGF0ZXIoMCxzZWxmLl9kb1hIUix1cmwsb3B0cyk7DQp9LF9kb1hIUjpmdW5jdGlvbih1cmwsb3B0cyl7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0Kb3B0cz1tLnVwZGF0ZSh7bWV0aG9kOiJHRVQiLHNlbmRDb250ZW50OiIifSxvcHRzKTsNCnZhciBzZWxmPU1vY2hpS2l0LkFzeW5jOw0KdmFyIHJlcT1zZWxmLmdldFhNTEh0dHBSZXF1ZXN0KCk7DQppZihvcHRzLnF1ZXJ5U3RyaW5nKXsNCnZhciBxcz1tLnF1ZXJ5U3RyaW5nKG9wdHMucXVlcnlTdHJpbmcpOw0KaWYocXMpew0KdXJsKz0iPyIrcXM7DQp9DQp9DQppZigidXNlcm5hbWUiIGluIG9wdHMpew0KcmVxLm9wZW4ob3B0cy5tZXRob2QsdXJsLHRydWUsb3B0cy51c2VybmFtZSxvcHRzLnBhc3N3b3JkKTsNCn1lbHNlew0KcmVxLm9wZW4ob3B0cy5tZXRob2QsdXJsLHRydWUpOw0KfQ0KaWYocmVxLm92ZXJyaWRlTWltZVR5cGUmJm9wdHMubWltZVR5cGUpew0KcmVxLm92ZXJyaWRlTWltZVR5cGUob3B0cy5taW1lVHlwZSk7DQp9DQpyZXEuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBSZXF1ZXN0Iik7DQppZihvcHRzLmhlYWRlcnMpew0KdmFyIF8zMTc9b3B0cy5oZWFkZXJzOw0KaWYoIW0uaXNBcnJheUxpa2UoXzMxNykpew0KXzMxNz1tLml0ZW1zKF8zMTcpOw0KfQ0KZm9yKHZhciBpPTA7aTxfMzE3Lmxlbmd0aDtpKyspew0KdmFyIF8zMTk9XzMxN1tpXTsNCnZhciBuYW1lPV8zMTlbMF07DQp2YXIgXzMxYj1fMzE5WzFdOw0KcmVxLnNldFJlcXVlc3RIZWFkZXIobmFtZSxfMzFiKTsNCn0NCn0NCnJldHVybiBzZWxmLnNlbmRYTUxIdHRwUmVxdWVzdChyZXEsb3B0cy5zZW5kQ29udGVudCk7DQp9LF9idWlsZFVSTDpmdW5jdGlvbih1cmwpew0KaWYoYXJndW1lbnRzLmxlbmd0aD4xKXsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQp2YXIgcXM9bS5xdWVyeVN0cmluZy5hcHBseShudWxsLG0uZXh0ZW5kKG51bGwsYXJndW1lbnRzLDEpKTsNCmlmKHFzKXsNCnJldHVybiB1cmwrIj8iK3FzOw0KfQ0KfQ0KcmV0dXJuIHVybDsNCn0sZG9TaW1wbGVYTUxIdHRwUmVxdWVzdDpmdW5jdGlvbih1cmwpew0KdmFyIHNlbGY9TW9jaGlLaXQuQXN5bmM7DQp1cmw9c2VsZi5fYnVpbGRVUkwuYXBwbHkoc2VsZixhcmd1bWVudHMpOw0KcmV0dXJuIHNlbGYuZG9YSFIodXJsKTsNCn0sbG9hZEpTT05Eb2M6ZnVuY3Rpb24odXJsKXsNCnZhciBzZWxmPU1vY2hpS2l0LkFzeW5jOw0KdXJsPXNlbGYuX2J1aWxkVVJMLmFwcGx5KHNlbGYsYXJndW1lbnRzKTsNCnZhciBkPXNlbGYuZG9YSFIodXJsLHsibWltZVR5cGUiOiJ0ZXh0L3BsYWluIiwiaGVhZGVycyI6W1siQWNjZXB0IiwiYXBwbGljYXRpb24vanNvbiJdXX0pOw0KZD1kLmFkZENhbGxiYWNrKHNlbGYuZXZhbEpTT05SZXF1ZXN0KTsNCnJldHVybiBkOw0KfSx3YWl0OmZ1bmN0aW9uKF8zMjQsXzMyNSl7DQp2YXIgZD1uZXcgTW9jaGlLaXQuQXN5bmMuRGVmZXJyZWQoKTsNCnZhciBjYj1Nb2NoaUtpdC5CYXNlLmJpbmQoImNhbGxiYWNrIixkLF8zMjUpOw0KdmFyIF8zMjg9c2V0VGltZW91dChjYixNYXRoLmZsb29yKF8zMjQqMTAwMCkpOw0KZC5jYW5jZWxsZXI9ZnVuY3Rpb24oKXsNCnRyeXsNCmNsZWFyVGltZW91dChfMzI4KTsNCn0NCmNhdGNoKGUpew0KfQ0KfTsNCnJldHVybiBkOw0KfSxjYWxsTGF0ZXI6ZnVuY3Rpb24oXzMyOSxmdW5jKXsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQp2YXIgXzMyYz1tLnBhcnRpYWwuYXBwbHkobSxtLmV4dGVuZChudWxsLGFyZ3VtZW50cywxKSk7DQpyZXR1cm4gTW9jaGlLaXQuQXN5bmMud2FpdChfMzI5KS5hZGRDYWxsYmFjayhmdW5jdGlvbihyZXMpew0KcmV0dXJuIF8zMmMoKTsNCn0pOw0KfX0pOw0KTW9jaGlLaXQuQXN5bmMuRGVmZXJyZWRMb2NrPWZ1bmN0aW9uKCl7DQp0aGlzLndhaXRpbmc9W107DQp0aGlzLmxvY2tlZD1mYWxzZTsNCnRoaXMuaWQ9dGhpcy5fbmV4dElkKCk7DQp9Ow0KTW9jaGlLaXQuQXN5bmMuRGVmZXJyZWRMb2NrLnByb3RvdHlwZT17X19jbGFzc19fOk1vY2hpS2l0LkFzeW5jLkRlZmVycmVkTG9jayxhY3F1aXJlOmZ1bmN0aW9uKCl7DQp2YXIgZD1uZXcgTW9jaGlLaXQuQXN5bmMuRGVmZXJyZWQoKTsNCmlmKHRoaXMubG9ja2VkKXsNCnRoaXMud2FpdGluZy5wdXNoKGQpOw0KfWVsc2V7DQp0aGlzLmxvY2tlZD10cnVlOw0KZC5jYWxsYmFjayh0aGlzKTsNCn0NCnJldHVybiBkOw0KfSxyZWxlYXNlOmZ1bmN0aW9uKCl7DQppZighdGhpcy5sb2NrZWQpew0KdGhyb3cgVHlwZUVycm9yKCJUcmllZCB0byByZWxlYXNlIGFuIHVubG9ja2VkIERlZmVycmVkTG9jayIpOw0KfQ0KdGhpcy5sb2NrZWQ9ZmFsc2U7DQppZih0aGlzLndhaXRpbmcubGVuZ3RoPjApew0KdGhpcy5sb2NrZWQ9dHJ1ZTsNCnRoaXMud2FpdGluZy5zaGlmdCgpLmNhbGxiYWNrKHRoaXMpOw0KfQ0KfSxfbmV4dElkOk1vY2hpS2l0LkJhc2UuY291bnRlcigpLHJlcHI6ZnVuY3Rpb24oKXsNCnZhciBfMzJmOw0KaWYodGhpcy5sb2NrZWQpew0KXzMyZj0ibG9ja2VkLCAiK3RoaXMud2FpdGluZy5sZW5ndGgrIiB3YWl0aW5nIjsNCn1lbHNlew0KXzMyZj0idW5sb2NrZWQiOw0KfQ0KcmV0dXJuICJEZWZlcnJlZExvY2soIit0aGlzLmlkKyIsICIrXzMyZisiKSI7DQp9LHRvU3RyaW5nOk1vY2hpS2l0LkJhc2UuZm9yd2FyZENhbGwoInJlcHIiKX07DQpNb2NoaUtpdC5Bc3luYy5EZWZlcnJlZExpc3Q9ZnVuY3Rpb24obGlzdCxfMzMxLF8zMzIsXzMzMyxfMzM0KXsNCk1vY2hpS2l0LkFzeW5jLkRlZmVycmVkLmFwcGx5KHRoaXMsW18zMzRdKTsNCnRoaXMubGlzdD1saXN0Ow0KdmFyIF8zMzU9W107DQp0aGlzLnJlc3VsdExpc3Q9XzMzNTsNCnRoaXMuZmluaXNoZWRDb3VudD0wOw0KdGhpcy5maXJlT25PbmVDYWxsYmFjaz1fMzMxOw0KdGhpcy5maXJlT25PbmVFcnJiYWNrPV8zMzI7DQp0aGlzLmNvbnN1bWVFcnJvcnM9XzMzMzsNCnZhciBjYj1Nb2NoaUtpdC5CYXNlLmJpbmQodGhpcy5fY2JEZWZlcnJlZCx0aGlzKTsNCmZvcih2YXIgaT0wO2k8bGlzdC5sZW5ndGg7aSsrKXsNCnZhciBkPWxpc3RbaV07DQpfMzM1LnB1c2godW5kZWZpbmVkKTsNCmQuYWRkQ2FsbGJhY2soY2IsaSx0cnVlKTsNCmQuYWRkRXJyYmFjayhjYixpLGZhbHNlKTsNCn0NCmlmKGxpc3QubGVuZ3RoPT09MCYmIV8zMzEpew0KdGhpcy5jYWxsYmFjayh0aGlzLnJlc3VsdExpc3QpOw0KfQ0KfTsNCk1vY2hpS2l0LkFzeW5jLkRlZmVycmVkTGlzdC5wcm90b3R5cGU9bmV3IE1vY2hpS2l0LkFzeW5jLkRlZmVycmVkKCk7DQpNb2NoaUtpdC5Bc3luYy5EZWZlcnJlZExpc3QucHJvdG90eXBlLl9jYkRlZmVycmVkPWZ1bmN0aW9uKF8zMzksXzMzYSxfMzNiKXsNCnRoaXMucmVzdWx0TGlzdFtfMzM5XT1bXzMzYSxfMzNiXTsNCnRoaXMuZmluaXNoZWRDb3VudCs9MTsNCmlmKHRoaXMuZmlyZWQ9PS0xKXsNCmlmKF8zM2EmJnRoaXMuZmlyZU9uT25lQ2FsbGJhY2spew0KdGhpcy5jYWxsYmFjayhbXzMzOSxfMzNiXSk7DQp9ZWxzZXsNCmlmKCFfMzNhJiZ0aGlzLmZpcmVPbk9uZUVycmJhY2spew0KdGhpcy5lcnJiYWNrKF8zM2IpOw0KfWVsc2V7DQppZih0aGlzLmZpbmlzaGVkQ291bnQ9PXRoaXMubGlzdC5sZW5ndGgpew0KdGhpcy5jYWxsYmFjayh0aGlzLnJlc3VsdExpc3QpOw0KfQ0KfQ0KfQ0KfQ0KaWYoIV8zM2EmJnRoaXMuY29uc3VtZUVycm9ycyl7DQpfMzNiPW51bGw7DQp9DQpyZXR1cm4gXzMzYjsNCn07DQpNb2NoaUtpdC5Bc3luYy5nYXRoZXJSZXN1bHRzPWZ1bmN0aW9uKF8zM2Mpew0KdmFyIGQ9bmV3IE1vY2hpS2l0LkFzeW5jLkRlZmVycmVkTGlzdChfMzNjLGZhbHNlLHRydWUsZmFsc2UpOw0KZC5hZGRDYWxsYmFjayhmdW5jdGlvbihfMzNlKXsNCnZhciByZXQ9W107DQpmb3IodmFyIGk9MDtpPF8zM2UubGVuZ3RoO2krKyl7DQpyZXQucHVzaChfMzNlW2ldWzFdKTsNCn0NCnJldHVybiByZXQ7DQp9KTsNCnJldHVybiBkOw0KfTsNCk1vY2hpS2l0LkFzeW5jLm1heWJlRGVmZXJyZWQ9ZnVuY3Rpb24oZnVuYyl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5Bc3luYzsNCnZhciBfMzQzOw0KdHJ5ew0KdmFyIHI9ZnVuYy5hcHBseShudWxsLE1vY2hpS2l0LkJhc2UuZXh0ZW5kKFtdLGFyZ3VtZW50cywxKSk7DQppZihyIGluc3RhbmNlb2Ygc2VsZi5EZWZlcnJlZCl7DQpfMzQzPXI7DQp9ZWxzZXsNCmlmKHIgaW5zdGFuY2VvZiBFcnJvcil7DQpfMzQzPXNlbGYuZmFpbChyKTsNCn1lbHNlew0KXzM0Mz1zZWxmLnN1Y2NlZWQocik7DQp9DQp9DQp9DQpjYXRjaChlKXsNCl8zNDM9c2VsZi5mYWlsKGUpOw0KfQ0KcmV0dXJuIF8zNDM7DQp9Ow0KTW9jaGlLaXQuQXN5bmMuX19uZXdfXz1mdW5jdGlvbigpew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnZhciBuZT1tLnBhcnRpYWwobS5fbmV3TmFtZWRFcnJvcix0aGlzKTsNCm5lKCJBbHJlYWR5Q2FsbGVkRXJyb3IiLGZ1bmN0aW9uKF8zNDcpew0KdGhpcy5kZWZlcnJlZD1fMzQ3Ow0KfSk7DQpuZSgiQ2FuY2VsbGVkRXJyb3IiLGZ1bmN0aW9uKF8zNDgpew0KdGhpcy5kZWZlcnJlZD1fMzQ4Ow0KfSk7DQpuZSgiQnJvd3NlckNvbXBsaWFuY2VFcnJvciIsZnVuY3Rpb24obXNnKXsNCnRoaXMubWVzc2FnZT1tc2c7DQp9KTsNCm5lKCJHZW5lcmljRXJyb3IiLGZ1bmN0aW9uKG1zZyl7DQp0aGlzLm1lc3NhZ2U9bXNnOw0KfSk7DQpuZSgiWE1MSHR0cFJlcXVlc3RFcnJvciIsZnVuY3Rpb24ocmVxLG1zZyl7DQp0aGlzLnJlcT1yZXE7DQp0aGlzLm1lc3NhZ2U9bXNnOw0KdHJ5ew0KdGhpcy5udW1iZXI9cmVxLnN0YXR1czsNCn0NCmNhdGNoKGUpew0KfQ0KfSk7DQptLm5hbWVGdW5jdGlvbnModGhpcyk7DQp9Ow0KTW9jaGlLaXQuQXN5bmMuX19uZXdfXygpOw0KTW9jaGlLaXQuQmFzZS5fZXhwb3J0U3ltYm9scyh0aGlzLE1vY2hpS2l0LkFzeW5jKTsNCk1vY2hpS2l0LkJhc2UuX21vZHVsZSgiRE9NIiwiMS41IixbIkJhc2UiXSk7DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5ET00se2N1cnJlbnRXaW5kb3c6ZnVuY3Rpb24oKXsNCnJldHVybiBNb2NoaUtpdC5ET00uX3dpbmRvdzsNCn0sY3VycmVudERvY3VtZW50OmZ1bmN0aW9uKCl7DQpyZXR1cm4gTW9jaGlLaXQuRE9NLl9kb2N1bWVudDsNCn0sd2l0aFdpbmRvdzpmdW5jdGlvbih3aW4sZnVuYyl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQp2YXIgXzM1MD1zZWxmLl9kb2N1bWVudDsNCnZhciBfMzUxPXNlbGYuX3dpbmRvdzsNCnZhciBydmFsOw0KdHJ5ew0Kc2VsZi5fd2luZG93PXdpbjsNCnNlbGYuX2RvY3VtZW50PXdpbi5kb2N1bWVudDsNCnJ2YWw9ZnVuYygpOw0KfQ0KY2F0Y2goZSl7DQpzZWxmLl93aW5kb3c9XzM1MTsNCnNlbGYuX2RvY3VtZW50PV8zNTA7DQp0aHJvdyBlOw0KfQ0Kc2VsZi5fd2luZG93PV8zNTE7DQpzZWxmLl9kb2N1bWVudD1fMzUwOw0KcmV0dXJuIHJ2YWw7DQp9LGZvcm1Db250ZW50czpmdW5jdGlvbihlbGVtKXsNCnZhciBfMzU0PVtdOw0KdmFyIF8zNTU9W107DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KdmFyIHNlbGY9TW9jaGlLaXQuRE9NOw0KaWYodHlwZW9mIChlbGVtKT09InVuZGVmaW5lZCJ8fGVsZW09PT1udWxsKXsNCmVsZW09c2VsZi5fZG9jdW1lbnQuYm9keTsNCn1lbHNlew0KZWxlbT1zZWxmLmdldEVsZW1lbnQoZWxlbSk7DQp9DQptLm5vZGVXYWxrKGVsZW0sZnVuY3Rpb24oZWxlbSl7DQp2YXIgbmFtZT1lbGVtLm5hbWU7DQppZihtLmlzTm90RW1wdHkobmFtZSkpew0KdmFyIF8zNWE9ZWxlbS50YWdOYW1lLnRvVXBwZXJDYXNlKCk7DQppZihfMzVhPT09IklOUFVUIiYmKGVsZW0udHlwZT09InJhZGlvInx8ZWxlbS50eXBlPT0iY2hlY2tib3giKSYmIWVsZW0uY2hlY2tlZCl7DQpyZXR1cm4gbnVsbDsNCn0NCmlmKF8zNWE9PT0iU0VMRUNUIil7DQppZihlbGVtLnR5cGU9PSJzZWxlY3Qtb25lIil7DQppZihlbGVtLnNlbGVjdGVkSW5kZXg+PTApew0KdmFyIG9wdD1lbGVtLm9wdGlvbnNbZWxlbS5zZWxlY3RlZEluZGV4XTsNCnZhciB2PW9wdC52YWx1ZTsNCmlmKCF2KXsNCnZhciBoPW9wdC5vdXRlckhUTUw7DQppZihoJiYhaC5tYXRjaCgvXltePl0rXHN2YWx1ZVxzKj0vaSkpew0Kdj1vcHQudGV4dDsNCn0NCn0NCl8zNTQucHVzaChuYW1lKTsNCl8zNTUucHVzaCh2KTsNCnJldHVybiBudWxsOw0KfQ0KXzM1NC5wdXNoKG5hbWUpOw0KXzM1NS5wdXNoKCIiKTsNCnJldHVybiBudWxsOw0KfWVsc2V7DQp2YXIgb3B0cz1lbGVtLm9wdGlvbnM7DQppZighb3B0cy5sZW5ndGgpew0KXzM1NC5wdXNoKG5hbWUpOw0KXzM1NS5wdXNoKCIiKTsNCnJldHVybiBudWxsOw0KfQ0KZm9yKHZhciBpPTA7aTxvcHRzLmxlbmd0aDtpKyspew0KdmFyIG9wdD1vcHRzW2ldOw0KaWYoIW9wdC5zZWxlY3RlZCl7DQpjb250aW51ZTsNCn0NCnZhciB2PW9wdC52YWx1ZTsNCmlmKCF2KXsNCnZhciBoPW9wdC5vdXRlckhUTUw7DQppZihoJiYhaC5tYXRjaCgvXltePl0rXHN2YWx1ZVxzKj0vaSkpew0Kdj1vcHQudGV4dDsNCn0NCn0NCl8zNTQucHVzaChuYW1lKTsNCl8zNTUucHVzaCh2KTsNCn0NCnJldHVybiBudWxsOw0KfQ0KfQ0KaWYoXzM1YT09PSJGT1JNInx8XzM1YT09PSJQInx8XzM1YT09PSJTUEFOInx8XzM1YT09PSJESVYiKXsNCnJldHVybiBlbGVtLmNoaWxkTm9kZXM7DQp9DQpfMzU0LnB1c2gobmFtZSk7DQpfMzU1LnB1c2goZWxlbS52YWx1ZXx8IiIpOw0KcmV0dXJuIG51bGw7DQp9DQpyZXR1cm4gZWxlbS5jaGlsZE5vZGVzOw0KfSk7DQpyZXR1cm4gW18zNTQsXzM1NV07DQp9LHdpdGhEb2N1bWVudDpmdW5jdGlvbihkb2MsZnVuYyl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQp2YXIgXzM2Mz1zZWxmLl9kb2N1bWVudDsNCnZhciBydmFsOw0KdHJ5ew0Kc2VsZi5fZG9jdW1lbnQ9ZG9jOw0KcnZhbD1mdW5jKCk7DQp9DQpjYXRjaChlKXsNCnNlbGYuX2RvY3VtZW50PV8zNjM7DQp0aHJvdyBlOw0KfQ0Kc2VsZi5fZG9jdW1lbnQ9XzM2MzsNCnJldHVybiBydmFsOw0KfSxyZWdpc3RlckRPTUNvbnZlcnRlcjpmdW5jdGlvbihuYW1lLF8zNjYsd3JhcCxfMzY4KXsNCk1vY2hpS2l0LkRPTS5kb21Db252ZXJ0ZXJzLnJlZ2lzdGVyKG5hbWUsXzM2Nix3cmFwLF8zNjgpOw0KfSxjb2VyY2VUb0RPTTpmdW5jdGlvbihub2RlLGN0eCl7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KdmFyIGltPU1vY2hpS2l0Lkl0ZXI7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQppZihpbSl7DQp2YXIgaXRlcj1pbS5pdGVyOw0KdmFyIF8zNmY9aW0ucmVwZWF0Ow0KfQ0KdmFyIG1hcD1tLm1hcDsNCnZhciBfMzcxPXNlbGYuZG9tQ29udmVydGVyczsNCnZhciBfMzcyPWFyZ3VtZW50cy5jYWxsZWU7DQp2YXIgXzM3Mz1tLk5vdEZvdW5kOw0Kd2hpbGUodHJ1ZSl7DQppZih0eXBlb2YgKG5vZGUpPT0idW5kZWZpbmVkInx8bm9kZT09PW51bGwpew0KcmV0dXJuIG51bGw7DQp9DQppZih0eXBlb2YgKG5vZGUpPT0iZnVuY3Rpb24iJiZ0eXBlb2YgKG5vZGUubGVuZ3RoKT09Im51bWJlciImJiEobm9kZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl7DQpub2RlPWltP2ltLmxpc3Qobm9kZSk6bS5leHRlbmQobnVsbCxub2RlKTsNCn0NCmlmKHR5cGVvZiAobm9kZS5ub2RlVHlwZSkhPSJ1bmRlZmluZWQiJiZub2RlLm5vZGVUeXBlPjApew0KcmV0dXJuIG5vZGU7DQp9DQppZih0eXBlb2YgKG5vZGUpPT0ibnVtYmVyInx8dHlwZW9mIChub2RlKT09ImJvb2xlYW4iKXsNCm5vZGU9bm9kZS50b1N0cmluZygpOw0KfQ0KaWYodHlwZW9mIChub2RlKT09InN0cmluZyIpew0KcmV0dXJuIHNlbGYuX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5vZGUpOw0KfQ0KaWYodHlwZW9mIChub2RlLl9fZG9tX18pPT0iZnVuY3Rpb24iKXsNCm5vZGU9bm9kZS5fX2RvbV9fKGN0eCk7DQpjb250aW51ZTsNCn0NCmlmKHR5cGVvZiAobm9kZS5kb20pPT0iZnVuY3Rpb24iKXsNCm5vZGU9bm9kZS5kb20oY3R4KTsNCmNvbnRpbnVlOw0KfQ0KaWYodHlwZW9mIChub2RlKT09ImZ1bmN0aW9uIil7DQpub2RlPW5vZGUuYXBwbHkoY3R4LFtjdHhdKTsNCmNvbnRpbnVlOw0KfQ0KaWYoaW0pew0KdmFyIF8zNzQ9bnVsbDsNCnRyeXsNCl8zNzQ9aXRlcihub2RlKTsNCn0NCmNhdGNoKGUpew0KfQ0KaWYoXzM3NCl7DQpyZXR1cm4gbWFwKF8zNzIsXzM3NCxfMzZmKGN0eCkpOw0KfQ0KfWVsc2V7DQppZihtLmlzQXJyYXlMaWtlKG5vZGUpKXsNCnZhciBmdW5jPWZ1bmN0aW9uKG4pew0KcmV0dXJuIF8zNzIobixjdHgpOw0KfTsNCnJldHVybiBtYXAoZnVuYyxub2RlKTsNCn0NCn0NCnRyeXsNCm5vZGU9XzM3MS5tYXRjaChub2RlLGN0eCk7DQpjb250aW51ZTsNCn0NCmNhdGNoKGUpew0KaWYoZSE9XzM3Myl7DQp0aHJvdyBlOw0KfQ0KfQ0KcmV0dXJuIHNlbGYuX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5vZGUudG9TdHJpbmcoKSk7DQp9DQpyZXR1cm4gdW5kZWZpbmVkOw0KfSxpc0NoaWxkTm9kZTpmdW5jdGlvbihub2RlLF8zNzgpew0KdmFyIHNlbGY9TW9jaGlLaXQuRE9NOw0KaWYodHlwZW9mIChub2RlKT09InN0cmluZyIpew0Kbm9kZT1zZWxmLmdldEVsZW1lbnQobm9kZSk7DQp9DQppZih0eXBlb2YgKF8zNzgpPT0ic3RyaW5nIil7DQpfMzc4PXNlbGYuZ2V0RWxlbWVudChfMzc4KTsNCn0NCmlmKHR5cGVvZiAobm9kZSk9PSJ1bmRlZmluZWQifHxub2RlPT09bnVsbCl7DQpyZXR1cm4gZmFsc2U7DQp9DQp3aGlsZShub2RlIT1udWxsJiZub2RlIT09c2VsZi5fZG9jdW1lbnQpew0KaWYobm9kZT09PV8zNzgpew0KcmV0dXJuIHRydWU7DQp9DQpub2RlPW5vZGUucGFyZW50Tm9kZTsNCn0NCnJldHVybiBmYWxzZTsNCn0sc2V0Tm9kZUF0dHJpYnV0ZTpmdW5jdGlvbihub2RlLGF0dHIsXzM3Yyl7DQp2YXIgbz17fTsNCm9bYXR0cl09XzM3YzsNCnRyeXsNCnJldHVybiBNb2NoaUtpdC5ET00udXBkYXRlTm9kZUF0dHJpYnV0ZXMobm9kZSxvKTsNCn0NCmNhdGNoKGUpew0KfQ0KcmV0dXJuIG51bGw7DQp9LGdldE5vZGVBdHRyaWJ1dGU6ZnVuY3Rpb24obm9kZSxhdHRyKXsNCnZhciBzZWxmPU1vY2hpS2l0LkRPTTsNCnZhciBfMzgxPXNlbGYuYXR0cmlidXRlQXJyYXkucmVuYW1lc1thdHRyXTsNCnZhciBfMzgyPXNlbGYuYXR0cmlidXRlQXJyYXkuaWdub3JlQXR0clthdHRyXTsNCm5vZGU9c2VsZi5nZXRFbGVtZW50KG5vZGUpOw0KdHJ5ew0KaWYoXzM4MSl7DQpyZXR1cm4gbm9kZVtfMzgxXTsNCn0NCnZhciBfMzgzPW5vZGUuZ2V0QXR0cmlidXRlKGF0dHIpOw0KaWYoXzM4MyE9XzM4Mil7DQpyZXR1cm4gXzM4MzsNCn0NCn0NCmNhdGNoKGUpew0KfQ0KcmV0dXJuIG51bGw7DQp9LHJlbW92ZU5vZGVBdHRyaWJ1dGU6ZnVuY3Rpb24obm9kZSxhdHRyKXsNCnZhciBzZWxmPU1vY2hpS2l0LkRPTTsNCnZhciBfMzg3PXNlbGYuYXR0cmlidXRlQXJyYXkucmVuYW1lc1thdHRyXTsNCm5vZGU9c2VsZi5nZXRFbGVtZW50KG5vZGUpOw0KdHJ5ew0KaWYoXzM4Nyl7DQpyZXR1cm4gbm9kZVtfMzg3XTsNCn0NCnJldHVybiBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTsNCn0NCmNhdGNoKGUpew0KfQ0KcmV0dXJuIG51bGw7DQp9LHVwZGF0ZU5vZGVBdHRyaWJ1dGVzOmZ1bmN0aW9uKG5vZGUsXzM4OSl7DQp2YXIgZWxlbT1ub2RlOw0KdmFyIHNlbGY9TW9jaGlLaXQuRE9NOw0KaWYodHlwZW9mIChub2RlKT09InN0cmluZyIpew0KZWxlbT1zZWxmLmdldEVsZW1lbnQobm9kZSk7DQp9DQppZihfMzg5KXsNCnZhciBfMzhjPU1vY2hpS2l0LkJhc2UudXBkYXRldHJlZTsNCmlmKHNlbGYuYXR0cmlidXRlQXJyYXkuY29tcGxpYW50KXsNCmZvcih2YXIgayBpbiBfMzg5KXsNCnZhciB2PV8zODlba107DQppZih0eXBlb2YgKHYpPT0ib2JqZWN0IiYmdHlwZW9mIChlbGVtW2tdKT09Im9iamVjdCIpew0KaWYoaz09InN0eWxlIiYmTW9jaGlLaXQuU3R5bGUpew0KTW9jaGlLaXQuU3R5bGUuc2V0U3R5bGUoZWxlbSx2KTsNCn1lbHNlew0KXzM4YyhlbGVtW2tdLHYpOw0KfQ0KfWVsc2V7DQppZihrLnN1YnN0cmluZygwLDIpPT0ib24iKXsNCmlmKHR5cGVvZiAodik9PSJzdHJpbmciKXsNCnY9bmV3IEZ1bmN0aW9uKHYpOw0KfQ0KZWxlbVtrXT12Ow0KfWVsc2V7DQplbGVtLnNldEF0dHJpYnV0ZShrLHYpOw0KfQ0KfQ0KaWYodHlwZW9mIChlbGVtW2tdKT09InN0cmluZyImJmVsZW1ba10hPXYpew0KZWxlbVtrXT12Ow0KfQ0KfQ0KfWVsc2V7DQp2YXIgXzM4Zj1zZWxmLmF0dHJpYnV0ZUFycmF5LnJlbmFtZXM7DQpmb3IodmFyIGsgaW4gXzM4OSl7DQp2PV8zODlba107DQp2YXIgXzM5MD1fMzhmW2tdOw0KaWYoaz09InN0eWxlIiYmdHlwZW9mICh2KT09InN0cmluZyIpew0KZWxlbS5zdHlsZS5jc3NUZXh0PXY7DQp9ZWxzZXsNCmlmKHR5cGVvZiAoXzM5MCk9PSJzdHJpbmciKXsNCmVsZW1bXzM5MF09djsNCn1lbHNlew0KaWYodHlwZW9mIChlbGVtW2tdKT09Im9iamVjdCImJnR5cGVvZiAodik9PSJvYmplY3QiKXsNCmlmKGs9PSJzdHlsZSImJk1vY2hpS2l0LlN0eWxlKXsNCk1vY2hpS2l0LlN0eWxlLnNldFN0eWxlKGVsZW0sdik7DQp9ZWxzZXsNCl8zOGMoZWxlbVtrXSx2KTsNCn0NCn1lbHNlew0KaWYoay5zdWJzdHJpbmcoMCwyKT09Im9uIil7DQppZih0eXBlb2YgKHYpPT0ic3RyaW5nIil7DQp2PW5ldyBGdW5jdGlvbih2KTsNCn0NCmVsZW1ba109djsNCn1lbHNlew0KZWxlbS5zZXRBdHRyaWJ1dGUoayx2KTsNCn0NCn0NCn0NCn0NCmlmKHR5cGVvZiAoZWxlbVtrXSk9PSJzdHJpbmciJiZlbGVtW2tdIT12KXsNCmVsZW1ba109djsNCn0NCn0NCn0NCn0NCnJldHVybiBlbGVtOw0KfSxhcHBlbmRDaGlsZE5vZGVzOmZ1bmN0aW9uKG5vZGUpew0KdmFyIGVsZW09bm9kZTsNCnZhciBzZWxmPU1vY2hpS2l0LkRPTTsNCmlmKHR5cGVvZiAobm9kZSk9PSJzdHJpbmciKXsNCmVsZW09c2VsZi5nZXRFbGVtZW50KG5vZGUpOw0KfQ0KdmFyIF8zOTQ9W3NlbGYuY29lcmNlVG9ET00oTW9jaGlLaXQuQmFzZS5leHRlbmQobnVsbCxhcmd1bWVudHMsMSksZWxlbSldOw0KdmFyIF8zOTU9TW9jaGlLaXQuQmFzZS5jb25jYXQ7DQp3aGlsZShfMzk0Lmxlbmd0aCl7DQp2YXIgbj1fMzk0LnNoaWZ0KCk7DQppZih0eXBlb2YgKG4pPT0idW5kZWZpbmVkInx8bj09PW51bGwpew0KfWVsc2V7DQppZih0eXBlb2YgKG4ubm9kZVR5cGUpPT0ibnVtYmVyIil7DQplbGVtLmFwcGVuZENoaWxkKG4pOw0KfWVsc2V7DQpfMzk0PV8zOTUobixfMzk0KTsNCn0NCn0NCn0NCnJldHVybiBlbGVtOw0KfSxpbnNlcnRTaWJsaW5nTm9kZXNCZWZvcmU6ZnVuY3Rpb24obm9kZSl7DQp2YXIgZWxlbT1ub2RlOw0KdmFyIHNlbGY9TW9jaGlLaXQuRE9NOw0KaWYodHlwZW9mIChub2RlKT09InN0cmluZyIpew0KZWxlbT1zZWxmLmdldEVsZW1lbnQobm9kZSk7DQp9DQp2YXIgXzM5YT1bc2VsZi5jb2VyY2VUb0RPTShNb2NoaUtpdC5CYXNlLmV4dGVuZChudWxsLGFyZ3VtZW50cywxKSxlbGVtKV07DQp2YXIgXzM5Yj1lbGVtLnBhcmVudE5vZGU7DQp2YXIgXzM5Yz1Nb2NoaUtpdC5CYXNlLmNvbmNhdDsNCndoaWxlKF8zOWEubGVuZ3RoKXsNCnZhciBuPV8zOWEuc2hpZnQoKTsNCmlmKHR5cGVvZiAobik9PSJ1bmRlZmluZWQifHxuPT09bnVsbCl7DQp9ZWxzZXsNCmlmKHR5cGVvZiAobi5ub2RlVHlwZSk9PSJudW1iZXIiKXsNCl8zOWIuaW5zZXJ0QmVmb3JlKG4sZWxlbSk7DQp9ZWxzZXsNCl8zOWE9XzM5YyhuLF8zOWEpOw0KfQ0KfQ0KfQ0KcmV0dXJuIF8zOWI7DQp9LGluc2VydFNpYmxpbmdOb2Rlc0FmdGVyOmZ1bmN0aW9uKG5vZGUpew0KdmFyIGVsZW09bm9kZTsNCnZhciBzZWxmPU1vY2hpS2l0LkRPTTsNCmlmKHR5cGVvZiAobm9kZSk9PSJzdHJpbmciKXsNCmVsZW09c2VsZi5nZXRFbGVtZW50KG5vZGUpOw0KfQ0KdmFyIF8zYTE9W3NlbGYuY29lcmNlVG9ET00oTW9jaGlLaXQuQmFzZS5leHRlbmQobnVsbCxhcmd1bWVudHMsMSksZWxlbSldOw0KaWYoZWxlbS5uZXh0U2libGluZyl7DQpyZXR1cm4gc2VsZi5pbnNlcnRTaWJsaW5nTm9kZXNCZWZvcmUoZWxlbS5uZXh0U2libGluZyxfM2ExKTsNCn1lbHNlew0KcmV0dXJuIHNlbGYuYXBwZW5kQ2hpbGROb2RlcyhlbGVtLnBhcmVudE5vZGUsXzNhMSk7DQp9DQp9LHJlcGxhY2VDaGlsZE5vZGVzOmZ1bmN0aW9uKG5vZGUpew0KdmFyIGVsZW09bm9kZTsNCnZhciBzZWxmPU1vY2hpS2l0LkRPTTsNCmlmKHR5cGVvZiAobm9kZSk9PSJzdHJpbmciKXsNCmVsZW09c2VsZi5nZXRFbGVtZW50KG5vZGUpOw0KYXJndW1lbnRzWzBdPWVsZW07DQp9DQp2YXIgXzNhNTsNCndoaWxlKChfM2E1PWVsZW0uZmlyc3RDaGlsZCkpew0KZWxlbS5yZW1vdmVDaGlsZChfM2E1KTsNCn0NCmlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7DQpyZXR1cm4gZWxlbTsNCn1lbHNlew0KcmV0dXJuIHNlbGYuYXBwZW5kQ2hpbGROb2Rlcy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7DQp9DQp9LGNyZWF0ZURPTTpmdW5jdGlvbihuYW1lLF8zYTcpew0KdmFyIGVsZW07DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KaWYodHlwZW9mIChfM2E3KT09InN0cmluZyJ8fHR5cGVvZiAoXzNhNyk9PSJudW1iZXIiKXsNCnZhciBhcmdzPW0uZXh0ZW5kKFtuYW1lLG51bGxdLGFyZ3VtZW50cywxKTsNCnJldHVybiBhcmd1bWVudHMuY2FsbGVlLmFwcGx5KHRoaXMsYXJncyk7DQp9DQppZih0eXBlb2YgKG5hbWUpPT0ic3RyaW5nIil7DQp2YXIgXzNhYz1zZWxmLl94aHRtbDsNCmlmKF8zYTcmJiFzZWxmLmF0dHJpYnV0ZUFycmF5LmNvbXBsaWFudCl7DQp2YXIgXzNhZD0iIjsNCmlmKCJuYW1lIiBpbiBfM2E3KXsNCl8zYWQrPSIgbmFtZT1cIiIrc2VsZi5lc2NhcGVIVE1MKF8zYTcubmFtZSkrIlwiIjsNCn0NCmlmKG5hbWU9PSJpbnB1dCImJiJ0eXBlIiBpbiBfM2E3KXsNCl8zYWQrPSIgdHlwZT1cIiIrc2VsZi5lc2NhcGVIVE1MKF8zYTcudHlwZSkrIlwiIjsNCn0NCmlmKF8zYWQpew0KbmFtZT0iPCIrbmFtZStfM2FkKyI+IjsNCl8zYWM9ZmFsc2U7DQp9DQp9DQp2YXIgZD1zZWxmLl9kb2N1bWVudDsNCmlmKF8zYWMmJmQ9PT1kb2N1bWVudCl7DQplbGVtPWQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixuYW1lKTsNCn1lbHNlew0KZWxlbT1kLmNyZWF0ZUVsZW1lbnQobmFtZSk7DQp9DQp9ZWxzZXsNCmVsZW09bmFtZTsNCn0NCmlmKF8zYTcpew0Kc2VsZi51cGRhdGVOb2RlQXR0cmlidXRlcyhlbGVtLF8zYTcpOw0KfQ0KaWYoYXJndW1lbnRzLmxlbmd0aDw9Mil7DQpyZXR1cm4gZWxlbTsNCn1lbHNlew0KdmFyIGFyZ3M9bS5leHRlbmQoW2VsZW1dLGFyZ3VtZW50cywyKTsNCnJldHVybiBzZWxmLmFwcGVuZENoaWxkTm9kZXMuYXBwbHkodGhpcyxhcmdzKTsNCn0NCn0sY3JlYXRlRE9NRnVuYzpmdW5jdGlvbigpew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnJldHVybiBtLnBhcnRpYWwuYXBwbHkodGhpcyxtLmV4dGVuZChbTW9jaGlLaXQuRE9NLmNyZWF0ZURPTV0sYXJndW1lbnRzKSk7DQp9LHJlbW92ZUVsZW1lbnQ6ZnVuY3Rpb24oZWxlbSl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQppZih0eXBlb2YgKGVsZW0pPT0ic3RyaW5nIil7DQplbGVtPXNlbGYuZ2V0RWxlbWVudChlbGVtKTsNCn0NCnZhciBlPXNlbGYuY29lcmNlVG9ET00oZWxlbSk7DQplLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7DQpyZXR1cm4gZTsNCn0sc3dhcERPTTpmdW5jdGlvbihkZXN0LHNyYyl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQpkZXN0PXNlbGYuZ2V0RWxlbWVudChkZXN0KTsNCnZhciBfM2I2PWRlc3QucGFyZW50Tm9kZTsNCmlmKHNyYyl7DQppZih0eXBlb2YgKHNyYyk9PSJzdHJpbmciKXsNCnNyYz1zZWxmLmdldEVsZW1lbnQoc3JjKTsNCn0NCnNyYz1zZWxmLmNvZXJjZVRvRE9NKHNyYyxfM2I2KTsNCl8zYjYucmVwbGFjZUNoaWxkKHNyYyxkZXN0KTsNCn1lbHNlew0KXzNiNi5yZW1vdmVDaGlsZChkZXN0KTsNCn0NCnJldHVybiBzcmM7DQp9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oaWQpew0KdmFyIHNlbGY9TW9jaGlLaXQuRE9NOw0KaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7DQpyZXR1cm4gKCh0eXBlb2YgKGlkKT09InN0cmluZyIpP3NlbGYuX2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTppZCk7DQp9ZWxzZXsNCnJldHVybiBNb2NoaUtpdC5CYXNlLm1hcChzZWxmLmdldEVsZW1lbnQsYXJndW1lbnRzKTsNCn0NCn0sZ2V0RWxlbWVudHNCeVRhZ0FuZENsYXNzTmFtZTpmdW5jdGlvbihfM2I5LF8zYmEsXzNiYil7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQppZih0eXBlb2YgKF8zYjkpPT0idW5kZWZpbmVkInx8XzNiOT09PW51bGwpew0KXzNiOT0iKiI7DQp9DQppZih0eXBlb2YgKF8zYmIpPT0idW5kZWZpbmVkInx8XzNiYj09PW51bGwpew0KXzNiYj1zZWxmLl9kb2N1bWVudDsNCn0NCl8zYmI9c2VsZi5nZXRFbGVtZW50KF8zYmIpOw0KaWYoXzNiYj09bnVsbCl7DQpyZXR1cm4gW107DQp9DQp2YXIgXzNiZD0oXzNiYi5nZXRFbGVtZW50c0J5VGFnTmFtZShfM2I5KXx8c2VsZi5fZG9jdW1lbnQuYWxsKTsNCmlmKHR5cGVvZiAoXzNiYSk9PSJ1bmRlZmluZWQifHxfM2JhPT09bnVsbCl7DQpyZXR1cm4gTW9jaGlLaXQuQmFzZS5leHRlbmQobnVsbCxfM2JkKTsNCn0NCnZhciBfM2JlPVtdOw0KZm9yKHZhciBpPTA7aTxfM2JkLmxlbmd0aDtpKyspew0KdmFyIF8zYzA9XzNiZFtpXTsNCnZhciBjbHM9XzNjMC5jbGFzc05hbWU7DQppZih0eXBlb2YgKGNscykhPSJzdHJpbmciKXsNCmNscz1fM2MwLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsNCn0NCmlmKHR5cGVvZiAoY2xzKT09InN0cmluZyIpew0KdmFyIF8zYzI9Y2xzLnNwbGl0KCIgIik7DQpmb3IodmFyIGo9MDtqPF8zYzIubGVuZ3RoO2orKyl7DQppZihfM2MyW2pdPT1fM2JhKXsNCl8zYmUucHVzaChfM2MwKTsNCmJyZWFrOw0KfQ0KfQ0KfQ0KfQ0KcmV0dXJuIF8zYmU7DQp9LF9uZXdDYWxsU3RhY2s6ZnVuY3Rpb24ocGF0aCxvbmNlKXsNCnZhciBydmFsPWZ1bmN0aW9uKCl7DQp2YXIgXzNjNz1hcmd1bWVudHMuY2FsbGVlLmNhbGxTdGFjazsNCmZvcih2YXIgaT0wO2k8XzNjNy5sZW5ndGg7aSsrKXsNCmlmKF8zYzdbaV0uYXBwbHkodGhpcyxhcmd1bWVudHMpPT09ZmFsc2Upew0KYnJlYWs7DQp9DQp9DQppZihvbmNlKXsNCnRyeXsNCnRoaXNbcGF0aF09bnVsbDsNCn0NCmNhdGNoKGUpew0KfQ0KfQ0KfTsNCnJ2YWwuY2FsbFN0YWNrPVtdOw0KcmV0dXJuIHJ2YWw7DQp9LGFkZFRvQ2FsbFN0YWNrOmZ1bmN0aW9uKF8zYzkscGF0aCxmdW5jLG9uY2Upew0KdmFyIHNlbGY9TW9jaGlLaXQuRE9NOw0KdmFyIF8zY2U9XzNjOVtwYXRoXTsNCnZhciBfM2NmPV8zY2U7DQppZighKHR5cGVvZiAoXzNjZSk9PSJmdW5jdGlvbiImJnR5cGVvZiAoXzNjZS5jYWxsU3RhY2spPT0ib2JqZWN0IiYmXzNjZS5jYWxsU3RhY2shPT1udWxsKSl7DQpfM2NmPXNlbGYuX25ld0NhbGxTdGFjayhwYXRoLG9uY2UpOw0KaWYodHlwZW9mIChfM2NlKT09ImZ1bmN0aW9uIil7DQpfM2NmLmNhbGxTdGFjay5wdXNoKF8zY2UpOw0KfQ0KXzNjOVtwYXRoXT1fM2NmOw0KfQ0KXzNjZi5jYWxsU3RhY2sucHVzaChmdW5jKTsNCn0sYWRkTG9hZEV2ZW50OmZ1bmN0aW9uKGZ1bmMpew0KdmFyIHNlbGY9TW9jaGlLaXQuRE9NOw0Kc2VsZi5hZGRUb0NhbGxTdGFjayhzZWxmLl93aW5kb3csIm9ubG9hZCIsZnVuYyx0cnVlKTsNCn0sZm9jdXNPbkxvYWQ6ZnVuY3Rpb24oXzNkMil7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQpzZWxmLmFkZExvYWRFdmVudChmdW5jdGlvbigpew0KXzNkMj1zZWxmLmdldEVsZW1lbnQoXzNkMik7DQppZihfM2QyKXsNCl8zZDIuZm9jdXMoKTsNCn0NCn0pOw0KfSxzZXRFbGVtZW50Q2xhc3M6ZnVuY3Rpb24oXzNkNCxfM2Q1KXsNCnZhciBzZWxmPU1vY2hpS2l0LkRPTTsNCnZhciBvYmo9c2VsZi5nZXRFbGVtZW50KF8zZDQpOw0KaWYoc2VsZi5hdHRyaWJ1dGVBcnJheS5jb21wbGlhbnQpew0Kb2JqLnNldEF0dHJpYnV0ZSgiY2xhc3MiLF8zZDUpOw0KfWVsc2V7DQpvYmouc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLF8zZDUpOw0KfQ0KfSx0b2dnbGVFbGVtZW50Q2xhc3M6ZnVuY3Rpb24oXzNkOCl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQpmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsNCnZhciBvYmo9c2VsZi5nZXRFbGVtZW50KGFyZ3VtZW50c1tpXSk7DQppZighc2VsZi5hZGRFbGVtZW50Q2xhc3Mob2JqLF8zZDgpKXsNCnNlbGYucmVtb3ZlRWxlbWVudENsYXNzKG9iaixfM2Q4KTsNCn0NCn0NCn0sYWRkRWxlbWVudENsYXNzOmZ1bmN0aW9uKF8zZGMsXzNkZCl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQp2YXIgb2JqPXNlbGYuZ2V0RWxlbWVudChfM2RjKTsNCnZhciBjbHM9b2JqLmNsYXNzTmFtZTsNCmlmKHR5cGVvZiAoY2xzKSE9InN0cmluZyIpew0KY2xzPW9iai5nZXRBdHRyaWJ1dGUoImNsYXNzIik7DQp9DQppZih0eXBlb2YgKGNscykhPSJzdHJpbmcifHxjbHMubGVuZ3RoPT09MCl7DQpzZWxmLnNldEVsZW1lbnRDbGFzcyhvYmosXzNkZCk7DQpyZXR1cm4gdHJ1ZTsNCn0NCmlmKGNscz09XzNkZCl7DQpyZXR1cm4gZmFsc2U7DQp9DQp2YXIgXzNlMT1jbHMuc3BsaXQoIiAiKTsNCmZvcih2YXIgaT0wO2k8XzNlMS5sZW5ndGg7aSsrKXsNCmlmKF8zZTFbaV09PV8zZGQpew0KcmV0dXJuIGZhbHNlOw0KfQ0KfQ0Kc2VsZi5zZXRFbGVtZW50Q2xhc3Mob2JqLGNscysiICIrXzNkZCk7DQpyZXR1cm4gdHJ1ZTsNCn0scmVtb3ZlRWxlbWVudENsYXNzOmZ1bmN0aW9uKF8zZTMsXzNlNCl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQp2YXIgb2JqPXNlbGYuZ2V0RWxlbWVudChfM2UzKTsNCnZhciBjbHM9b2JqLmNsYXNzTmFtZTsNCmlmKHR5cGVvZiAoY2xzKSE9InN0cmluZyIpew0KY2xzPW9iai5nZXRBdHRyaWJ1dGUoImNsYXNzIik7DQp9DQppZih0eXBlb2YgKGNscykhPSJzdHJpbmcifHxjbHMubGVuZ3RoPT09MCl7DQpyZXR1cm4gZmFsc2U7DQp9DQppZihjbHM9PV8zZTQpew0Kc2VsZi5zZXRFbGVtZW50Q2xhc3Mob2JqLCIiKTsNCnJldHVybiB0cnVlOw0KfQ0KdmFyIF8zZTg9Y2xzLnNwbGl0KCIgIik7DQpmb3IodmFyIGk9MDtpPF8zZTgubGVuZ3RoO2krKyl7DQppZihfM2U4W2ldPT1fM2U0KXsNCl8zZTguc3BsaWNlKGksMSk7DQpzZWxmLnNldEVsZW1lbnRDbGFzcyhvYmosXzNlOC5qb2luKCIgIikpOw0KcmV0dXJuIHRydWU7DQp9DQp9DQpyZXR1cm4gZmFsc2U7DQp9LHN3YXBFbGVtZW50Q2xhc3M6ZnVuY3Rpb24oXzNlYSxfM2ViLF8zZWMpew0KdmFyIG9iaj1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChfM2VhKTsNCnZhciByZXM9TW9jaGlLaXQuRE9NLnJlbW92ZUVsZW1lbnRDbGFzcyhvYmosXzNlYik7DQppZihyZXMpew0KTW9jaGlLaXQuRE9NLmFkZEVsZW1lbnRDbGFzcyhvYmosXzNlYyk7DQp9DQpyZXR1cm4gcmVzOw0KfSxoYXNFbGVtZW50Q2xhc3M6ZnVuY3Rpb24oXzNlZixfM2YwKXsNCnZhciBvYmo9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoXzNlZik7DQppZihvYmo9PW51bGwpew0KcmV0dXJuIGZhbHNlOw0KfQ0KdmFyIGNscz1vYmouY2xhc3NOYW1lOw0KaWYodHlwZW9mIChjbHMpIT0ic3RyaW5nIiYmdHlwZW9mIChvYmouZ2V0QXR0cmlidXRlKT09ImZ1bmN0aW9uIil7DQpjbHM9b2JqLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsNCn0NCmlmKHR5cGVvZiAoY2xzKSE9InN0cmluZyIpew0KcmV0dXJuIGZhbHNlOw0KfQ0KdmFyIF8zZjM9Y2xzLnNwbGl0KCIgIik7DQpmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsNCnZhciBnb29kPWZhbHNlOw0KZm9yKHZhciBqPTA7ajxfM2YzLmxlbmd0aDtqKyspew0KaWYoXzNmM1tqXT09YXJndW1lbnRzW2ldKXsNCmdvb2Q9dHJ1ZTsNCmJyZWFrOw0KfQ0KfQ0KaWYoIWdvb2Qpew0KcmV0dXJuIGZhbHNlOw0KfQ0KfQ0KcmV0dXJuIHRydWU7DQp9LGVzY2FwZUhUTUw6ZnVuY3Rpb24ocyl7DQpyZXR1cm4gcy5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKTsNCn0sdG9IVE1MOmZ1bmN0aW9uKGRvbSl7DQpyZXR1cm4gTW9jaGlLaXQuRE9NLmVtaXRIVE1MKGRvbSkuam9pbigiIik7DQp9LGVtaXRIVE1MOmZ1bmN0aW9uKGRvbSxsc3Qpew0KaWYodHlwZW9mIChsc3QpPT0idW5kZWZpbmVkInx8bHN0PT09bnVsbCl7DQpsc3Q9W107DQp9DQp2YXIgXzNmYj1bZG9tXTsNCnZhciBzZWxmPU1vY2hpS2l0LkRPTTsNCnZhciBfM2ZkPXNlbGYuZXNjYXBlSFRNTDsNCnZhciBfM2ZlPXNlbGYuYXR0cmlidXRlQXJyYXk7DQp3aGlsZShfM2ZiLmxlbmd0aCl7DQpkb209XzNmYi5wb3AoKTsNCmlmKHR5cGVvZiAoZG9tKT09InN0cmluZyIpew0KbHN0LnB1c2goZG9tKTsNCn1lbHNlew0KaWYoZG9tLm5vZGVUeXBlPT0xKXsNCmxzdC5wdXNoKCI8Iitkb20udGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsNCnZhciBfM2ZmPVtdOw0KdmFyIF80MDA9XzNmZShkb20pOw0KZm9yKHZhciBpPTA7aTxfNDAwLmxlbmd0aDtpKyspew0KdmFyIGE9XzQwMFtpXTsNCl8zZmYucHVzaChbIiAiLGEubmFtZSwiPVwiIixfM2ZkKGEudmFsdWUpLCJcIiJdKTsNCn0NCl8zZmYuc29ydCgpOw0KZm9yKGk9MDtpPF8zZmYubGVuZ3RoO2krKyl7DQp2YXIgXzQwMz1fM2ZmW2ldOw0KZm9yKHZhciBqPTA7ajxfNDAzLmxlbmd0aDtqKyspew0KbHN0LnB1c2goXzQwM1tqXSk7DQp9DQp9DQppZihkb20uaGFzQ2hpbGROb2RlcygpKXsNCmxzdC5wdXNoKCI+Iik7DQpfM2ZiLnB1c2goIjwvIitkb20udGFnTmFtZS50b0xvd2VyQ2FzZSgpKyI+Iik7DQp2YXIgXzQwNT1kb20uY2hpbGROb2RlczsNCmZvcihpPV80MDUubGVuZ3RoLTE7aT49MDtpLS0pew0KXzNmYi5wdXNoKF80MDVbaV0pOw0KfQ0KfWVsc2V7DQpsc3QucHVzaCgiLz4iKTsNCn0NCn1lbHNlew0KaWYoZG9tLm5vZGVUeXBlPT0zKXsNCmxzdC5wdXNoKF8zZmQoZG9tLm5vZGVWYWx1ZSkpOw0KfQ0KfQ0KfQ0KfQ0KcmV0dXJuIGxzdDsNCn0sc2NyYXBlVGV4dDpmdW5jdGlvbihub2RlLF80MDcpew0KdmFyIHJ2YWw9W107DQooZnVuY3Rpb24obm9kZSl7DQp2YXIgY249bm9kZS5jaGlsZE5vZGVzOw0KaWYoY24pew0KZm9yKHZhciBpPTA7aTxjbi5sZW5ndGg7aSsrKXsNCmFyZ3VtZW50cy5jYWxsZWUuY2FsbCh0aGlzLGNuW2ldKTsNCn0NCn0NCnZhciBfNDBjPW5vZGUubm9kZVZhbHVlOw0KaWYodHlwZW9mIChfNDBjKT09InN0cmluZyIpew0KcnZhbC5wdXNoKF80MGMpOw0KfQ0KfSkoTW9jaGlLaXQuRE9NLmdldEVsZW1lbnQobm9kZSkpOw0KaWYoXzQwNyl7DQpyZXR1cm4gcnZhbDsNCn1lbHNlew0KcmV0dXJuIHJ2YWwuam9pbigiIik7DQp9DQp9LHJlbW92ZUVtcHR5VGV4dE5vZGVzOmZ1bmN0aW9uKF80MGQpew0KXzQwZD1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChfNDBkKTsNCmZvcih2YXIgaT0wO2k8XzQwZC5jaGlsZE5vZGVzLmxlbmd0aDtpKyspew0KdmFyIG5vZGU9XzQwZC5jaGlsZE5vZGVzW2ldOw0KaWYobm9kZS5ub2RlVHlwZT09MyYmIS9cUy8udGVzdChub2RlLm5vZGVWYWx1ZSkpew0Kbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOw0KfQ0KfQ0KfSxnZXRGaXJzdEVsZW1lbnRCeVRhZ0FuZENsYXNzTmFtZTpmdW5jdGlvbihfNDEwLF80MTEsXzQxMil7DQp2YXIgc2VsZj1Nb2NoaUtpdC5ET007DQppZih0eXBlb2YgKF80MTApPT0idW5kZWZpbmVkInx8XzQxMD09PW51bGwpew0KXzQxMD0iKiI7DQp9DQppZih0eXBlb2YgKF80MTIpPT0idW5kZWZpbmVkInx8XzQxMj09PW51bGwpew0KXzQxMj1zZWxmLl9kb2N1bWVudDsNCn0NCl80MTI9c2VsZi5nZXRFbGVtZW50KF80MTIpOw0KaWYoXzQxMj09bnVsbCl7DQpyZXR1cm4gbnVsbDsNCn0NCnZhciBfNDE0PShfNDEyLmdldEVsZW1lbnRzQnlUYWdOYW1lKF80MTApfHxzZWxmLl9kb2N1bWVudC5hbGwpOw0KaWYoXzQxNC5sZW5ndGg8PTApew0KcmV0dXJuIG51bGw7DQp9ZWxzZXsNCmlmKHR5cGVvZiAoXzQxMSk9PSJ1bmRlZmluZWQifHxfNDExPT09bnVsbCl7DQpyZXR1cm4gXzQxNFswXTsNCn0NCn0NCmZvcih2YXIgaT0wO2k8XzQxNC5sZW5ndGg7aSsrKXsNCnZhciBfNDE2PV80MTRbaV07DQp2YXIgY2xzPV80MTYuY2xhc3NOYW1lOw0KaWYodHlwZW9mIChjbHMpIT0ic3RyaW5nIil7DQpjbHM9XzQxNi5nZXRBdHRyaWJ1dGUoImNsYXNzIik7DQp9DQppZih0eXBlb2YgKGNscyk9PSJzdHJpbmciKXsNCnZhciBfNDE4PWNscy5zcGxpdCgiICIpOw0KZm9yKHZhciBqPTA7ajxfNDE4Lmxlbmd0aDtqKyspew0KaWYoXzQxOFtqXT09XzQxMSl7DQpyZXR1cm4gXzQxNjsNCn0NCn0NCn0NCn0NCnJldHVybiBudWxsOw0KfSxnZXRGaXJzdFBhcmVudEJ5VGFnQW5kQ2xhc3NOYW1lOmZ1bmN0aW9uKGVsZW0sXzQxYixfNDFjKXsNCnZhciBzZWxmPU1vY2hpS2l0LkRPTTsNCmVsZW09c2VsZi5nZXRFbGVtZW50KGVsZW0pOw0KaWYodHlwZW9mIChfNDFiKT09InVuZGVmaW5lZCJ8fF80MWI9PT1udWxsKXsNCl80MWI9IioiOw0KfWVsc2V7DQpfNDFiPV80MWIudG9VcHBlckNhc2UoKTsNCn0NCmlmKHR5cGVvZiAoXzQxYyk9PSJ1bmRlZmluZWQifHxfNDFjPT09bnVsbCl7DQpfNDFjPW51bGw7DQp9DQppZihlbGVtKXsNCmVsZW09ZWxlbS5wYXJlbnROb2RlOw0KfQ0Kd2hpbGUoZWxlbSYmZWxlbS50YWdOYW1lKXsNCnZhciBfNDFlPWVsZW0udGFnTmFtZS50b1VwcGVyQ2FzZSgpOw0KaWYoKF80MWI9PT0iKiJ8fF80MWI9PV80MWUpJiYoXzQxYz09PW51bGx8fHNlbGYuaGFzRWxlbWVudENsYXNzKGVsZW0sXzQxYykpKXsNCnJldHVybiBlbGVtOw0KfQ0KZWxlbT1lbGVtLnBhcmVudE5vZGU7DQp9DQpyZXR1cm4gbnVsbDsNCn0sX19uZXdfXzpmdW5jdGlvbih3aW4pew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCmlmKHR5cGVvZiAoZG9jdW1lbnQpIT0idW5kZWZpbmVkIil7DQp0aGlzLl9kb2N1bWVudD1kb2N1bWVudDsNCnZhciBfNDIxPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL2tleW1hc3Rlci9nYXRla2VlcGVyL3RoZXJlLmlzLm9ubHkueHVsIjsNCnRoaXMuX3hodG1sPShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PV80MjEpOw0KfWVsc2V7DQppZihNb2NoaUtpdC5Nb2NrRE9NKXsNCnRoaXMuX2RvY3VtZW50PU1vY2hpS2l0Lk1vY2tET00uZG9jdW1lbnQ7DQp9DQp9DQp0aGlzLl93aW5kb3c9d2luOw0KdGhpcy5kb21Db252ZXJ0ZXJzPW5ldyBtLkFkYXB0ZXJSZWdpc3RyeSgpOw0KdmFyIF80MjI9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOw0KdmFyIF80MjM7DQppZihfNDIyJiZfNDIyLmF0dHJpYnV0ZXMmJl80MjIuYXR0cmlidXRlcy5sZW5ndGg+MCl7DQp2YXIgXzQyND1tLmZpbHRlcjsNCl80MjM9ZnVuY3Rpb24obm9kZSl7DQpyZXR1cm4gXzQyNChfNDIzLmlnbm9yZUF0dHJGaWx0ZXIsbm9kZS5hdHRyaWJ1dGVzKTsNCn07DQpfNDIzLmlnbm9yZUF0dHI9e307DQp2YXIgXzQyNj1fNDIyLmF0dHJpYnV0ZXM7DQp2YXIgXzQyNz1fNDIzLmlnbm9yZUF0dHI7DQpmb3IodmFyIGk9MDtpPF80MjYubGVuZ3RoO2krKyl7DQp2YXIgYT1fNDI2W2ldOw0KXzQyN1thLm5hbWVdPWEudmFsdWU7DQp9DQpfNDIzLmlnbm9yZUF0dHJGaWx0ZXI9ZnVuY3Rpb24oYSl7DQpyZXR1cm4gKF80MjMuaWdub3JlQXR0clthLm5hbWVdIT1hLnZhbHVlKTsNCn07DQpfNDIzLmNvbXBsaWFudD1mYWxzZTsNCl80MjMucmVuYW1lcz17ImNsYXNzIjoiY2xhc3NOYW1lIiwiY2hlY2tlZCI6ImRlZmF1bHRDaGVja2VkIiwidXNlbWFwIjoidXNlTWFwIiwiZm9yIjoiaHRtbEZvciIsInJlYWRvbmx5IjoicmVhZE9ubHkiLCJjb2xzcGFuIjoiY29sU3BhbiIsImJnY29sb3IiOiJiZ0NvbG9yIiwiY2VsbHNwYWNpbmciOiJjZWxsU3BhY2luZyIsImNlbGxwYWRkaW5nIjoiY2VsbFBhZGRpbmcifTsNCn1lbHNlew0KXzQyMz1mdW5jdGlvbihub2RlKXsNCnJldHVybiBub2RlLmF0dHJpYnV0ZXM7DQp9Ow0KXzQyMy5jb21wbGlhbnQ9dHJ1ZTsNCl80MjMuaWdub3JlQXR0cj17fTsNCl80MjMucmVuYW1lcz17fTsNCn0NCl80MjMuX19leHBvcnRfXz1mYWxzZTsNCnRoaXMuYXR0cmlidXRlQXJyYXk9XzQyMzsNCm0uX2RlcHJlY2F0ZWQodGhpcywiY29tcHV0ZWRTdHlsZSIsIk1vY2hpS2l0LlN0eWxlLmdldFN0eWxlIiwiMS40Iix0cnVlKTsNCm0uX2RlcHJlY2F0ZWQodGhpcywiZWxlbWVudERpbWVuc2lvbnMiLCJNb2NoaUtpdC5TdHlsZS5nZXRFbGVtZW50RGltZW5zaW9ucyIsIjEuNCIpOw0KbS5fZGVwcmVjYXRlZCh0aGlzLCJlbGVtZW50UG9zaXRpb24iLCJNb2NoaUtpdC5TdHlsZS5nZXRFbGVtZW50UG9zaXRpb24iLCIxLjQiKTsNCm0uX2RlcHJlY2F0ZWQodGhpcywiZ2V0Vmlld3BvcnREaW1lbnNpb25zIiwiTW9jaGlLaXQuU3R5bGUuZ2V0Vmlld3BvcnREaW1lbnNpb25zIiwiMS40Iik7DQptLl9kZXByZWNhdGVkKHRoaXMsImhpZGVFbGVtZW50IiwiTW9jaGlLaXQuU3R5bGUuaGlkZUVsZW1lbnQiLCIxLjQiKTsNCm0uX2RlcHJlY2F0ZWQodGhpcywibWFrZUNsaXBwaW5nIiwiTW9jaGlLaXQuU3R5bGUubWFrZUNsaXBwaW5nIiwiMS40LjEiKTsNCm0uX2RlcHJlY2F0ZWQodGhpcywibWFrZVBvc2l0aW9uZWQiLCJNb2NoaUtpdC5TdHlsZS5tYWtlUG9zaXRpb25lZCIsIjEuNC4xIik7DQptLl9kZXByZWNhdGVkKHRoaXMsInNldEVsZW1lbnREaW1lbnNpb25zIiwiTW9jaGlLaXQuU3R5bGUuc2V0RWxlbWVudERpbWVuc2lvbnMiLCIxLjQiKTsNCm0uX2RlcHJlY2F0ZWQodGhpcywic2V0RWxlbWVudFBvc2l0aW9uIiwiTW9jaGlLaXQuU3R5bGUuc2V0RWxlbWVudFBvc2l0aW9uIiwiMS40Iik7DQptLl9kZXByZWNhdGVkKHRoaXMsInNldERpc3BsYXlGb3JFbGVtZW50IiwiTW9jaGlLaXQuU3R5bGUuc2V0RGlzcGxheUZvckVsZW1lbnQiLCIxLjQiKTsNCm0uX2RlcHJlY2F0ZWQodGhpcywic2V0T3BhY2l0eSIsIk1vY2hpS2l0LlN0eWxlLnNldE9wYWNpdHkiLCIxLjQiKTsNCm0uX2RlcHJlY2F0ZWQodGhpcywic2hvd0VsZW1lbnQiLCJNb2NoaUtpdC5TdHlsZS5zaG93RWxlbWVudCIsIjEuNCIpOw0KbS5fZGVwcmVjYXRlZCh0aGlzLCJ1bmRvQ2xpcHBpbmciLCJNb2NoaUtpdC5TdHlsZS51bmRvQ2xpcHBpbmciLCIxLjQuMSIpOw0KbS5fZGVwcmVjYXRlZCh0aGlzLCJ1bmRvUG9zaXRpb25lZCIsIk1vY2hpS2l0LlN0eWxlLnVuZG9Qb3NpdGlvbmVkIiwiMS40LjEiKTsNCm0uX2RlcHJlY2F0ZWQodGhpcywiQ29vcmRpbmF0ZXMiLCJNb2NoaUtpdC5TdHlsZS5Db29yZGluYXRlcyIsIjEuNCIpOw0KbS5fZGVwcmVjYXRlZCh0aGlzLCJEaW1lbnNpb25zIiwiTW9jaGlLaXQuU3R5bGUuRGltZW5zaW9ucyIsIjEuNCIpOw0KdmFyIF80MmM9dGhpcy5jcmVhdGVET01GdW5jOw0KdGhpcy5VTD1fNDJjKCJ1bCIpOw0KdGhpcy5PTD1fNDJjKCJvbCIpOw0KdGhpcy5MST1fNDJjKCJsaSIpOw0KdGhpcy5ETD1fNDJjKCJkbCIpOw0KdGhpcy5EVD1fNDJjKCJkdCIpOw0KdGhpcy5ERD1fNDJjKCJkZCIpOw0KdGhpcy5URD1fNDJjKCJ0ZCIpOw0KdGhpcy5UUj1fNDJjKCJ0ciIpOw0KdGhpcy5UQk9EWT1fNDJjKCJ0Ym9keSIpOw0KdGhpcy5USEVBRD1fNDJjKCJ0aGVhZCIpOw0KdGhpcy5URk9PVD1fNDJjKCJ0Zm9vdCIpOw0KdGhpcy5UQUJMRT1fNDJjKCJ0YWJsZSIpOw0KdGhpcy5USD1fNDJjKCJ0aCIpOw0KdGhpcy5JTlBVVD1fNDJjKCJpbnB1dCIpOw0KdGhpcy5TUEFOPV80MmMoInNwYW4iKTsNCnRoaXMuQT1fNDJjKCJhIik7DQp0aGlzLkRJVj1fNDJjKCJkaXYiKTsNCnRoaXMuSU1HPV80MmMoImltZyIpOw0KdGhpcy5CVVRUT049XzQyYygiYnV0dG9uIik7DQp0aGlzLlRUPV80MmMoInR0Iik7DQp0aGlzLlBSRT1fNDJjKCJwcmUiKTsNCnRoaXMuSDE9XzQyYygiaDEiKTsNCnRoaXMuSDI9XzQyYygiaDIiKTsNCnRoaXMuSDM9XzQyYygiaDMiKTsNCnRoaXMuSDQ9XzQyYygiaDQiKTsNCnRoaXMuSDU9XzQyYygiaDUiKTsNCnRoaXMuSDY9XzQyYygiaDYiKTsNCnRoaXMuQlI9XzQyYygiYnIiKTsNCnRoaXMuSFI9XzQyYygiaHIiKTsNCnRoaXMuTEFCRUw9XzQyYygibGFiZWwiKTsNCnRoaXMuVEVYVEFSRUE9XzQyYygidGV4dGFyZWEiKTsNCnRoaXMuRk9STT1fNDJjKCJmb3JtIik7DQp0aGlzLlA9XzQyYygicCIpOw0KdGhpcy5TRUxFQ1Q9XzQyYygic2VsZWN0Iik7DQp0aGlzLk9QVElPTj1fNDJjKCJvcHRpb24iKTsNCnRoaXMuT1BUR1JPVVA9XzQyYygib3B0Z3JvdXAiKTsNCnRoaXMuTEVHRU5EPV80MmMoImxlZ2VuZCIpOw0KdGhpcy5GSUVMRFNFVD1fNDJjKCJmaWVsZHNldCIpOw0KdGhpcy5TVFJPTkc9XzQyYygic3Ryb25nIik7DQp0aGlzLkNBTlZBUz1fNDJjKCJjYW52YXMiKTsNCnRoaXMuJD10aGlzLmdldEVsZW1lbnQ7DQptLm5hbWVGdW5jdGlvbnModGhpcyk7DQp9fSk7DQpNb2NoaUtpdC5ET00uX19uZXdfXygoKHR5cGVvZiAod2luZG93KT09InVuZGVmaW5lZCIpP3RoaXM6d2luZG93KSk7DQppZihNb2NoaUtpdC5fX2V4cG9ydF9fKXsNCndpdGhXaW5kb3c9TW9jaGlLaXQuRE9NLndpdGhXaW5kb3c7DQp3aXRoRG9jdW1lbnQ9TW9jaGlLaXQuRE9NLndpdGhEb2N1bWVudDsNCn0NCk1vY2hpS2l0LkJhc2UuX2V4cG9ydFN5bWJvbHModGhpcyxNb2NoaUtpdC5ET00pOw0KTW9jaGlLaXQuQmFzZS5fbW9kdWxlKCJTZWxlY3RvciIsIjEuNSIsWyJCYXNlIiwiRE9NIiwiSXRlciJdKTsNCk1vY2hpS2l0LlNlbGVjdG9yLlNlbGVjdG9yPWZ1bmN0aW9uKF80MmQpew0KdGhpcy5wYXJhbXM9e2NsYXNzTmFtZXM6W10scHNldWRvQ2xhc3NOYW1lczpbXX07DQp0aGlzLmV4cHJlc3Npb249XzQyZC50b1N0cmluZygpLnJlcGxhY2UoLyheXHMrfFxzKyQpL2csIiIpOw0KdGhpcy5wYXJzZUV4cHJlc3Npb24oKTsNCnRoaXMuY29tcGlsZU1hdGNoZXIoKTsNCn07DQpNb2NoaUtpdC5TZWxlY3Rvci5TZWxlY3Rvci5wcm90b3R5cGU9e19fY2xhc3NfXzpNb2NoaUtpdC5TZWxlY3Rvci5TZWxlY3RvcixwYXJzZUV4cHJlc3Npb246ZnVuY3Rpb24oKXsNCmZ1bmN0aW9uIGFib3J0KF80MmUpew0KdGhyb3cgIlBhcnNlIGVycm9yIGluIHNlbGVjdG9yOiAiK180MmU7DQp9DQppZih0aGlzLmV4cHJlc3Npb249PSIiKXsNCmFib3J0KCJlbXB0eSBleHByZXNzaW9uIik7DQp9DQp2YXIgcmVwcj1Nb2NoaUtpdC5CYXNlLnJlcHI7DQp2YXIgXzQzMD10aGlzLnBhcmFtczsNCnZhciBleHByPXRoaXMuZXhwcmVzc2lvbjsNCnZhciBfNDMyLF80MzMsXzQzNCxyZXN0Ow0Kd2hpbGUoXzQzMj1leHByLm1hdGNoKC9eKC4qKVxbKFthLXowLTlfOi1dKz8pKD86KFt+XHwhXiQqXT89KSg/OiIoW14iXSopInwoW15cXVxzXSopKSk/XF0kL2kpKXsNCl80MzAuYXR0cmlidXRlcz1fNDMwLmF0dHJpYnV0ZXN8fFtdOw0KXzQzMC5hdHRyaWJ1dGVzLnB1c2goe25hbWU6XzQzMlsyXSxvcGVyYXRvcjpfNDMyWzNdLHZhbHVlOl80MzJbNF18fF80MzJbNV18fCIifSk7DQpleHByPV80MzJbMV07DQp9DQppZihleHByPT0iKiIpew0KcmV0dXJuIHRoaXMucGFyYW1zLndpbGRjYXJkPXRydWU7DQp9DQp3aGlsZShfNDMyPWV4cHIubWF0Y2goL14oW15hLXowLTlfLV0pPyhbYS16MC05Xy1dKyg/OlwoW14pXSpcKSk/KSguKikvaSkpew0KXzQzMz1fNDMyWzFdOw0KXzQzND1fNDMyWzJdOw0KcmVzdD1fNDMyWzNdOw0Kc3dpdGNoKF80MzMpew0KY2FzZSAiIyI6DQpfNDMwLmlkPV80MzQ7DQpicmVhazsNCmNhc2UgIi4iOg0KXzQzMC5jbGFzc05hbWVzLnB1c2goXzQzNCk7DQpicmVhazsNCmNhc2UgIjoiOg0KXzQzMC5wc2V1ZG9DbGFzc05hbWVzLnB1c2goXzQzNCk7DQpicmVhazsNCmNhc2UgIiI6DQpjYXNlIHVuZGVmaW5lZDoNCl80MzAudGFnTmFtZT1fNDM0LnRvVXBwZXJDYXNlKCk7DQpicmVhazsNCmRlZmF1bHQ6DQphYm9ydChyZXByKGV4cHIpKTsNCn0NCmV4cHI9cmVzdDsNCn0NCmlmKGV4cHIubGVuZ3RoPjApew0KYWJvcnQocmVwcihleHByKSk7DQp9DQp9LGJ1aWxkTWF0Y2hFeHByZXNzaW9uOmZ1bmN0aW9uKCl7DQp2YXIgcmVwcj1Nb2NoaUtpdC5CYXNlLnJlcHI7DQp2YXIgXzQzNz10aGlzLnBhcmFtczsNCnZhciBfNDM4PVtdOw0KdmFyIF80MzksaTsNCmZ1bmN0aW9uIGNoaWxkRWxlbWVudHMoXzQzYil7DQpyZXR1cm4gIk1vY2hpS2l0LkJhc2UuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLm5vZGVUeXBlID09IDE7IH0sICIrXzQzYisiLmNoaWxkTm9kZXMpIjsNCn0NCmlmKF80Mzcud2lsZGNhcmQpew0KXzQzOC5wdXNoKCJ0cnVlIik7DQp9DQppZihfNDM5PV80MzcuaWQpew0KXzQzOC5wdXNoKCJlbGVtZW50LmlkID09ICIrcmVwcihfNDM5KSk7DQp9DQppZihfNDM5PV80MzcudGFnTmFtZSl7DQpfNDM4LnB1c2goImVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09ICIrcmVwcihfNDM5KSk7DQp9DQppZigoXzQzOT1fNDM3LmNsYXNzTmFtZXMpLmxlbmd0aD4wKXsNCmZvcihpPTA7aTxfNDM5Lmxlbmd0aDtpKyspew0KXzQzOC5wdXNoKCJNb2NoaUtpdC5ET00uaGFzRWxlbWVudENsYXNzKGVsZW1lbnQsICIrcmVwcihfNDM5W2ldKSsiKSIpOw0KfQ0KfQ0KaWYoKF80Mzk9XzQzNy5wc2V1ZG9DbGFzc05hbWVzKS5sZW5ndGg+MCl7DQpmb3IoaT0wO2k8XzQzOS5sZW5ndGg7aSsrKXsNCnZhciBfNDNjPV80MzlbaV0ubWF0Y2goL14oW14oXSspKD86XCgoLiopXCkpPyQvKTsNCnZhciBfNDNkPV80M2NbMV07DQp2YXIgXzQzZT1fNDNjWzJdOw0Kc3dpdGNoKF80M2Qpew0KY2FzZSAicm9vdCI6DQpfNDM4LnB1c2goImVsZW1lbnQubm9kZVR5cGUgPT0gOSB8fCBlbGVtZW50ID09PSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Iik7DQpicmVhazsNCmNhc2UgIm50aC1jaGlsZCI6DQpjYXNlICJudGgtbGFzdC1jaGlsZCI6DQpjYXNlICJudGgtb2YtdHlwZSI6DQpjYXNlICJudGgtbGFzdC1vZi10eXBlIjoNCl80M2M9XzQzZS5tYXRjaCgvXigoPzooXGQrKW5cKyk/KFxkKyl8b2RkfGV2ZW4pJC8pOw0KaWYoIV80M2Mpew0KdGhyb3cgIkludmFsaWQgYXJndW1lbnQgdG8gcHNldWRvIGVsZW1lbnQgbnRoLWNoaWxkOiAiK180M2U7DQp9DQp2YXIgYSxiOw0KaWYoXzQzY1swXT09Im9kZCIpew0KYT0yOw0KYj0xOw0KfWVsc2V7DQppZihfNDNjWzBdPT0iZXZlbiIpew0KYT0yOw0KYj0wOw0KfWVsc2V7DQphPV80M2NbMl0mJnBhcnNlSW50KF80M2MpfHxudWxsOw0KYj1wYXJzZUludChfNDNjWzNdKTsNCn0NCn0NCl80MzgucHVzaCgidGhpcy5udGhDaGlsZChlbGVtZW50LCIrYSsiLCIrYisiLCIrISFfNDNkLm1hdGNoKCJebnRoLWxhc3QiKSsiLCIrISFfNDNkLm1hdGNoKCJvZi10eXBlJCIpKyIpIik7DQpicmVhazsNCmNhc2UgImZpcnN0LWNoaWxkIjoNCl80MzgucHVzaCgidGhpcy5udGhDaGlsZChlbGVtZW50LCBudWxsLCAxKSIpOw0KYnJlYWs7DQpjYXNlICJsYXN0LWNoaWxkIjoNCl80MzgucHVzaCgidGhpcy5udGhDaGlsZChlbGVtZW50LCBudWxsLCAxLCB0cnVlKSIpOw0KYnJlYWs7DQpjYXNlICJmaXJzdC1vZi10eXBlIjoNCl80MzgucHVzaCgidGhpcy5udGhDaGlsZChlbGVtZW50LCBudWxsLCAxLCBmYWxzZSwgdHJ1ZSkiKTsNCmJyZWFrOw0KY2FzZSAibGFzdC1vZi10eXBlIjoNCl80MzgucHVzaCgidGhpcy5udGhDaGlsZChlbGVtZW50LCBudWxsLCAxLCB0cnVlLCB0cnVlKSIpOw0KYnJlYWs7DQpjYXNlICJvbmx5LWNoaWxkIjoNCl80MzgucHVzaChjaGlsZEVsZW1lbnRzKCJlbGVtZW50LnBhcmVudE5vZGUiKSsiLmxlbmd0aCA9PSAxIik7DQpicmVhazsNCmNhc2UgIm9ubHktb2YtdHlwZSI6DQpfNDM4LnB1c2goIk1vY2hpS2l0LkJhc2UuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnRhZ05hbWUgPT0gZWxlbWVudC50YWdOYW1lOyB9LCAiK2NoaWxkRWxlbWVudHMoImVsZW1lbnQucGFyZW50Tm9kZSIpKyIpLmxlbmd0aCA9PSAxIik7DQpicmVhazsNCmNhc2UgImVtcHR5IjoNCl80MzgucHVzaCgiZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAwIik7DQpicmVhazsNCmNhc2UgImVuYWJsZWQiOg0KXzQzOC5wdXNoKCIodGhpcy5pc1VJRWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50LmRpc2FibGVkID09PSBmYWxzZSkiKTsNCmJyZWFrOw0KY2FzZSAiZGlzYWJsZWQiOg0KXzQzOC5wdXNoKCIodGhpcy5pc1VJRWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50LmRpc2FibGVkID09PSB0cnVlKSIpOw0KYnJlYWs7DQpjYXNlICJjaGVja2VkIjoNCl80MzgucHVzaCgiKHRoaXMuaXNVSUVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jaGVja2VkID09PSB0cnVlKSIpOw0KYnJlYWs7DQpjYXNlICJub3QiOg0KdmFyIF80NDE9bmV3IE1vY2hpS2l0LlNlbGVjdG9yLlNlbGVjdG9yKF80M2UpOw0KXzQzOC5wdXNoKCIhKCAiK180NDEuYnVpbGRNYXRjaEV4cHJlc3Npb24oKSsiKSIpOw0KYnJlYWs7DQp9DQp9DQp9DQppZihfNDM5PV80MzcuYXR0cmlidXRlcyl7DQpNb2NoaUtpdC5CYXNlLm1hcChmdW5jdGlvbihfNDQyKXsNCnZhciBfNDQzPSJNb2NoaUtpdC5ET00uZ2V0Tm9kZUF0dHJpYnV0ZShlbGVtZW50LCAiK3JlcHIoXzQ0Mi5uYW1lKSsiKSI7DQp2YXIgXzQ0ND1mdW5jdGlvbihfNDQ1KXsNCnJldHVybiBfNDQzKyIuc3BsaXQoIityZXByKF80NDUpKyIpIjsNCn07DQpfNDM4LnB1c2goXzQ0MysiICE9IG51bGwiKTsNCnN3aXRjaChfNDQyLm9wZXJhdG9yKXsNCmNhc2UgIj0iOg0KXzQzOC5wdXNoKF80NDMrIiA9PSAiK3JlcHIoXzQ0Mi52YWx1ZSkpOw0KYnJlYWs7DQpjYXNlICJ+PSI6DQpfNDM4LnB1c2goIk1vY2hpS2l0LkJhc2UuZmluZFZhbHVlKCIrXzQ0NCgiICIpKyIsICIrcmVwcihfNDQyLnZhbHVlKSsiKSA+IC0xIik7DQpicmVhazsNCmNhc2UgIl49IjoNCl80MzgucHVzaChfNDQzKyIuc3Vic3RyaW5nKDAsICIrXzQ0Mi52YWx1ZS5sZW5ndGgrIikgPT0gIityZXByKF80NDIudmFsdWUpKTsNCmJyZWFrOw0KY2FzZSAiJD0iOg0KXzQzOC5wdXNoKF80NDMrIi5zdWJzdHJpbmcoIitfNDQzKyIubGVuZ3RoIC0gIitfNDQyLnZhbHVlLmxlbmd0aCsiKSA9PSAiK3JlcHIoXzQ0Mi52YWx1ZSkpOw0KYnJlYWs7DQpjYXNlICIqPSI6DQpfNDM4LnB1c2goXzQ0MysiLm1hdGNoKCIrcmVwcihfNDQyLnZhbHVlKSsiKSIpOw0KYnJlYWs7DQpjYXNlICJ8PSI6DQpfNDM4LnB1c2goXzQ0NCgiLSIpKyJbMF0udG9VcHBlckNhc2UoKSA9PSAiK3JlcHIoXzQ0Mi52YWx1ZS50b1VwcGVyQ2FzZSgpKSk7DQpicmVhazsNCmNhc2UgIiE9IjoNCl80MzgucHVzaChfNDQzKyIgIT0gIityZXByKF80NDIudmFsdWUpKTsNCmJyZWFrOw0KY2FzZSAiIjoNCmNhc2UgdW5kZWZpbmVkOg0KYnJlYWs7DQpkZWZhdWx0Og0KdGhyb3cgIlVua25vd24gb3BlcmF0b3IgIitfNDQyLm9wZXJhdG9yKyIgaW4gc2VsZWN0b3IiOw0KfQ0KfSxfNDM5KTsNCn0NCnJldHVybiBfNDM4LmpvaW4oIiAmJiAiKTsNCn0sY29tcGlsZU1hdGNoZXI6ZnVuY3Rpb24oKXsNCnZhciBjb2RlPSJyZXR1cm4gKCFlbGVtZW50LnRhZ05hbWUpID8gZmFsc2UgOiAiK3RoaXMuYnVpbGRNYXRjaEV4cHJlc3Npb24oKSsiOyI7DQp0aGlzLm1hdGNoPW5ldyBGdW5jdGlvbigiZWxlbWVudCIsY29kZSk7DQp9LG50aENoaWxkOmZ1bmN0aW9uKF80NDcsYSxiLF80NGEsXzQ0Yil7DQp2YXIgXzQ0Yz1Nb2NoaUtpdC5CYXNlLmZpbHRlcihmdW5jdGlvbihub2RlKXsNCnJldHVybiBub2RlLm5vZGVUeXBlPT0xOw0KfSxfNDQ3LnBhcmVudE5vZGUuY2hpbGROb2Rlcyk7DQppZihfNDRiKXsNCl80NGM9TW9jaGlLaXQuQmFzZS5maWx0ZXIoZnVuY3Rpb24obm9kZSl7DQpyZXR1cm4gbm9kZS50YWdOYW1lPT1fNDQ3LnRhZ05hbWU7DQp9LF80NGMpOw0KfQ0KaWYoXzQ0YSl7DQpfNDRjPU1vY2hpS2l0Lkl0ZXIucmV2ZXJzZWQoXzQ0Yyk7DQp9DQppZihhKXsNCnZhciBfNDRmPU1vY2hpS2l0LkJhc2UuZmluZElkZW50aWNhbChfNDRjLF80NDcpOw0KcmV0dXJuICgoXzQ0ZisxLWIpL2EpJTE9PTA7DQp9ZWxzZXsNCnJldHVybiBiPT1Nb2NoaUtpdC5CYXNlLmZpbmRJZGVudGljYWwoXzQ0YyxfNDQ3KSsxOw0KfQ0KfSxpc1VJRWxlbWVudDpmdW5jdGlvbihfNDUwKXsNCnJldHVybiBNb2NoaUtpdC5CYXNlLmZpbmRWYWx1ZShbImlucHV0IiwiYnV0dG9uIiwic2VsZWN0Iiwib3B0aW9uIiwidGV4dGFyZWEiLCJvYmplY3QiXSxfNDUwLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk+LTE7DQp9LGZpbmRFbGVtZW50czpmdW5jdGlvbihfNDUxLGF4aXMpew0KdmFyIF80NTM7DQppZihheGlzPT11bmRlZmluZWQpew0KYXhpcz0iIjsNCn0NCmZ1bmN0aW9uIGluU2NvcGUoXzQ1NCxfNDU1KXsNCmlmKGF4aXM9PSIiKXsNCnJldHVybiBNb2NoaUtpdC5ET00uaXNDaGlsZE5vZGUoXzQ1NCxfNDU1KTsNCn1lbHNlew0KaWYoYXhpcz09Ij4iKXsNCnJldHVybiBfNDU0LnBhcmVudE5vZGU9PT1fNDU1Ow0KfWVsc2V7DQppZihheGlzPT0iKyIpew0KcmV0dXJuIF80NTQ9PT1uZXh0U2libGluZ0VsZW1lbnQoXzQ1NSk7DQp9ZWxzZXsNCmlmKGF4aXM9PSJ+Iil7DQp2YXIgXzQ1Nj1fNDU1Ow0Kd2hpbGUoXzQ1Nj1uZXh0U2libGluZ0VsZW1lbnQoXzQ1Nikpew0KaWYoXzQ1ND09PV80NTYpew0KcmV0dXJuIHRydWU7DQp9DQp9DQpyZXR1cm4gZmFsc2U7DQp9ZWxzZXsNCnRocm93ICJJbnZhbGlkIGF4aXM6ICIrYXhpczsNCn0NCn0NCn0NCn0NCn0NCmlmKF80NTM9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQodGhpcy5wYXJhbXMuaWQpKXsNCmlmKHRoaXMubWF0Y2goXzQ1Mykpew0KaWYoIV80NTF8fGluU2NvcGUoXzQ1MyxfNDUxKSl7DQpyZXR1cm4gW180NTNdOw0KfQ0KfQ0KfQ0KZnVuY3Rpb24gbmV4dFNpYmxpbmdFbGVtZW50KG5vZGUpew0Kbm9kZT1ub2RlLm5leHRTaWJsaW5nOw0Kd2hpbGUobm9kZSYmbm9kZS5ub2RlVHlwZSE9MSl7DQpub2RlPW5vZGUubmV4dFNpYmxpbmc7DQp9DQpyZXR1cm4gbm9kZTsNCn0NCmlmKGF4aXM9PSIiKXsNCl80NTE9KF80NTF8fE1vY2hpS2l0LkRPTS5jdXJyZW50RG9jdW1lbnQoKSkuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGhpcy5wYXJhbXMudGFnTmFtZXx8IioiKTsNCn1lbHNlew0KaWYoYXhpcz09Ij4iKXsNCmlmKCFfNDUxKXsNCnRocm93ICI+IGNvbWJpbmF0b3Igbm90IGFsbG93ZWQgd2l0aG91dCBwcmVjZWVkaW5nIGV4cHJlc3Npb24iOw0KfQ0KXzQ1MT1Nb2NoaUtpdC5CYXNlLmZpbHRlcihmdW5jdGlvbihub2RlKXsNCnJldHVybiBub2RlLm5vZGVUeXBlPT0xOw0KfSxfNDUxLmNoaWxkTm9kZXMpOw0KfWVsc2V7DQppZihheGlzPT0iKyIpew0KaWYoIV80NTEpew0KdGhyb3cgIisgY29tYmluYXRvciBub3QgYWxsb3dlZCB3aXRob3V0IHByZWNlZWRpbmcgZXhwcmVzc2lvbiI7DQp9DQpfNDUxPW5leHRTaWJsaW5nRWxlbWVudChfNDUxKSYmW25leHRTaWJsaW5nRWxlbWVudChfNDUxKV07DQp9ZWxzZXsNCmlmKGF4aXM9PSJ+Iil7DQppZighXzQ1MSl7DQp0aHJvdyAifiBjb21iaW5hdG9yIG5vdCBhbGxvd2VkIHdpdGhvdXQgcHJlY2VlZGluZyBleHByZXNzaW9uIjsNCn0NCnZhciBfNDU5PVtdOw0Kd2hpbGUobmV4dFNpYmxpbmdFbGVtZW50KF80NTEpKXsNCl80NTE9bmV4dFNpYmxpbmdFbGVtZW50KF80NTEpOw0KXzQ1OS5wdXNoKF80NTEpOw0KfQ0KXzQ1MT1fNDU5Ow0KfQ0KfQ0KfQ0KfQ0KaWYoIV80NTEpew0KcmV0dXJuIFtdOw0KfQ0KdmFyIF80NWE9TW9jaGlLaXQuQmFzZS5maWx0ZXIoTW9jaGlLaXQuQmFzZS5iaW5kKGZ1bmN0aW9uKF80NWIpew0KcmV0dXJuIHRoaXMubWF0Y2goXzQ1Yik7DQp9LHRoaXMpLF80NTEpOw0KcmV0dXJuIF80NWE7DQp9LHJlcHI6ZnVuY3Rpb24oKXsNCnJldHVybiAiU2VsZWN0b3IoIit0aGlzLmV4cHJlc3Npb24rIikiOw0KfSx0b1N0cmluZzpNb2NoaUtpdC5CYXNlLmZvcndhcmRDYWxsKCJyZXByIil9Ow0KTW9jaGlLaXQuQmFzZS51cGRhdGUoTW9jaGlLaXQuU2VsZWN0b3Ise2ZpbmRDaGlsZEVsZW1lbnRzOmZ1bmN0aW9uKF80NWMsXzQ1ZCl7DQpfNDVjPU1vY2hpS2l0LkRPTS5nZXRFbGVtZW50KF80NWMpOw0KdmFyIHVuaXE9ZnVuY3Rpb24oYXJyKXsNCnZhciByZXM9W107DQpmb3IodmFyIGk9MDtpPGFyci5sZW5ndGg7aSsrKXsNCmlmKE1vY2hpS2l0LkJhc2UuZmluZElkZW50aWNhbChyZXMsYXJyW2ldKTwwKXsNCnJlcy5wdXNoKGFycltpXSk7DQp9DQp9DQpyZXR1cm4gcmVzOw0KfTsNCnJldHVybiBNb2NoaUtpdC5CYXNlLmZsYXR0ZW5BcnJheShNb2NoaUtpdC5CYXNlLm1hcChmdW5jdGlvbihfNDYyKXsNCnZhciBfNDYzPSIiOw0KdmFyIF80NjQ9ZnVuY3Rpb24oXzQ2NSxleHByKXsNCnZhciBfNDY3PWV4cHIubWF0Y2goL15bPit+XSQvKTsNCmlmKF80Njcpew0KXzQ2Mz1fNDY3WzBdOw0KcmV0dXJuIF80NjU7DQp9ZWxzZXsNCnZhciBfNDY4PW5ldyBNb2NoaUtpdC5TZWxlY3Rvci5TZWxlY3RvcihleHByKTsNCnZhciBfNDY5PU1vY2hpS2l0Lkl0ZXIucmVkdWNlKGZ1bmN0aW9uKF80NmEsXzQ2Yil7DQpyZXR1cm4gTW9jaGlLaXQuQmFzZS5leHRlbmQoXzQ2YSxfNDY4LmZpbmRFbGVtZW50cyhfNDZifHxfNDVjLF80NjMpKTsNCn0sXzQ2NSxbXSk7DQpfNDYzPSIiOw0KcmV0dXJuIF80Njk7DQp9DQp9Ow0KdmFyIF80NmM9XzQ2Mi5yZXBsYWNlKC8oXlxzK3xccyskKS9nLCIiKS5zcGxpdCgvXHMrLyk7DQpyZXR1cm4gdW5pcShNb2NoaUtpdC5JdGVyLnJlZHVjZShfNDY0LF80NmMsW251bGxdKSk7DQp9LF80NWQpKTsNCn0sZmluZERvY0VsZW1lbnRzOmZ1bmN0aW9uKCl7DQpyZXR1cm4gTW9jaGlLaXQuU2VsZWN0b3IuZmluZENoaWxkRWxlbWVudHMoTW9jaGlLaXQuRE9NLmN1cnJlbnREb2N1bWVudCgpLGFyZ3VtZW50cyk7DQp9LF9fbmV3X186ZnVuY3Rpb24oKXsNCnRoaXMuJCQ9dGhpcy5maW5kRG9jRWxlbWVudHM7DQpNb2NoaUtpdC5CYXNlLm5hbWVGdW5jdGlvbnModGhpcyk7DQp9fSk7DQpNb2NoaUtpdC5TZWxlY3Rvci5fX25ld19fKCk7DQpNb2NoaUtpdC5CYXNlLl9leHBvcnRTeW1ib2xzKHRoaXMsTW9jaGlLaXQuU2VsZWN0b3IpOw0KTW9jaGlLaXQuQmFzZS5fbW9kdWxlKCJTdHlsZSIsIjEuNSIsWyJCYXNlIiwiRE9NIl0pOw0KTW9jaGlLaXQuU3R5bGUuRGltZW5zaW9ucz1mdW5jdGlvbih3LGgpew0KaWYoISh0aGlzIGluc3RhbmNlb2YgTW9jaGlLaXQuU3R5bGUuRGltZW5zaW9ucykpew0KcmV0dXJuIG5ldyBNb2NoaUtpdC5TdHlsZS5EaW1lbnNpb25zKHcsaCk7DQp9DQp0aGlzLnc9dzsNCnRoaXMuaD1oOw0KfTsNCk1vY2hpS2l0LlN0eWxlLkRpbWVuc2lvbnMucHJvdG90eXBlLl9fcmVwcl9fPWZ1bmN0aW9uKCl7DQp2YXIgcmVwcj1Nb2NoaUtpdC5CYXNlLnJlcHI7DQpyZXR1cm4gInt3OiAiK3JlcHIodGhpcy53KSsiLCBoOiAiK3JlcHIodGhpcy5oKSsifSI7DQp9Ow0KTW9jaGlLaXQuU3R5bGUuRGltZW5zaW9ucy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXsNCnJldHVybiB0aGlzLl9fcmVwcl9fKCk7DQp9Ow0KTW9jaGlLaXQuU3R5bGUuQ29vcmRpbmF0ZXM9ZnVuY3Rpb24oeCx5KXsNCmlmKCEodGhpcyBpbnN0YW5jZW9mIE1vY2hpS2l0LlN0eWxlLkNvb3JkaW5hdGVzKSl7DQpyZXR1cm4gbmV3IE1vY2hpS2l0LlN0eWxlLkNvb3JkaW5hdGVzKHgseSk7DQp9DQp0aGlzLng9eDsNCnRoaXMueT15Ow0KfTsNCk1vY2hpS2l0LlN0eWxlLkNvb3JkaW5hdGVzLnByb3RvdHlwZS5fX3JlcHJfXz1mdW5jdGlvbigpew0KdmFyIHJlcHI9TW9jaGlLaXQuQmFzZS5yZXByOw0KcmV0dXJuICJ7eDogIityZXByKHRoaXMueCkrIiwgeTogIityZXByKHRoaXMueSkrIn0iOw0KfTsNCk1vY2hpS2l0LlN0eWxlLkNvb3JkaW5hdGVzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpew0KcmV0dXJuIHRoaXMuX19yZXByX18oKTsNCn07DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5TdHlsZSx7Z2V0U3R5bGU6ZnVuY3Rpb24oZWxlbSxfNDc0KXsNCnZhciBkb209TW9jaGlLaXQuRE9NOw0KdmFyIGQ9ZG9tLl9kb2N1bWVudDsNCmVsZW09ZG9tLmdldEVsZW1lbnQoZWxlbSk7DQpfNDc0PU1vY2hpS2l0LkJhc2UuY2FtZWxpemUoXzQ3NCk7DQppZighZWxlbXx8ZWxlbT09ZCl7DQpyZXR1cm4gdW5kZWZpbmVkOw0KfQ0KaWYoXzQ3ND09Im9wYWNpdHkiJiZ0eXBlb2YgKGVsZW0uZmlsdGVycykhPSJ1bmRlZmluZWQiKXsNCnZhciBfNDc3PShNb2NoaUtpdC5TdHlsZS5nZXRTdHlsZShlbGVtLCJmaWx0ZXIiKXx8IiIpLm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKTsNCmlmKF80NzcmJl80NzdbMV0pew0KcmV0dXJuIHBhcnNlRmxvYXQoXzQ3N1sxXSkvMTAwOw0KfQ0KcmV0dXJuIDE7DQp9DQppZihfNDc0PT0iZmxvYXQifHxfNDc0PT0iY3NzRmxvYXQifHxfNDc0PT0ic3R5bGVGbG9hdCIpew0KaWYoZWxlbS5zdHlsZVsiZmxvYXQiXSl7DQpyZXR1cm4gZWxlbS5zdHlsZVsiZmxvYXQiXTsNCn1lbHNlew0KaWYoZWxlbS5zdHlsZS5jc3NGbG9hdCl7DQpyZXR1cm4gZWxlbS5zdHlsZS5jc3NGbG9hdDsNCn1lbHNlew0KaWYoZWxlbS5zdHlsZS5zdHlsZUZsb2F0KXsNCnJldHVybiBlbGVtLnN0eWxlLnN0eWxlRmxvYXQ7DQp9ZWxzZXsNCnJldHVybiAibm9uZSI7DQp9DQp9DQp9DQp9DQp2YXIgXzQ3OD1lbGVtLnN0eWxlP2VsZW0uc3R5bGVbXzQ3NF06bnVsbDsNCmlmKCFfNDc4KXsNCmlmKGQuZGVmYXVsdFZpZXcmJmQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSl7DQp2YXIgY3NzPWQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLG51bGwpOw0KXzQ3ND1fNDc0LnJlcGxhY2UoLyhbQS1aXSkvZywiLSQxIikudG9Mb3dlckNhc2UoKTsNCl80Nzg9Y3NzP2Nzcy5nZXRQcm9wZXJ0eVZhbHVlKF80NzQpOm51bGw7DQp9ZWxzZXsNCmlmKGVsZW0uY3VycmVudFN0eWxlKXsNCl80Nzg9ZWxlbS5jdXJyZW50U3R5bGVbXzQ3NF07DQppZigvXlxkLy50ZXN0KF80NzgpJiYhL3B4JC8udGVzdChfNDc4KSYmXzQ3NCE9ImZvbnRXZWlnaHQiKXsNCnZhciBsZWZ0PWVsZW0uc3R5bGUubGVmdDsNCnZhciBfNDdiPWVsZW0ucnVudGltZVN0eWxlLmxlZnQ7DQplbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0PWVsZW0uY3VycmVudFN0eWxlLmxlZnQ7DQplbGVtLnN0eWxlLmxlZnQ9XzQ3OHx8MDsNCl80Nzg9ZWxlbS5zdHlsZS5waXhlbExlZnQrInB4IjsNCmVsZW0uc3R5bGUubGVmdD1sZWZ0Ow0KZWxlbS5ydW50aW1lU3R5bGUubGVmdD1fNDdiOw0KfQ0KfQ0KfQ0KfQ0KaWYoXzQ3ND09Im9wYWNpdHkiKXsNCl80Nzg9cGFyc2VGbG9hdChfNDc4KTsNCn0NCmlmKC9PcGVyYS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKE1vY2hpS2l0LkJhc2UuZmluZFZhbHVlKFsibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIl0sXzQ3NCkhPS0xKSl7DQppZihNb2NoaUtpdC5TdHlsZS5nZXRTdHlsZShlbGVtLCJwb3NpdGlvbiIpPT0ic3RhdGljIil7DQpfNDc4PSJhdXRvIjsNCn0NCn0NCnJldHVybiBfNDc4PT0iYXV0byI/bnVsbDpfNDc4Ow0KfSxzZXRTdHlsZTpmdW5jdGlvbihlbGVtLF80N2Qpew0KZWxlbT1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChlbGVtKTsNCmZvcih2YXIgbmFtZSBpbiBfNDdkKXsNCnN3aXRjaChuYW1lKXsNCmNhc2UgIm9wYWNpdHkiOg0KTW9jaGlLaXQuU3R5bGUuc2V0T3BhY2l0eShlbGVtLF80N2RbbmFtZV0pOw0KYnJlYWs7DQpjYXNlICJmbG9hdCI6DQpjYXNlICJjc3NGbG9hdCI6DQpjYXNlICJzdHlsZUZsb2F0IjoNCmlmKHR5cGVvZiAoZWxlbS5zdHlsZVsiZmxvYXQiXSkhPSJ1bmRlZmluZWQiKXsNCmVsZW0uc3R5bGVbImZsb2F0Il09XzQ3ZFtuYW1lXTsNCn1lbHNlew0KaWYodHlwZW9mIChlbGVtLnN0eWxlLmNzc0Zsb2F0KSE9InVuZGVmaW5lZCIpew0KZWxlbS5zdHlsZS5jc3NGbG9hdD1fNDdkW25hbWVdOw0KfWVsc2V7DQplbGVtLnN0eWxlLnN0eWxlRmxvYXQ9XzQ3ZFtuYW1lXTsNCn0NCn0NCmJyZWFrOw0KZGVmYXVsdDoNCmVsZW0uc3R5bGVbTW9jaGlLaXQuQmFzZS5jYW1lbGl6ZShuYW1lKV09XzQ3ZFtuYW1lXTsNCn0NCn0NCn0sc2V0T3BhY2l0eTpmdW5jdGlvbihlbGVtLG8pew0KZWxlbT1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChlbGVtKTsNCnZhciBzZWxmPU1vY2hpS2l0LlN0eWxlOw0KaWYobz09MSl7DQp2YXIgXzQ4Mj0vR2Vja28vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiEoL0tvbnF1ZXJvcnxBcHBsZVdlYktpdHxLSFRNTC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSk7DQplbGVtLnN0eWxlWyJvcGFjaXR5Il09XzQ4Mj8wLjk5OTk5OToxOw0KaWYoL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpew0KZWxlbS5zdHlsZVsiZmlsdGVyIl09c2VsZi5nZXRTdHlsZShlbGVtLCJmaWx0ZXIiKS5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksIiIpOw0KfQ0KfWVsc2V7DQppZihvPDAuMDAwMDEpew0Kbz0wOw0KfQ0KZWxlbS5zdHlsZVsib3BhY2l0eSJdPW87DQppZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7DQplbGVtLnN0eWxlWyJmaWx0ZXIiXT1zZWxmLmdldFN0eWxlKGVsZW0sImZpbHRlciIpLnJlcGxhY2UoL2FscGhhXChbXlwpXSpcKS9naSwiIikrImFscGhhKG9wYWNpdHk9IitvKjEwMCsiKSI7DQp9DQp9DQp9LGdldEVsZW1lbnRQb3NpdGlvbjpmdW5jdGlvbihlbGVtLF80ODQpew0KdmFyIHNlbGY9TW9jaGlLaXQuU3R5bGU7DQp2YXIgZG9tPU1vY2hpS2l0LkRPTTsNCnZhciBfNDg3PWZ1bmN0aW9uKG8pew0KcmV0dXJuIG8hPW51bGwmJm8ubm9kZVR5cGU9PW51bGwmJnR5cGVvZiAoby54KT09Im51bWJlciImJnR5cGVvZiAoby55KT09Im51bWJlciI7DQp9Ow0KaWYodHlwZW9mIChlbGVtKT09InN0cmluZyIpew0KZWxlbT1kb20uZ2V0RWxlbWVudChlbGVtKTsNCn0NCmlmKGVsZW09PW51bGx8fCghXzQ4NyhlbGVtKSYmc2VsZi5nZXRTdHlsZShlbGVtLCJkaXNwbGF5Iik9PSJub25lIikpew0KcmV0dXJuIHVuZGVmaW5lZDsNCn0NCnZhciBjPW5ldyBzZWxmLkNvb3JkaW5hdGVzKDAsMCk7DQp2YXIgYm94PW51bGw7DQp2YXIgXzQ4Yj1udWxsOw0KdmFyIGQ9TW9jaGlLaXQuRE9NLl9kb2N1bWVudDsNCnZhciBkZT1kLmRvY3VtZW50RWxlbWVudDsNCnZhciBiPWQuYm9keTsNCmlmKCFlbGVtLnBhcmVudE5vZGUmJmVsZW0ueCYmZWxlbS55KXsNCmMueCs9ZWxlbS54fHwwOw0KYy55Kz1lbGVtLnl8fDA7DQp9ZWxzZXsNCmlmKGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXsNCmJveD1lbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOw0KYy54Kz1ib3gubGVmdCsoZGUuc2Nyb2xsTGVmdHx8Yi5zY3JvbGxMZWZ0KS0oZGUuY2xpZW50TGVmdHx8MCk7DQpjLnkrPWJveC50b3ArKGRlLnNjcm9sbFRvcHx8Yi5zY3JvbGxUb3ApLShkZS5jbGllbnRUb3B8fDApOw0KfWVsc2V7DQppZihlbGVtLm9mZnNldFBhcmVudCl7DQpjLngrPWVsZW0ub2Zmc2V0TGVmdDsNCmMueSs9ZWxlbS5vZmZzZXRUb3A7DQpfNDhiPWVsZW0ub2Zmc2V0UGFyZW50Ow0KaWYoXzQ4YiE9ZWxlbSl7DQp3aGlsZShfNDhiKXsNCmMueCs9cGFyc2VJbnQoXzQ4Yi5zdHlsZS5ib3JkZXJMZWZ0V2lkdGgpfHwwOw0KYy55Kz1wYXJzZUludChfNDhiLnN0eWxlLmJvcmRlclRvcFdpZHRoKXx8MDsNCmMueCs9XzQ4Yi5vZmZzZXRMZWZ0Ow0KYy55Kz1fNDhiLm9mZnNldFRvcDsNCl80OGI9XzQ4Yi5vZmZzZXRQYXJlbnQ7DQp9DQp9DQp2YXIgdWE9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOw0KaWYoKHR5cGVvZiAob3BlcmEpIT0idW5kZWZpbmVkIiYmcGFyc2VGbG9hdChvcGVyYS52ZXJzaW9uKCkpPDkpfHwodWEuaW5kZXhPZigiQXBwbGVXZWJLaXQiKSE9LTEmJnNlbGYuZ2V0U3R5bGUoZWxlbSwicG9zaXRpb24iKT09ImFic29sdXRlIikpew0KYy54LT1iLm9mZnNldExlZnQ7DQpjLnktPWIub2Zmc2V0VG9wOw0KfQ0KaWYoZWxlbS5wYXJlbnROb2RlKXsNCl80OGI9ZWxlbS5wYXJlbnROb2RlOw0KfWVsc2V7DQpfNDhiPW51bGw7DQp9DQp3aGlsZShfNDhiKXsNCnZhciBfNDkwPV80OGIudGFnTmFtZS50b1VwcGVyQ2FzZSgpOw0KaWYoXzQ5MD09PSJCT0RZInx8XzQ5MD09PSJIVE1MIil7DQpicmVhazsNCn0NCnZhciBkaXNwPXNlbGYuZ2V0U3R5bGUoXzQ4YiwiZGlzcGxheSIpOw0KaWYoZGlzcC5zZWFyY2goL15pbmxpbmV8dGFibGUtcm93LiokL2kpKXsNCmMueC09XzQ4Yi5zY3JvbGxMZWZ0Ow0KYy55LT1fNDhiLnNjcm9sbFRvcDsNCn0NCmlmKF80OGIucGFyZW50Tm9kZSl7DQpfNDhiPV80OGIucGFyZW50Tm9kZTsNCn1lbHNlew0KXzQ4Yj1udWxsOw0KfQ0KfQ0KfQ0KfQ0KfQ0KaWYoXzQ4NCl7DQpfNDg0PWFyZ3VtZW50cy5jYWxsZWUoXzQ4NCk7DQppZihfNDg0KXsNCmMueC09KF80ODQueHx8MCk7DQpjLnktPShfNDg0Lnl8fDApOw0KfQ0KfQ0KcmV0dXJuIGM7DQp9LHNldEVsZW1lbnRQb3NpdGlvbjpmdW5jdGlvbihlbGVtLF80OTMsXzQ5NCl7DQplbGVtPU1vY2hpS2l0LkRPTS5nZXRFbGVtZW50KGVsZW0pOw0KaWYodHlwZW9mIChfNDk0KT09InVuZGVmaW5lZCIpew0KXzQ5ND0icHgiOw0KfQ0KdmFyIF80OTU9e307DQp2YXIgXzQ5Nj1Nb2NoaUtpdC5CYXNlLmlzVW5kZWZpbmVkT3JOdWxsOw0KaWYoIV80OTYoXzQ5My54KSl7DQpfNDk1WyJsZWZ0Il09XzQ5My54K180OTQ7DQp9DQppZighXzQ5NihfNDkzLnkpKXsNCl80OTVbInRvcCJdPV80OTMueStfNDk0Ow0KfQ0KTW9jaGlLaXQuRE9NLnVwZGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW0seyJzdHlsZSI6XzQ5NX0pOw0KfSxtYWtlUG9zaXRpb25lZDpmdW5jdGlvbihfNDk3KXsNCl80OTc9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoXzQ5Nyk7DQp2YXIgcG9zPU1vY2hpS2l0LlN0eWxlLmdldFN0eWxlKF80OTcsInBvc2l0aW9uIik7DQppZihwb3M9PSJzdGF0aWMifHwhcG9zKXsNCl80OTcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjsNCmlmKC9PcGVyYS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7DQpfNDk3LnN0eWxlLnRvcD0wOw0KXzQ5Ny5zdHlsZS5sZWZ0PTA7DQp9DQp9DQp9LHVuZG9Qb3NpdGlvbmVkOmZ1bmN0aW9uKF80OTkpew0KXzQ5OT1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChfNDk5KTsNCmlmKF80OTkuc3R5bGUucG9zaXRpb249PSJyZWxhdGl2ZSIpew0KXzQ5OS5zdHlsZS5wb3NpdGlvbj1fNDk5LnN0eWxlLnRvcD1fNDk5LnN0eWxlLmxlZnQ9XzQ5OS5zdHlsZS5ib3R0b209XzQ5OS5zdHlsZS5yaWdodD0iIjsNCn0NCn0sbWFrZUNsaXBwaW5nOmZ1bmN0aW9uKF80OWEpew0KXzQ5YT1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChfNDlhKTsNCnZhciBzPV80OWEuc3R5bGU7DQp2YXIgXzQ5Yz17Im92ZXJmbG93IjpzLm92ZXJmbG93LCJvdmVyZmxvdy14IjpzLm92ZXJmbG93WCwib3ZlcmZsb3cteSI6cy5vdmVyZmxvd1l9Ow0KaWYoKE1vY2hpS2l0LlN0eWxlLmdldFN0eWxlKF80OWEsIm92ZXJmbG93Iil8fCJ2aXNpYmxlIikhPSJoaWRkZW4iKXsNCl80OWEuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7DQpfNDlhLnN0eWxlLm92ZXJmbG93WD0iaGlkZGVuIjsNCl80OWEuc3R5bGUub3ZlcmZsb3dZPSJoaWRkZW4iOw0KfQ0KcmV0dXJuIF80OWM7DQp9LHVuZG9DbGlwcGluZzpmdW5jdGlvbihfNDlkLF80OWUpew0KXzQ5ZD1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChfNDlkKTsNCmlmKHR5cGVvZiAoXzQ5ZSk9PSJzdHJpbmciKXsNCl80OWQuc3R5bGUub3ZlcmZsb3c9XzQ5ZTsNCn1lbHNlew0KaWYoXzQ5ZSE9bnVsbCl7DQpfNDlkLnN0eWxlLm92ZXJmbG93PV80OWVbIm92ZXJmbG93Il07DQpfNDlkLnN0eWxlLm92ZXJmbG93WD1fNDllWyJvdmVyZmxvdy14Il07DQpfNDlkLnN0eWxlLm92ZXJmbG93WT1fNDllWyJvdmVyZmxvdy15Il07DQp9DQp9DQp9LGdldEVsZW1lbnREaW1lbnNpb25zOmZ1bmN0aW9uKGVsZW0sXzRhMCl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5TdHlsZTsNCnZhciBkb209TW9jaGlLaXQuRE9NOw0KaWYodHlwZW9mIChlbGVtLncpPT0ibnVtYmVyInx8dHlwZW9mIChlbGVtLmgpPT0ibnVtYmVyIil7DQpyZXR1cm4gbmV3IHNlbGYuRGltZW5zaW9ucyhlbGVtLnd8fDAsZWxlbS5ofHwwKTsNCn0NCmVsZW09ZG9tLmdldEVsZW1lbnQoZWxlbSk7DQppZighZWxlbSl7DQpyZXR1cm4gdW5kZWZpbmVkOw0KfQ0KdmFyIGRpc3A9c2VsZi5nZXRTdHlsZShlbGVtLCJkaXNwbGF5Iik7DQppZihkaXNwPT0ibm9uZSJ8fGRpc3A9PSIifHx0eXBlb2YgKGRpc3ApPT0idW5kZWZpbmVkIil7DQp2YXIgcz1lbGVtLnN0eWxlOw0KdmFyIF80YTU9cy52aXNpYmlsaXR5Ow0KdmFyIF80YTY9cy5wb3NpdGlvbjsNCnZhciBfNGE3PXMuZGlzcGxheTsNCnMudmlzaWJpbGl0eT0iaGlkZGVuIjsNCnMucG9zaXRpb249ImFic29sdXRlIjsNCnMuZGlzcGxheT1zZWxmLl9nZXREZWZhdWx0RGlzcGxheShlbGVtKTsNCnZhciBfNGE4PWVsZW0ub2Zmc2V0V2lkdGg7DQp2YXIgXzRhOT1lbGVtLm9mZnNldEhlaWdodDsNCnMuZGlzcGxheT1fNGE3Ow0Kcy5wb3NpdGlvbj1fNGE2Ow0Kcy52aXNpYmlsaXR5PV80YTU7DQp9ZWxzZXsNCl80YTg9ZWxlbS5vZmZzZXRXaWR0aHx8MDsNCl80YTk9ZWxlbS5vZmZzZXRIZWlnaHR8fDA7DQp9DQppZihfNGEwKXsNCnZhciBfNGFhPSJjb2xTcGFuIiBpbiBlbGVtJiYicm93U3BhbiIgaW4gZWxlbTsNCnZhciBfNGFiPShfNGFhJiZlbGVtLnBhcmVudE5vZGUmJnNlbGYuZ2V0U3R5bGUoZWxlbS5wYXJlbnROb2RlLCJib3JkZXJDb2xsYXBzZSIpPT0iY29sbGFwc2UiKTsNCmlmKF80YWIpew0KaWYoL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpew0KdmFyIF80YWM9ZWxlbS5wcmV2aW91c1NpYmxpbmc/MC41OjE7DQp2YXIgXzRhZD1lbGVtLm5leHRTaWJsaW5nPzAuNToxOw0KfWVsc2V7DQp2YXIgXzRhYz0wLjU7DQp2YXIgXzRhZD0wLjU7DQp9DQp9ZWxzZXsNCnZhciBfNGFjPTE7DQp2YXIgXzRhZD0xOw0KfQ0KXzRhOC09TWF0aC5yb3VuZCgocGFyc2VGbG9hdChzZWxmLmdldFN0eWxlKGVsZW0sInBhZGRpbmdMZWZ0IikpfHwwKSsocGFyc2VGbG9hdChzZWxmLmdldFN0eWxlKGVsZW0sInBhZGRpbmdSaWdodCIpKXx8MCkrXzRhYyoocGFyc2VGbG9hdChzZWxmLmdldFN0eWxlKGVsZW0sImJvcmRlckxlZnRXaWR0aCIpKXx8MCkrXzRhZCoocGFyc2VGbG9hdChzZWxmLmdldFN0eWxlKGVsZW0sImJvcmRlclJpZ2h0V2lkdGgiKSl8fDApKTsNCmlmKF80YWEpew0KaWYoL0dlY2tvfE9wZXJhLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhL0tvbnF1ZXJvcnxBcHBsZVdlYktpdHxLSFRNTC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7DQp2YXIgXzRhZT0wOw0KfWVsc2V7DQppZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7DQp2YXIgXzRhZT0xOw0KfWVsc2V7DQp2YXIgXzRhZT1fNGFiPzAuNToxOw0KfQ0KfQ0KfWVsc2V7DQp2YXIgXzRhZT0xOw0KfQ0KXzRhOS09TWF0aC5yb3VuZCgocGFyc2VGbG9hdChzZWxmLmdldFN0eWxlKGVsZW0sInBhZGRpbmdUb3AiKSl8fDApKyhwYXJzZUZsb2F0KHNlbGYuZ2V0U3R5bGUoZWxlbSwicGFkZGluZ0JvdHRvbSIpKXx8MCkrXzRhZSooKHBhcnNlRmxvYXQoc2VsZi5nZXRTdHlsZShlbGVtLCJib3JkZXJUb3BXaWR0aCIpKXx8MCkrKHBhcnNlRmxvYXQoc2VsZi5nZXRTdHlsZShlbGVtLCJib3JkZXJCb3R0b21XaWR0aCIpKXx8MCkpKTsNCn0NCnJldHVybiBuZXcgc2VsZi5EaW1lbnNpb25zKF80YTgsXzRhOSk7DQp9LHNldEVsZW1lbnREaW1lbnNpb25zOmZ1bmN0aW9uKGVsZW0sXzRiMCxfNGIxKXsNCmVsZW09TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoZWxlbSk7DQppZih0eXBlb2YgKF80YjEpPT0idW5kZWZpbmVkIil7DQpfNGIxPSJweCI7DQp9DQp2YXIgXzRiMj17fTsNCnZhciBfNGIzPU1vY2hpS2l0LkJhc2UuaXNVbmRlZmluZWRPck51bGw7DQppZighXzRiMyhfNGIwLncpKXsNCl80YjJbIndpZHRoIl09XzRiMC53K180YjE7DQp9DQppZighXzRiMyhfNGIwLmgpKXsNCl80YjJbImhlaWdodCJdPV80YjAuaCtfNGIxOw0KfQ0KTW9jaGlLaXQuRE9NLnVwZGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW0seyJzdHlsZSI6XzRiMn0pOw0KfSxfZ2V0RGVmYXVsdERpc3BsYXk6ZnVuY3Rpb24oZWxlbSl7DQp2YXIgc2VsZj1Nb2NoaUtpdC5TdHlsZTsNCnZhciBkb209TW9jaGlLaXQuRE9NOw0KZWxlbT1kb20uZ2V0RWxlbWVudChlbGVtKTsNCmlmKCFlbGVtKXsNCnJldHVybiB1bmRlZmluZWQ7DQp9DQp2YXIgXzRiNz1lbGVtLnRhZ05hbWUudG9VcHBlckNhc2UoKTsNCnJldHVybiBzZWxmLl9kZWZhdWx0RGlzcGxheVtfNGI3XXx8ImJsb2NrIjsNCn0sc2V0RGlzcGxheUZvckVsZW1lbnQ6ZnVuY3Rpb24oXzRiOCxfNGI5KXsNCnZhciBfNGJhPU1vY2hpS2l0LkJhc2UuZXh0ZW5kKG51bGwsYXJndW1lbnRzLDEpOw0KdmFyIF80YmI9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQ7DQpmb3IodmFyIGk9MDtpPF80YmEubGVuZ3RoO2krKyl7DQpfNGI5PV80YmIoXzRiYVtpXSk7DQppZihfNGI5KXsNCl80Yjkuc3R5bGUuZGlzcGxheT1fNGI4Ow0KfQ0KfQ0KfSxnZXRWaWV3cG9ydERpbWVuc2lvbnM6ZnVuY3Rpb24oKXsNCnZhciBkPW5ldyBNb2NoaUtpdC5TdHlsZS5EaW1lbnNpb25zKCk7DQp2YXIgdz1Nb2NoaUtpdC5ET00uX3dpbmRvdzsNCnZhciBiPU1vY2hpS2l0LkRPTS5fZG9jdW1lbnQuYm9keTsNCmlmKHcuaW5uZXJXaWR0aCl7DQpkLnc9dy5pbm5lcldpZHRoOw0KZC5oPXcuaW5uZXJIZWlnaHQ7DQp9ZWxzZXsNCmlmKGImJmIucGFyZW50RWxlbWVudCYmYi5wYXJlbnRFbGVtZW50LmNsaWVudFdpZHRoKXsNCmQudz1iLnBhcmVudEVsZW1lbnQuY2xpZW50V2lkdGg7DQpkLmg9Yi5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodDsNCn1lbHNlew0KaWYoYiYmYi5jbGllbnRXaWR0aCl7DQpkLnc9Yi5jbGllbnRXaWR0aDsNCmQuaD1iLmNsaWVudEhlaWdodDsNCn0NCn0NCn0NCnJldHVybiBkOw0KfSxnZXRWaWV3cG9ydFBvc2l0aW9uOmZ1bmN0aW9uKCl7DQp2YXIgYz1uZXcgTW9jaGlLaXQuU3R5bGUuQ29vcmRpbmF0ZXMoMCwwKTsNCnZhciBkPU1vY2hpS2l0LkRPTS5fZG9jdW1lbnQ7DQp2YXIgZGU9ZC5kb2N1bWVudEVsZW1lbnQ7DQp2YXIgZGI9ZC5ib2R5Ow0KaWYoZGUmJihkZS5zY3JvbGxUb3B8fGRlLnNjcm9sbExlZnQpKXsNCmMueD1kZS5zY3JvbGxMZWZ0Ow0KYy55PWRlLnNjcm9sbFRvcDsNCn1lbHNlew0KaWYoZGIpew0KYy54PWRiLnNjcm9sbExlZnQ7DQpjLnk9ZGIuc2Nyb2xsVG9wOw0KfQ0KfQ0KcmV0dXJuIGM7DQp9LF9fbmV3X186ZnVuY3Rpb24oKXsNCnZhciBtPU1vY2hpS2l0LkJhc2U7DQp2YXIgXzRjNT1bIkEiLCJBQkJSIiwiQUNST05ZTSIsIkIiLCJCQVNFRk9OVCIsIkJETyIsIkJJRyIsIkJSIiwiQ0lURSIsIkNPREUiLCJERk4iLCJFTSIsIkZPTlQiLCJJIiwiSU1HIiwiS0JEIiwiTEFCRUwiLCJRIiwiUyIsIlNBTVAiLCJTTUFMTCIsIlNQQU4iLCJTVFJJS0UiLCJTVFJPTkciLCJTVUIiLCJTVVAiLCJURVhUQVJFQSIsIlRUIiwiVSIsIlZBUiJdOw0KdGhpcy5fZGVmYXVsdERpc3BsYXk9eyJUQUJMRSI6InRhYmxlIiwiVEhFQUQiOiJ0YWJsZS1oZWFkZXItZ3JvdXAiLCJUQk9EWSI6InRhYmxlLXJvdy1ncm91cCIsIlRGT09UIjoidGFibGUtZm9vdGVyLWdyb3VwIiwiQ09MR1JPVVAiOiJ0YWJsZS1jb2x1bW4tZ3JvdXAiLCJDT0wiOiJ0YWJsZS1jb2x1bW4iLCJUUiI6InRhYmxlLXJvdyIsIlREIjoidGFibGUtY2VsbCIsIlRIIjoidGFibGUtY2VsbCIsIkNBUFRJT04iOiJ0YWJsZS1jYXB0aW9uIiwiTEkiOiJsaXN0LWl0ZW0iLCJJTlBVVCI6ImlubGluZS1ibG9jayIsIlNFTEVDVCI6ImlubGluZS1ibG9jayJ9Ow0KaWYoL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpew0KZm9yKHZhciBrIGluIHRoaXMuX2RlZmF1bHREaXNwbGF5KXsNCnZhciB2PXRoaXMuX2RlZmF1bHREaXNwbGF5W2tdOw0KaWYodi5pbmRleE9mKCJ0YWJsZSIpPT0wKXsNCnRoaXMuX2RlZmF1bHREaXNwbGF5W2tdPSJibG9jayI7DQp9DQp9DQp9DQpmb3IodmFyIGk9MDtpPF80YzUubGVuZ3RoO2krKyl7DQp0aGlzLl9kZWZhdWx0RGlzcGxheVtfNGM1W2ldXT0iaW5saW5lIjsNCn0NCm0uX2RlcHJlY2F0ZWQodGhpcywiZWxlbWVudFBvc2l0aW9uIiwiTW9jaGlLaXQuU3R5bGUuZ2V0RWxlbWVudFBvc2l0aW9uIiwiMS4zIix0cnVlKTsNCm0uX2RlcHJlY2F0ZWQodGhpcywiZWxlbWVudERpbWVuc2lvbnMiLCJNb2NoaUtpdC5TdHlsZS5nZXRFbGVtZW50RGltZW5zaW9ucyIsIjEuMyIsdHJ1ZSk7DQp0aGlzLmhpZGVFbGVtZW50PW0ucGFydGlhbCh0aGlzLnNldERpc3BsYXlGb3JFbGVtZW50LCJub25lIik7DQp0aGlzLnNob3dFbGVtZW50PW0ucGFydGlhbCh0aGlzLnNldERpc3BsYXlGb3JFbGVtZW50LCJibG9jayIpOw0KbS5uYW1lRnVuY3Rpb25zKHRoaXMpOw0KfX0pOw0KTW9jaGlLaXQuU3R5bGUuX19uZXdfXygpOw0KTW9jaGlLaXQuQmFzZS5fZXhwb3J0U3ltYm9scyh0aGlzLE1vY2hpS2l0LlN0eWxlKTsNCk1vY2hpS2l0LkJhc2UuX21vZHVsZSgiTG9nZ2luZ1BhbmUiLCIxLjUiLFsiQmFzZSIsIkxvZ2dpbmciXSk7DQpNb2NoaUtpdC5Mb2dnaW5nUGFuZS5jcmVhdGVMb2dnaW5nUGFuZT1mdW5jdGlvbihfNGM5KXsNCnZhciBtPU1vY2hpS2l0LkxvZ2dpbmdQYW5lOw0KXzRjOT0hKCFfNGM5KTsNCmlmKG0uX2xvZ2dpbmdQYW5lJiZtLl9sb2dnaW5nUGFuZS5pbmxpbmUhPV80Yzkpew0KbS5fbG9nZ2luZ1BhbmUuY2xvc2VQYW5lKCk7DQptLl9sb2dnaW5nUGFuZT1udWxsOw0KfQ0KaWYoIW0uX2xvZ2dpbmdQYW5lfHxtLl9sb2dnaW5nUGFuZS5jbG9zZWQpew0KbS5fbG9nZ2luZ1BhbmU9bmV3IG0uTG9nZ2luZ1BhbmUoXzRjOSxNb2NoaUtpdC5Mb2dnaW5nLmxvZ2dlcik7DQp9DQpyZXR1cm4gbS5fbG9nZ2luZ1BhbmU7DQp9Ow0KTW9jaGlLaXQuTG9nZ2luZ1BhbmUuTG9nZ2luZ1BhbmU9ZnVuY3Rpb24oXzRjYixfNGNjKXsNCmlmKHR5cGVvZiAoXzRjYyk9PSJ1bmRlZmluZWQifHxfNGNjPT09bnVsbCl7DQpfNGNjPU1vY2hpS2l0LkxvZ2dpbmcubG9nZ2VyOw0KfQ0KdGhpcy5sb2dnZXI9XzRjYzsNCnZhciBfNGNkPU1vY2hpS2l0LkJhc2UudXBkYXRlOw0KdmFyIF80Y2U9TW9jaGlLaXQuQmFzZS51cGRhdGV0cmVlOw0KdmFyIGJpbmQ9TW9jaGlLaXQuQmFzZS5iaW5kOw0KdmFyIF80ZDA9TW9jaGlLaXQuQmFzZS5jbG9uZTsNCnZhciB3aW49d2luZG93Ow0KdmFyIHVpZD0iX01vY2hpS2l0X0xvZ2dpbmdQYW5lIjsNCmlmKHR5cGVvZiAoTW9jaGlLaXQuRE9NKSE9InVuZGVmaW5lZCIpew0Kd2luPU1vY2hpS2l0LkRPTS5jdXJyZW50V2luZG93KCk7DQp9DQppZighXzRjYil7DQp2YXIgdXJsPXdpbi5sb2NhdGlvbi5ocmVmLnNwbGl0KCI/IilbMF0ucmVwbGFjZSgvWyM6XC8uPjwmJS1dL2csIl8iKTsNCnZhciBuYW1lPXVpZCsiXyIrdXJsOw0KdmFyIG53aW49d2luLm9wZW4oIiIsbmFtZSwiZGVwZW5kZW50LHJlc2l6YWJsZSxoZWlnaHQ9MjAwIik7DQppZighbndpbil7DQphbGVydCgiTm90IGFibGUgdG8gb3BlbiBkZWJ1Z2dpbmcgd2luZG93IGR1ZSB0byBwb3AtdXAgYmxvY2tpbmcuIik7DQpyZXR1cm4gdW5kZWZpbmVkOw0KfQ0Kbndpbi5kb2N1bWVudC53cml0ZSgiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTlwiICIrIlwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkXCI+IisiPGh0bWw+PGhlYWQ+PHRpdGxlPltNb2NoaUtpdC5Mb2dnaW5nUGFuZV08L3RpdGxlPjwvaGVhZD4iKyI8Ym9keT48L2JvZHk+PC9odG1sPiIpOw0Kbndpbi5kb2N1bWVudC5jbG9zZSgpOw0Kbndpbi5kb2N1bWVudC50aXRsZSs9IiAiK3dpbi5kb2N1bWVudC50aXRsZTsNCndpbj1ud2luOw0KfQ0KdmFyIGRvYz13aW4uZG9jdW1lbnQ7DQp0aGlzLmRvYz1kb2M7DQp2YXIgXzRkNz1kb2MuZ2V0RWxlbWVudEJ5SWQodWlkKTsNCnZhciBfNGQ4PSEhXzRkNzsNCmlmKF80ZDcmJnR5cGVvZiAoXzRkNy5sb2dnaW5nUGFuZSkhPSJ1bmRlZmluZWQiKXsNCl80ZDcubG9nZ2luZ1BhbmUubG9nZ2VyPXRoaXMubG9nZ2VyOw0KXzRkNy5sb2dnaW5nUGFuZS5idWlsZEFuZEFwcGx5RmlsdGVyKCk7DQpyZXR1cm4gXzRkNy5sb2dnaW5nUGFuZTsNCn0NCmlmKF80ZDgpew0KdmFyIF80ZDk7DQp3aGlsZSgoXzRkOT1fNGQ3LmZpcnN0Q2hpbGQpKXsNCl80ZDcucmVtb3ZlQ2hpbGQoXzRkOSk7DQp9DQp9ZWxzZXsNCl80ZDc9ZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KXzRkNy5pZD11aWQ7DQp9DQpfNGQ3LmxvZ2dpbmdQYW5lPXRoaXM7DQp2YXIgXzRkYT1kb2MuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsNCnZhciBfNGRiPWRvYy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOw0KdmFyIF80ZGM9ZG9jLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOw0KdmFyIF80ZGQ9ZG9jLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOw0KdmFyIF80ZGU9ZG9jLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOw0KdmFyIF80ZGY9ZG9jLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOw0KdmFyIF80ZTA9ZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KdmFyIF80ZTE9ZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KdmFyIF80ZTI9dWlkKyJfTGlzdGVuZXIiOw0KdGhpcy5jb2xvclRhYmxlPV80ZDAodGhpcy5jb2xvclRhYmxlKTsNCnZhciBfNGUzPVtdOw0KdmFyIF80ZTQ9bnVsbDsNCnZhciBfNGU1PWZ1bmN0aW9uKG1zZyl7DQp2YXIgXzRlNz1tc2cubGV2ZWw7DQppZih0eXBlb2YgKF80ZTcpPT0ibnVtYmVyIil7DQpfNGU3PU1vY2hpS2l0LkxvZ2dpbmcuTG9nTGV2ZWxbXzRlN107DQp9DQpyZXR1cm4gXzRlNzsNCn07DQp2YXIgXzRlOD1mdW5jdGlvbihtc2cpew0KcmV0dXJuIG1zZy5pbmZvLmpvaW4oIiAiKTsNCn07DQp2YXIgXzRlYT1iaW5kKGZ1bmN0aW9uKG1zZyl7DQp2YXIgXzRlYz1fNGU1KG1zZyk7DQp2YXIgdGV4dD1fNGU4KG1zZyk7DQp2YXIgYz10aGlzLmNvbG9yVGFibGVbXzRlY107DQp2YXIgcD1kb2MuY3JlYXRlRWxlbWVudCgic3BhbiIpOw0KcC5jbGFzc05hbWU9Ik1vY2hpS2l0LUxvZ01lc3NhZ2UgTW9jaGlLaXQtTG9nTGV2ZWwtIitfNGVjOw0KcC5zdHlsZS5jc3NUZXh0PSJtYXJnaW46IDBweDsgd2hpdGUtc3BhY2U6IC1tb3otcHJlLXdyYXA7IHdoaXRlLXNwYWNlOiAtby1wcmUtd3JhcDsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgd3JhcC1vcHRpb246IGVtZXJnZW5jeTsgY29sb3I6ICIrYzsNCnAuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKF80ZWMrIjogIit0ZXh0KSk7DQpfNGUxLmFwcGVuZENoaWxkKHApOw0KXzRlMS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlRWxlbWVudCgiYnIiKSk7DQppZihfNGUwLm9mZnNldEhlaWdodD5fNGUwLnNjcm9sbEhlaWdodCl7DQpfNGUwLnNjcm9sbFRvcD0wOw0KfWVsc2V7DQpfNGUwLnNjcm9sbFRvcD1fNGUwLnNjcm9sbEhlaWdodDsNCn0NCn0sdGhpcyk7DQp2YXIgXzRmMD1mdW5jdGlvbihtc2cpew0KXzRlM1tfNGUzLmxlbmd0aF09bXNnOw0KXzRlYShtc2cpOw0KfTsNCnZhciBfNGYyPWZ1bmN0aW9uKCl7DQp2YXIgXzRmMyxfNGY0Ow0KdHJ5ew0KXzRmMz1uZXcgUmVnRXhwKF80ZGEudmFsdWUpOw0KXzRmND1uZXcgUmVnRXhwKF80ZGIudmFsdWUpOw0KfQ0KY2F0Y2goZSl7DQpsb2dEZWJ1ZygiRXJyb3IgaW4gZmlsdGVyIHJlZ2V4OiAiK2UubWVzc2FnZSk7DQpyZXR1cm4gbnVsbDsNCn0NCnJldHVybiBmdW5jdGlvbihtc2cpew0KcmV0dXJuIChfNGYzLnRlc3QoXzRlNShtc2cpKSYmXzRmNC50ZXN0KF80ZTgobXNnKSkpOw0KfTsNCn07DQp2YXIgXzRmNj1mdW5jdGlvbigpew0Kd2hpbGUoXzRlMS5maXJzdENoaWxkKXsNCl80ZTEucmVtb3ZlQ2hpbGQoXzRlMS5maXJzdENoaWxkKTsNCn0NCn07DQp2YXIgXzRmNz1mdW5jdGlvbigpew0KXzRlMz1bXTsNCl80ZjYoKTsNCn07DQp2YXIgXzRmOD1iaW5kKGZ1bmN0aW9uKCl7DQppZih0aGlzLmNsb3NlZCl7DQpyZXR1cm47DQp9DQp0aGlzLmNsb3NlZD10cnVlOw0KaWYoTW9jaGlLaXQuTG9nZ2luZ1BhbmUuX2xvZ2dpbmdQYW5lPT10aGlzKXsNCk1vY2hpS2l0LkxvZ2dpbmdQYW5lLl9sb2dnaW5nUGFuZT1udWxsOw0KfQ0KdGhpcy5sb2dnZXIucmVtb3ZlTGlzdGVuZXIoXzRlMik7DQp0cnl7DQp0cnl7DQpfNGQ3LmxvZ2dpbmdQYW5lPW51bGw7DQp9DQpjYXRjaChlKXsNCmxvZ0ZhdGFsKCJCb29rbWFya2xldCB3YXMgY2xvc2VkIGluY29ycmVjdGx5LiIpOw0KfQ0KaWYoXzRjYil7DQpfNGQ3LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoXzRkNyk7DQp9ZWxzZXsNCnRoaXMud2luLmNsb3NlKCk7DQp9DQp9DQpjYXRjaChlKXsNCn0NCn0sdGhpcyk7DQp2YXIgXzRmOT1mdW5jdGlvbigpew0KXzRmNigpOw0KZm9yKHZhciBpPTA7aTxfNGUzLmxlbmd0aDtpKyspew0KdmFyIG1zZz1fNGUzW2ldOw0KaWYoXzRlND09PW51bGx8fF80ZTQobXNnKSl7DQpfNGVhKG1zZyk7DQp9DQp9DQp9Ow0KdGhpcy5idWlsZEFuZEFwcGx5RmlsdGVyPWZ1bmN0aW9uKCl7DQpfNGU0PV80ZjIoKTsNCl80ZjkoKTsNCnRoaXMubG9nZ2VyLnJlbW92ZUxpc3RlbmVyKF80ZTIpOw0KdGhpcy5sb2dnZXIuYWRkTGlzdGVuZXIoXzRlMixfNGU0LF80ZjApOw0KfTsNCnZhciBfNGZjPWJpbmQoZnVuY3Rpb24oKXsNCl80ZTM9dGhpcy5sb2dnZXIuZ2V0TWVzc2FnZXMoKTsNCl80ZjkoKTsNCn0sdGhpcyk7DQp2YXIgXzRmZD1iaW5kKGZ1bmN0aW9uKF80ZmUpew0KXzRmZT1fNGZlfHx3aW5kb3cuZXZlbnQ7DQprZXk9XzRmZS53aGljaHx8XzRmZS5rZXlDb2RlOw0KaWYoa2V5PT0xMyl7DQp0aGlzLmJ1aWxkQW5kQXBwbHlGaWx0ZXIoKTsNCn0NCn0sdGhpcyk7DQp2YXIgXzRmZj0iZGlzcGxheTogYmxvY2s7IHotaW5kZXg6IDEwMDA7IGxlZnQ6IDBweDsgYm90dG9tOiAwcHg7IHBvc2l0aW9uOiBmaXhlZDsgd2lkdGg6IDEwMCU7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBmb250OiAiK3RoaXMubG9nRm9udDsNCmlmKF80Y2Ipew0KXzRmZis9IjsgaGVpZ2h0OiAxMGVtOyBib3JkZXItdG9wOiAycHggc29saWQgYmxhY2siOw0KfWVsc2V7DQpfNGZmKz0iOyBoZWlnaHQ6IDEwMCU7IjsNCn0NCl80ZDcuc3R5bGUuY3NzVGV4dD1fNGZmOw0KaWYoIV80ZDgpew0KZG9jLmJvZHkuYXBwZW5kQ2hpbGQoXzRkNyk7DQp9DQpfNGZmPXsiY3NzVGV4dCI6IndpZHRoOiAzMyU7IGRpc3BsYXk6IGlubGluZTsgZm9udDogIit0aGlzLmxvZ0ZvbnR9Ow0KXzRjZShfNGRhLHsidmFsdWUiOiJGQVRBTHxFUlJPUnxXQVJOSU5HfElORk98REVCVUciLCJvbmtleXByZXNzIjpfNGZkLCJzdHlsZSI6XzRmZn0pOw0KXzRkNy5hcHBlbmRDaGlsZChfNGRhKTsNCl80Y2UoXzRkYix7InZhbHVlIjoiLioiLCJvbmtleXByZXNzIjpfNGZkLCJzdHlsZSI6XzRmZn0pOw0KXzRkNy5hcHBlbmRDaGlsZChfNGRiKTsNCl80ZmY9IndpZHRoOiA4JTsgZGlzcGxheTppbmxpbmU7IGZvbnQ6ICIrdGhpcy5sb2dGb250Ow0KXzRkYy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIkZpbHRlciIpKTsNCl80ZGMub25jbGljaz1iaW5kKCJidWlsZEFuZEFwcGx5RmlsdGVyIix0aGlzKTsNCl80ZGMuc3R5bGUuY3NzVGV4dD1fNGZmOw0KXzRkNy5hcHBlbmRDaGlsZChfNGRjKTsNCl80ZGQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJMb2FkIikpOw0KXzRkZC5vbmNsaWNrPV80ZmM7DQpfNGRkLnN0eWxlLmNzc1RleHQ9XzRmZjsNCl80ZDcuYXBwZW5kQ2hpbGQoXzRkZCk7DQpfNGRlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiQ2xlYXIiKSk7DQpfNGRlLm9uY2xpY2s9XzRmNzsNCl80ZGUuc3R5bGUuY3NzVGV4dD1fNGZmOw0KXzRkNy5hcHBlbmRDaGlsZChfNGRlKTsNCl80ZGYuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJDbG9zZSIpKTsNCl80ZGYub25jbGljaz1fNGY4Ow0KXzRkZi5zdHlsZS5jc3NUZXh0PV80ZmY7DQpfNGQ3LmFwcGVuZENoaWxkKF80ZGYpOw0KXzRlMC5zdHlsZS5jc3NUZXh0PSJvdmVyZmxvdzogYXV0bzsgd2lkdGg6IDEwMCUiOw0KXzRlMS5zdHlsZS5jc3NUZXh0PSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAiKyhfNGNiPyI4ZW0iOiIxMDAlIik7DQpfNGUwLmFwcGVuZENoaWxkKF80ZTEpOw0KXzRkNy5hcHBlbmRDaGlsZChfNGUwKTsNCnRoaXMuYnVpbGRBbmRBcHBseUZpbHRlcigpOw0KXzRmYygpOw0KaWYoXzRjYil7DQp0aGlzLndpbj11bmRlZmluZWQ7DQp9ZWxzZXsNCnRoaXMud2luPXdpbjsNCn0NCnRoaXMuaW5saW5lPV80Y2I7DQp0aGlzLmNsb3NlUGFuZT1fNGY4Ow0KdGhpcy5jbG9zZWQ9ZmFsc2U7DQpyZXR1cm4gdGhpczsNCn07DQpNb2NoaUtpdC5Mb2dnaW5nUGFuZS5Mb2dnaW5nUGFuZS5wcm90b3R5cGU9eyJsb2dGb250IjoiOHB0IFZlcmRhbmEsc2Fucy1zZXJpZiIsImNvbG9yVGFibGUiOnsiRVJST1IiOiJyZWQiLCJGQVRBTCI6ImRhcmtyZWQiLCJXQVJOSU5HIjoiYmx1ZSIsIklORk8iOiJibGFjayIsIkRFQlVHIjoiZ3JlZW4ifX07DQpNb2NoaUtpdC5Mb2dnaW5nUGFuZS5fX25ld19fPWZ1bmN0aW9uKCl7DQpNb2NoaUtpdC5CYXNlLm5hbWVGdW5jdGlvbnModGhpcyk7DQpNb2NoaUtpdC5Mb2dnaW5nUGFuZS5fbG9nZ2luZ1BhbmU9bnVsbDsNCn07DQpNb2NoaUtpdC5Mb2dnaW5nUGFuZS5fX25ld19fKCk7DQpNb2NoaUtpdC5CYXNlLl9leHBvcnRTeW1ib2xzKHRoaXMsTW9jaGlLaXQuTG9nZ2luZ1BhbmUpOw0KTW9jaGlLaXQuQmFzZS5fbW9kdWxlKCJDb2xvciIsIjEuNSIsWyJCYXNlIiwiRE9NIiwiU3R5bGUiXSk7DQpNb2NoaUtpdC5Db2xvci5Db2xvcj1mdW5jdGlvbihyZWQsXzUwMSxibHVlLF81MDMpew0KaWYodHlwZW9mIChfNTAzKT09InVuZGVmaW5lZCJ8fF81MDM9PT1udWxsKXsNCl81MDM9MTsNCn0NCnRoaXMucmdiPXtyOnJlZCxnOl81MDEsYjpibHVlLGE6XzUwM307DQp9Ow0KTW9jaGlLaXQuQ29sb3IuQ29sb3IucHJvdG90eXBlPXtfX2NsYXNzX186TW9jaGlLaXQuQ29sb3IuQ29sb3IsY29sb3JXaXRoQWxwaGE6ZnVuY3Rpb24oXzUwNCl7DQp2YXIgcmdiPXRoaXMucmdiOw0KdmFyIG09TW9jaGlLaXQuQ29sb3I7DQpyZXR1cm4gbS5Db2xvci5mcm9tUkdCKHJnYi5yLHJnYi5nLHJnYi5iLF81MDQpOw0KfSxjb2xvcldpdGhIdWU6ZnVuY3Rpb24oaHVlKXsNCnZhciBoc2w9dGhpcy5hc0hTTCgpOw0KaHNsLmg9aHVlOw0KdmFyIG09TW9jaGlLaXQuQ29sb3I7DQpyZXR1cm4gbS5Db2xvci5mcm9tSFNMKGhzbCk7DQp9LGNvbG9yV2l0aFNhdHVyYXRpb246ZnVuY3Rpb24oXzUwYSl7DQp2YXIgaHNsPXRoaXMuYXNIU0woKTsNCmhzbC5zPV81MGE7DQp2YXIgbT1Nb2NoaUtpdC5Db2xvcjsNCnJldHVybiBtLkNvbG9yLmZyb21IU0woaHNsKTsNCn0sY29sb3JXaXRoTGlnaHRuZXNzOmZ1bmN0aW9uKF81MGQpew0KdmFyIGhzbD10aGlzLmFzSFNMKCk7DQpoc2wubD1fNTBkOw0KdmFyIG09TW9jaGlLaXQuQ29sb3I7DQpyZXR1cm4gbS5Db2xvci5mcm9tSFNMKGhzbCk7DQp9LGRhcmtlckNvbG9yV2l0aExldmVsOmZ1bmN0aW9uKF81MTApew0KdmFyIGhzbD10aGlzLmFzSFNMKCk7DQpoc2wubD1NYXRoLm1heChoc2wubC1fNTEwLDApOw0KdmFyIG09TW9jaGlLaXQuQ29sb3I7DQpyZXR1cm4gbS5Db2xvci5mcm9tSFNMKGhzbCk7DQp9LGxpZ2h0ZXJDb2xvcldpdGhMZXZlbDpmdW5jdGlvbihfNTEzKXsNCnZhciBoc2w9dGhpcy5hc0hTTCgpOw0KaHNsLmw9TWF0aC5taW4oaHNsLmwrXzUxMywxKTsNCnZhciBtPU1vY2hpS2l0LkNvbG9yOw0KcmV0dXJuIG0uQ29sb3IuZnJvbUhTTChoc2wpOw0KfSxibGVuZGVkQ29sb3I6ZnVuY3Rpb24oXzUxNixfNTE3KXsNCmlmKHR5cGVvZiAoXzUxNyk9PSJ1bmRlZmluZWQifHxfNTE3PT09bnVsbCl7DQpfNTE3PTAuNTsNCn0NCnZhciBzZj0xLV81MTc7DQp2YXIgcz10aGlzLnJnYjsNCnZhciBkPV81MTYucmdiOw0KdmFyIGRmPV81MTc7DQpyZXR1cm4gTW9jaGlLaXQuQ29sb3IuQ29sb3IuZnJvbVJHQigocy5yKnNmKSsoZC5yKmRmKSwocy5nKnNmKSsoZC5nKmRmKSwocy5iKnNmKSsoZC5iKmRmKSwocy5hKnNmKSsoZC5hKmRmKSk7DQp9LGNvbXBhcmVSR0I6ZnVuY3Rpb24oXzUxYyl7DQp2YXIgYT10aGlzLmFzUkdCKCk7DQp2YXIgYj1fNTFjLmFzUkdCKCk7DQpyZXR1cm4gTW9jaGlLaXQuQmFzZS5jb21wYXJlKFthLnIsYS5nLGEuYixhLmFdLFtiLnIsYi5nLGIuYixiLmFdKTsNCn0saXNMaWdodDpmdW5jdGlvbigpew0KcmV0dXJuIHRoaXMuYXNIU0woKS5sPjAuNTsNCn0saXNEYXJrOmZ1bmN0aW9uKCl7DQpyZXR1cm4gKCF0aGlzLmlzTGlnaHQoKSk7DQp9LHRvSFNMU3RyaW5nOmZ1bmN0aW9uKCl7DQp2YXIgYz10aGlzLmFzSFNMKCk7DQp2YXIgY2NjPU1vY2hpS2l0LkNvbG9yLmNsYW1wQ29sb3JDb21wb25lbnQ7DQp2YXIgcnZhbD10aGlzLl9oc2xTdHJpbmc7DQppZighcnZhbCl7DQp2YXIgbWlkPShjY2MoYy5oLDM2MCkudG9GaXhlZCgwKSsiLCIrY2NjKGMucywxMDApLnRvUHJlY2lzaW9uKDQpKyIlIisiLCIrY2NjKGMubCwxMDApLnRvUHJlY2lzaW9uKDQpKyIlIik7DQp2YXIgYT1jLmE7DQppZihhPj0xKXsNCmE9MTsNCnJ2YWw9ImhzbCgiK21pZCsiKSI7DQp9ZWxzZXsNCmlmKGE8PTApew0KYT0wOw0KfQ0KcnZhbD0iaHNsYSgiK21pZCsiLCIrYSsiKSI7DQp9DQp0aGlzLl9oc2xTdHJpbmc9cnZhbDsNCn0NCnJldHVybiBydmFsOw0KfSx0b1JHQlN0cmluZzpmdW5jdGlvbigpew0KdmFyIGM9dGhpcy5yZ2I7DQp2YXIgY2NjPU1vY2hpS2l0LkNvbG9yLmNsYW1wQ29sb3JDb21wb25lbnQ7DQp2YXIgcnZhbD10aGlzLl9yZ2JTdHJpbmc7DQppZighcnZhbCl7DQp2YXIgbWlkPShjY2MoYy5yLDI1NSkudG9GaXhlZCgwKSsiLCIrY2NjKGMuZywyNTUpLnRvRml4ZWQoMCkrIiwiK2NjYyhjLmIsMjU1KS50b0ZpeGVkKDApKTsNCmlmKGMuYSE9MSl7DQpydmFsPSJyZ2JhKCIrbWlkKyIsIitjLmErIikiOw0KfWVsc2V7DQpydmFsPSJyZ2IoIittaWQrIikiOw0KfQ0KdGhpcy5fcmdiU3RyaW5nPXJ2YWw7DQp9DQpyZXR1cm4gcnZhbDsNCn0sYXNSR0I6ZnVuY3Rpb24oKXsNCnJldHVybiBNb2NoaUtpdC5CYXNlLmNsb25lKHRoaXMucmdiKTsNCn0sdG9IZXhTdHJpbmc6ZnVuY3Rpb24oKXsNCnZhciBtPU1vY2hpS2l0LkNvbG9yOw0KdmFyIGM9dGhpcy5yZ2I7DQp2YXIgY2NjPU1vY2hpS2l0LkNvbG9yLmNsYW1wQ29sb3JDb21wb25lbnQ7DQp2YXIgcnZhbD10aGlzLl9oZXhTdHJpbmc7DQppZighcnZhbCl7DQpydmFsPSgiIyIrbS50b0NvbG9yUGFydChjY2MoYy5yLDI1NSkpK20udG9Db2xvclBhcnQoY2NjKGMuZywyNTUpKSttLnRvQ29sb3JQYXJ0KGNjYyhjLmIsMjU1KSkpOw0KdGhpcy5faGV4U3RyaW5nPXJ2YWw7DQp9DQpyZXR1cm4gcnZhbDsNCn0sYXNIU1Y6ZnVuY3Rpb24oKXsNCnZhciBoc3Y9dGhpcy5oc3Y7DQp2YXIgYz10aGlzLnJnYjsNCmlmKHR5cGVvZiAoaHN2KT09InVuZGVmaW5lZCJ8fGhzdj09PW51bGwpew0KaHN2PU1vY2hpS2l0LkNvbG9yLnJnYlRvSFNWKHRoaXMucmdiKTsNCnRoaXMuaHN2PWhzdjsNCn0NCnJldHVybiBNb2NoaUtpdC5CYXNlLmNsb25lKGhzdik7DQp9LGFzSFNMOmZ1bmN0aW9uKCl7DQp2YXIgaHNsPXRoaXMuaHNsOw0KdmFyIGM9dGhpcy5yZ2I7DQppZih0eXBlb2YgKGhzbCk9PSJ1bmRlZmluZWQifHxoc2w9PT1udWxsKXsNCmhzbD1Nb2NoaUtpdC5Db2xvci5yZ2JUb0hTTCh0aGlzLnJnYik7DQp0aGlzLmhzbD1oc2w7DQp9DQpyZXR1cm4gTW9jaGlLaXQuQmFzZS5jbG9uZShoc2wpOw0KfSx0b1N0cmluZzpmdW5jdGlvbigpew0KcmV0dXJuIHRoaXMudG9SR0JTdHJpbmcoKTsNCn0scmVwcjpmdW5jdGlvbigpew0KdmFyIGM9dGhpcy5yZ2I7DQp2YXIgY29sPVtjLnIsYy5nLGMuYixjLmFdOw0KcmV0dXJuIHRoaXMuX19jbGFzc19fLk5BTUUrIigiK2NvbC5qb2luKCIsICIpKyIpIjsNCn19Ow0KTW9jaGlLaXQuQmFzZS51cGRhdGUoTW9jaGlLaXQuQ29sb3IuQ29sb3Ise2Zyb21SR0I6ZnVuY3Rpb24ocmVkLF81MzMsYmx1ZSxfNTM1KXsNCnZhciBfNTM2PU1vY2hpS2l0LkNvbG9yLkNvbG9yOw0KaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7DQp2YXIgcmdiPXJlZDsNCnJlZD1yZ2IucjsNCl81MzM9cmdiLmc7DQpibHVlPXJnYi5iOw0KaWYodHlwZW9mIChyZ2IuYSk9PSJ1bmRlZmluZWQiKXsNCl81MzU9dW5kZWZpbmVkOw0KfWVsc2V7DQpfNTM1PXJnYi5hOw0KfQ0KfQ0KcmV0dXJuIG5ldyBfNTM2KHJlZCxfNTMzLGJsdWUsXzUzNSk7DQp9LGZyb21IU0w6ZnVuY3Rpb24oaHVlLF81MzksXzUzYSxfNTNiKXsNCnZhciBtPU1vY2hpS2l0LkNvbG9yOw0KcmV0dXJuIG0uQ29sb3IuZnJvbVJHQihtLmhzbFRvUkdCLmFwcGx5KG0sYXJndW1lbnRzKSk7DQp9LGZyb21IU1Y6ZnVuY3Rpb24oaHVlLF81M2UsXzUzZixfNTQwKXsNCnZhciBtPU1vY2hpS2l0LkNvbG9yOw0KcmV0dXJuIG0uQ29sb3IuZnJvbVJHQihtLmhzdlRvUkdCLmFwcGx5KG0sYXJndW1lbnRzKSk7DQp9LGZyb21OYW1lOmZ1bmN0aW9uKG5hbWUpew0KdmFyIF81NDM9TW9jaGlLaXQuQ29sb3IuQ29sb3I7DQppZihuYW1lLmNoYXJBdCgwKT09IlwiIil7DQpuYW1lPW5hbWUuc3Vic3RyKDEsbmFtZS5sZW5ndGgtMik7DQp9DQp2YXIgXzU0ND1fNTQzLl9uYW1lZENvbG9yc1tuYW1lLnRvTG93ZXJDYXNlKCldOw0KaWYodHlwZW9mIChfNTQ0KT09InN0cmluZyIpew0KcmV0dXJuIF81NDMuZnJvbUhleFN0cmluZyhfNTQ0KTsNCn1lbHNlew0KaWYobmFtZT09InRyYW5zcGFyZW50Iil7DQpyZXR1cm4gXzU0My50cmFuc3BhcmVudENvbG9yKCk7DQp9DQp9DQpyZXR1cm4gbnVsbDsNCn0sZnJvbVN0cmluZzpmdW5jdGlvbihfNTQ1KXsNCnZhciBzZWxmPU1vY2hpS2l0LkNvbG9yLkNvbG9yOw0KdmFyIF81NDc9XzU0NS5zdWJzdHIoMCwzKTsNCmlmKF81NDc9PSJyZ2IiKXsNCnJldHVybiBzZWxmLmZyb21SR0JTdHJpbmcoXzU0NSk7DQp9ZWxzZXsNCmlmKF81NDc9PSJoc2wiKXsNCnJldHVybiBzZWxmLmZyb21IU0xTdHJpbmcoXzU0NSk7DQp9ZWxzZXsNCmlmKF81NDUuY2hhckF0KDApPT0iIyIpew0KcmV0dXJuIHNlbGYuZnJvbUhleFN0cmluZyhfNTQ1KTsNCn0NCn0NCn0NCnJldHVybiBzZWxmLmZyb21OYW1lKF81NDUpOw0KfSxmcm9tSGV4U3RyaW5nOmZ1bmN0aW9uKF81NDgpew0KaWYoXzU0OC5jaGFyQXQoMCk9PSIjIil7DQpfNTQ4PV81NDguc3Vic3RyaW5nKDEpOw0KfQ0KdmFyIF81NDk9W107DQp2YXIgaSxoZXg7DQppZihfNTQ4Lmxlbmd0aD09Myl7DQpmb3IoaT0wO2k8MztpKyspew0KaGV4PV81NDguc3Vic3RyKGksMSk7DQpfNTQ5LnB1c2gocGFyc2VJbnQoaGV4K2hleCwxNikvMjU1KTsNCn0NCn1lbHNlew0KZm9yKGk9MDtpPDY7aSs9Mil7DQpoZXg9XzU0OC5zdWJzdHIoaSwyKTsNCl81NDkucHVzaChwYXJzZUludChoZXgsMTYpLzI1NSk7DQp9DQp9DQp2YXIgXzU0Yz1Nb2NoaUtpdC5Db2xvci5Db2xvcjsNCnJldHVybiBfNTRjLmZyb21SR0IuYXBwbHkoXzU0YyxfNTQ5KTsNCn0sX2Zyb21Db2xvclN0cmluZzpmdW5jdGlvbihwcmUsXzU0ZSxfNTRmLF81NTApew0KaWYoXzU1MC5pbmRleE9mKHByZSk9PT0wKXsNCl81NTA9XzU1MC5zdWJzdHJpbmcoXzU1MC5pbmRleE9mKCIoIiwzKSsxLF81NTAubGVuZ3RoLTEpOw0KfQ0KdmFyIF81NTE9XzU1MC5zcGxpdCgvXHMqLFxzKi8pOw0KdmFyIF81NTI9W107DQpmb3IodmFyIGk9MDtpPF81NTEubGVuZ3RoO2krKyl7DQp2YXIgYz1fNTUxW2ldOw0KdmFyIHZhbDsNCnZhciBfNTU2PWMuc3Vic3RyaW5nKGMubGVuZ3RoLTMpOw0KaWYoYy5jaGFyQXQoYy5sZW5ndGgtMSk9PSIlIil7DQp2YWw9MC4wMSpwYXJzZUZsb2F0KGMuc3Vic3RyaW5nKDAsYy5sZW5ndGgtMSkpOw0KfWVsc2V7DQppZihfNTU2PT0iZGVnIil7DQp2YWw9cGFyc2VGbG9hdChjKS8zNjA7DQp9ZWxzZXsNCmlmKF81NTY9PSJyYWQiKXsNCnZhbD1wYXJzZUZsb2F0KGMpLyhNYXRoLlBJKjIpOw0KfWVsc2V7DQp2YWw9XzU0ZltpXSpwYXJzZUZsb2F0KGMpOw0KfQ0KfQ0KfQ0KXzU1Mi5wdXNoKHZhbCk7DQp9DQpyZXR1cm4gdGhpc1tfNTRlXS5hcHBseSh0aGlzLF81NTIpOw0KfSxmcm9tQ29tcHV0ZWRTdHlsZTpmdW5jdGlvbihlbGVtLF81NTgpew0KdmFyIGQ9TW9jaGlLaXQuRE9NOw0KdmFyIGNscz1Nb2NoaUtpdC5Db2xvci5Db2xvcjsNCmZvcihlbGVtPWQuZ2V0RWxlbWVudChlbGVtKTtlbGVtO2VsZW09ZWxlbS5wYXJlbnROb2RlKXsNCnZhciBfNTViPU1vY2hpS2l0LlN0eWxlLmdldFN0eWxlLmFwcGx5KGQsYXJndW1lbnRzKTsNCmlmKCFfNTViKXsNCmNvbnRpbnVlOw0KfQ0KdmFyIF81NWM9Y2xzLmZyb21TdHJpbmcoXzU1Yik7DQppZighXzU1Yyl7DQpicmVhazsNCn0NCmlmKF81NWMuYXNSR0IoKS5hPjApew0KcmV0dXJuIF81NWM7DQp9DQp9DQpyZXR1cm4gbnVsbDsNCn0sZnJvbUJhY2tncm91bmQ6ZnVuY3Rpb24oZWxlbSl7DQp2YXIgY2xzPU1vY2hpS2l0LkNvbG9yLkNvbG9yOw0KcmV0dXJuIGNscy5mcm9tQ29tcHV0ZWRTdHlsZShlbGVtLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kLWNvbG9yIil8fGNscy53aGl0ZUNvbG9yKCk7DQp9LGZyb21UZXh0OmZ1bmN0aW9uKGVsZW0pew0KdmFyIGNscz1Nb2NoaUtpdC5Db2xvci5Db2xvcjsNCnJldHVybiBjbHMuZnJvbUNvbXB1dGVkU3R5bGUoZWxlbSwiY29sb3IiLCJjb2xvciIpfHxjbHMuYmxhY2tDb2xvcigpOw0KfSxuYW1lZENvbG9yczpmdW5jdGlvbigpew0KcmV0dXJuIE1vY2hpS2l0LkJhc2UuY2xvbmUoTW9jaGlLaXQuQ29sb3IuQ29sb3IuX25hbWVkQ29sb3JzKTsNCn19KTsNCk1vY2hpS2l0LkJhc2UudXBkYXRlKE1vY2hpS2l0LkNvbG9yLHtjbGFtcENvbG9yQ29tcG9uZW50OmZ1bmN0aW9uKHYsXzU2Mil7DQp2Kj1fNTYyOw0KaWYodjwwKXsNCnJldHVybiAwOw0KfWVsc2V7DQppZih2Pl81NjIpew0KcmV0dXJuIF81NjI7DQp9ZWxzZXsNCnJldHVybiB2Ow0KfQ0KfQ0KfSxfaHNsVmFsdWU6ZnVuY3Rpb24objEsbjIsaHVlKXsNCmlmKGh1ZT42KXsNCmh1ZS09NjsNCn1lbHNlew0KaWYoaHVlPDApew0KaHVlKz02Ow0KfQ0KfQ0KdmFyIHZhbDsNCmlmKGh1ZTwxKXsNCnZhbD1uMSsobjItbjEpKmh1ZTsNCn1lbHNlew0KaWYoaHVlPDMpew0KdmFsPW4yOw0KfWVsc2V7DQppZihodWU8NCl7DQp2YWw9bjErKG4yLW4xKSooNC1odWUpOw0KfWVsc2V7DQp2YWw9bjE7DQp9DQp9DQp9DQpyZXR1cm4gdmFsOw0KfSxoc3ZUb1JHQjpmdW5jdGlvbihodWUsXzU2OCxfNTY5LF81NmEpew0KaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7DQp2YXIgaHN2PWh1ZTsNCmh1ZT1oc3YuaDsNCl81Njg9aHN2LnM7DQpfNTY5PWhzdi52Ow0KXzU2YT1oc3YuYTsNCn0NCnZhciByZWQ7DQp2YXIgXzU2ZDsNCnZhciBibHVlOw0KaWYoXzU2OD09PTApew0KcmVkPV81Njk7DQpfNTZkPV81Njk7DQpibHVlPV81Njk7DQp9ZWxzZXsNCnZhciBpPU1hdGguZmxvb3IoaHVlKjYpOw0KdmFyIGY9KGh1ZSo2KS1pOw0KdmFyIHA9XzU2OSooMS1fNTY4KTsNCnZhciBxPV81NjkqKDEtKF81NjgqZikpOw0KdmFyIHQ9XzU2OSooMS0oXzU2OCooMS1mKSkpOw0Kc3dpdGNoKGkpew0KY2FzZSAxOg0KcmVkPXE7DQpfNTZkPV81Njk7DQpibHVlPXA7DQpicmVhazsNCmNhc2UgMjoNCnJlZD1wOw0KXzU2ZD1fNTY5Ow0KYmx1ZT10Ow0KYnJlYWs7DQpjYXNlIDM6DQpyZWQ9cDsNCl81NmQ9cTsNCmJsdWU9XzU2OTsNCmJyZWFrOw0KY2FzZSA0Og0KcmVkPXQ7DQpfNTZkPXA7DQpibHVlPV81Njk7DQpicmVhazsNCmNhc2UgNToNCnJlZD1fNTY5Ow0KXzU2ZD1wOw0KYmx1ZT1xOw0KYnJlYWs7DQpjYXNlIDY6DQpjYXNlIDA6DQpyZWQ9XzU2OTsNCl81NmQ9dDsNCmJsdWU9cDsNCmJyZWFrOw0KfQ0KfQ0KcmV0dXJuIHtyOnJlZCxnOl81NmQsYjpibHVlLGE6XzU2YX07DQp9LGhzbFRvUkdCOmZ1bmN0aW9uKGh1ZSxfNTc1LF81NzYsXzU3Nyl7DQppZihhcmd1bWVudHMubGVuZ3RoPT0xKXsNCnZhciBoc2w9aHVlOw0KaHVlPWhzbC5oOw0KXzU3NT1oc2wuczsNCl81NzY9aHNsLmw7DQpfNTc3PWhzbC5hOw0KfQ0KdmFyIHJlZDsNCnZhciBfNTdhOw0KdmFyIGJsdWU7DQppZihfNTc1PT09MCl7DQpyZWQ9XzU3NjsNCl81N2E9XzU3NjsNCmJsdWU9XzU3NjsNCn1lbHNlew0KdmFyIG0yOw0KaWYoXzU3Njw9MC41KXsNCm0yPV81NzYqKDErXzU3NSk7DQp9ZWxzZXsNCm0yPV81NzYrXzU3NS0oXzU3NipfNTc1KTsNCn0NCnZhciBtMT0oMipfNTc2KS1tMjsNCnZhciBmPU1vY2hpS2l0LkNvbG9yLl9oc2xWYWx1ZTsNCnZhciBoNj1odWUqNjsNCnJlZD1mKG0xLG0yLGg2KzIpOw0KXzU3YT1mKG0xLG0yLGg2KTsNCmJsdWU9ZihtMSxtMixoNi0yKTsNCn0NCnJldHVybiB7cjpyZWQsZzpfNTdhLGI6Ymx1ZSxhOl81Nzd9Ow0KfSxyZ2JUb0hTVjpmdW5jdGlvbihyZWQsXzU4MSxibHVlLF81ODMpew0KaWYoYXJndW1lbnRzLmxlbmd0aD09MSl7DQp2YXIgcmdiPXJlZDsNCnJlZD1yZ2IucjsNCl81ODE9cmdiLmc7DQpibHVlPXJnYi5iOw0KXzU4Mz1yZ2IuYTsNCn0NCnZhciBtYXg9TWF0aC5tYXgoTWF0aC5tYXgocmVkLF81ODEpLGJsdWUpOw0KdmFyIG1pbj1NYXRoLm1pbihNYXRoLm1pbihyZWQsXzU4MSksYmx1ZSk7DQp2YXIgaHVlOw0KdmFyIF81ODg7DQp2YXIgXzU4OT1tYXg7DQppZihtaW49PW1heCl7DQpodWU9MDsNCl81ODg9MDsNCn1lbHNlew0KdmFyIF81OGE9KG1heC1taW4pOw0KXzU4OD1fNThhL21heDsNCmlmKHJlZD09bWF4KXsNCmh1ZT0oXzU4MS1ibHVlKS9fNThhOw0KfWVsc2V7DQppZihfNTgxPT1tYXgpew0KaHVlPTIrKChibHVlLXJlZCkvXzU4YSk7DQp9ZWxzZXsNCmh1ZT00KygocmVkLV81ODEpL181OGEpOw0KfQ0KfQ0KaHVlLz02Ow0KaWYoaHVlPDApew0KaHVlKz0xOw0KfQ0KaWYoaHVlPjEpew0KaHVlLT0xOw0KfQ0KfQ0KcmV0dXJuIHtoOmh1ZSxzOl81ODgsdjpfNTg5LGE6XzU4M307DQp9LHJnYlRvSFNMOmZ1bmN0aW9uKHJlZCxfNThjLGJsdWUsXzU4ZSl7DQppZihhcmd1bWVudHMubGVuZ3RoPT0xKXsNCnZhciByZ2I9cmVkOw0KcmVkPXJnYi5yOw0KXzU4Yz1yZ2IuZzsNCmJsdWU9cmdiLmI7DQpfNThlPXJnYi5hOw0KfQ0KdmFyIG1heD1NYXRoLm1heChyZWQsTWF0aC5tYXgoXzU4YyxibHVlKSk7DQp2YXIgbWluPU1hdGgubWluKHJlZCxNYXRoLm1pbihfNThjLGJsdWUpKTsNCnZhciBodWU7DQp2YXIgXzU5MzsNCnZhciBfNTk0PShtYXgrbWluKS8yOw0KdmFyIF81OTU9bWF4LW1pbjsNCmlmKF81OTU9PT0wKXsNCmh1ZT0wOw0KXzU5Mz0wOw0KfWVsc2V7DQppZihfNTk0PD0wLjUpew0KXzU5Mz1fNTk1LyhtYXgrbWluKTsNCn1lbHNlew0KXzU5Mz1fNTk1LygyLW1heC1taW4pOw0KfQ0KaWYocmVkPT1tYXgpew0KaHVlPShfNThjLWJsdWUpL181OTU7DQp9ZWxzZXsNCmlmKF81OGM9PW1heCl7DQpodWU9MisoKGJsdWUtcmVkKS9fNTk1KTsNCn1lbHNlew0KaHVlPTQrKChyZWQtXzU4YykvXzU5NSk7DQp9DQp9DQpodWUvPTY7DQppZihodWU8MCl7DQpodWUrPTE7DQp9DQppZihodWU+MSl7DQpodWUtPTE7DQp9DQp9DQpyZXR1cm4ge2g6aHVlLHM6XzU5MyxsOl81OTQsYTpfNThlfTsNCn0sdG9Db2xvclBhcnQ6ZnVuY3Rpb24obnVtKXsNCm51bT1NYXRoLnJvdW5kKG51bSk7DQp2YXIgXzU5Nz1udW0udG9TdHJpbmcoMTYpOw0KaWYobnVtPDE2KXsNCnJldHVybiAiMCIrXzU5NzsNCn0NCnJldHVybiBfNTk3Ow0KfSxfX25ld19fOmZ1bmN0aW9uKCl7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KdGhpcy5Db2xvci5mcm9tUkdCU3RyaW5nPW0uYmluZCh0aGlzLkNvbG9yLl9mcm9tQ29sb3JTdHJpbmcsdGhpcy5Db2xvciwicmdiIiwiZnJvbVJHQiIsWzEvMjU1LDEvMjU1LDEvMjU1LDFdKTsNCnRoaXMuQ29sb3IuZnJvbUhTTFN0cmluZz1tLmJpbmQodGhpcy5Db2xvci5fZnJvbUNvbG9yU3RyaW5nLHRoaXMuQ29sb3IsImhzbCIsImZyb21IU0wiLFsxLzM2MCwwLjAxLDAuMDEsMV0pOw0KdmFyIF81OTk9MS8zOw0KdmFyIF81OWE9e2JsYWNrOlswLDAsMF0sYmx1ZTpbMCwwLDFdLGJyb3duOlswLjYsMC40LDAuMl0sY3lhbjpbMCwxLDFdLGRhcmtHcmF5OltfNTk5LF81OTksXzU5OV0sZ3JheTpbMC41LDAuNSwwLjVdLGdyZWVuOlswLDEsMF0sbGlnaHRHcmF5OlsyKl81OTksMipfNTk5LDIqXzU5OV0sbWFnZW50YTpbMSwwLDFdLG9yYW5nZTpbMSwwLjUsMF0scHVycGxlOlswLjUsMCwwLjVdLHJlZDpbMSwwLDBdLHRyYW5zcGFyZW50OlswLDAsMCwwXSx3aGl0ZTpbMSwxLDFdLHllbGxvdzpbMSwxLDBdfTsNCmZvcih2YXIgayBpbiBfNTlhKXsNCnZhciBuYW1lPWsrIkNvbG9yIjsNCnZhciBfNTlkPXRoaXMuQ29sb3IuZnJvbVJHQi5hcHBseSh0aGlzLkNvbG9yLF81OWFba10pOw0KdGhpcy5Db2xvcltuYW1lXT1tLnBhcnRpYWwobS5vcGVyYXRvci5pZGVudGl0eSxfNTlkKTsNCn0NCnZhciBfNTllPWZ1bmN0aW9uKCl7DQpmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXsNCmlmKCEoYXJndW1lbnRzW2ldIGluc3RhbmNlb2YgTW9jaGlLaXQuQ29sb3IuQ29sb3IpKXsNCnJldHVybiBmYWxzZTsNCn0NCn0NCnJldHVybiB0cnVlOw0KfTsNCnZhciBfNWEwPWZ1bmN0aW9uKGEsYil7DQpyZXR1cm4gYS5jb21wYXJlUkdCKGIpOw0KfTsNCm0ubmFtZUZ1bmN0aW9ucyh0aGlzKTsNCm0ucmVnaXN0ZXJDb21wYXJhdG9yKHRoaXMuQ29sb3IuTkFNRSxfNTllLF81YTApOw0KfX0pOw0KTW9jaGlLaXQuQ29sb3IuX19uZXdfXygpOw0KTW9jaGlLaXQuQ29sb3IuQ29sb3IuX25hbWVkQ29sb3JzPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmVlbjoiIzAwNjQwMCIsZGFya2dyZXk6IiNhOWE5YTkiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGdyZXk6IiM4MDgwODAiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZWVuOiIjOTBlZTkwIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZGIiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkYjcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiJ9Ow0KTW9jaGlLaXQuQmFzZS5fZXhwb3J0U3ltYm9scyh0aGlzLE1vY2hpS2l0LkNvbG9yKTsNCk1vY2hpS2l0LkJhc2UuX21vZHVsZSgiU2lnbmFsIiwiMS41IixbIkJhc2UiLCJET00iLCJTdHlsZSJdKTsNCk1vY2hpS2l0LlNpZ25hbC5fb2JzZXJ2ZXJzPVtdOw0KTW9jaGlLaXQuU2lnbmFsLkV2ZW50PWZ1bmN0aW9uKHNyYyxlKXsNCnRoaXMuX2V2ZW50PWV8fHdpbmRvdy5ldmVudDsNCnRoaXMuX3NyYz1zcmM7DQp9Ow0KTW9jaGlLaXQuU2lnbmFsLkV2ZW50Ll9fZXhwb3J0X189ZmFsc2U7DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5TaWduYWwuRXZlbnQucHJvdG90eXBlLHtfX3JlcHJfXzpmdW5jdGlvbigpew0KdmFyIHJlcHI9TW9jaGlLaXQuQmFzZS5yZXByOw0KdmFyIHN0cj0ie2V2ZW50KCk6ICIrcmVwcih0aGlzLmV2ZW50KCkpKyIsIHNyYygpOiAiK3JlcHIodGhpcy5zcmMoKSkrIiwgdHlwZSgpOiAiK3JlcHIodGhpcy50eXBlKCkpKyIsIHRhcmdldCgpOiAiK3JlcHIodGhpcy50YXJnZXQoKSk7DQppZih0aGlzLnR5cGUoKSYmdGhpcy50eXBlKCkuaW5kZXhPZigia2V5Iik9PT0wfHx0aGlzLnR5cGUoKS5pbmRleE9mKCJtb3VzZSIpPT09MHx8dGhpcy50eXBlKCkuaW5kZXhPZigiY2xpY2siKSE9LTF8fHRoaXMudHlwZSgpPT0iY29udGV4dG1lbnUiKXsNCnN0cis9IiwgbW9kaWZpZXIoKTogIisie2FsdDogIityZXByKHRoaXMubW9kaWZpZXIoKS5hbHQpKyIsIGN0cmw6ICIrcmVwcih0aGlzLm1vZGlmaWVyKCkuY3RybCkrIiwgbWV0YTogIityZXByKHRoaXMubW9kaWZpZXIoKS5tZXRhKSsiLCBzaGlmdDogIityZXByKHRoaXMubW9kaWZpZXIoKS5zaGlmdCkrIiwgYW55OiAiK3JlcHIodGhpcy5tb2RpZmllcigpLmFueSkrIn0iOw0KfQ0KaWYodGhpcy50eXBlKCkmJnRoaXMudHlwZSgpLmluZGV4T2YoImtleSIpPT09MCl7DQpzdHIrPSIsIGtleSgpOiB7Y29kZTogIityZXByKHRoaXMua2V5KCkuY29kZSkrIiwgc3RyaW5nOiAiK3JlcHIodGhpcy5rZXkoKS5zdHJpbmcpKyJ9IjsNCn0NCmlmKHRoaXMudHlwZSgpJiYodGhpcy50eXBlKCkuaW5kZXhPZigibW91c2UiKT09PTB8fHRoaXMudHlwZSgpLmluZGV4T2YoImNsaWNrIikhPS0xfHx0aGlzLnR5cGUoKT09ImNvbnRleHRtZW51Iikpew0Kc3RyKz0iLCBtb3VzZSgpOiB7cGFnZTogIityZXByKHRoaXMubW91c2UoKS5wYWdlKSsiLCBjbGllbnQ6ICIrcmVwcih0aGlzLm1vdXNlKCkuY2xpZW50KTsNCmlmKHRoaXMudHlwZSgpIT0ibW91c2Vtb3ZlIiYmdGhpcy50eXBlKCkhPSJtb3VzZXdoZWVsIil7DQpzdHIrPSIsIGJ1dHRvbjoge2xlZnQ6ICIrcmVwcih0aGlzLm1vdXNlKCkuYnV0dG9uLmxlZnQpKyIsIG1pZGRsZTogIityZXByKHRoaXMubW91c2UoKS5idXR0b24ubWlkZGxlKSsiLCByaWdodDogIityZXByKHRoaXMubW91c2UoKS5idXR0b24ucmlnaHQpKyJ9IjsNCn0NCmlmKHRoaXMudHlwZSgpPT0ibW91c2V3aGVlbCIpew0Kc3RyKz0iLCB3aGVlbDogIityZXByKHRoaXMubW91c2UoKS53aGVlbCk7DQp9DQpzdHIrPSJ9IjsNCn0NCmlmKHRoaXMudHlwZSgpPT0ibW91c2VvdmVyInx8dGhpcy50eXBlKCk9PSJtb3VzZW91dCJ8fHRoaXMudHlwZSgpPT0ibW91c2VlbnRlciJ8fHRoaXMudHlwZSgpPT0ibW91c2VsZWF2ZSIpew0Kc3RyKz0iLCByZWxhdGVkVGFyZ2V0KCk6ICIrcmVwcih0aGlzLnJlbGF0ZWRUYXJnZXQoKSk7DQp9DQpzdHIrPSJ9IjsNCnJldHVybiBzdHI7DQp9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7DQpyZXR1cm4gdGhpcy5fX3JlcHJfXygpOw0KfSxzcmM6ZnVuY3Rpb24oKXsNCnJldHVybiB0aGlzLl9zcmM7DQp9LGV2ZW50OmZ1bmN0aW9uKCl7DQpyZXR1cm4gdGhpcy5fZXZlbnQ7DQp9LHR5cGU6ZnVuY3Rpb24oKXsNCmlmKHRoaXMuX2V2ZW50LnR5cGU9PT0iRE9NTW91c2VTY3JvbGwiKXsNCnJldHVybiAibW91c2V3aGVlbCI7DQp9ZWxzZXsNCnJldHVybiB0aGlzLl9ldmVudC50eXBlfHx1bmRlZmluZWQ7DQp9DQp9LHRhcmdldDpmdW5jdGlvbigpew0KcmV0dXJuIHRoaXMuX2V2ZW50LnRhcmdldHx8dGhpcy5fZXZlbnQuc3JjRWxlbWVudDsNCn0sX3JlbGF0ZWRUYXJnZXQ6bnVsbCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKCl7DQppZih0aGlzLl9yZWxhdGVkVGFyZ2V0IT09bnVsbCl7DQpyZXR1cm4gdGhpcy5fcmVsYXRlZFRhcmdldDsNCn0NCnZhciBlbGVtPW51bGw7DQppZih0aGlzLnR5cGUoKT09Im1vdXNlb3ZlciJ8fHRoaXMudHlwZSgpPT0ibW91c2VlbnRlciIpew0KZWxlbT0odGhpcy5fZXZlbnQucmVsYXRlZFRhcmdldHx8dGhpcy5fZXZlbnQuZnJvbUVsZW1lbnQpOw0KfWVsc2V7DQppZih0aGlzLnR5cGUoKT09Im1vdXNlb3V0Inx8dGhpcy50eXBlKCk9PSJtb3VzZWxlYXZlIil7DQplbGVtPSh0aGlzLl9ldmVudC5yZWxhdGVkVGFyZ2V0fHx0aGlzLl9ldmVudC50b0VsZW1lbnQpOw0KfQ0KfQ0KdHJ5ew0KaWYoZWxlbSE9PW51bGwmJmVsZW0ubm9kZVR5cGUhPT1udWxsKXsNCnRoaXMuX3JlbGF0ZWRUYXJnZXQ9ZWxlbTsNCnJldHVybiBlbGVtOw0KfQ0KfQ0KY2F0Y2goaWdub3JlKXsNCn0NCnJldHVybiB1bmRlZmluZWQ7DQp9LF9tb2RpZmllcjpudWxsLG1vZGlmaWVyOmZ1bmN0aW9uKCl7DQppZih0aGlzLl9tb2RpZmllciE9PW51bGwpew0KcmV0dXJuIHRoaXMuX21vZGlmaWVyOw0KfQ0KdmFyIG09e307DQptLmFsdD10aGlzLl9ldmVudC5hbHRLZXk7DQptLmN0cmw9dGhpcy5fZXZlbnQuY3RybEtleTsNCm0ubWV0YT10aGlzLl9ldmVudC5tZXRhS2V5fHxmYWxzZTsNCm0uc2hpZnQ9dGhpcy5fZXZlbnQuc2hpZnRLZXk7DQptLmFueT1tLmFsdHx8bS5jdHJsfHxtLnNoaWZ0fHxtLm1ldGE7DQp0aGlzLl9tb2RpZmllcj1tOw0KcmV0dXJuIG07DQp9LF9rZXk6bnVsbCxrZXk6ZnVuY3Rpb24oKXsNCmlmKHRoaXMuX2tleSE9PW51bGwpew0KcmV0dXJuIHRoaXMuX2tleTsNCn0NCnZhciBrPXt9Ow0KaWYodGhpcy50eXBlKCkmJnRoaXMudHlwZSgpLmluZGV4T2YoImtleSIpPT09MCl7DQppZih0aGlzLnR5cGUoKT09ImtleWRvd24ifHx0aGlzLnR5cGUoKT09ImtleXVwIil7DQprLmNvZGU9dGhpcy5fZXZlbnQua2V5Q29kZTsNCmsuc3RyaW5nPShNb2NoaUtpdC5TaWduYWwuX3NwZWNpYWxLZXlzW2suY29kZV18fCJLRVlfVU5LTk9XTiIpOw0KdGhpcy5fa2V5PWs7DQpyZXR1cm4gazsNCn1lbHNlew0KaWYodGhpcy50eXBlKCk9PSJrZXlwcmVzcyIpew0Kay5jb2RlPTA7DQprLnN0cmluZz0iIjsNCmlmKHR5cGVvZiAodGhpcy5fZXZlbnQuY2hhckNvZGUpIT0idW5kZWZpbmVkIiYmdGhpcy5fZXZlbnQuY2hhckNvZGUhPT0wJiYhTW9jaGlLaXQuU2lnbmFsLl9zcGVjaWFsTWFjS2V5c1t0aGlzLl9ldmVudC5jaGFyQ29kZV0pew0Kay5jb2RlPXRoaXMuX2V2ZW50LmNoYXJDb2RlOw0Kay5zdHJpbmc9U3RyaW5nLmZyb21DaGFyQ29kZShrLmNvZGUpOw0KfWVsc2V7DQppZih0aGlzLl9ldmVudC5rZXlDb2RlJiZ0eXBlb2YgKHRoaXMuX2V2ZW50LmNoYXJDb2RlKT09InVuZGVmaW5lZCIpew0Kay5jb2RlPXRoaXMuX2V2ZW50LmtleUNvZGU7DQprLnN0cmluZz1TdHJpbmcuZnJvbUNoYXJDb2RlKGsuY29kZSk7DQp9DQp9DQp0aGlzLl9rZXk9azsNCnJldHVybiBrOw0KfQ0KfQ0KfQ0KcmV0dXJuIHVuZGVmaW5lZDsNCn0sX21vdXNlOm51bGwsbW91c2U6ZnVuY3Rpb24oKXsNCmlmKHRoaXMuX21vdXNlIT09bnVsbCl7DQpyZXR1cm4gdGhpcy5fbW91c2U7DQp9DQp2YXIgbT17fTsNCnZhciBlPXRoaXMuX2V2ZW50Ow0KaWYodGhpcy50eXBlKCkmJih0aGlzLnR5cGUoKS5pbmRleE9mKCJtb3VzZSIpPT09MHx8dGhpcy50eXBlKCkuaW5kZXhPZigiZHJhZyIpPT09MHx8dGhpcy50eXBlKCkuaW5kZXhPZigiY2xpY2siKSE9LTF8fHRoaXMudHlwZSgpPT0iY29udGV4dG1lbnUiKSl7DQptLmNsaWVudD1uZXcgTW9jaGlLaXQuU3R5bGUuQ29vcmRpbmF0ZXMoMCwwKTsNCmlmKGUuY2xpZW50WHx8ZS5jbGllbnRZKXsNCm0uY2xpZW50Lng9KCFlLmNsaWVudFh8fGUuY2xpZW50WDwwKT8wOmUuY2xpZW50WDsNCm0uY2xpZW50Lnk9KCFlLmNsaWVudFl8fGUuY2xpZW50WTwwKT8wOmUuY2xpZW50WTsNCn0NCm0ucGFnZT1uZXcgTW9jaGlLaXQuU3R5bGUuQ29vcmRpbmF0ZXMoMCwwKTsNCmlmKGUucGFnZVh8fGUucGFnZVkpew0KbS5wYWdlLng9KCFlLnBhZ2VYfHxlLnBhZ2VYPDApPzA6ZS5wYWdlWDsNCm0ucGFnZS55PSghZS5wYWdlWXx8ZS5wYWdlWTwwKT8wOmUucGFnZVk7DQp9ZWxzZXsNCnZhciBkZT1Nb2NoaUtpdC5ET00uX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCnZhciBiPU1vY2hpS2l0LkRPTS5fZG9jdW1lbnQuYm9keTsNCm0ucGFnZS54PWUuY2xpZW50WCsoZGUuc2Nyb2xsTGVmdHx8Yi5zY3JvbGxMZWZ0KS0oZGUuY2xpZW50TGVmdHx8MCk7DQptLnBhZ2UueT1lLmNsaWVudFkrKGRlLnNjcm9sbFRvcHx8Yi5zY3JvbGxUb3ApLShkZS5jbGllbnRUb3B8fDApOw0KfQ0KaWYodGhpcy50eXBlKCkhPSJtb3VzZW1vdmUiJiZ0aGlzLnR5cGUoKSE9Im1vdXNld2hlZWwiKXsNCm0uYnV0dG9uPXt9Ow0KbS5idXR0b24ubGVmdD1mYWxzZTsNCm0uYnV0dG9uLnJpZ2h0PWZhbHNlOw0KbS5idXR0b24ubWlkZGxlPWZhbHNlOw0KaWYoZS53aGljaCl7DQptLmJ1dHRvbi5sZWZ0PShlLndoaWNoPT0xKTsNCm0uYnV0dG9uLm1pZGRsZT0oZS53aGljaD09Mik7DQptLmJ1dHRvbi5yaWdodD0oZS53aGljaD09Myk7DQp9ZWxzZXsNCm0uYnV0dG9uLmxlZnQ9ISEoZS5idXR0b24mMSk7DQptLmJ1dHRvbi5yaWdodD0hIShlLmJ1dHRvbiYyKTsNCm0uYnV0dG9uLm1pZGRsZT0hIShlLmJ1dHRvbiY0KTsNCn0NCn0NCmlmKHRoaXMudHlwZSgpPT0ibW91c2V3aGVlbCIpew0KbS53aGVlbD1uZXcgTW9jaGlLaXQuU3R5bGUuQ29vcmRpbmF0ZXMoMCwwKTsNCmlmKGUud2hlZWxEZWx0YVh8fGUud2hlZWxEZWx0YVkpew0KbS53aGVlbC54PWUud2hlZWxEZWx0YVgvLTQwfHwwOw0KbS53aGVlbC55PWUud2hlZWxEZWx0YVkvLTQwfHwwOw0KfWVsc2V7DQppZihlLndoZWVsRGVsdGEpew0KbS53aGVlbC55PWUud2hlZWxEZWx0YS8tNDA7DQp9ZWxzZXsNCm0ud2hlZWwueT1lLmRldGFpbHx8MDsNCn0NCn0NCn0NCnRoaXMuX21vdXNlPW07DQpyZXR1cm4gbTsNCn0NCnJldHVybiB1bmRlZmluZWQ7DQp9LHN0b3A6ZnVuY3Rpb24oKXsNCnRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7DQp0aGlzLnByZXZlbnREZWZhdWx0KCk7DQp9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpew0KaWYodGhpcy5fZXZlbnQuc3RvcFByb3BhZ2F0aW9uKXsNCnRoaXMuX2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KfWVsc2V7DQp0aGlzLl9ldmVudC5jYW5jZWxCdWJibGU9dHJ1ZTsNCn0NCn0scHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXsNCmlmKHRoaXMuX2V2ZW50LnByZXZlbnREZWZhdWx0KXsNCnRoaXMuX2V2ZW50LnByZXZlbnREZWZhdWx0KCk7DQp9ZWxzZXsNCmlmKHRoaXMuX2NvbmZpcm1VbmxvYWQ9PT1udWxsKXsNCnRoaXMuX2V2ZW50LnJldHVyblZhbHVlPWZhbHNlOw0KfQ0KfQ0KfSxfY29uZmlybVVubG9hZDpudWxsLGNvbmZpcm1VbmxvYWQ6ZnVuY3Rpb24obXNnKXsNCmlmKHRoaXMudHlwZSgpPT0iYmVmb3JldW5sb2FkIil7DQp0aGlzLl9jb25maXJtVW5sb2FkPW1zZzsNCnRoaXMuX2V2ZW50LnJldHVyblZhbHVlPW1zZzsNCn0NCn19KTsNCk1vY2hpS2l0LlNpZ25hbC5fc3BlY2lhbE1hY0tleXM9ezM6IktFWV9FTlRFUiIsNjMyODk6IktFWV9OVU1fUEFEX0NMRUFSIiw2MzI3NjoiS0VZX1BBR0VfVVAiLDYzMjc3OiJLRVlfUEFHRV9ET1dOIiw2MzI3NToiS0VZX0VORCIsNjMyNzM6IktFWV9IT01FIiw2MzIzNDoiS0VZX0FSUk9XX0xFRlQiLDYzMjMyOiJLRVlfQVJST1dfVVAiLDYzMjM1OiJLRVlfQVJST1dfUklHSFQiLDYzMjMzOiJLRVlfQVJST1dfRE9XTiIsNjMzMDI6IktFWV9JTlNFUlQiLDYzMjcyOiJLRVlfREVMRVRFIn07DQooZnVuY3Rpb24oKXsNCnZhciBfNWFmPU1vY2hpS2l0LlNpZ25hbC5fc3BlY2lhbE1hY0tleXM7DQpmb3IodmFyIGk9NjMyMzY7aTw9NjMyNDI7aSsrKXsNCl81YWZbaV09IktFWV9GIisoaS02MzIzNisxKTsNCn0NCn0pKCk7DQpNb2NoaUtpdC5TaWduYWwuX3NwZWNpYWxLZXlzPXs4OiJLRVlfQkFDS1NQQUNFIiw5OiJLRVlfVEFCIiwxMjoiS0VZX05VTV9QQURfQ0xFQVIiLDEzOiJLRVlfRU5URVIiLDE2OiJLRVlfU0hJRlQiLDE3OiJLRVlfQ1RSTCIsMTg6IktFWV9BTFQiLDE5OiJLRVlfUEFVU0UiLDIwOiJLRVlfQ0FQU19MT0NLIiwyNzoiS0VZX0VTQ0FQRSIsMzI6IktFWV9TUEFDRUJBUiIsMzM6IktFWV9QQUdFX1VQIiwzNDoiS0VZX1BBR0VfRE9XTiIsMzU6IktFWV9FTkQiLDM2OiJLRVlfSE9NRSIsMzc6IktFWV9BUlJPV19MRUZUIiwzODoiS0VZX0FSUk9XX1VQIiwzOToiS0VZX0FSUk9XX1JJR0hUIiw0MDoiS0VZX0FSUk9XX0RPV04iLDQ0OiJLRVlfUFJJTlRfU0NSRUVOIiw0NToiS0VZX0lOU0VSVCIsNDY6IktFWV9ERUxFVEUiLDU5OiJLRVlfU0VNSUNPTE9OIiw5MToiS0VZX1dJTkRPV1NfTEVGVCIsOTI6IktFWV9XSU5ET1dTX1JJR0hUIiw5MzoiS0VZX1NFTEVDVCIsMTA2OiJLRVlfTlVNX1BBRF9BU1RFUklTSyIsMTA3OiJLRVlfTlVNX1BBRF9QTFVTX1NJR04iLDEwOToiS0VZX05VTV9QQURfSFlQSEVOLU1JTlVTIiwxMTA6IktFWV9OVU1fUEFEX0ZVTExfU1RPUCIsMTExOiJLRVlfTlVNX1BBRF9TT0xJRFVTIiwxNDQ6IktFWV9OVU1fTE9DSyIsMTQ1OiJLRVlfU0NST0xMX0xPQ0siLDE4NjoiS0VZX1NFTUlDT0xPTiIsMTg3OiJLRVlfRVFVQUxTX1NJR04iLDE4ODoiS0VZX0NPTU1BIiwxODk6IktFWV9IWVBIRU4tTUlOVVMiLDE5MDoiS0VZX0ZVTExfU1RPUCIsMTkxOiJLRVlfU09MSURVUyIsMTkyOiJLRVlfR1JBVkVfQUNDRU5UIiwyMTk6IktFWV9MRUZUX1NRVUFSRV9CUkFDS0VUIiwyMjA6IktFWV9SRVZFUlNFX1NPTElEVVMiLDIyMToiS0VZX1JJR0hUX1NRVUFSRV9CUkFDS0VUIiwyMjI6IktFWV9BUE9TVFJPUEhFIn07DQooZnVuY3Rpb24oKXsNCnZhciBfNWIxPU1vY2hpS2l0LlNpZ25hbC5fc3BlY2lhbEtleXM7DQpmb3IodmFyIGk9NDg7aTw9NTc7aSsrKXsNCl81YjFbaV09IktFWV8iKyhpLTQ4KTsNCn0NCmZvcihpPTY1O2k8PTkwO2krKyl7DQpfNWIxW2ldPSJLRVlfIitTdHJpbmcuZnJvbUNoYXJDb2RlKGkpOw0KfQ0KZm9yKGk9OTY7aTw9MTA1O2krKyl7DQpfNWIxW2ldPSJLRVlfTlVNX1BBRF8iKyhpLTk2KTsNCn0NCmZvcihpPTExMjtpPD0xMjM7aSsrKXsNCl81YjFbaV09IktFWV9GIisoaS0xMTIrMSk7DQp9DQp9KSgpOw0KTW9jaGlLaXQuU2lnbmFsLklkZW50PWZ1bmN0aW9uKF81YjMpew0KdGhpcy5zb3VyY2U9XzViMy5zb3VyY2U7DQp0aGlzLnNpZ25hbD1fNWIzLnNpZ25hbDsNCnRoaXMubGlzdGVuZXI9XzViMy5saXN0ZW5lcjsNCnRoaXMuaXNET009XzViMy5pc0RPTTsNCnRoaXMub2JqT3JGdW5jPV81YjMub2JqT3JGdW5jOw0KdGhpcy5mdW5jT3JTdHI9XzViMy5mdW5jT3JTdHI7DQp0aGlzLmNvbm5lY3RlZD1fNWIzLmNvbm5lY3RlZDsNCn07DQpNb2NoaUtpdC5TaWduYWwuSWRlbnQuX19leHBvcnRfXz1mYWxzZTsNCk1vY2hpS2l0LlNpZ25hbC5JZGVudC5wcm90b3R5cGU9e307DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5TaWduYWwse191bmxvYWRDYWNoZTpmdW5jdGlvbigpew0KdmFyIHNlbGY9TW9jaGlLaXQuU2lnbmFsOw0KdmFyIF81YjU9c2VsZi5fb2JzZXJ2ZXJzOw0KZm9yKHZhciBpPTA7aTxfNWI1Lmxlbmd0aDtpKyspew0KaWYoXzViNVtpXS5zaWduYWwhPT0ib25sb2FkIiYmXzViNVtpXS5zaWduYWwhPT0ib251bmxvYWQiKXsNCnNlbGYuX2Rpc2Nvbm5lY3QoXzViNVtpXSk7DQp9DQp9DQp9LF9saXN0ZW5lcjpmdW5jdGlvbihzcmMsc2lnLGZ1bmMsb2JqLF81YmIpew0KdmFyIHNlbGY9TW9jaGlLaXQuU2lnbmFsOw0KdmFyIEU9c2VsZi5FdmVudDsNCmlmKCFfNWJiKXsNCmlmKHR5cGVvZiAoZnVuYy5pbV9zZWxmKT09InVuZGVmaW5lZCIpew0KcmV0dXJuIE1vY2hpS2l0LkJhc2UuYmluZExhdGUoZnVuYyxvYmopOw0KfWVsc2V7DQpyZXR1cm4gZnVuYzsNCn0NCn0NCm9iaj1vYmp8fHNyYzsNCmlmKHR5cGVvZiAoZnVuYyk9PSJzdHJpbmciKXsNCmlmKHNpZz09PSJvbmxvYWQifHxzaWc9PT0ib251bmxvYWQiKXsNCnJldHVybiBmdW5jdGlvbihfNWJlKXsNCm9ialtmdW5jXS5hcHBseShvYmosW25ldyBFKHNyYyxfNWJlKV0pOw0KdmFyIF81YmY9bmV3IE1vY2hpS2l0LlNpZ25hbC5JZGVudCh7c291cmNlOnNyYyxzaWduYWw6c2lnLG9iak9yRnVuYzpvYmosZnVuY09yU3RyOmZ1bmN9KTsNCk1vY2hpS2l0LlNpZ25hbC5fZGlzY29ubmVjdChfNWJmKTsNCn07DQp9ZWxzZXsNCnJldHVybiBmdW5jdGlvbihfNWMwKXsNCm9ialtmdW5jXS5hcHBseShvYmosW25ldyBFKHNyYyxfNWMwKV0pOw0KfTsNCn0NCn1lbHNlew0KaWYoc2lnPT09Im9ubG9hZCJ8fHNpZz09PSJvbnVubG9hZCIpew0KcmV0dXJuIGZ1bmN0aW9uKF81YzEpew0KZnVuYy5hcHBseShvYmosW25ldyBFKHNyYyxfNWMxKV0pOw0KdmFyIF81YzI9bmV3IE1vY2hpS2l0LlNpZ25hbC5JZGVudCh7c291cmNlOnNyYyxzaWduYWw6c2lnLG9iak9yRnVuYzpmdW5jfSk7DQpNb2NoaUtpdC5TaWduYWwuX2Rpc2Nvbm5lY3QoXzVjMik7DQp9Ow0KfWVsc2V7DQpyZXR1cm4gZnVuY3Rpb24oXzVjMyl7DQpmdW5jLmFwcGx5KG9iaixbbmV3IEUoc3JjLF81YzMpXSk7DQp9Ow0KfQ0KfQ0KfSxfYnJvd3NlckFscmVhZHlIYXNNb3VzZUVudGVyQW5kTGVhdmU6ZnVuY3Rpb24oKXsNCnJldHVybiAvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsNCn0sX2Jyb3dzZXJMYWNrc01vdXNlV2hlZWxFdmVudDpmdW5jdGlvbigpew0KcmV0dXJuIC9HZWNrb1wvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOw0KfSxfbW91c2VFbnRlckxpc3RlbmVyOmZ1bmN0aW9uKHNyYyxzaWcsZnVuYyxvYmopew0KdmFyIEU9TW9jaGlLaXQuU2lnbmFsLkV2ZW50Ow0KcmV0dXJuIGZ1bmN0aW9uKF81Yzkpew0KdmFyIGU9bmV3IEUoc3JjLF81YzkpOw0KdHJ5ew0KZS5yZWxhdGVkVGFyZ2V0KCkubm9kZU5hbWU7DQp9DQpjYXRjaChlcnIpew0KcmV0dXJuOw0KfQ0KZS5zdG9wKCk7DQppZihNb2NoaUtpdC5ET00uaXNDaGlsZE5vZGUoZS5yZWxhdGVkVGFyZ2V0KCksc3JjKSl7DQpyZXR1cm47DQp9DQplLnR5cGU9ZnVuY3Rpb24oKXsNCnJldHVybiBzaWc7DQp9Ow0KaWYodHlwZW9mIChmdW5jKT09InN0cmluZyIpew0KcmV0dXJuIG9ialtmdW5jXS5hcHBseShvYmosW2VdKTsNCn1lbHNlew0KcmV0dXJuIGZ1bmMuYXBwbHkob2JqLFtlXSk7DQp9DQp9Ow0KfSxfZ2V0RGVzdFBhaXI6ZnVuY3Rpb24oXzVjYixfNWNjKXsNCnZhciBvYmo9bnVsbDsNCnZhciBmdW5jPW51bGw7DQppZih0eXBlb2YgKF81Y2MpIT0idW5kZWZpbmVkIil7DQpvYmo9XzVjYjsNCmZ1bmM9XzVjYzsNCmlmKHR5cGVvZiAoXzVjYyk9PSJzdHJpbmciKXsNCmlmKHR5cGVvZiAoXzVjYltfNWNjXSkhPSJmdW5jdGlvbiIpew0KdGhyb3cgbmV3IEVycm9yKCInZnVuY09yU3RyJyBtdXN0IGJlIGEgZnVuY3Rpb24gb24gJ29iak9yRnVuYyciKTsNCn0NCn1lbHNlew0KaWYodHlwZW9mIChfNWNjKSE9ImZ1bmN0aW9uIil7DQp0aHJvdyBuZXcgRXJyb3IoIidmdW5jT3JTdHInIG11c3QgYmUgYSBmdW5jdGlvbiBvciBzdHJpbmciKTsNCn0NCn0NCn1lbHNlew0KaWYodHlwZW9mIChfNWNiKSE9ImZ1bmN0aW9uIil7DQp0aHJvdyBuZXcgRXJyb3IoIidvYmpPckZ1bmMnIG11c3QgYmUgYSBmdW5jdGlvbiBpZiAnZnVuY09yU3RyJyBpcyBub3QgZ2l2ZW4iKTsNCn1lbHNlew0KZnVuYz1fNWNiOw0KfQ0KfQ0KcmV0dXJuIFtvYmosZnVuY107DQp9LGNvbm5lY3Q6ZnVuY3Rpb24oc3JjLHNpZyxfNWQxLF81ZDIpew0KaWYodHlwZW9mIChzcmMpPT0ic3RyaW5nIil7DQpzcmM9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoc3JjKTsNCn0NCnZhciBzZWxmPU1vY2hpS2l0LlNpZ25hbDsNCmlmKHR5cGVvZiAoc2lnKSE9InN0cmluZyIpew0KdGhyb3cgbmV3IEVycm9yKCInc2lnJyBtdXN0IGJlIGEgc3RyaW5nIik7DQp9DQp2YXIgXzVkND1zZWxmLl9nZXREZXN0UGFpcihfNWQxLF81ZDIpOw0KdmFyIG9iaj1fNWQ0WzBdOw0KdmFyIGZ1bmM9XzVkNFsxXTsNCmlmKHR5cGVvZiAob2JqKT09InVuZGVmaW5lZCJ8fG9iaj09PW51bGwpew0Kb2JqPXNyYzsNCn0NCnZhciBfNWQ3PSEhKHNyYy5hZGRFdmVudExpc3RlbmVyfHxzcmMuYXR0YWNoRXZlbnQpOw0KaWYoXzVkNyYmKHNpZz09PSJvbm1vdXNlZW50ZXIifHxzaWc9PT0ib25tb3VzZWxlYXZlIikmJiFzZWxmLl9icm93c2VyQWxyZWFkeUhhc01vdXNlRW50ZXJBbmRMZWF2ZSgpKXsNCnZhciBfNWQ4PXNlbGYuX21vdXNlRW50ZXJMaXN0ZW5lcihzcmMsc2lnLnN1YnN0cigyKSxmdW5jLG9iaik7DQppZihzaWc9PT0ib25tb3VzZWVudGVyIil7DQpzaWc9Im9ubW91c2VvdmVyIjsNCn1lbHNlew0Kc2lnPSJvbm1vdXNlb3V0IjsNCn0NCn1lbHNlew0KaWYoXzVkNyYmc2lnPT0ib25tb3VzZXdoZWVsIiYmc2VsZi5fYnJvd3NlckxhY2tzTW91c2VXaGVlbEV2ZW50KCkpew0KdmFyIF81ZDg9c2VsZi5fbGlzdGVuZXIoc3JjLHNpZyxmdW5jLG9iaixfNWQ3KTsNCnNpZz0ib25ET01Nb3VzZVNjcm9sbCI7DQp9ZWxzZXsNCnZhciBfNWQ4PXNlbGYuX2xpc3RlbmVyKHNyYyxzaWcsZnVuYyxvYmosXzVkNyk7DQp9DQp9DQppZihzcmMuYWRkRXZlbnRMaXN0ZW5lcil7DQpzcmMuYWRkRXZlbnRMaXN0ZW5lcihzaWcuc3Vic3RyKDIpLF81ZDgsZmFsc2UpOw0KfWVsc2V7DQppZihzcmMuYXR0YWNoRXZlbnQpew0Kc3JjLmF0dGFjaEV2ZW50KHNpZyxfNWQ4KTsNCn0NCn0NCnZhciBfNWQ5PW5ldyBNb2NoaUtpdC5TaWduYWwuSWRlbnQoe3NvdXJjZTpzcmMsc2lnbmFsOnNpZyxsaXN0ZW5lcjpfNWQ4LGlzRE9NOl81ZDcsb2JqT3JGdW5jOl81ZDEsZnVuY09yU3RyOl81ZDIsY29ubmVjdGVkOnRydWV9KTsNCnNlbGYuX29ic2VydmVycy5wdXNoKF81ZDkpOw0KaWYoIV81ZDcmJnR5cGVvZiAoc3JjLl9fY29ubmVjdF9fKT09ImZ1bmN0aW9uIil7DQp2YXIgYXJncz1Nb2NoaUtpdC5CYXNlLmV4dGVuZChbXzVkOV0sYXJndW1lbnRzLDEpOw0Kc3JjLl9fY29ubmVjdF9fLmFwcGx5KHNyYyxhcmdzKTsNCn0NCnJldHVybiBfNWQ5Ow0KfSxfZGlzY29ubmVjdDpmdW5jdGlvbihfNWRiKXsNCmlmKCFfNWRiLmNvbm5lY3RlZCl7DQpyZXR1cm47DQp9DQpfNWRiLmNvbm5lY3RlZD1mYWxzZTsNCnZhciBzcmM9XzVkYi5zb3VyY2U7DQp2YXIgc2lnPV81ZGIuc2lnbmFsOw0KdmFyIF81ZGU9XzVkYi5saXN0ZW5lcjsNCmlmKCFfNWRiLmlzRE9NKXsNCmlmKHR5cGVvZiAoc3JjLl9fZGlzY29ubmVjdF9fKT09ImZ1bmN0aW9uIil7DQpzcmMuX19kaXNjb25uZWN0X18oXzVkYixzaWcsXzVkYi5vYmpPckZ1bmMsXzVkYi5mdW5jT3JTdHIpOw0KfQ0KcmV0dXJuOw0KfQ0KaWYoc3JjLnJlbW92ZUV2ZW50TGlzdGVuZXIpew0Kc3JjLnJlbW92ZUV2ZW50TGlzdGVuZXIoc2lnLnN1YnN0cigyKSxfNWRlLGZhbHNlKTsNCn1lbHNlew0KaWYoc3JjLmRldGFjaEV2ZW50KXsNCnNyYy5kZXRhY2hFdmVudChzaWcsXzVkZSk7DQp9ZWxzZXsNCnRocm93IG5ldyBFcnJvcigiJ3NyYycgbXVzdCBiZSBhIERPTSBlbGVtZW50Iik7DQp9DQp9DQp9LGRpc2Nvbm5lY3Q6ZnVuY3Rpb24oXzVkZil7DQp2YXIgc2VsZj1Nb2NoaUtpdC5TaWduYWw7DQp2YXIgXzVlMT1zZWxmLl9vYnNlcnZlcnM7DQp2YXIgbT1Nb2NoaUtpdC5CYXNlOw0KaWYoYXJndW1lbnRzLmxlbmd0aD4xKXsNCnZhciBzcmM9YXJndW1lbnRzWzBdOw0KaWYodHlwZW9mIChzcmMpPT0ic3RyaW5nIil7DQpzcmM9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoc3JjKTsNCn0NCnZhciBzaWc9YXJndW1lbnRzWzFdOw0KdmFyIG9iaj1hcmd1bWVudHNbMl07DQp2YXIgZnVuYz1hcmd1bWVudHNbM107DQpmb3IodmFyIGk9XzVlMS5sZW5ndGgtMTtpPj0wO2ktLSl7DQp2YXIgbz1fNWUxW2ldOw0KaWYoby5zb3VyY2U9PT1zcmMmJm8uc2lnbmFsPT09c2lnJiZvLm9iak9yRnVuYz09PW9iaiYmby5mdW5jT3JTdHI9PT1mdW5jKXsNCnNlbGYuX2Rpc2Nvbm5lY3Qobyk7DQppZihzZWxmLl9sb2NrPT09MCl7DQpfNWUxLnNwbGljZShpLDEpOw0KfWVsc2V7DQpzZWxmLl9kaXJ0eT10cnVlOw0KfQ0KcmV0dXJuIHRydWU7DQp9DQp9DQp9ZWxzZXsNCnZhciBpZHg9bS5maW5kSWRlbnRpY2FsKF81ZTEsXzVkZik7DQppZihpZHg+PTApew0Kc2VsZi5fZGlzY29ubmVjdChfNWRmKTsNCmlmKHNlbGYuX2xvY2s9PT0wKXsNCl81ZTEuc3BsaWNlKGlkeCwxKTsNCn1lbHNlew0Kc2VsZi5fZGlydHk9dHJ1ZTsNCn0NCnJldHVybiB0cnVlOw0KfQ0KfQ0KcmV0dXJuIGZhbHNlOw0KfSxkaXNjb25uZWN0QWxsVG86ZnVuY3Rpb24oXzVlYSxfNWViKXsNCnZhciBzZWxmPU1vY2hpS2l0LlNpZ25hbDsNCnZhciBfNWVkPXNlbGYuX29ic2VydmVyczsNCnZhciBfNWVlPXNlbGYuX2Rpc2Nvbm5lY3Q7DQp2YXIgbG9jaz1zZWxmLl9sb2NrOw0KdmFyIF81ZjA9c2VsZi5fZGlydHk7DQppZih0eXBlb2YgKF81ZWIpPT09InVuZGVmaW5lZCIpew0KXzVlYj1udWxsOw0KfQ0KZm9yKHZhciBpPV81ZWQubGVuZ3RoLTE7aT49MDtpLS0pew0KdmFyIF81ZjI9XzVlZFtpXTsNCmlmKF81ZjIub2JqT3JGdW5jPT09XzVlYSYmKF81ZWI9PT1udWxsfHxfNWYyLmZ1bmNPclN0cj09PV81ZWIpKXsNCl81ZWUoXzVmMik7DQppZihsb2NrPT09MCl7DQpfNWVkLnNwbGljZShpLDEpOw0KfWVsc2V7DQpfNWYwPXRydWU7DQp9DQp9DQp9DQpzZWxmLl9kaXJ0eT1fNWYwOw0KfSxkaXNjb25uZWN0QWxsOmZ1bmN0aW9uKHNyYyxzaWcpew0KaWYodHlwZW9mIChzcmMpPT0ic3RyaW5nIil7DQpzcmM9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoc3JjKTsNCn0NCnZhciBtPU1vY2hpS2l0LkJhc2U7DQp2YXIgXzVmNj1tLmZsYXR0ZW5Bcmd1bWVudHMobS5leHRlbmQobnVsbCxhcmd1bWVudHMsMSkpOw0KdmFyIHNlbGY9TW9jaGlLaXQuU2lnbmFsOw0KdmFyIF81Zjg9c2VsZi5fZGlzY29ubmVjdDsNCnZhciBfNWY5PXNlbGYuX29ic2VydmVyczsNCnZhciBpLF81ZmI7DQp2YXIgbG9jaz1zZWxmLl9sb2NrOw0KdmFyIF81ZmQ9c2VsZi5fZGlydHk7DQppZihfNWY2Lmxlbmd0aD09PTApew0KZm9yKGk9XzVmOS5sZW5ndGgtMTtpPj0wO2ktLSl7DQpfNWZiPV81ZjlbaV07DQppZihfNWZiLnNvdXJjZT09PXNyYyl7DQpfNWY4KF81ZmIpOw0KaWYobG9jaz09PTApew0KXzVmOS5zcGxpY2UoaSwxKTsNCn1lbHNlew0KXzVmZD10cnVlOw0KfQ0KfQ0KfQ0KfWVsc2V7DQp2YXIgc2lncz17fTsNCmZvcihpPTA7aTxfNWY2Lmxlbmd0aDtpKyspew0Kc2lnc1tfNWY2W2ldXT10cnVlOw0KfQ0KZm9yKGk9XzVmOS5sZW5ndGgtMTtpPj0wO2ktLSl7DQpfNWZiPV81ZjlbaV07DQppZihfNWZiLnNvdXJjZT09PXNyYyYmXzVmYi5zaWduYWwgaW4gc2lncyl7DQpfNWY4KF81ZmIpOw0KaWYobG9jaz09PTApew0KXzVmOS5zcGxpY2UoaSwxKTsNCn1lbHNlew0KXzVmZD10cnVlOw0KfQ0KfQ0KfQ0KfQ0Kc2VsZi5fZGlydHk9XzVmZDsNCn0sc2lnbmFsOmZ1bmN0aW9uKHNyYyxzaWcpew0KdmFyIHNlbGY9TW9jaGlLaXQuU2lnbmFsOw0KdmFyIF82MDI9c2VsZi5fb2JzZXJ2ZXJzOw0KaWYodHlwZW9mIChzcmMpPT0ic3RyaW5nIil7DQpzcmM9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoc3JjKTsNCn0NCnZhciBhcmdzPU1vY2hpS2l0LkJhc2UuZXh0ZW5kKG51bGwsYXJndW1lbnRzLDIpOw0KdmFyIF82MDQ9W107DQpzZWxmLl9sb2NrKys7DQpmb3IodmFyIGk9MDtpPF82MDIubGVuZ3RoO2krKyl7DQp2YXIgXzYwNj1fNjAyW2ldOw0KaWYoXzYwNi5zb3VyY2U9PT1zcmMmJl82MDYuc2lnbmFsPT09c2lnJiZfNjA2LmNvbm5lY3RlZCl7DQp0cnl7DQppZihfNjA2LmlzRE9NJiZfNjA2LmZ1bmNPclN0ciE9bnVsbCl7DQp2YXIgb2JqPV82MDYub2JqT3JGdW5jOw0Kb2JqW182MDYuZnVuY09yU3RyXS5hcHBseShvYmosYXJncyk7DQp9ZWxzZXsNCmlmKF82MDYuaXNET00pew0KXzYwNi5vYmpPckZ1bmMuYXBwbHkoc3JjLGFyZ3MpOw0KfWVsc2V7DQpfNjA2Lmxpc3RlbmVyLmFwcGx5KHNyYyxhcmdzKTsNCn0NCn0NCn0NCmNhdGNoKGUpew0KXzYwNC5wdXNoKGUpOw0KfQ0KfQ0KfQ0Kc2VsZi5fbG9jay0tOw0KaWYoc2VsZi5fbG9jaz09PTAmJnNlbGYuX2RpcnR5KXsNCnNlbGYuX2RpcnR5PWZhbHNlOw0KZm9yKHZhciBpPV82MDIubGVuZ3RoLTE7aT49MDtpLS0pew0KaWYoIV82MDJbaV0uY29ubmVjdGVkKXsNCl82MDIuc3BsaWNlKGksMSk7DQp9DQp9DQp9DQppZihfNjA0Lmxlbmd0aD09MSl7DQp0aHJvdyBfNjA0WzBdOw0KfWVsc2V7DQppZihfNjA0Lmxlbmd0aD4xKXsNCnZhciBlPW5ldyBFcnJvcigiTXVsdGlwbGUgZXJyb3JzIHRocm93biBpbiBoYW5kbGluZyAnc2lnJywgc2VlIGVycm9ycyBwcm9wZXJ0eSIpOw0KZS5lcnJvcnM9XzYwNDsNCnRocm93IGU7DQp9DQp9DQp9fSk7DQpNb2NoaUtpdC5TaWduYWwuX19uZXdfXz1mdW5jdGlvbih3aW4pew0KdmFyIG09TW9jaGlLaXQuQmFzZTsNCnRoaXMuX2RvY3VtZW50PWRvY3VtZW50Ow0KdGhpcy5fd2luZG93PXdpbjsNCnRoaXMuX2xvY2s9MDsNCnRoaXMuX2RpcnR5PWZhbHNlOw0KdHJ5ew0KdGhpcy5jb25uZWN0KHdpbmRvdywib251bmxvYWQiLHRoaXMuX3VubG9hZENhY2hlKTsNCn0NCmNhdGNoKGUpew0KfQ0KbS5uYW1lRnVuY3Rpb25zKHRoaXMpOw0KfTsNCk1vY2hpS2l0LlNpZ25hbC5fX25ld19fKHRoaXMpOw0KaWYoTW9jaGlLaXQuX19leHBvcnRfXyl7DQpjb25uZWN0PU1vY2hpS2l0LlNpZ25hbC5jb25uZWN0Ow0KZGlzY29ubmVjdD1Nb2NoaUtpdC5TaWduYWwuZGlzY29ubmVjdDsNCmRpc2Nvbm5lY3RBbGw9TW9jaGlLaXQuU2lnbmFsLmRpc2Nvbm5lY3RBbGw7DQpzaWduYWw9TW9jaGlLaXQuU2lnbmFsLnNpZ25hbDsNCn0NCk1vY2hpS2l0LkJhc2UuX2V4cG9ydFN5bWJvbHModGhpcyxNb2NoaUtpdC5TaWduYWwpOw0KTW9jaGlLaXQuQmFzZS5fbW9kdWxlKCJQb3NpdGlvbiIsIjEuNSIsWyJCYXNlIiwiRE9NIiwiU3R5bGUiXSk7DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5Qb3NpdGlvbix7X19leHBvcnRfXzpmYWxzZSxpbmNsdWRlU2Nyb2xsT2Zmc2V0czpmYWxzZSxwcmVwYXJlOmZ1bmN0aW9uKCl7DQp2YXIgXzYwYj13aW5kb3cucGFnZVhPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fHxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnR8fDA7DQp2YXIgXzYwYz13aW5kb3cucGFnZVlPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wfHwwOw0KdGhpcy53aW5kb3dPZmZzZXQ9bmV3IE1vY2hpS2l0LlN0eWxlLkNvb3JkaW5hdGVzKF82MGIsXzYwYyk7DQp9LGN1bXVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oXzYwZCl7DQp2YXIgXzYwZT0wOw0KdmFyIF82MGY9MDsNCmRvew0KXzYwZSs9XzYwZC5vZmZzZXRUb3B8fDA7DQpfNjBmKz1fNjBkLm9mZnNldExlZnR8fDA7DQpfNjBkPV82MGQub2Zmc2V0UGFyZW50Ow0KfXdoaWxlKF82MGQpOw0KcmV0dXJuIG5ldyBNb2NoaUtpdC5TdHlsZS5Db29yZGluYXRlcyhfNjBmLF82MGUpOw0KfSxyZWFsT2Zmc2V0OmZ1bmN0aW9uKF82MTApew0KdmFyIF82MTE9MDsNCnZhciBfNjEyPTA7DQpkb3sNCl82MTErPV82MTAuc2Nyb2xsVG9wfHwwOw0KXzYxMis9XzYxMC5zY3JvbGxMZWZ0fHwwOw0KXzYxMD1fNjEwLnBhcmVudE5vZGU7DQp9d2hpbGUoXzYxMCk7DQpyZXR1cm4gbmV3IE1vY2hpS2l0LlN0eWxlLkNvb3JkaW5hdGVzKF82MTIsXzYxMSk7DQp9LHdpdGhpbjpmdW5jdGlvbihfNjEzLHgseSl7DQppZih0aGlzLmluY2x1ZGVTY3JvbGxPZmZzZXRzKXsNCnJldHVybiB0aGlzLndpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHMoXzYxMyx4LHkpOw0KfQ0KdGhpcy54Y29tcD14Ow0KdGhpcy55Y29tcD15Ow0KdGhpcy5vZmZzZXQ9dGhpcy5jdW11bGF0aXZlT2Zmc2V0KF82MTMpOw0KaWYoXzYxMy5zdHlsZS5wb3NpdGlvbj09ImZpeGVkIil7DQp0aGlzLm9mZnNldC54Kz10aGlzLndpbmRvd09mZnNldC54Ow0KdGhpcy5vZmZzZXQueSs9dGhpcy53aW5kb3dPZmZzZXQueTsNCn0NCnJldHVybiAoeT49dGhpcy5vZmZzZXQueSYmeTx0aGlzLm9mZnNldC55K182MTMub2Zmc2V0SGVpZ2h0JiZ4Pj10aGlzLm9mZnNldC54JiZ4PHRoaXMub2Zmc2V0LngrXzYxMy5vZmZzZXRXaWR0aCk7DQp9LHdpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHM6ZnVuY3Rpb24oXzYxNix4LHkpew0KdmFyIF82MTk9dGhpcy5yZWFsT2Zmc2V0KF82MTYpOw0KdGhpcy54Y29tcD14K182MTkueC10aGlzLndpbmRvd09mZnNldC54Ow0KdGhpcy55Y29tcD15K182MTkueS10aGlzLndpbmRvd09mZnNldC55Ow0KdGhpcy5vZmZzZXQ9dGhpcy5jdW11bGF0aXZlT2Zmc2V0KF82MTYpOw0KcmV0dXJuICh0aGlzLnljb21wPj10aGlzLm9mZnNldC55JiZ0aGlzLnljb21wPHRoaXMub2Zmc2V0LnkrXzYxNi5vZmZzZXRIZWlnaHQmJnRoaXMueGNvbXA+PXRoaXMub2Zmc2V0LngmJnRoaXMueGNvbXA8dGhpcy5vZmZzZXQueCtfNjE2Lm9mZnNldFdpZHRoKTsNCn0sb3ZlcmxhcDpmdW5jdGlvbihtb2RlLF82MWIpew0KaWYoIW1vZGUpew0KcmV0dXJuIDA7DQp9DQppZihtb2RlPT0idmVydGljYWwiKXsNCnJldHVybiAoKHRoaXMub2Zmc2V0LnkrXzYxYi5vZmZzZXRIZWlnaHQpLXRoaXMueWNvbXApL182MWIub2Zmc2V0SGVpZ2h0Ow0KfQ0KaWYobW9kZT09Imhvcml6b250YWwiKXsNCnJldHVybiAoKHRoaXMub2Zmc2V0LngrXzYxYi5vZmZzZXRXaWR0aCktdGhpcy54Y29tcCkvXzYxYi5vZmZzZXRXaWR0aDsNCn0NCn0sYWJzb2x1dGl6ZTpmdW5jdGlvbihfNjFjKXsNCl82MWM9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoXzYxYyk7DQppZihfNjFjLnN0eWxlLnBvc2l0aW9uPT0iYWJzb2x1dGUiKXsNCnJldHVybjsNCn0NCk1vY2hpS2l0LlBvc2l0aW9uLnByZXBhcmUoKTsNCnZhciBfNjFkPU1vY2hpS2l0LlBvc2l0aW9uLnBvc2l0aW9uZWRPZmZzZXQoXzYxYyk7DQp2YXIgXzYxZT1fNjFjLmNsaWVudFdpZHRoOw0KdmFyIF82MWY9XzYxYy5jbGllbnRIZWlnaHQ7DQp2YXIgXzYyMD17InBvc2l0aW9uIjpfNjFjLnN0eWxlLnBvc2l0aW9uLCJsZWZ0IjpfNjFkLngtcGFyc2VGbG9hdChfNjFjLnN0eWxlLmxlZnR8fDApLCJ0b3AiOl82MWQueS1wYXJzZUZsb2F0KF82MWMuc3R5bGUudG9wfHwwKSwid2lkdGgiOl82MWMuc3R5bGUud2lkdGgsImhlaWdodCI6XzYxYy5zdHlsZS5oZWlnaHR9Ow0KXzYxYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiOw0KXzYxYy5zdHlsZS50b3A9XzYxZC55KyJweCI7DQpfNjFjLnN0eWxlLmxlZnQ9XzYxZC54KyJweCI7DQpfNjFjLnN0eWxlLndpZHRoPV82MWUrInB4IjsNCl82MWMuc3R5bGUuaGVpZ2h0PV82MWYrInB4IjsNCnJldHVybiBfNjIwOw0KfSxwb3NpdGlvbmVkT2Zmc2V0OmZ1bmN0aW9uKF82MjEpew0KdmFyIF82MjI9MCxfNjIzPTA7DQpkb3sNCl82MjIrPV82MjEub2Zmc2V0VG9wfHwwOw0KXzYyMys9XzYyMS5vZmZzZXRMZWZ0fHwwOw0KXzYyMT1fNjIxLm9mZnNldFBhcmVudDsNCmlmKF82MjEpew0KdmFyIHA9TW9jaGlLaXQuU3R5bGUuZ2V0U3R5bGUoXzYyMSwicG9zaXRpb24iKTsNCmlmKHA9PSJyZWxhdGl2ZSJ8fHA9PSJhYnNvbHV0ZSIpew0KYnJlYWs7DQp9DQp9DQp9d2hpbGUoXzYyMSk7DQpyZXR1cm4gbmV3IE1vY2hpS2l0LlN0eWxlLkNvb3JkaW5hdGVzKF82MjMsXzYyMik7DQp9LHJlbGF0aXZpemU6ZnVuY3Rpb24oXzYyNSxfNjI2KXsNCl82MjU9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoXzYyNSk7DQppZihfNjI1LnN0eWxlLnBvc2l0aW9uPT0icmVsYXRpdmUiKXsNCnJldHVybjsNCn0NCk1vY2hpS2l0LlBvc2l0aW9uLnByZXBhcmUoKTsNCnZhciB0b3A9cGFyc2VGbG9hdChfNjI1LnN0eWxlLnRvcHx8MCktKF82MjZbInRvcCJdfHwwKTsNCnZhciBsZWZ0PXBhcnNlRmxvYXQoXzYyNS5zdHlsZS5sZWZ0fHwwKS0oXzYyNlsibGVmdCJdfHwwKTsNCl82MjUuc3R5bGUucG9zaXRpb249XzYyNlsicG9zaXRpb24iXTsNCl82MjUuc3R5bGUudG9wPXRvcCsicHgiOw0KXzYyNS5zdHlsZS5sZWZ0PWxlZnQrInB4IjsNCl82MjUuc3R5bGUud2lkdGg9XzYyNlsid2lkdGgiXTsNCl82MjUuc3R5bGUuaGVpZ2h0PV82MjZbImhlaWdodCJdOw0KfSxjbG9uZTpmdW5jdGlvbihfNjI5LF82MmEpew0KXzYyOT1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChfNjI5KTsNCl82MmE9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoXzYyYSk7DQpfNjJhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7DQp2YXIgXzYyYj10aGlzLmN1bXVsYXRpdmVPZmZzZXQoXzYyOSk7DQpfNjJhLnN0eWxlLnRvcD1fNjJiLnkrInB4IjsNCl82MmEuc3R5bGUubGVmdD1fNjJiLngrInB4IjsNCl82MmEuc3R5bGUud2lkdGg9XzYyOS5vZmZzZXRXaWR0aCsicHgiOw0KXzYyYS5zdHlsZS5oZWlnaHQ9XzYyOS5vZmZzZXRIZWlnaHQrInB4IjsNCn0scGFnZTpmdW5jdGlvbihfNjJjKXsNCnZhciBfNjJkPTA7DQp2YXIgXzYyZT0wOw0KdmFyIF82MmY9XzYyYzsNCmRvew0KXzYyZCs9XzYyZi5vZmZzZXRUb3B8fDA7DQpfNjJlKz1fNjJmLm9mZnNldExlZnR8fDA7DQppZihfNjJmLm9mZnNldFBhcmVudD09ZG9jdW1lbnQuYm9keSYmTW9jaGlLaXQuU3R5bGUuZ2V0U3R5bGUoXzYyZiwicG9zaXRpb24iKT09ImFic29sdXRlIil7DQpicmVhazsNCn0NCn13aGlsZShfNjJmPV82MmYub2Zmc2V0UGFyZW50KTsNCl82MmY9XzYyYzsNCmRvew0KXzYyZC09XzYyZi5zY3JvbGxUb3B8fDA7DQpfNjJlLT1fNjJmLnNjcm9sbExlZnR8fDA7DQp9d2hpbGUoXzYyZj1fNjJmLnBhcmVudE5vZGUpOw0KcmV0dXJuIG5ldyBNb2NoaUtpdC5TdHlsZS5Db29yZGluYXRlcyhfNjJlLF82MmQpOw0KfX0pOw0KTW9jaGlLaXQuUG9zaXRpb24uX19uZXdfXz1mdW5jdGlvbih3aW4pew0KTW9jaGlLaXQuQmFzZS5uYW1lRnVuY3Rpb25zKHRoaXMpOw0KfTsNCk1vY2hpS2l0LlBvc2l0aW9uLl9fbmV3X18odGhpcyk7DQpNb2NoaUtpdC5CYXNlLl9leHBvcnRTeW1ib2xzKHRoaXMsTW9jaGlLaXQuUG9zaXRpb24pOw0KTW9jaGlLaXQuQmFzZS5fbW9kdWxlKCJWaXN1YWwiLCIxLjUiLFsiQmFzZSIsIkRPTSIsIlN0eWxlIiwiQ29sb3IiLCJQb3NpdGlvbiJdKTsNCk1vY2hpS2l0LlZpc3VhbC5fUm91bmRDb3JuZXJzPWZ1bmN0aW9uKGUsXzYzMil7DQplPU1vY2hpS2l0LkRPTS5nZXRFbGVtZW50KGUpOw0KdGhpcy5fc2V0T3B0aW9ucyhfNjMyKTsNCmlmKHRoaXMub3B0aW9ucy5fX3Vuc3RhYmxlX193cmFwRWxlbWVudCl7DQplPXRoaXMuX2RvV3JhcChlKTsNCn0NCnZhciBfNjMzPXRoaXMub3B0aW9ucy5jb2xvcjsNCnZhciBDPU1vY2hpS2l0LkNvbG9yLkNvbG9yOw0KaWYodGhpcy5vcHRpb25zLmNvbG9yPT09ImZyb21FbGVtZW50Iil7DQpfNjMzPUMuZnJvbUJhY2tncm91bmQoZSk7DQp9ZWxzZXsNCmlmKCEoXzYzMyBpbnN0YW5jZW9mIEMpKXsNCl82MzM9Qy5mcm9tU3RyaW5nKF82MzMpOw0KfQ0KfQ0KdGhpcy5pc1RyYW5zcGFyZW50PShfNjMzLmFzUkdCKCkuYTw9MCk7DQp2YXIgXzYzNT10aGlzLm9wdGlvbnMuYmdDb2xvcjsNCmlmKHRoaXMub3B0aW9ucy5iZ0NvbG9yPT09ImZyb21QYXJlbnQiKXsNCl82MzU9Qy5mcm9tQmFja2dyb3VuZChlLm9mZnNldFBhcmVudCk7DQp9ZWxzZXsNCmlmKCEoXzYzNSBpbnN0YW5jZW9mIEMpKXsNCl82MzU9Qy5mcm9tU3RyaW5nKF82MzUpOw0KfQ0KfQ0KdGhpcy5fcm91bmRDb3JuZXJzSW1wbChlLF82MzMsXzYzNSk7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLl9Sb3VuZENvcm5lcnMucHJvdG90eXBlPXtfZG9XcmFwOmZ1bmN0aW9uKGUpew0KdmFyIF82Mzc9ZS5wYXJlbnROb2RlOw0KdmFyIGRvYz1Nb2NoaUtpdC5ET00uY3VycmVudERvY3VtZW50KCk7DQppZih0eXBlb2YgKGRvYy5kZWZhdWx0Vmlldyk9PT0idW5kZWZpbmVkInx8ZG9jLmRlZmF1bHRWaWV3PT09bnVsbCl7DQpyZXR1cm4gZTsNCn0NCnZhciBfNjM5PWRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCk7DQppZih0eXBlb2YgKF82MzkpPT09InVuZGVmaW5lZCJ8fF82Mzk9PT1udWxsKXsNCnJldHVybiBlOw0KfQ0KdmFyIF82M2E9TW9jaGlLaXQuRE9NLkRJVih7InN0eWxlIjp7ZGlzcGxheToiYmxvY2siLG1hcmdpblRvcDpfNjM5LmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctdG9wIiksbWFyZ2luUmlnaHQ6XzYzOS5nZXRQcm9wZXJ0eVZhbHVlKCJwYWRkaW5nLXJpZ2h0IiksbWFyZ2luQm90dG9tOl82MzkuZ2V0UHJvcGVydHlWYWx1ZSgicGFkZGluZy1ib3R0b20iKSxtYXJnaW5MZWZ0Ol82MzkuZ2V0UHJvcGVydHlWYWx1ZSgicGFkZGluZy1sZWZ0IikscGFkZGluZzoiMHB4In19KTsNCl82M2EuaW5uZXJIVE1MPWUuaW5uZXJIVE1MOw0KZS5pbm5lckhUTUw9IiI7DQplLmFwcGVuZENoaWxkKF82M2EpOw0KcmV0dXJuIGU7DQp9LF9yb3VuZENvcm5lcnNJbXBsOmZ1bmN0aW9uKGUsXzYzYyxfNjNkKXsNCmlmKHRoaXMub3B0aW9ucy5ib3JkZXIpew0KdGhpcy5fcmVuZGVyQm9yZGVyKGUsXzYzZCk7DQp9DQppZih0aGlzLl9pc1RvcFJvdW5kZWQoKSl7DQp0aGlzLl9yb3VuZFRvcENvcm5lcnMoZSxfNjNjLF82M2QpOw0KfQ0KaWYodGhpcy5faXNCb3R0b21Sb3VuZGVkKCkpew0KdGhpcy5fcm91bmRCb3R0b21Db3JuZXJzKGUsXzYzYyxfNjNkKTsNCn0NCn0sX3JlbmRlckJvcmRlcjpmdW5jdGlvbihlbCxfNjNmKXsNCnZhciBfNjQwPSIxcHggc29saWQgIit0aGlzLl9ib3JkZXJDb2xvcihfNjNmKTsNCnZhciBfNjQxPSJib3JkZXItbGVmdDogIitfNjQwOw0KdmFyIF82NDI9ImJvcmRlci1yaWdodDogIitfNjQwOw0KdmFyIF82NDM9InN0eWxlPSciK182NDErIjsiK182NDIrIiciOw0KZWwuaW5uZXJIVE1MPSI8ZGl2ICIrXzY0MysiPiIrZWwuaW5uZXJIVE1MKyI8L2Rpdj4iOw0KfSxfcm91bmRUb3BDb3JuZXJzOmZ1bmN0aW9uKGVsLF82NDUsXzY0Nil7DQp2YXIgXzY0Nz10aGlzLl9jcmVhdGVDb3JuZXIoXzY0Nik7DQpmb3IodmFyIGk9MDtpPHRoaXMub3B0aW9ucy5udW1TbGljZXM7aSsrKXsNCl82NDcuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlQ29ybmVyU2xpY2UoXzY0NSxfNjQ2LGksInRvcCIpKTsNCn0NCmVsLnN0eWxlLnBhZGRpbmdUb3A9MDsNCmVsLmluc2VydEJlZm9yZShfNjQ3LGVsLmZpcnN0Q2hpbGQpOw0KfSxfcm91bmRCb3R0b21Db3JuZXJzOmZ1bmN0aW9uKGVsLF82NGEsXzY0Yil7DQp2YXIgXzY0Yz10aGlzLl9jcmVhdGVDb3JuZXIoXzY0Yik7DQpmb3IodmFyIGk9KHRoaXMub3B0aW9ucy5udW1TbGljZXMtMSk7aT49MDtpLS0pew0KXzY0Yy5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVDb3JuZXJTbGljZShfNjRhLF82NGIsaSwiYm90dG9tIikpOw0KfQ0KZWwuc3R5bGUucGFkZGluZ0JvdHRvbT0wOw0KZWwuYXBwZW5kQ2hpbGQoXzY0Yyk7DQp9LF9jcmVhdGVDb3JuZXI6ZnVuY3Rpb24oXzY0ZSl7DQp2YXIgZG9tPU1vY2hpS2l0LkRPTTsNCnJldHVybiBkb20uRElWKHtzdHlsZTp7YmFja2dyb3VuZENvbG9yOl82NGUudG9TdHJpbmcoKX19KTsNCn0sX2NyZWF0ZUNvcm5lclNsaWNlOmZ1bmN0aW9uKF82NTAsXzY1MSxuLF82NTMpew0KdmFyIF82NTQ9TW9jaGlLaXQuRE9NLlNQQU4oKTsNCnZhciBfNjU1PV82NTQuc3R5bGU7DQpfNjU1LmJhY2tncm91bmRDb2xvcj1fNjUwLnRvU3RyaW5nKCk7DQpfNjU1LmRpc3BsYXk9ImJsb2NrIjsNCl82NTUuaGVpZ2h0PSIxcHgiOw0KXzY1NS5vdmVyZmxvdz0iaGlkZGVuIjsNCl82NTUuZm9udFNpemU9IjFweCI7DQp2YXIgXzY1Nj10aGlzLl9ib3JkZXJDb2xvcihfNjUwLF82NTEpOw0KaWYodGhpcy5vcHRpb25zLmJvcmRlciYmbj09PTApew0KXzY1NS5ib3JkZXJUb3BTdHlsZT0ic29saWQiOw0KXzY1NS5ib3JkZXJUb3BXaWR0aD0iMXB4IjsNCl82NTUuYm9yZGVyTGVmdFdpZHRoPSIwcHgiOw0KXzY1NS5ib3JkZXJSaWdodFdpZHRoPSIwcHgiOw0KXzY1NS5ib3JkZXJCb3R0b21XaWR0aD0iMHB4IjsNCl82NTUuaGVpZ2h0PSIwcHgiOw0KXzY1NS5ib3JkZXJDb2xvcj1fNjU2LnRvU3RyaW5nKCk7DQp9ZWxzZXsNCmlmKF82NTYpew0KXzY1NS5ib3JkZXJDb2xvcj1fNjU2LnRvU3RyaW5nKCk7DQpfNjU1LmJvcmRlclN0eWxlPSJzb2xpZCI7DQpfNjU1LmJvcmRlcldpZHRoPSIwcHggMXB4IjsNCn0NCn0NCmlmKCF0aGlzLm9wdGlvbnMuY29tcGFjdCYmKG49PSh0aGlzLm9wdGlvbnMubnVtU2xpY2VzLTEpKSl7DQpfNjU1LmhlaWdodD0iMnB4IjsNCn0NCnRoaXMuX3NldE1hcmdpbihfNjU0LG4sXzY1Myk7DQp0aGlzLl9zZXRCb3JkZXIoXzY1NCxuLF82NTMpOw0KcmV0dXJuIF82NTQ7DQp9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKF82NTcpew0KdGhpcy5vcHRpb25zPXtjb3JuZXJzOiJhbGwiLGNvbG9yOiJmcm9tRWxlbWVudCIsYmdDb2xvcjoiZnJvbVBhcmVudCIsYmxlbmQ6dHJ1ZSxib3JkZXI6ZmFsc2UsY29tcGFjdDpmYWxzZSxfX3Vuc3RhYmxlX193cmFwRWxlbWVudDpmYWxzZX07DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZSh0aGlzLm9wdGlvbnMsXzY1Nyk7DQp0aGlzLm9wdGlvbnMubnVtU2xpY2VzPSh0aGlzLm9wdGlvbnMuY29tcGFjdD8yOjQpOw0KfSxfd2hpY2hTaWRlVG9wOmZ1bmN0aW9uKCl7DQp2YXIgXzY1OD10aGlzLm9wdGlvbnMuY29ybmVyczsNCmlmKHRoaXMuX2hhc1N0cmluZyhfNjU4LCJhbGwiLCJ0b3AiKSl7DQpyZXR1cm4gIiI7DQp9DQp2YXIgXzY1OT0oXzY1OC5pbmRleE9mKCJ0bCIpIT0tMSk7DQp2YXIgXzY1YT0oXzY1OC5pbmRleE9mKCJ0ciIpIT0tMSk7DQppZihfNjU5JiZfNjVhKXsNCnJldHVybiAiIjsNCn0NCmlmKF82NTkpew0KcmV0dXJuICJsZWZ0IjsNCn0NCmlmKF82NWEpew0KcmV0dXJuICJyaWdodCI7DQp9DQpyZXR1cm4gIiI7DQp9LF93aGljaFNpZGVCb3R0b206ZnVuY3Rpb24oKXsNCnZhciBfNjViPXRoaXMub3B0aW9ucy5jb3JuZXJzOw0KaWYodGhpcy5faGFzU3RyaW5nKF82NWIsImFsbCIsImJvdHRvbSIpKXsNCnJldHVybiAiIjsNCn0NCnZhciBfNjVjPShfNjViLmluZGV4T2YoImJsIikhPS0xKTsNCnZhciBfNjVkPShfNjViLmluZGV4T2YoImJyIikhPS0xKTsNCmlmKF82NWMmJl82NWQpew0KcmV0dXJuICIiOw0KfQ0KaWYoXzY1Yyl7DQpyZXR1cm4gImxlZnQiOw0KfQ0KaWYoXzY1ZCl7DQpyZXR1cm4gInJpZ2h0IjsNCn0NCnJldHVybiAiIjsNCn0sX2JvcmRlckNvbG9yOmZ1bmN0aW9uKF82NWUsXzY1Zil7DQppZihfNjVlPT0idHJhbnNwYXJlbnQiKXsNCnJldHVybiBfNjVmOw0KfWVsc2V7DQppZih0aGlzLm9wdGlvbnMuYm9yZGVyKXsNCnJldHVybiB0aGlzLm9wdGlvbnMuYm9yZGVyOw0KfWVsc2V7DQppZih0aGlzLm9wdGlvbnMuYmxlbmQpew0KcmV0dXJuIF82NWYuYmxlbmRlZENvbG9yKF82NWUpOw0KfQ0KfQ0KfQ0KcmV0dXJuICIiOw0KfSxfc2V0TWFyZ2luOmZ1bmN0aW9uKGVsLG4sXzY2Mil7DQp2YXIgXzY2Mz10aGlzLl9tYXJnaW5TaXplKG4pKyJweCI7DQp2YXIgXzY2ND0oXzY2Mj09InRvcCI/dGhpcy5fd2hpY2hTaWRlVG9wKCk6dGhpcy5fd2hpY2hTaWRlQm90dG9tKCkpOw0KdmFyIF82NjU9ZWwuc3R5bGU7DQppZihfNjY0PT0ibGVmdCIpew0KXzY2NS5tYXJnaW5MZWZ0PV82NjM7DQpfNjY1Lm1hcmdpblJpZ2h0PSIwcHgiOw0KfWVsc2V7DQppZihfNjY0PT0icmlnaHQiKXsNCl82NjUubWFyZ2luUmlnaHQ9XzY2MzsNCl82NjUubWFyZ2luTGVmdD0iMHB4IjsNCn1lbHNlew0KXzY2NS5tYXJnaW5MZWZ0PV82NjM7DQpfNjY1Lm1hcmdpblJpZ2h0PV82NjM7DQp9DQp9DQp9LF9zZXRCb3JkZXI6ZnVuY3Rpb24oZWwsbixfNjY4KXsNCnZhciBfNjY5PXRoaXMuX2JvcmRlclNpemUobikrInB4IjsNCnZhciBfNjZhPShfNjY4PT0idG9wIj90aGlzLl93aGljaFNpZGVUb3AoKTp0aGlzLl93aGljaFNpZGVCb3R0b20oKSk7DQp2YXIgXzY2Yj1lbC5zdHlsZTsNCmlmKF82NmE9PSJsZWZ0Iil7DQpfNjZiLmJvcmRlckxlZnRXaWR0aD1fNjY5Ow0KXzY2Yi5ib3JkZXJSaWdodFdpZHRoPSIwcHgiOw0KfWVsc2V7DQppZihfNjZhPT0icmlnaHQiKXsNCl82NmIuYm9yZGVyUmlnaHRXaWR0aD1fNjY5Ow0KXzY2Yi5ib3JkZXJMZWZ0V2lkdGg9IjBweCI7DQp9ZWxzZXsNCl82NmIuYm9yZGVyTGVmdFdpZHRoPV82Njk7DQpfNjZiLmJvcmRlclJpZ2h0V2lkdGg9XzY2OTsNCn0NCn0NCn0sX21hcmdpblNpemU6ZnVuY3Rpb24obil7DQppZih0aGlzLmlzVHJhbnNwYXJlbnQpew0KcmV0dXJuIDA7DQp9DQp2YXIgbz10aGlzLm9wdGlvbnM7DQppZihvLmNvbXBhY3QmJm8uYmxlbmQpew0KdmFyIF82NmU9WzEsMF07DQpyZXR1cm4gXzY2ZVtuXTsNCn1lbHNlew0KaWYoby5jb21wYWN0KXsNCnZhciBfNjZmPVsyLDFdOw0KcmV0dXJuIF82NmZbbl07DQp9ZWxzZXsNCmlmKG8uYmxlbmQpew0KdmFyIF82NzA9WzMsMiwxLDBdOw0KcmV0dXJuIF82NzBbbl07DQp9ZWxzZXsNCnZhciBfNjcxPVs1LDMsMiwxXTsNCnJldHVybiBfNjcxW25dOw0KfQ0KfQ0KfQ0KfSxfYm9yZGVyU2l6ZTpmdW5jdGlvbihuKXsNCnZhciBvPXRoaXMub3B0aW9uczsNCnZhciBfNjc0Ow0KaWYoby5jb21wYWN0JiYoby5ibGVuZHx8dGhpcy5pc1RyYW5zcGFyZW50KSl7DQpyZXR1cm4gMTsNCn1lbHNlew0KaWYoby5jb21wYWN0KXsNCl82NzQ9WzEsMF07DQp9ZWxzZXsNCmlmKG8uYmxlbmQpew0KXzY3ND1bMiwxLDEsMV07DQp9ZWxzZXsNCmlmKG8uYm9yZGVyKXsNCl82NzQ9WzAsMiwwLDBdOw0KfWVsc2V7DQppZih0aGlzLmlzVHJhbnNwYXJlbnQpew0KXzY3ND1bNSwzLDIsMV07DQp9ZWxzZXsNCnJldHVybiAwOw0KfQ0KfQ0KfQ0KfQ0KfQ0KcmV0dXJuIF82NzRbbl07DQp9LF9oYXNTdHJpbmc6ZnVuY3Rpb24oc3RyKXsNCmZvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspew0KaWYoc3RyLmluZGV4T2YoYXJndW1lbnRzW2ldKSE9LTEpew0KcmV0dXJuIHRydWU7DQp9DQp9DQpyZXR1cm4gZmFsc2U7DQp9LF9pc1RvcFJvdW5kZWQ6ZnVuY3Rpb24oKXsNCnJldHVybiB0aGlzLl9oYXNTdHJpbmcodGhpcy5vcHRpb25zLmNvcm5lcnMsImFsbCIsInRvcCIsInRsIiwidHIiKTsNCn0sX2lzQm90dG9tUm91bmRlZDpmdW5jdGlvbigpew0KcmV0dXJuIHRoaXMuX2hhc1N0cmluZyh0aGlzLm9wdGlvbnMuY29ybmVycywiYWxsIiwiYm90dG9tIiwiYmwiLCJiciIpOw0KfSxfaGFzU2luZ2xlVGV4dENoaWxkOmZ1bmN0aW9uKGVsKXsNCnJldHVybiAoZWwuY2hpbGROb2Rlcy5sZW5ndGg9PTEmJmVsLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGU9PTMpOw0KfX07DQpNb2NoaUtpdC5WaXN1YWwucm91bmRFbGVtZW50PWZ1bmN0aW9uKGUsXzY3OSl7DQpuZXcgTW9jaGlLaXQuVmlzdWFsLl9Sb3VuZENvcm5lcnMoZSxfNjc5KTsNCn07DQpNb2NoaUtpdC5WaXN1YWwucm91bmRDbGFzcz1mdW5jdGlvbihfNjdhLF82N2IsXzY3Yyl7DQp2YXIgXzY3ZD1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudHNCeVRhZ0FuZENsYXNzTmFtZShfNjdhLF82N2IpOw0KZm9yKHZhciBpPTA7aTxfNjdkLmxlbmd0aDtpKyspew0KTW9jaGlLaXQuVmlzdWFsLnJvdW5kRWxlbWVudChfNjdkW2ldLF82N2MpOw0KfQ0KfTsNCk1vY2hpS2l0LlZpc3VhbC50YWdpZnlUZXh0PWZ1bmN0aW9uKF82N2YsXzY4MCl7DQpfNjgwPV82ODB8fCJwb3NpdGlvbjpyZWxhdGl2ZSI7DQppZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7DQpfNjgwKz0iO3pvb206MSI7DQp9DQpfNjdmPU1vY2hpS2l0LkRPTS5nZXRFbGVtZW50KF82N2YpOw0KdmFyIG1hPU1vY2hpS2l0LkJhc2UubWFwOw0KbWEoZnVuY3Rpb24oXzY4Mil7DQppZihfNjgyLm5vZGVUeXBlPT0zKXsNCm1hKGZ1bmN0aW9uKF82ODMpew0KXzY3Zi5pbnNlcnRCZWZvcmUoTW9jaGlLaXQuRE9NLlNQQU4oe3N0eWxlOl82ODB9LF82ODM9PSIgIj9TdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk6XzY4MyksXzY4Mik7DQp9LF82ODIubm9kZVZhbHVlLnNwbGl0KCIiKSk7DQpNb2NoaUtpdC5ET00ucmVtb3ZlRWxlbWVudChfNjgyKTsNCn0NCn0sXzY3Zi5jaGlsZE5vZGVzKTsNCn07DQpNb2NoaUtpdC5WaXN1YWwuX2ZvcmNlUmVyZW5kZXJpbmc9ZnVuY3Rpb24oXzY4NCl7DQp0cnl7DQpfNjg0PU1vY2hpS2l0LkRPTS5nZXRFbGVtZW50KF82ODQpOw0KdmFyIG49ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKTsNCl82ODQuYXBwZW5kQ2hpbGQobik7DQpfNjg0LnJlbW92ZUNoaWxkKG4pOw0KfQ0KY2F0Y2goZSl7DQp9DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLm11bHRpcGxlPWZ1bmN0aW9uKF82ODYsXzY4NyxfNjg4KXsNCl82ODg9TW9jaGlLaXQuQmFzZS51cGRhdGUoe3NwZWVkOjAuMSxkZWxheTowfSxfNjg4KTsNCnZhciBfNjg5PV82ODguZGVsYXk7DQp2YXIgXzY4YT0wOw0KTW9jaGlLaXQuQmFzZS5tYXAoZnVuY3Rpb24oXzY4Yil7DQpfNjg4LmRlbGF5PV82OGEqXzY4OC5zcGVlZCtfNjg5Ow0KbmV3IF82ODcoXzY4YixfNjg4KTsNCl82OGErPTE7DQp9LF82ODYpOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5QQUlSUz17InNsaWRlIjpbInNsaWRlRG93biIsInNsaWRlVXAiXSwiYmxpbmQiOlsiYmxpbmREb3duIiwiYmxpbmRVcCJdLCJhcHBlYXIiOlsiYXBwZWFyIiwiZmFkZSJdLCJzaXplIjpbImdyb3ciLCJzaHJpbmsiXX07DQpNb2NoaUtpdC5WaXN1YWwudG9nZ2xlPWZ1bmN0aW9uKF82OGMsXzY4ZCxfNjhlKXsNCl82OGM9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoXzY4Yyk7DQpfNjhkPShfNjhkfHwiYXBwZWFyIikudG9Mb3dlckNhc2UoKTsNCl82OGU9TW9jaGlLaXQuQmFzZS51cGRhdGUoe3F1ZXVlOntwb3NpdGlvbjoiZW5kIixzY29wZTooXzY4Yy5pZHx8Imdsb2JhbCIpLGxpbWl0OjF9fSxfNjhlKTsNCnZhciB2PU1vY2hpS2l0LlZpc3VhbDsNCnZbTW9jaGlLaXQuU3R5bGUuZ2V0U3R5bGUoXzY4YywiZGlzcGxheSIpIT0ibm9uZSI/di5QQUlSU1tfNjhkXVsxXTp2LlBBSVJTW182OGRdWzBdXShfNjhjLF82OGUpOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5UcmFuc2l0aW9ucz17X19leHBvcnRfXzpmYWxzZX07DQpNb2NoaUtpdC5WaXN1YWwuVHJhbnNpdGlvbnMubGluZWFyPWZ1bmN0aW9uKHBvcyl7DQpyZXR1cm4gcG9zOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5UcmFuc2l0aW9ucy5zaW5vaWRhbD1mdW5jdGlvbihwb3Mpew0KcmV0dXJuIDAuNS1NYXRoLmNvcyhwb3MqTWF0aC5QSSkvMjsNCn07DQpNb2NoaUtpdC5WaXN1YWwuVHJhbnNpdGlvbnMucmV2ZXJzZT1mdW5jdGlvbihwb3Mpew0KcmV0dXJuIDEtcG9zOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5UcmFuc2l0aW9ucy5mbGlja2VyPWZ1bmN0aW9uKHBvcyl7DQpyZXR1cm4gMC4yNS1NYXRoLmNvcyhwb3MqTWF0aC5QSSkvNCtNYXRoLnJhbmRvbSgpLzI7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLlRyYW5zaXRpb25zLndvYmJsZT1mdW5jdGlvbihwb3Mpew0KcmV0dXJuIDAuNS1NYXRoLmNvcyg5KnBvcypNYXRoLlBJKS8yOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5UcmFuc2l0aW9ucy5wdWxzZT1mdW5jdGlvbihwb3MsXzY5Nil7DQppZihfNjk2KXsNCnBvcyo9MipfNjk2Ow0KfWVsc2V7DQpwb3MqPTEwOw0KfQ0KdmFyIF82OTc9cG9zLU1hdGguZmxvb3IocG9zKTsNCnJldHVybiAoTWF0aC5mbG9vcihwb3MpJTI9PTApP182OTc6MS1fNjk3Ow0KfTsNCk1vY2hpS2l0LlZpc3VhbC5UcmFuc2l0aW9ucy5wYXJhYm9saWM9ZnVuY3Rpb24ocG9zKXsNCnJldHVybiBwb3MqcG9zOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5UcmFuc2l0aW9ucy5zcHJpbmc9ZnVuY3Rpb24ocG9zKXsNCnJldHVybiAxLShNYXRoLmNvcyhwb3MqMi41Kk1hdGguUEkpKk1hdGguZXhwKC1wb3MqNikpOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5UcmFuc2l0aW9ucy5ub25lPWZ1bmN0aW9uKHBvcyl7DQpyZXR1cm4gMDsNCn07DQpNb2NoaUtpdC5WaXN1YWwuVHJhbnNpdGlvbnMuZnVsbD1mdW5jdGlvbihwb3Mpew0KcmV0dXJuIDE7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLlNjb3BlZFF1ZXVlPWZ1bmN0aW9uKCl7DQp2YXIgY2xzPWFyZ3VtZW50cy5jYWxsZWU7DQppZighKHRoaXMgaW5zdGFuY2VvZiBjbHMpKXsNCnJldHVybiBuZXcgY2xzKCk7DQp9DQp0aGlzLl9faW5pdF9fKCk7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLlNjb3BlZFF1ZXVlLl9fZXhwb3J0X189ZmFsc2U7DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5WaXN1YWwuU2NvcGVkUXVldWUucHJvdG90eXBlLHtfX2luaXRfXzpmdW5jdGlvbigpew0KdGhpcy5lZmZlY3RzPVtdOw0KdGhpcy5pbnRlcnZhbD1udWxsOw0KfSxhZGQ6ZnVuY3Rpb24oXzY5ZCl7DQp2YXIgXzY5ZT1uZXcgRGF0ZSgpLmdldFRpbWUoKTsNCnZhciBfNjlmPSh0eXBlb2YgKF82OWQub3B0aW9ucy5xdWV1ZSk9PSJzdHJpbmciKT9fNjlkLm9wdGlvbnMucXVldWU6XzY5ZC5vcHRpb25zLnF1ZXVlLnBvc2l0aW9uOw0KdmFyIG1hPU1vY2hpS2l0LkJhc2UubWFwOw0Kc3dpdGNoKF82OWYpew0KY2FzZSAiZnJvbnQiOg0KbWEoZnVuY3Rpb24oZSl7DQppZihlLnN0YXRlPT0iaWRsZSIpew0KZS5zdGFydE9uKz1fNjlkLmZpbmlzaE9uOw0KZS5maW5pc2hPbis9XzY5ZC5maW5pc2hPbjsNCn0NCn0sdGhpcy5lZmZlY3RzKTsNCmJyZWFrOw0KY2FzZSAiZW5kIjoNCnZhciBfNmEyOw0KbWEoZnVuY3Rpb24oZSl7DQp2YXIgaT1lLmZpbmlzaE9uOw0KaWYoaT49KF82YTJ8fGkpKXsNCl82YTI9aTsNCn0NCn0sdGhpcy5lZmZlY3RzKTsNCl82OWU9XzZhMnx8XzY5ZTsNCmJyZWFrOw0KY2FzZSAiYnJlYWsiOg0KbWEoZnVuY3Rpb24oZSl7DQplLmZpbmFsaXplKCk7DQp9LHRoaXMuZWZmZWN0cyk7DQpicmVhazsNCmNhc2UgInJlcGxhY2UiOg0KbWEoZnVuY3Rpb24oZSl7DQplLmNhbmNlbCgpOw0KfSx0aGlzLmVmZmVjdHMpOw0KYnJlYWs7DQp9DQpfNjlkLnN0YXJ0T24rPV82OWU7DQpfNjlkLmZpbmlzaE9uKz1fNjllOw0KaWYoIV82OWQub3B0aW9ucy5xdWV1ZS5saW1pdHx8dGhpcy5lZmZlY3RzLmxlbmd0aDxfNjlkLm9wdGlvbnMucXVldWUubGltaXQpew0KdGhpcy5lZmZlY3RzLnB1c2goXzY5ZCk7DQp9DQppZighdGhpcy5pbnRlcnZhbCl7DQp0aGlzLmludGVydmFsPXRoaXMuc3RhcnRMb29wKE1vY2hpS2l0LkJhc2UuYmluZCh0aGlzLmxvb3AsdGhpcyksNDApOw0KfQ0KfSxzdGFydExvb3A6ZnVuY3Rpb24oZnVuYyxfNmE4KXsNCnJldHVybiBzZXRJbnRlcnZhbChmdW5jLF82YTgpOw0KfSxyZW1vdmU6ZnVuY3Rpb24oXzZhOSl7DQp0aGlzLmVmZmVjdHM9TW9jaGlLaXQuQmFzZS5maWx0ZXIoZnVuY3Rpb24oZSl7DQpyZXR1cm4gZSE9XzZhOTsNCn0sdGhpcy5lZmZlY3RzKTsNCmlmKCF0aGlzLmVmZmVjdHMubGVuZ3RoKXsNCnRoaXMuc3RvcExvb3AodGhpcy5pbnRlcnZhbCk7DQp0aGlzLmludGVydmFsPW51bGw7DQp9DQp9LHN0b3BMb29wOmZ1bmN0aW9uKF82YWIpew0KY2xlYXJJbnRlcnZhbChfNmFiKTsNCn0sbG9vcDpmdW5jdGlvbigpew0KdmFyIF82YWM9bmV3IERhdGUoKS5nZXRUaW1lKCk7DQpNb2NoaUtpdC5CYXNlLm1hcChmdW5jdGlvbihfNmFkKXsNCl82YWQubG9vcChfNmFjKTsNCn0sdGhpcy5lZmZlY3RzKTsNCn19KTsNCk1vY2hpS2l0LlZpc3VhbC5RdWV1ZXM9e19fZXhwb3J0X186ZmFsc2UsaW5zdGFuY2VzOnt9LGdldDpmdW5jdGlvbihfNmFlKXsNCmlmKHR5cGVvZiAoXzZhZSkhPSJzdHJpbmciKXsNCnJldHVybiBfNmFlOw0KfQ0KaWYoIXRoaXMuaW5zdGFuY2VzW182YWVdKXsNCnRoaXMuaW5zdGFuY2VzW182YWVdPW5ldyBNb2NoaUtpdC5WaXN1YWwuU2NvcGVkUXVldWUoKTsNCn0NCnJldHVybiB0aGlzLmluc3RhbmNlc1tfNmFlXTsNCn19Ow0KTW9jaGlLaXQuVmlzdWFsLlF1ZXVlPU1vY2hpS2l0LlZpc3VhbC5RdWV1ZXMuZ2V0KCJnbG9iYWwiKTsNCk1vY2hpS2l0LlZpc3VhbC5RdWV1ZS5fX2V4cG9ydF9fPWZhbHNlOw0KTW9jaGlLaXQuVmlzdWFsLkRlZmF1bHRPcHRpb25zPXtfX2V4cG9ydF9fOmZhbHNlLHRyYW5zaXRpb246TW9jaGlLaXQuVmlzdWFsLlRyYW5zaXRpb25zLnNpbm9pZGFsLGR1cmF0aW9uOjEsZnBzOjI1LHN5bmM6ZmFsc2UsZnJvbTowLHRvOjEsZGVsYXk6MCxxdWV1ZToicGFyYWxsZWwifTsNCk1vY2hpS2l0LlZpc3VhbC5CYXNlPWZ1bmN0aW9uKCl7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLkJhc2UucHJvdG90eXBlPXtfX2NsYXNzX186TW9jaGlLaXQuVmlzdWFsLkJhc2Usc3RhcnQ6ZnVuY3Rpb24oXzZhZil7DQp2YXIgdj1Nb2NoaUtpdC5WaXN1YWw7DQp0aGlzLm9wdGlvbnM9TW9jaGlLaXQuQmFzZS5zZXRkZWZhdWx0KF82YWYsdi5EZWZhdWx0T3B0aW9ucyk7DQp0aGlzLmN1cnJlbnRGcmFtZT0wOw0KdGhpcy5zdGF0ZT0iaWRsZSI7DQp0aGlzLnN0YXJ0T249dGhpcy5vcHRpb25zLmRlbGF5KjEwMDA7DQp0aGlzLmZpbmlzaE9uPXRoaXMuc3RhcnRPbisodGhpcy5vcHRpb25zLmR1cmF0aW9uKjEwMDApOw0KdGhpcy5ldmVudCgiYmVmb3JlU3RhcnQiKTsNCmlmKCF0aGlzLm9wdGlvbnMuc3luYyl7DQp2LlF1ZXVlcy5nZXQodHlwZW9mICh0aGlzLm9wdGlvbnMucXVldWUpPT0ic3RyaW5nIj8iZ2xvYmFsIjp0aGlzLm9wdGlvbnMucXVldWUuc2NvcGUpLmFkZCh0aGlzKTsNCn0NCn0sbG9vcDpmdW5jdGlvbihfNmIxKXsNCmlmKF82YjE+PXRoaXMuc3RhcnRPbil7DQppZihfNmIxPj10aGlzLmZpbmlzaE9uKXsNCnJldHVybiB0aGlzLmZpbmFsaXplKCk7DQp9DQp2YXIgcG9zPShfNmIxLXRoaXMuc3RhcnRPbikvKHRoaXMuZmluaXNoT24tdGhpcy5zdGFydE9uKTsNCnZhciBfNmIzPU1hdGgucm91bmQocG9zKnRoaXMub3B0aW9ucy5mcHMqdGhpcy5vcHRpb25zLmR1cmF0aW9uKTsNCmlmKF82YjM+dGhpcy5jdXJyZW50RnJhbWUpew0KdGhpcy5yZW5kZXIocG9zKTsNCnRoaXMuY3VycmVudEZyYW1lPV82YjM7DQp9DQp9DQp9LHJlbmRlcjpmdW5jdGlvbihwb3Mpew0KaWYodGhpcy5zdGF0ZT09ImlkbGUiKXsNCnRoaXMuc3RhdGU9InJ1bm5pbmciOw0KdGhpcy5ldmVudCgiYmVmb3JlU2V0dXAiKTsNCnRoaXMuc2V0dXAoKTsNCnRoaXMuZXZlbnQoImFmdGVyU2V0dXAiKTsNCn0NCmlmKHRoaXMuc3RhdGU9PSJydW5uaW5nIil7DQp2YXIgXzZiNT10aGlzLm9wdGlvbnMudHJhbnNpdGlvbjsNCmlmKHR5cGVvZiAoXzZiNSk9PSJzdHJpbmciKXsNCl82YjU9TW9jaGlLaXQuVmlzdWFsLlRyYW5zaXRpb25zW182YjVdOw0KfQ0KaWYodHlwZW9mIChfNmI1KT09ImZ1bmN0aW9uIil7DQpwb3M9XzZiNShwb3MpOw0KfQ0KcG9zKj0odGhpcy5vcHRpb25zLnRvLXRoaXMub3B0aW9ucy5mcm9tKTsNCnBvcys9dGhpcy5vcHRpb25zLmZyb207DQp0aGlzLmV2ZW50KCJiZWZvcmVVcGRhdGUiKTsNCnRoaXMudXBkYXRlKHBvcyk7DQp0aGlzLmV2ZW50KCJhZnRlclVwZGF0ZSIpOw0KfQ0KfSxjYW5jZWw6ZnVuY3Rpb24oKXsNCmlmKCF0aGlzLm9wdGlvbnMuc3luYyl7DQpNb2NoaUtpdC5WaXN1YWwuUXVldWVzLmdldCh0eXBlb2YgKHRoaXMub3B0aW9ucy5xdWV1ZSk9PSJzdHJpbmciPyJnbG9iYWwiOnRoaXMub3B0aW9ucy5xdWV1ZS5zY29wZSkucmVtb3ZlKHRoaXMpOw0KfQ0KdGhpcy5zdGF0ZT0iZmluaXNoZWQiOw0KfSxmaW5hbGl6ZTpmdW5jdGlvbigpew0KdGhpcy5yZW5kZXIoMSk7DQp0aGlzLmNhbmNlbCgpOw0KdGhpcy5ldmVudCgiYmVmb3JlRmluaXNoIik7DQp0aGlzLmZpbmlzaCgpOw0KdGhpcy5ldmVudCgiYWZ0ZXJGaW5pc2giKTsNCn0sc2V0dXA6ZnVuY3Rpb24oKXsNCn0sZmluaXNoOmZ1bmN0aW9uKCl7DQp9LHVwZGF0ZTpmdW5jdGlvbihfNmI2KXsNCn0sZXZlbnQ6ZnVuY3Rpb24oXzZiNyl7DQppZih0aGlzLm9wdGlvbnNbXzZiNysiSW50ZXJuYWwiXSl7DQp0aGlzLm9wdGlvbnNbXzZiNysiSW50ZXJuYWwiXSh0aGlzKTsNCn0NCmlmKHRoaXMub3B0aW9uc1tfNmI3XSl7DQp0aGlzLm9wdGlvbnNbXzZiN10odGhpcyk7DQp9DQp9LHJlcHI6ZnVuY3Rpb24oKXsNCnJldHVybiAiWyIrdGhpcy5fX2NsYXNzX18uTkFNRSsiLCBvcHRpb25zOiIrTW9jaGlLaXQuQmFzZS5yZXByKHRoaXMub3B0aW9ucykrIl0iOw0KfX07DQpNb2NoaUtpdC5WaXN1YWwuUGFyYWxsZWw9ZnVuY3Rpb24oXzZiOCxfNmI5KXsNCnZhciBjbHM9YXJndW1lbnRzLmNhbGxlZTsNCmlmKCEodGhpcyBpbnN0YW5jZW9mIGNscykpew0KcmV0dXJuIG5ldyBjbHMoXzZiOCxfNmI5KTsNCn0NCnRoaXMuX19pbml0X18oXzZiOCxfNmI5KTsNCn07DQpNb2NoaUtpdC5WaXN1YWwuUGFyYWxsZWwucHJvdG90eXBlPW5ldyBNb2NoaUtpdC5WaXN1YWwuQmFzZSgpOw0KTW9jaGlLaXQuQmFzZS51cGRhdGUoTW9jaGlLaXQuVmlzdWFsLlBhcmFsbGVsLnByb3RvdHlwZSx7X19jbGFzc19fOk1vY2hpS2l0LlZpc3VhbC5QYXJhbGxlbCxfX2luaXRfXzpmdW5jdGlvbihfNmJiLF82YmMpew0KdGhpcy5lZmZlY3RzPV82YmJ8fFtdOw0KdGhpcy5zdGFydChfNmJjKTsNCn0sdXBkYXRlOmZ1bmN0aW9uKF82YmQpew0KTW9jaGlLaXQuQmFzZS5tYXAoZnVuY3Rpb24oXzZiZSl7DQpfNmJlLnJlbmRlcihfNmJkKTsNCn0sdGhpcy5lZmZlY3RzKTsNCn0sZmluaXNoOmZ1bmN0aW9uKCl7DQpNb2NoaUtpdC5CYXNlLm1hcChmdW5jdGlvbihfNmJmKXsNCl82YmYuZmluYWxpemUoKTsNCn0sdGhpcy5lZmZlY3RzKTsNCn19KTsNCk1vY2hpS2l0LlZpc3VhbC5TZXF1ZW5jZT1mdW5jdGlvbihfNmMwLF82YzEpew0KdmFyIGNscz1hcmd1bWVudHMuY2FsbGVlOw0KaWYoISh0aGlzIGluc3RhbmNlb2YgY2xzKSl7DQpyZXR1cm4gbmV3IGNscyhfNmMwLF82YzEpOw0KfQ0KdGhpcy5fX2luaXRfXyhfNmMwLF82YzEpOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5TZXF1ZW5jZS5wcm90b3R5cGU9bmV3IE1vY2hpS2l0LlZpc3VhbC5CYXNlKCk7DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5WaXN1YWwuU2VxdWVuY2UucHJvdG90eXBlLHtfX2NsYXNzX186TW9jaGlLaXQuVmlzdWFsLlNlcXVlbmNlLF9faW5pdF9fOmZ1bmN0aW9uKF82YzMsXzZjNCl7DQp2YXIgZGVmcz17dHJhbnNpdGlvbjpNb2NoaUtpdC5WaXN1YWwuVHJhbnNpdGlvbnMubGluZWFyLGR1cmF0aW9uOjB9Ow0KdGhpcy5lZmZlY3RzPV82YzN8fFtdOw0KTW9jaGlLaXQuQmFzZS5tYXAoZnVuY3Rpb24oXzZjNil7DQpkZWZzLmR1cmF0aW9uKz1fNmM2Lm9wdGlvbnMuZHVyYXRpb247DQp9LHRoaXMuZWZmZWN0cyk7DQpNb2NoaUtpdC5CYXNlLnNldGRlZmF1bHQoXzZjNCxkZWZzKTsNCnRoaXMuc3RhcnQoXzZjNCk7DQp9LHVwZGF0ZTpmdW5jdGlvbihfNmM3KXsNCnZhciB0aW1lPV82YzcqdGhpcy5vcHRpb25zLmR1cmF0aW9uOw0KZm9yKHZhciBpPTA7aTx0aGlzLmVmZmVjdHMubGVuZ3RoO2krKyl7DQp2YXIgXzZjYT10aGlzLmVmZmVjdHNbaV07DQppZih0aW1lPD1fNmNhLm9wdGlvbnMuZHVyYXRpb24pew0KXzZjYS5yZW5kZXIodGltZS9fNmNhLm9wdGlvbnMuZHVyYXRpb24pOw0KYnJlYWs7DQp9ZWxzZXsNCnRpbWUtPV82Y2Eub3B0aW9ucy5kdXJhdGlvbjsNCn0NCn0NCn0sZmluaXNoOmZ1bmN0aW9uKCl7DQpNb2NoaUtpdC5CYXNlLm1hcChmdW5jdGlvbihfNmNiKXsNCl82Y2IuZmluYWxpemUoKTsNCn0sdGhpcy5lZmZlY3RzKTsNCn19KTsNCk1vY2hpS2l0LlZpc3VhbC5PcGFjaXR5PWZ1bmN0aW9uKF82Y2MsXzZjZCl7DQp2YXIgY2xzPWFyZ3VtZW50cy5jYWxsZWU7DQppZighKHRoaXMgaW5zdGFuY2VvZiBjbHMpKXsNCnJldHVybiBuZXcgY2xzKF82Y2MsXzZjZCk7DQp9DQp0aGlzLl9faW5pdF9fKF82Y2MsXzZjZCk7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLk9wYWNpdHkucHJvdG90eXBlPW5ldyBNb2NoaUtpdC5WaXN1YWwuQmFzZSgpOw0KTW9jaGlLaXQuQmFzZS51cGRhdGUoTW9jaGlLaXQuVmlzdWFsLk9wYWNpdHkucHJvdG90eXBlLHtfX2NsYXNzX186TW9jaGlLaXQuVmlzdWFsLk9wYWNpdHksX19pbml0X186ZnVuY3Rpb24oXzZjZixfNmQwKXsNCnZhciBiPU1vY2hpS2l0LkJhc2U7DQp2YXIgcz1Nb2NoaUtpdC5TdHlsZTsNCnRoaXMuZWxlbWVudD1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChfNmNmKTsNCmlmKHRoaXMuZWxlbWVudC5jdXJyZW50U3R5bGUmJighdGhpcy5lbGVtZW50LmN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpKXsNCnMuc2V0U3R5bGUodGhpcy5lbGVtZW50LHt6b29tOjF9KTsNCn0NCl82ZDA9Yi51cGRhdGUoe2Zyb206cy5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsIm9wYWNpdHkiKXx8MCx0bzoxfSxfNmQwKTsNCnRoaXMuc3RhcnQoXzZkMCk7DQp9LHVwZGF0ZTpmdW5jdGlvbihfNmQzKXsNCk1vY2hpS2l0LlN0eWxlLnNldFN0eWxlKHRoaXMuZWxlbWVudCx7Im9wYWNpdHkiOl82ZDN9KTsNCn19KTsNCk1vY2hpS2l0LlZpc3VhbC5Nb3ZlPWZ1bmN0aW9uKF82ZDQsXzZkNSl7DQp2YXIgY2xzPWFyZ3VtZW50cy5jYWxsZWU7DQppZighKHRoaXMgaW5zdGFuY2VvZiBjbHMpKXsNCnJldHVybiBuZXcgY2xzKF82ZDQsXzZkNSk7DQp9DQp0aGlzLl9faW5pdF9fKF82ZDQsXzZkNSk7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLk1vdmUucHJvdG90eXBlPW5ldyBNb2NoaUtpdC5WaXN1YWwuQmFzZSgpOw0KTW9jaGlLaXQuQmFzZS51cGRhdGUoTW9jaGlLaXQuVmlzdWFsLk1vdmUucHJvdG90eXBlLHtfX2NsYXNzX186TW9jaGlLaXQuVmlzdWFsLk1vdmUsX19pbml0X186ZnVuY3Rpb24oXzZkNyxfNmQ4KXsNCnRoaXMuZWxlbWVudD1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChfNmQ3KTsNCl82ZDg9TW9jaGlLaXQuQmFzZS51cGRhdGUoe3g6MCx5OjAsbW9kZToicmVsYXRpdmUifSxfNmQ4KTsNCnRoaXMuc3RhcnQoXzZkOCk7DQp9LHNldHVwOmZ1bmN0aW9uKCl7DQpNb2NoaUtpdC5TdHlsZS5tYWtlUG9zaXRpb25lZCh0aGlzLmVsZW1lbnQpOw0KdmFyIHM9dGhpcy5lbGVtZW50LnN0eWxlOw0KdmFyIF82ZGE9cy52aXNpYmlsaXR5Ow0KdmFyIF82ZGI9cy5kaXNwbGF5Ow0KaWYoXzZkYj09Im5vbmUiKXsNCnMudmlzaWJpbGl0eT0iaGlkZGVuIjsNCnMuZGlzcGxheT0iIjsNCn0NCnRoaXMub3JpZ2luYWxMZWZ0PXBhcnNlRmxvYXQoTW9jaGlLaXQuU3R5bGUuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCJsZWZ0Iil8fCIwIik7DQp0aGlzLm9yaWdpbmFsVG9wPXBhcnNlRmxvYXQoTW9jaGlLaXQuU3R5bGUuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCJ0b3AiKXx8IjAiKTsNCmlmKHRoaXMub3B0aW9ucy5tb2RlPT0iYWJzb2x1dGUiKXsNCnRoaXMub3B0aW9ucy54LT10aGlzLm9yaWdpbmFsTGVmdDsNCnRoaXMub3B0aW9ucy55LT10aGlzLm9yaWdpbmFsVG9wOw0KfQ0KaWYoXzZkYj09Im5vbmUiKXsNCnMudmlzaWJpbGl0eT1fNmRhOw0Kcy5kaXNwbGF5PV82ZGI7DQp9DQp9LHVwZGF0ZTpmdW5jdGlvbihfNmRjKXsNCk1vY2hpS2l0LlN0eWxlLnNldFN0eWxlKHRoaXMuZWxlbWVudCx7bGVmdDpNYXRoLnJvdW5kKHRoaXMub3B0aW9ucy54Kl82ZGMrdGhpcy5vcmlnaW5hbExlZnQpKyJweCIsdG9wOk1hdGgucm91bmQodGhpcy5vcHRpb25zLnkqXzZkYyt0aGlzLm9yaWdpbmFsVG9wKSsicHgifSk7DQp9fSk7DQpNb2NoaUtpdC5WaXN1YWwuU2NhbGU9ZnVuY3Rpb24oXzZkZCxfNmRlLF82ZGYpew0KdmFyIGNscz1hcmd1bWVudHMuY2FsbGVlOw0KaWYoISh0aGlzIGluc3RhbmNlb2YgY2xzKSl7DQpyZXR1cm4gbmV3IGNscyhfNmRkLF82ZGUsXzZkZik7DQp9DQp0aGlzLl9faW5pdF9fKF82ZGQsXzZkZSxfNmRmKTsNCn07DQpNb2NoaUtpdC5WaXN1YWwuU2NhbGUucHJvdG90eXBlPW5ldyBNb2NoaUtpdC5WaXN1YWwuQmFzZSgpOw0KTW9jaGlLaXQuQmFzZS51cGRhdGUoTW9jaGlLaXQuVmlzdWFsLlNjYWxlLnByb3RvdHlwZSx7X19jbGFzc19fOk1vY2hpS2l0LlZpc3VhbC5TY2FsZSxfX2luaXRfXzpmdW5jdGlvbihfNmUxLF82ZTIsXzZlMyl7DQp0aGlzLmVsZW1lbnQ9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoXzZlMSk7DQpfNmUzPU1vY2hpS2l0LkJhc2UudXBkYXRlKHtzY2FsZVg6dHJ1ZSxzY2FsZVk6dHJ1ZSxzY2FsZUNvbnRlbnQ6dHJ1ZSxzY2FsZUZyb21DZW50ZXI6ZmFsc2Usc2NhbGVNb2RlOiJib3giLHNjYWxlRnJvbToxMDAsc2NhbGVUbzpfNmUyfSxfNmUzKTsNCnRoaXMuc3RhcnQoXzZlMyk7DQp9LHNldHVwOmZ1bmN0aW9uKCl7DQp0aGlzLnJlc3RvcmVBZnRlckZpbmlzaD10aGlzLm9wdGlvbnMucmVzdG9yZUFmdGVyRmluaXNofHxmYWxzZTsNCnRoaXMuZWxlbWVudFBvc2l0aW9uaW5nPU1vY2hpS2l0LlN0eWxlLmdldFN0eWxlKHRoaXMuZWxlbWVudCwicG9zaXRpb24iKTsNCnZhciBtYT1Nb2NoaUtpdC5CYXNlLm1hcDsNCnZhciBiPU1vY2hpS2l0LkJhc2UuYmluZDsNCnRoaXMub3JpZ2luYWxTdHlsZT17fTsNCm1hKGIoZnVuY3Rpb24oayl7DQp0aGlzLm9yaWdpbmFsU3R5bGVba109dGhpcy5lbGVtZW50LnN0eWxlW2tdOw0KfSx0aGlzKSxbInRvcCIsImxlZnQiLCJ3aWR0aCIsImhlaWdodCIsImZvbnRTaXplIl0pOw0KdGhpcy5vcmlnaW5hbFRvcD10aGlzLmVsZW1lbnQub2Zmc2V0VG9wOw0KdGhpcy5vcmlnaW5hbExlZnQ9dGhpcy5lbGVtZW50Lm9mZnNldExlZnQ7DQp2YXIgXzZlNz1Nb2NoaUtpdC5TdHlsZS5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsImZvbnQtc2l6ZSIpfHwiMTAwJSI7DQptYShiKGZ1bmN0aW9uKF82ZTgpew0KaWYoXzZlNy5pbmRleE9mKF82ZTgpPjApew0KdGhpcy5mb250U2l6ZT1wYXJzZUZsb2F0KF82ZTcpOw0KdGhpcy5mb250U2l6ZVR5cGU9XzZlODsNCn0NCn0sdGhpcyksWyJlbSIsInB4IiwiJSJdKTsNCnRoaXMuZmFjdG9yPSh0aGlzLm9wdGlvbnMuc2NhbGVUby10aGlzLm9wdGlvbnMuc2NhbGVGcm9tKS8xMDA7DQppZigvXmNvbnRlbnQvLnRlc3QodGhpcy5vcHRpb25zLnNjYWxlTW9kZSkpew0KdGhpcy5kaW1zPVt0aGlzLmVsZW1lbnQuc2Nyb2xsSGVpZ2h0LHRoaXMuZWxlbWVudC5zY3JvbGxXaWR0aF07DQp9ZWxzZXsNCmlmKHRoaXMub3B0aW9ucy5zY2FsZU1vZGU9PSJib3giKXsNCnRoaXMuZGltcz1bdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCx0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGhdOw0KfWVsc2V7DQp0aGlzLmRpbXM9W3RoaXMub3B0aW9ucy5zY2FsZU1vZGUub3JpZ2luYWxIZWlnaHQsdGhpcy5vcHRpb25zLnNjYWxlTW9kZS5vcmlnaW5hbFdpZHRoXTsNCn0NCn0NCn0sdXBkYXRlOmZ1bmN0aW9uKF82ZTkpew0KdmFyIF82ZWE9KHRoaXMub3B0aW9ucy5zY2FsZUZyb20vMTAwKSsodGhpcy5mYWN0b3IqXzZlOSk7DQppZih0aGlzLm9wdGlvbnMuc2NhbGVDb250ZW50JiZ0aGlzLmZvbnRTaXplKXsNCk1vY2hpS2l0LlN0eWxlLnNldFN0eWxlKHRoaXMuZWxlbWVudCx7Zm9udFNpemU6dGhpcy5mb250U2l6ZSpfNmVhK3RoaXMuZm9udFNpemVUeXBlfSk7DQp9DQp0aGlzLnNldERpbWVuc2lvbnModGhpcy5kaW1zWzBdKl82ZWEsdGhpcy5kaW1zWzFdKl82ZWEpOw0KfSxmaW5pc2g6ZnVuY3Rpb24oKXsNCmlmKHRoaXMucmVzdG9yZUFmdGVyRmluaXNoKXsNCk1vY2hpS2l0LlN0eWxlLnNldFN0eWxlKHRoaXMuZWxlbWVudCx0aGlzLm9yaWdpbmFsU3R5bGUpOw0KfQ0KfSxzZXREaW1lbnNpb25zOmZ1bmN0aW9uKF82ZWIsXzZlYyl7DQp2YXIgZD17fTsNCnZhciByPU1hdGgucm91bmQ7DQppZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7DQpyPU1hdGguY2VpbDsNCn0NCmlmKHRoaXMub3B0aW9ucy5zY2FsZVgpew0KZC53aWR0aD1yKF82ZWMpKyJweCI7DQp9DQppZih0aGlzLm9wdGlvbnMuc2NhbGVZKXsNCmQuaGVpZ2h0PXIoXzZlYikrInB4IjsNCn0NCmlmKHRoaXMub3B0aW9ucy5zY2FsZUZyb21DZW50ZXIpew0KdmFyIHRvcGQ9KF82ZWItdGhpcy5kaW1zWzBdKS8yOw0KdmFyIF82ZjA9KF82ZWMtdGhpcy5kaW1zWzFdKS8yOw0KaWYodGhpcy5lbGVtZW50UG9zaXRpb25pbmc9PSJhYnNvbHV0ZSIpew0KaWYodGhpcy5vcHRpb25zLnNjYWxlWSl7DQpkLnRvcD10aGlzLm9yaWdpbmFsVG9wLXRvcGQrInB4IjsNCn0NCmlmKHRoaXMub3B0aW9ucy5zY2FsZVgpew0KZC5sZWZ0PXRoaXMub3JpZ2luYWxMZWZ0LV82ZjArInB4IjsNCn0NCn1lbHNlew0KaWYodGhpcy5vcHRpb25zLnNjYWxlWSl7DQpkLnRvcD0tdG9wZCsicHgiOw0KfQ0KaWYodGhpcy5vcHRpb25zLnNjYWxlWCl7DQpkLmxlZnQ9LV82ZjArInB4IjsNCn0NCn0NCn0NCk1vY2hpS2l0LlN0eWxlLnNldFN0eWxlKHRoaXMuZWxlbWVudCxkKTsNCn19KTsNCk1vY2hpS2l0LlZpc3VhbC5IaWdobGlnaHQ9ZnVuY3Rpb24oXzZmMSxfNmYyKXsNCnZhciBjbHM9YXJndW1lbnRzLmNhbGxlZTsNCmlmKCEodGhpcyBpbnN0YW5jZW9mIGNscykpew0KcmV0dXJuIG5ldyBjbHMoXzZmMSxfNmYyKTsNCn0NCnRoaXMuX19pbml0X18oXzZmMSxfNmYyKTsNCn07DQpNb2NoaUtpdC5WaXN1YWwuSGlnaGxpZ2h0LnByb3RvdHlwZT1uZXcgTW9jaGlLaXQuVmlzdWFsLkJhc2UoKTsNCk1vY2hpS2l0LkJhc2UudXBkYXRlKE1vY2hpS2l0LlZpc3VhbC5IaWdobGlnaHQucHJvdG90eXBlLHtfX2NsYXNzX186TW9jaGlLaXQuVmlzdWFsLkhpZ2hsaWdodCxfX2luaXRfXzpmdW5jdGlvbihfNmY0LF82ZjUpew0KdGhpcy5lbGVtZW50PU1vY2hpS2l0LkRPTS5nZXRFbGVtZW50KF82ZjQpOw0KXzZmNT1Nb2NoaUtpdC5CYXNlLnVwZGF0ZSh7c3RhcnRjb2xvcjoiI2ZmZmY5OSJ9LF82ZjUpOw0KdGhpcy5zdGFydChfNmY1KTsNCn0sc2V0dXA6ZnVuY3Rpb24oKXsNCnZhciBiPU1vY2hpS2l0LkJhc2U7DQp2YXIgcz1Nb2NoaUtpdC5TdHlsZTsNCmlmKHMuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCJkaXNwbGF5Iik9PSJub25lIil7DQp0aGlzLmNhbmNlbCgpOw0KcmV0dXJuOw0KfQ0KdGhpcy5vbGRTdHlsZT17YmFja2dyb3VuZEltYWdlOnMuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCJiYWNrZ3JvdW5kLWltYWdlIil9Ow0Kcy5zZXRTdHlsZSh0aGlzLmVsZW1lbnQse2JhY2tncm91bmRJbWFnZToibm9uZSJ9KTsNCmlmKCF0aGlzLm9wdGlvbnMuZW5kY29sb3Ipew0KdGhpcy5vcHRpb25zLmVuZGNvbG9yPU1vY2hpS2l0LkNvbG9yLkNvbG9yLmZyb21CYWNrZ3JvdW5kKHRoaXMuZWxlbWVudCkudG9IZXhTdHJpbmcoKTsNCn0NCmlmKGIuaXNVbmRlZmluZWRPck51bGwodGhpcy5vcHRpb25zLnJlc3RvcmVjb2xvcikpew0KdGhpcy5vcHRpb25zLnJlc3RvcmVjb2xvcj1zLmdldFN0eWxlKHRoaXMuZWxlbWVudCwiYmFja2dyb3VuZC1jb2xvciIpOw0KfQ0KdGhpcy5fYmFzZT1iLm1hcChiLmJpbmQoZnVuY3Rpb24oaSl7DQpyZXR1cm4gcGFyc2VJbnQodGhpcy5vcHRpb25zLnN0YXJ0Y29sb3Iuc2xpY2UoaSoyKzEsaSoyKzMpLDE2KTsNCn0sdGhpcyksWzAsMSwyXSk7DQp0aGlzLl9kZWx0YT1iLm1hcChiLmJpbmQoZnVuY3Rpb24oaSl7DQpyZXR1cm4gcGFyc2VJbnQodGhpcy5vcHRpb25zLmVuZGNvbG9yLnNsaWNlKGkqMisxLGkqMiszKSwxNiktdGhpcy5fYmFzZVtpXTsNCn0sdGhpcyksWzAsMSwyXSk7DQp9LHVwZGF0ZTpmdW5jdGlvbihfNmZhKXsNCnZhciBtPSIjIjsNCk1vY2hpS2l0LkJhc2UubWFwKE1vY2hpS2l0LkJhc2UuYmluZChmdW5jdGlvbihpKXsNCm0rPU1vY2hpS2l0LkNvbG9yLnRvQ29sb3JQYXJ0KE1hdGgucm91bmQodGhpcy5fYmFzZVtpXSt0aGlzLl9kZWx0YVtpXSpfNmZhKSk7DQp9LHRoaXMpLFswLDEsMl0pOw0KTW9jaGlLaXQuU3R5bGUuc2V0U3R5bGUodGhpcy5lbGVtZW50LHtiYWNrZ3JvdW5kQ29sb3I6bX0pOw0KfSxmaW5pc2g6ZnVuY3Rpb24oKXsNCk1vY2hpS2l0LlN0eWxlLnNldFN0eWxlKHRoaXMuZWxlbWVudCxNb2NoaUtpdC5CYXNlLnVwZGF0ZSh0aGlzLm9sZFN0eWxlLHtiYWNrZ3JvdW5kQ29sb3I6dGhpcy5vcHRpb25zLnJlc3RvcmVjb2xvcn0pKTsNCn19KTsNCk1vY2hpS2l0LlZpc3VhbC5TY3JvbGxUbz1mdW5jdGlvbihfNmZkLF82ZmUpew0KdmFyIGNscz1hcmd1bWVudHMuY2FsbGVlOw0KaWYoISh0aGlzIGluc3RhbmNlb2YgY2xzKSl7DQpyZXR1cm4gbmV3IGNscyhfNmZkLF82ZmUpOw0KfQ0KdGhpcy5fX2luaXRfXyhfNmZkLF82ZmUpOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5TY3JvbGxUby5wcm90b3R5cGU9bmV3IE1vY2hpS2l0LlZpc3VhbC5CYXNlKCk7DQpNb2NoaUtpdC5CYXNlLnVwZGF0ZShNb2NoaUtpdC5WaXN1YWwuU2Nyb2xsVG8ucHJvdG90eXBlLHtfX2NsYXNzX186TW9jaGlLaXQuVmlzdWFsLlNjcm9sbFRvLF9faW5pdF9fOmZ1bmN0aW9uKF83MDAsXzcwMSl7DQp0aGlzLmVsZW1lbnQ9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoXzcwMCk7DQp0aGlzLnN0YXJ0KF83MDEpOw0KfSxzZXR1cDpmdW5jdGlvbigpew0KdmFyIHA9TW9jaGlLaXQuUG9zaXRpb247DQpwLnByZXBhcmUoKTsNCnZhciBfNzAzPXAuY3VtdWxhdGl2ZU9mZnNldCh0aGlzLmVsZW1lbnQpOw0KaWYodGhpcy5vcHRpb25zLm9mZnNldCl7DQpfNzAzLnkrPXRoaXMub3B0aW9ucy5vZmZzZXQ7DQp9DQp2YXIgbWF4Ow0KaWYod2luZG93LmlubmVySGVpZ2h0KXsNCm1heD13aW5kb3cuaW5uZXJIZWlnaHQtd2luZG93LmhlaWdodDsNCn1lbHNlew0KaWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KXsNCm1heD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LWRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0Ow0KfWVsc2V7DQppZihkb2N1bWVudC5ib2R5KXsNCm1heD1kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodC1kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDsNCn0NCn0NCn0NCnRoaXMuc2Nyb2xsU3RhcnQ9cC53aW5kb3dPZmZzZXQueTsNCnRoaXMuZGVsdGE9KF83MDMueT5tYXg/bWF4Ol83MDMueSktdGhpcy5zY3JvbGxTdGFydDsNCn0sdXBkYXRlOmZ1bmN0aW9uKF83MDUpew0KdmFyIHA9TW9jaGlLaXQuUG9zaXRpb247DQpwLnByZXBhcmUoKTsNCndpbmRvdy5zY3JvbGxUbyhwLndpbmRvd09mZnNldC54LHRoaXMuc2Nyb2xsU3RhcnQrKF83MDUqdGhpcy5kZWx0YSkpOw0KfX0pOw0KTW9jaGlLaXQuVmlzdWFsLl9DU1NfTEVOR1RIPS9eKChbXCtcLV0/WzAtOVwuXSspKGVtfGV4fHB4fGlufGNtfG1tfHB0fHBjfFwlKSl8MCQvOw0KTW9jaGlLaXQuVmlzdWFsLk1vcnBoPWZ1bmN0aW9uKF83MDcsXzcwOCl7DQp2YXIgY2xzPWFyZ3VtZW50cy5jYWxsZWU7DQppZighKHRoaXMgaW5zdGFuY2VvZiBjbHMpKXsNCnJldHVybiBuZXcgY2xzKF83MDcsXzcwOCk7DQp9DQp0aGlzLl9faW5pdF9fKF83MDcsXzcwOCk7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLk1vcnBoLnByb3RvdHlwZT1uZXcgTW9jaGlLaXQuVmlzdWFsLkJhc2UoKTsNCk1vY2hpS2l0LkJhc2UudXBkYXRlKE1vY2hpS2l0LlZpc3VhbC5Nb3JwaC5wcm90b3R5cGUse19fY2xhc3NfXzpNb2NoaUtpdC5WaXN1YWwuTW9ycGgsX19pbml0X186ZnVuY3Rpb24oXzcwYSxfNzBiKXsNCnRoaXMuZWxlbWVudD1Nb2NoaUtpdC5ET00uZ2V0RWxlbWVudChfNzBhKTsNCnRoaXMuc3RhcnQoXzcwYik7DQp9LHNldHVwOmZ1bmN0aW9uKCl7DQp2YXIgYj1Nb2NoaUtpdC5CYXNlOw0KdmFyIF83MGQ9dGhpcy5vcHRpb25zLnN0eWxlOw0KdGhpcy5zdHlsZVN0YXJ0PXt9Ow0KdGhpcy5zdHlsZUVuZD17fTsNCnRoaXMudW5pdHM9e307DQp2YXIgXzcwZSx1bml0Ow0KZm9yKHZhciBzIGluIF83MGQpew0KXzcwZT1fNzBkW3NdOw0Kcz1iLmNhbWVsaXplKHMpOw0KaWYoTW9jaGlLaXQuVmlzdWFsLl9DU1NfTEVOR1RILnRlc3QoXzcwZSkpew0KdmFyIF83MTE9XzcwZS5tYXRjaCgvXihbXCtcLV0/WzAtOVwuXSspKC4qKSQvKTsNCl83MGU9cGFyc2VGbG9hdChfNzExWzFdKTsNCnVuaXQ9KF83MTEubGVuZ3RoPT0zKT9fNzExWzJdOm51bGw7DQp0aGlzLnN0eWxlRW5kW3NdPV83MGU7DQp0aGlzLnVuaXRzW3NdPXVuaXQ7DQpfNzBlPU1vY2hpS2l0LlN0eWxlLmdldFN0eWxlKHRoaXMuZWxlbWVudCxzKTsNCl83MTE9XzcwZS5tYXRjaCgvXihbXCtcLV0/WzAtOVwuXSspKC4qKSQvKTsNCl83MGU9cGFyc2VGbG9hdChfNzExWzFdKTsNCnRoaXMuc3R5bGVTdGFydFtzXT1fNzBlOw0KfWVsc2V7DQppZigvW0NjXW9sb3IkLy50ZXN0KHMpKXsNCnZhciBjPU1vY2hpS2l0LkNvbG9yLkNvbG9yOw0KXzcwZT1jLmZyb21TdHJpbmcoXzcwZSk7DQppZihfNzBlKXsNCnRoaXMudW5pdHNbc109ImNvbG9yIjsNCnRoaXMuc3R5bGVFbmRbc109XzcwZS50b0hleFN0cmluZygpOw0KXzcwZT1Nb2NoaUtpdC5TdHlsZS5nZXRTdHlsZSh0aGlzLmVsZW1lbnQscyk7DQp0aGlzLnN0eWxlU3RhcnRbc109Yy5mcm9tU3RyaW5nKF83MGUpLnRvSGV4U3RyaW5nKCk7DQp0aGlzLnN0eWxlU3RhcnRbc109Yi5tYXAoYi5iaW5kKGZ1bmN0aW9uKGkpew0KcmV0dXJuIHBhcnNlSW50KHRoaXMuc3R5bGVTdGFydFtzXS5zbGljZShpKjIrMSxpKjIrMyksMTYpOw0KfSx0aGlzKSxbMCwxLDJdKTsNCnRoaXMuc3R5bGVFbmRbc109Yi5tYXAoYi5iaW5kKGZ1bmN0aW9uKGkpew0KcmV0dXJuIHBhcnNlSW50KHRoaXMuc3R5bGVFbmRbc10uc2xpY2UoaSoyKzEsaSoyKzMpLDE2KTsNCn0sdGhpcyksWzAsMSwyXSk7DQp9DQp9ZWxzZXsNCnRoaXMuZWxlbWVudC5zdHlsZVtzXT1fNzBlOw0KfQ0KfQ0KfQ0KfSx1cGRhdGU6ZnVuY3Rpb24oXzcxNSl7DQp2YXIgXzcxNjsNCmZvcih2YXIgcyBpbiB0aGlzLnN0eWxlU3RhcnQpew0KaWYodGhpcy51bml0c1tzXT09ImNvbG9yIil7DQp2YXIgbT0iIyI7DQp2YXIgXzcxOT10aGlzLnN0eWxlU3RhcnRbc107DQp2YXIgZW5kPXRoaXMuc3R5bGVFbmRbc107DQpNb2NoaUtpdC5CYXNlLm1hcChNb2NoaUtpdC5CYXNlLmJpbmQoZnVuY3Rpb24oaSl7DQptKz1Nb2NoaUtpdC5Db2xvci50b0NvbG9yUGFydChNYXRoLnJvdW5kKF83MTlbaV0rKGVuZFtpXS1fNzE5W2ldKSpfNzE1KSk7DQp9LHRoaXMpLFswLDEsMl0pOw0KdGhpcy5lbGVtZW50LnN0eWxlW3NdPW07DQp9ZWxzZXsNCl83MTY9dGhpcy5zdHlsZVN0YXJ0W3NdK01hdGgucm91bmQoKHRoaXMuc3R5bGVFbmRbc10tdGhpcy5zdHlsZVN0YXJ0W3NdKSpfNzE1KjEwMDApLzEwMDArdGhpcy51bml0c1tzXTsNCnRoaXMuZWxlbWVudC5zdHlsZVtzXT1fNzE2Ow0KfQ0KfQ0KfX0pOw0KTW9jaGlLaXQuVmlzdWFsLmZhZGU9ZnVuY3Rpb24oXzcxYyxfNzFkKXsNCnZhciBzPU1vY2hpS2l0LlN0eWxlOw0KdmFyIF83MWY9cy5nZXRTdHlsZShfNzFjLCJvcGFjaXR5Iik7DQpfNzFkPU1vY2hpS2l0LkJhc2UudXBkYXRlKHtmcm9tOnMuZ2V0U3R5bGUoXzcxYywib3BhY2l0eSIpfHwxLHRvOjAsYWZ0ZXJGaW5pc2hJbnRlcm5hbDpmdW5jdGlvbihfNzIwKXsNCmlmKF83MjAub3B0aW9ucy50byE9PTApew0KcmV0dXJuOw0KfQ0Kcy5oaWRlRWxlbWVudChfNzIwLmVsZW1lbnQpOw0Kcy5zZXRTdHlsZShfNzIwLmVsZW1lbnQseyJvcGFjaXR5IjpfNzFmfSk7DQp9fSxfNzFkKTsNCnJldHVybiBuZXcgTW9jaGlLaXQuVmlzdWFsLk9wYWNpdHkoXzcxYyxfNzFkKTsNCn07DQpNb2NoaUtpdC5WaXN1YWwuYXBwZWFyPWZ1bmN0aW9uKF83MjEsXzcyMil7DQp2YXIgcz1Nb2NoaUtpdC5TdHlsZTsNCnZhciB2PU1vY2hpS2l0LlZpc3VhbDsNCl83MjI9TW9jaGlLaXQuQmFzZS51cGRhdGUoe2Zyb206KHMuZ2V0U3R5bGUoXzcyMSwiZGlzcGxheSIpPT0ibm9uZSI/MDpzLmdldFN0eWxlKF83MjEsIm9wYWNpdHkiKXx8MCksdG86MSxhZnRlckZpbmlzaEludGVybmFsOmZ1bmN0aW9uKF83MjUpew0Kdi5fZm9yY2VSZXJlbmRlcmluZyhfNzI1LmVsZW1lbnQpOw0KfSxiZWZvcmVTZXR1cEludGVybmFsOmZ1bmN0aW9uKF83MjYpew0Kcy5zZXRTdHlsZShfNzI2LmVsZW1lbnQseyJvcGFjaXR5IjpfNzI2Lm9wdGlvbnMuZnJvbX0pOw0Kcy5zaG93RWxlbWVudChfNzI2LmVsZW1lbnQpOw0KfX0sXzcyMik7DQpyZXR1cm4gbmV3IHYuT3BhY2l0eShfNzIxLF83MjIpOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5wdWZmPWZ1bmN0aW9uKF83MjcsXzcyOCl7DQp2YXIgcz1Nb2NoaUtpdC5TdHlsZTsNCnZhciB2PU1vY2hpS2l0LlZpc3VhbDsNCl83Mjc9TW9jaGlLaXQuRE9NLmdldEVsZW1lbnQoXzcyNyk7DQp2YXIgXzcyYj1Nb2NoaUtpdC5TdHlsZS5nZXRFbGVtZW50RGltZW5zaW9ucyhfNzI3LHRydWUpOw0KdmFyIF83MmM9e3Bvc2l0aW9uOnMuZ2V0U3R5bGUoXzcyNywicG9zaXRpb24iKSx0b3A6XzcyNy5zdHlsZS50b3AsbGVmdDpfNzI3LnN0eWxlLmxlZnQsd2lkdGg6XzcyNy5zdHlsZS53aWR0aCxoZWlnaHQ6XzcyNy5zdHlsZS5oZWlnaHQsb3BhY2l0eTpzLmdldFN0eWxlKF83MjcsIm9wYWNpdHkiKX07DQpfNzI4PU1vY2hpS2l0LkJhc2UudXBkYXRlKHtiZWZvcmVTZXR1cEludGVybmFsOmZ1bmN0aW9uKF83MmQpew0KTW9jaGlLaXQuUG9zaXRpb24uYWJzb2x1dGl6ZShfNzJkLmVmZmVjdHNbMF0uZWxlbWVudCk7DQp9LGFmdGVyRmluaXNoSW50ZXJuYWw6ZnVuY3Rpb24oXzcyZSl7DQpzLmhpZGVFbGVtZW50KF83MmUuZWZmZWN0c1swXS5lbGVtZW50KTsNCnMuc2V0U3R5bGUoXzcyZS5lZmZlY3RzWzBdLmVsZW1lbnQsXzcyYyk7DQp9LHNjYWxlQ29udGVudDp0cnVlLHNjYWxlRnJvbUNlbnRlcjp0cnVlfSxfNzI4KTsNCnJldHVybiBuZXcgdi5QYXJhbGxlbChbbmV3IHYuU2NhbGUoXzcyNywyMDAse3N5bmM6dHJ1ZSxzY2FsZUZyb21DZW50ZXI6XzcyOC5zY2FsZUZyb21DZW50ZXIsc2NhbGVNb2RlOntvcmlnaW5hbEhlaWdodDpfNzJiLmgsb3JpZ2luYWxXaWR0aDpfNzJiLnd9LHNjYWxlQ29udGVudDpfNzI4LnNjYWxlQ29udGVudCxyZXN0b3JlQWZ0ZXJGaW5pc2g6dHJ1ZX0pLG5ldyB2Lk9wYWNpdHkoXzcyNyx7c3luYzp0cnVlLHRvOjB9KV0sXzcyOCk7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLmJsaW5kVXA9ZnVuY3Rpb24oXzcyZixfNzMwKXsNCnZhciBkPU1vY2hpS2l0LkRPTTsNCnZhciBzPU1vY2hpS2l0LlN0eWxlOw0KXzcyZj1kLmdldEVsZW1lbnQoXzcyZik7DQp2YXIgXzczMz1zLmdldEVsZW1lbnREaW1lbnNpb25zKF83MmYsdHJ1ZSk7DQp2YXIgXzczND1zLm1ha2VDbGlwcGluZyhfNzJmKTsNCl83MzA9TW9jaGlLaXQuQmFzZS51cGRhdGUoe3NjYWxlQ29udGVudDpmYWxzZSxzY2FsZVg6ZmFsc2Usc2NhbGVNb2RlOntvcmlnaW5hbEhlaWdodDpfNzMzLmgsb3JpZ2luYWxXaWR0aDpfNzMzLnd9LHJlc3RvcmVBZnRlckZpbmlzaDp0cnVlLGFmdGVyRmluaXNoSW50ZXJuYWw6ZnVuY3Rpb24oXzczNSl7DQpzLmhpZGVFbGVtZW50KF83MzUuZWxlbWVudCk7DQpzLnVuZG9DbGlwcGluZyhfNzM1LmVsZW1lbnQsXzczNCk7DQp9fSxfNzMwKTsNCnJldHVybiBuZXcgTW9jaGlLaXQuVmlzdWFsLlNjYWxlKF83MmYsMCxfNzMwKTsNCn07DQpNb2NoaUtpdC5WaXN1YWwuYmxpbmREb3duPWZ1bmN0aW9uKF83MzYsXzczNyl7DQp2YXIgZD1Nb2NoaUtpdC5ET007DQp2YXIgcz1Nb2NoaUtpdC5TdHlsZTsNCl83MzY9ZC5nZXRFbGVtZW50KF83MzYpOw0KdmFyIF83M2E9cy5nZXRFbGVtZW50RGltZW5zaW9ucyhfNzM2LHRydWUpOw0KdmFyIF83M2I7DQpfNzM3PU1vY2hpS2l0LkJhc2UudXBkYXRlKHtzY2FsZUNvbnRlbnQ6ZmFsc2Usc2NhbGVYOmZhbHNlLHNjYWxlRnJvbTowLHNjYWxlTW9kZTp7b3JpZ2luYWxIZWlnaHQ6XzczYS5oLG9yaWdpbmFsV2lkdGg6XzczYS53fSxyZXN0b3JlQWZ0ZXJGaW5pc2g6dHJ1ZSxhZnRlclNldHVwSW50ZXJuYWw6ZnVuY3Rpb24oXzczYyl7DQpfNzNiPXMubWFrZUNsaXBwaW5nKF83M2MuZWxlbWVudCk7DQpzLnNldFN0eWxlKF83M2MuZWxlbWVudCx7aGVpZ2h0OiIwcHgifSk7DQpzLnNob3dFbGVtZW50KF83M2MuZWxlbWVudCk7DQp9LGFmdGVyRmluaXNoSW50ZXJuYWw6ZnVuY3Rpb24oXzczZCl7DQpzLnVuZG9DbGlwcGluZyhfNzNkLmVsZW1lbnQsXzczYik7DQp9fSxfNzM3KTsNCnJldHVybiBuZXcgTW9jaGlLaXQuVmlzdWFsLlNjYWxlKF83MzYsMTAwLF83MzcpOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5zd2l0Y2hPZmY9ZnVuY3Rpb24oXzczZSxfNzNmKXsNCnZhciBkPU1vY2hpS2l0LkRPTTsNCnZhciBzPU1vY2hpS2l0LlN0eWxlOw0KXzczZT1kLmdldEVsZW1lbnQoXzczZSk7DQp2YXIgXzc0Mj1zLmdldEVsZW1lbnREaW1lbnNpb25zKF83M2UsdHJ1ZSk7DQp2YXIgXzc0Mz1zLmdldFN0eWxlKF83M2UsIm9wYWNpdHkiKTsNCnZhciBfNzQ0Ow0KXzczZj1Nb2NoaUtpdC5CYXNlLnVwZGF0ZSh7ZHVyYXRpb246MC43LHJlc3RvcmVBZnRlckZpbmlzaDp0cnVlLGJlZm9yZVNldHVwSW50ZXJuYWw6ZnVuY3Rpb24oXzc0NSl7DQpzLm1ha2VQb3NpdGlvbmVkKF83M2UpOw0KXzc0ND1zLm1ha2VDbGlwcGluZyhfNzNlKTsNCn0sYWZ0ZXJGaW5pc2hJbnRlcm5hbDpmdW5jdGlvbihfNzQ2KXsNCnMuaGlkZUVsZW1lbnQoXzczZSk7DQpzLnVuZG9DbGlwcGluZyhfNzNlLF83NDQpOw0Kcy51bmRvUG9zaXRpb25lZChfNzNlKTsNCnMuc2V0U3R5bGUoXzczZSx7Im9wYWNpdHkiOl83NDN9KTsNCn19LF83M2YpOw0KdmFyIHY9TW9jaGlLaXQuVmlzdWFsOw0KcmV0dXJuIG5ldyB2LlNlcXVlbmNlKFtuZXcgdi5hcHBlYXIoXzczZSx7c3luYzp0cnVlLGR1cmF0aW9uOjAuNTcqXzczZi5kdXJhdGlvbixmcm9tOjAsdHJhbnNpdGlvbjp2LlRyYW5zaXRpb25zLmZsaWNrZXJ9KSxuZXcgdi5TY2FsZShfNzNlLDEse3N5bmM6dHJ1ZSxkdXJhdGlvbjowLjQzKl83M2YuZHVyYXRpb24sc2NhbGVGcm9tQ2VudGVyOnRydWUsc2NhbGVYOmZhbHNlLHNjYWxlTW9kZTp7b3JpZ2luYWxIZWlnaHQ6Xzc0Mi5oLG9yaWdpbmFsV2lkdGg6Xzc0Mi53fSxzY2FsZUNvbnRlbnQ6ZmFsc2UscmVzdG9yZUFmdGVyRmluaXNoOnRydWV9KV0sXzczZik7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLmRyb3BPdXQ9ZnVuY3Rpb24oXzc0OCxfNzQ5KXsNCnZhciBkPU1vY2hpS2l0LkRPTTsNCnZhciBzPU1vY2hpS2l0LlN0eWxlOw0KXzc0OD1kLmdldEVsZW1lbnQoXzc0OCk7DQp2YXIgXzc0Yz17dG9wOnMuZ2V0U3R5bGUoXzc0OCwidG9wIiksbGVmdDpzLmdldFN0eWxlKF83NDgsImxlZnQiKSxvcGFjaXR5OnMuZ2V0U3R5bGUoXzc0OCwib3BhY2l0eSIpfTsNCl83NDk9TW9jaGlLaXQuQmFzZS51cGRhdGUoe2R1cmF0aW9uOjAuNSxkaXN0YW5jZToxMDAsYmVmb3JlU2V0dXBJbnRlcm5hbDpmdW5jdGlvbihfNzRkKXsNCnMubWFrZVBvc2l0aW9uZWQoXzc0ZC5lZmZlY3RzWzBdLmVsZW1lbnQpOw0KfSxhZnRlckZpbmlzaEludGVybmFsOmZ1bmN0aW9uKF83NGUpew0Kcy5oaWRlRWxlbWVudChfNzRlLmVmZmVjdHNbMF0uZWxlbWVudCk7DQpzLnVuZG9Qb3NpdGlvbmVkKF83NGUuZWZmZWN0c1swXS5lbGVtZW50KTsNCnMuc2V0U3R5bGUoXzc0ZS5lZmZlY3RzWzBdLmVsZW1lbnQsXzc0Yyk7DQp9fSxfNzQ5KTsNCnZhciB2PU1vY2hpS2l0LlZpc3VhbDsNCnJldHVybiBuZXcgdi5QYXJhbGxlbChbbmV3IHYuTW92ZShfNzQ4LHt4OjAseTpfNzQ5LmRpc3RhbmNlLHN5bmM6dHJ1ZX0pLG5ldyB2Lk9wYWNpdHkoXzc0OCx7c3luYzp0cnVlLHRvOjB9KV0sXzc0OSk7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLnNoYWtlPWZ1bmN0aW9uKF83NTAsXzc1MSl7DQp2YXIgZD1Nb2NoaUtpdC5ET007DQp2YXIgdj1Nb2NoaUtpdC5WaXN1YWw7DQp2YXIgcz1Nb2NoaUtpdC5TdHlsZTsNCl83NTA9ZC5nZXRFbGVtZW50KF83NTApOw0KdmFyIF83NTU9e3RvcDpzLmdldFN0eWxlKF83NTAsInRvcCIpLGxlZnQ6cy5nZXRTdHlsZShfNzUwLCJsZWZ0Iil9Ow0KXzc1MT1Nb2NoaUtpdC5CYXNlLnVwZGF0ZSh7ZHVyYXRpb246MC41LGFmdGVyRmluaXNoSW50ZXJuYWw6ZnVuY3Rpb24oXzc1Nil7DQpzLnVuZG9Qb3NpdGlvbmVkKF83NTApOw0Kcy5zZXRTdHlsZShfNzUwLF83NTUpOw0KfX0sXzc1MSk7DQpyZXR1cm4gbmV3IHYuU2VxdWVuY2UoW25ldyB2Lk1vdmUoXzc1MCx7c3luYzp0cnVlLGR1cmF0aW9uOjAuMSpfNzUxLmR1cmF0aW9uLHg6MjAseTowfSksbmV3IHYuTW92ZShfNzUwLHtzeW5jOnRydWUsZHVyYXRpb246MC4yKl83NTEuZHVyYXRpb24seDotNDAseTowfSksbmV3IHYuTW92ZShfNzUwLHtzeW5jOnRydWUsZHVyYXRpb246MC4yKl83NTEuZHVyYXRpb24seDo0MCx5OjB9KSxuZXcgdi5Nb3ZlKF83NTAse3N5bmM6dHJ1ZSxkdXJhdGlvbjowLjIqXzc1MS5kdXJhdGlvbix4Oi00MCx5OjB9KSxuZXcgdi5Nb3ZlKF83NTAse3N5bmM6dHJ1ZSxkdXJhdGlvbjowLjIqXzc1MS5kdXJhdGlvbix4OjQwLHk6MH0pLG5ldyB2Lk1vdmUoXzc1MCx7c3luYzp0cnVlLGR1cmF0aW9uOjAuMSpfNzUxLmR1cmF0aW9uLHg6LTIwLHk6MH0pXSxfNzUxKTsNCn07DQpNb2NoaUtpdC5WaXN1YWwuc2xpZGVEb3duPWZ1bmN0aW9uKF83NTcsXzc1OCl7DQp2YXIgZD1Nb2NoaUtpdC5ET007DQp2YXIgYj1Nb2NoaUtpdC5CYXNlOw0KdmFyIHM9TW9jaGlLaXQuU3R5bGU7DQpfNzU3PWQuZ2V0RWxlbWVudChfNzU3KTsNCmlmKCFfNzU3LmZpcnN0Q2hpbGQpew0KdGhyb3cgbmV3IEVycm9yKCJNb2NoaUtpdC5WaXN1YWwuc2xpZGVEb3duIG11c3QgYmUgdXNlZCBvbiBhIGVsZW1lbnQgd2l0aCBhIGNoaWxkIik7DQp9DQpkLnJlbW92ZUVtcHR5VGV4dE5vZGVzKF83NTcpOw0KdmFyIF83NWM9cy5nZXRTdHlsZShfNzU3LmZpcnN0Q2hpbGQsImJvdHRvbSIpfHwwOw0KdmFyIF83NWQ9cy5nZXRFbGVtZW50RGltZW5zaW9ucyhfNzU3LHRydWUpOw0KdmFyIF83NWU7DQpfNzU4PWIudXBkYXRlKHtzY2FsZUNvbnRlbnQ6ZmFsc2Usc2NhbGVYOmZhbHNlLHNjYWxlRnJvbTowLHNjYWxlTW9kZTp7b3JpZ2luYWxIZWlnaHQ6Xzc1ZC5oLG9yaWdpbmFsV2lkdGg6Xzc1ZC53fSxyZXN0b3JlQWZ0ZXJGaW5pc2g6dHJ1ZSxhZnRlclNldHVwSW50ZXJuYWw6ZnVuY3Rpb24oXzc1Zil7DQpzLm1ha2VQb3NpdGlvbmVkKF83NWYuZWxlbWVudCk7DQpzLm1ha2VQb3NpdGlvbmVkKF83NWYuZWxlbWVudC5maXJzdENoaWxkKTsNCmlmKC9PcGVyYS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7DQpzLnNldFN0eWxlKF83NWYuZWxlbWVudCx7dG9wOiIifSk7DQp9DQpfNzVlPXMubWFrZUNsaXBwaW5nKF83NWYuZWxlbWVudCk7DQpzLnNldFN0eWxlKF83NWYuZWxlbWVudCx7aGVpZ2h0OiIwcHgifSk7DQpzLnNob3dFbGVtZW50KF83NWYuZWxlbWVudCk7DQp9LGFmdGVyVXBkYXRlSW50ZXJuYWw6ZnVuY3Rpb24oXzc2MCl7DQp2YXIgXzc2MT1zLmdldEVsZW1lbnREaW1lbnNpb25zKF83NjAuZWxlbWVudCx0cnVlKTsNCnMuc2V0U3R5bGUoXzc2MC5lbGVtZW50LmZpcnN0Q2hpbGQse2JvdHRvbTooXzc2MC5kaW1zWzBdLV83NjEuaCkrInB4In0pOw0KfSxhZnRlckZpbmlzaEludGVybmFsOmZ1bmN0aW9uKF83NjIpew0Kcy51bmRvQ2xpcHBpbmcoXzc2Mi5lbGVtZW50LF83NWUpOw0KaWYoL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpew0Kcy51bmRvUG9zaXRpb25lZChfNzYyLmVsZW1lbnQpOw0Kcy51bmRvUG9zaXRpb25lZChfNzYyLmVsZW1lbnQuZmlyc3RDaGlsZCk7DQp9ZWxzZXsNCnMudW5kb1Bvc2l0aW9uZWQoXzc2Mi5lbGVtZW50LmZpcnN0Q2hpbGQpOw0Kcy51bmRvUG9zaXRpb25lZChfNzYyLmVsZW1lbnQpOw0KfQ0Kcy5zZXRTdHlsZShfNzYyLmVsZW1lbnQuZmlyc3RDaGlsZCx7Ym90dG9tOl83NWN9KTsNCn19LF83NTgpOw0KcmV0dXJuIG5ldyBNb2NoaUtpdC5WaXN1YWwuU2NhbGUoXzc1NywxMDAsXzc1OCk7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLnNsaWRlVXA9ZnVuY3Rpb24oXzc2MyxfNzY0KXsNCnZhciBkPU1vY2hpS2l0LkRPTTsNCnZhciBiPU1vY2hpS2l0LkJhc2U7DQp2YXIgcz1Nb2NoaUtpdC5TdHlsZTsNCl83NjM9ZC5nZXRFbGVtZW50KF83NjMpOw0KaWYoIV83NjMuZmlyc3RDaGlsZCl7DQp0aHJvdyBuZXcgRXJyb3IoIk1vY2hpS2l0LlZpc3VhbC5zbGlkZVVwIG11c3QgYmUgdXNlZCBvbiBhIGVsZW1lbnQgd2l0aCBhIGNoaWxkIik7DQp9DQpkLnJlbW92ZUVtcHR5VGV4dE5vZGVzKF83NjMpOw0KdmFyIF83Njg9cy5nZXRTdHlsZShfNzYzLmZpcnN0Q2hpbGQsImJvdHRvbSIpOw0KdmFyIF83Njk9cy5nZXRFbGVtZW50RGltZW5zaW9ucyhfNzYzLHRydWUpOw0KdmFyIF83NmE7DQpfNzY0PWIudXBkYXRlKHtzY2FsZUNvbnRlbnQ6ZmFsc2Usc2NhbGVYOmZhbHNlLHNjYWxlTW9kZTp7b3JpZ2luYWxIZWlnaHQ6Xzc2OS5oLG9yaWdpbmFsV2lkdGg6Xzc2OS53fSxzY2FsZUZyb206MTAwLHJlc3RvcmVBZnRlckZpbmlzaDp0cnVlLGJlZm9yZVN0YXJ0SW50ZXJuYWw6ZnVuY3Rpb24oXzc2Yil7DQpzLm1ha2VQb3NpdGlvbmVkKF83NmIuZWxlbWVudCk7DQpzLm1ha2VQb3NpdGlvbmVkKF83NmIuZWxlbWVudC5maXJzdENoaWxkKTsNCmlmKC9PcGVyYS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7DQpzLnNldFN0eWxlKF83NmIuZWxlbWVudCx7dG9wOiIifSk7DQp9DQpfNzZhPXMubWFrZUNsaXBwaW5nKF83NmIuZWxlbWVudCk7DQpzLnNob3dFbGVtZW50KF83NmIuZWxlbWVudCk7DQp9LGFmdGVyVXBkYXRlSW50ZXJuYWw6ZnVuY3Rpb24oXzc2Yyl7DQp2YXIgXzc2ZD1zLmdldEVsZW1lbnREaW1lbnNpb25zKF83NmMuZWxlbWVudCx0cnVlKTsNCnMuc2V0U3R5bGUoXzc2Yy5lbGVtZW50LmZpcnN0Q2hpbGQse2JvdHRvbTooXzc2Yy5kaW1zWzBdLV83NmQuaCkrInB4In0pOw0KfSxhZnRlckZpbmlzaEludGVybmFsOmZ1bmN0aW9uKF83NmUpew0Kcy5oaWRlRWxlbWVudChfNzZlLmVsZW1lbnQpOw0Kcy51bmRvQ2xpcHBpbmcoXzc2ZS5lbGVtZW50LF83NmEpOw0Kcy51bmRvUG9zaXRpb25lZChfNzZlLmVsZW1lbnQuZmlyc3RDaGlsZCk7DQpzLnVuZG9Qb3NpdGlvbmVkKF83NmUuZWxlbWVudCk7DQpzLnNldFN0eWxlKF83NmUuZWxlbWVudC5maXJzdENoaWxkLHtib3R0b206Xzc2OH0pOw0KfX0sXzc2NCk7DQpyZXR1cm4gbmV3IE1vY2hpS2l0LlZpc3VhbC5TY2FsZShfNzYzLDAsXzc2NCk7DQp9Ow0KTW9jaGlLaXQuVmlzdWFsLnNxdWlzaD1mdW5jdGlvbihfNzZmLF83NzApew0KdmFyIGQ9TW9jaGlLaXQuRE9NOw0KdmFyIGI9TW9jaGlLaXQuQmFzZTsNCnZhciBzPU1vY2hpS2l0LlN0eWxlOw0KdmFyIF83NzQ9cy5nZXRFbGVtZW50RGltZW5zaW9ucyhfNzZmLHRydWUpOw0KdmFyIF83NzU7DQpfNzcwPWIudXBkYXRlKHtyZXN0b3JlQWZ0ZXJGaW5pc2g6dHJ1ZSxzY2FsZU1vZGU6e29yaWdpbmFsSGVpZ2h0Ol83NzQudyxvcmlnaW5hbFdpZHRoOl83NzQuaH0sYmVmb3JlU2V0dXBJbnRlcm5hbDpmdW5jdGlvbihfNzc2KXsNCl83NzU9cy5tYWtlQ2xpcHBpbmcoXzc3Ni5lbGVtZW50KTsNCn0sYWZ0ZXJGaW5pc2hJbnRlcm5hbDpmdW5jdGlvbihfNzc3KXsNCnMuaGlkZUVsZW1lbnQoXzc3Ny5lbGVtZW50KTsNCnMudW5kb0NsaXBwaW5nKF83NzcuZWxlbWVudCxfNzc1KTsNCn19LF83NzApOw0KcmV0dXJuIG5ldyBNb2NoaUtpdC5WaXN1YWwuU2NhbGUoXzc2ZiwvT3BlcmEvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk/MTowLF83NzApOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5ncm93PWZ1bmN0aW9uKF83NzgsXzc3OSl7DQp2YXIgZD1Nb2NoaUtpdC5ET007DQp2YXIgdj1Nb2NoaUtpdC5WaXN1YWw7DQp2YXIgcz1Nb2NoaUtpdC5TdHlsZTsNCl83Nzg9ZC5nZXRFbGVtZW50KF83NzgpOw0KXzc3OT1Nb2NoaUtpdC5CYXNlLnVwZGF0ZSh7ZGlyZWN0aW9uOiJjZW50ZXIiLG1vdmVUcmFuc2l0aW9uOnYuVHJhbnNpdGlvbnMuc2lub2lkYWwsc2NhbGVUcmFuc2l0aW9uOnYuVHJhbnNpdGlvbnMuc2lub2lkYWwsb3BhY2l0eVRyYW5zaXRpb246di5UcmFuc2l0aW9ucy5mdWxsLHNjYWxlQ29udGVudDp0cnVlLHNjYWxlRnJvbUNlbnRlcjpmYWxzZX0sXzc3OSk7DQp2YXIgXzc3ZD17dG9wOl83Nzguc3R5bGUudG9wLGxlZnQ6Xzc3OC5zdHlsZS5sZWZ0LGhlaWdodDpfNzc4LnN0eWxlLmhlaWdodCx3aWR0aDpfNzc4LnN0eWxlLndpZHRoLG9wYWNpdHk6cy5nZXRTdHlsZShfNzc4LCJvcGFjaXR5Iil9Ow0KdmFyIGRpbXM9cy5nZXRFbGVtZW50RGltZW5zaW9ucyhfNzc4LHRydWUpOw0KdmFyIF83N2YsXzc4MDsNCnZhciBfNzgxLF83ODI7DQpzd2l0Y2goXzc3OS5kaXJlY3Rpb24pew0KY2FzZSAidG9wLWxlZnQiOg0KXzc3Zj1fNzgwPV83ODE9Xzc4Mj0wOw0KYnJlYWs7DQpjYXNlICJ0b3AtcmlnaHQiOg0KXzc3Zj1kaW1zLnc7DQpfNzgwPV83ODI9MDsNCl83ODE9LWRpbXMudzsNCmJyZWFrOw0KY2FzZSAiYm90dG9tLWxlZnQiOg0KXzc3Zj1fNzgxPTA7DQpfNzgwPWRpbXMuaDsNCl83ODI9LWRpbXMuaDsNCmJyZWFrOw0KY2FzZSAiYm90dG9tLXJpZ2h0IjoNCl83N2Y9ZGltcy53Ow0KXzc4MD1kaW1zLmg7DQpfNzgxPS1kaW1zLnc7DQpfNzgyPS1kaW1zLmg7DQpicmVhazsNCmNhc2UgImNlbnRlciI6DQpfNzdmPWRpbXMudy8yOw0KXzc4MD1kaW1zLmgvMjsNCl83ODE9LWRpbXMudy8yOw0KXzc4Mj0tZGltcy5oLzI7DQpicmVhazsNCn0NCnZhciBfNzgzPU1vY2hpS2l0LkJhc2UudXBkYXRlKHtiZWZvcmVTZXR1cEludGVybmFsOmZ1bmN0aW9uKF83ODQpew0Kcy5zZXRTdHlsZShfNzg0LmVmZmVjdHNbMF0uZWxlbWVudCx7aGVpZ2h0OiIwcHgifSk7DQpzLnNob3dFbGVtZW50KF83ODQuZWZmZWN0c1swXS5lbGVtZW50KTsNCn0sYWZ0ZXJGaW5pc2hJbnRlcm5hbDpmdW5jdGlvbihfNzg1KXsNCnMudW5kb0NsaXBwaW5nKF83ODUuZWZmZWN0c1swXS5lbGVtZW50KTsNCnMudW5kb1Bvc2l0aW9uZWQoXzc4NS5lZmZlY3RzWzBdLmVsZW1lbnQpOw0Kcy5zZXRTdHlsZShfNzg1LmVmZmVjdHNbMF0uZWxlbWVudCxfNzdkKTsNCn19LF83NzkpOw0KcmV0dXJuIG5ldyB2Lk1vdmUoXzc3OCx7eDpfNzdmLHk6Xzc4MCxkdXJhdGlvbjowLjAxLGJlZm9yZVNldHVwSW50ZXJuYWw6ZnVuY3Rpb24oXzc4Nil7DQpzLmhpZGVFbGVtZW50KF83ODYuZWxlbWVudCk7DQpzLm1ha2VDbGlwcGluZyhfNzg2LmVsZW1lbnQpOw0Kcy5tYWtlUG9zaXRpb25lZChfNzg2LmVsZW1lbnQpOw0KfSxhZnRlckZpbmlzaEludGVybmFsOmZ1bmN0aW9uKF83ODcpew0KbmV3IHYuUGFyYWxsZWwoW25ldyB2Lk9wYWNpdHkoXzc4Ny5lbGVtZW50LHtzeW5jOnRydWUsdG86MSxmcm9tOjAsdHJhbnNpdGlvbjpfNzc5Lm9wYWNpdHlUcmFuc2l0aW9ufSksbmV3IHYuTW92ZShfNzg3LmVsZW1lbnQse3g6Xzc4MSx5Ol83ODIsc3luYzp0cnVlLHRyYW5zaXRpb246Xzc3OS5tb3ZlVHJhbnNpdGlvbn0pLG5ldyB2LlNjYWxlKF83ODcuZWxlbWVudCwxMDAse3NjYWxlTW9kZTp7b3JpZ2luYWxIZWlnaHQ6ZGltcy5oLG9yaWdpbmFsV2lkdGg6ZGltcy53fSxzeW5jOnRydWUsc2NhbGVGcm9tOi9PcGVyYS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KT8xOjAsdHJhbnNpdGlvbjpfNzc5LnNjYWxlVHJhbnNpdGlvbixzY2FsZUNvbnRlbnQ6Xzc3OS5zY2FsZUNvbnRlbnQsc2NhbGVGcm9tQ2VudGVyOl83Nzkuc2NhbGVGcm9tQ2VudGVyLHJlc3RvcmVBZnRlckZpbmlzaDp0cnVlfSldLF83ODMpOw0KfX0pOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5zaHJpbms9ZnVuY3Rpb24oXzc4OCxfNzg5KXsNCnZhciBkPU1vY2hpS2l0LkRPTTsNCnZhciB2PU1vY2hpS2l0LlZpc3VhbDsNCnZhciBzPU1vY2hpS2l0LlN0eWxlOw0KXzc4OD1kLmdldEVsZW1lbnQoXzc4OCk7DQpfNzg5PU1vY2hpS2l0LkJhc2UudXBkYXRlKHtkaXJlY3Rpb246ImNlbnRlciIsbW92ZVRyYW5zaXRpb246di5UcmFuc2l0aW9ucy5zaW5vaWRhbCxzY2FsZVRyYW5zaXRpb246di5UcmFuc2l0aW9ucy5zaW5vaWRhbCxvcGFjaXR5VHJhbnNpdGlvbjp2LlRyYW5zaXRpb25zLm5vbmUsc2NhbGVDb250ZW50OnRydWUsc2NhbGVGcm9tQ2VudGVyOmZhbHNlfSxfNzg5KTsNCnZhciBfNzhkPXt0b3A6Xzc4OC5zdHlsZS50b3AsbGVmdDpfNzg4LnN0eWxlLmxlZnQsaGVpZ2h0Ol83ODguc3R5bGUuaGVpZ2h0LHdpZHRoOl83ODguc3R5bGUud2lkdGgsb3BhY2l0eTpzLmdldFN0eWxlKF83ODgsIm9wYWNpdHkiKX07DQp2YXIgZGltcz1zLmdldEVsZW1lbnREaW1lbnNpb25zKF83ODgsdHJ1ZSk7DQp2YXIgXzc4ZixfNzkwOw0Kc3dpdGNoKF83ODkuZGlyZWN0aW9uKXsNCmNhc2UgInRvcC1sZWZ0IjoNCl83OGY9Xzc5MD0wOw0KYnJlYWs7DQpjYXNlICJ0b3AtcmlnaHQiOg0KXzc4Zj1kaW1zLnc7DQpfNzkwPTA7DQpicmVhazsNCmNhc2UgImJvdHRvbS1sZWZ0IjoNCl83OGY9MDsNCl83OTA9ZGltcy5oOw0KYnJlYWs7DQpjYXNlICJib3R0b20tcmlnaHQiOg0KXzc4Zj1kaW1zLnc7DQpfNzkwPWRpbXMuaDsNCmJyZWFrOw0KY2FzZSAiY2VudGVyIjoNCl83OGY9ZGltcy53LzI7DQpfNzkwPWRpbXMuaC8yOw0KYnJlYWs7DQp9DQp2YXIgXzc5MTsNCnZhciBfNzkyPU1vY2hpS2l0LkJhc2UudXBkYXRlKHtiZWZvcmVTdGFydEludGVybmFsOmZ1bmN0aW9uKF83OTMpew0Kcy5tYWtlUG9zaXRpb25lZChfNzkzLmVmZmVjdHNbMF0uZWxlbWVudCk7DQpfNzkxPXMubWFrZUNsaXBwaW5nKF83OTMuZWZmZWN0c1swXS5lbGVtZW50KTsNCn0sYWZ0ZXJGaW5pc2hJbnRlcm5hbDpmdW5jdGlvbihfNzk0KXsNCnMuaGlkZUVsZW1lbnQoXzc5NC5lZmZlY3RzWzBdLmVsZW1lbnQpOw0Kcy51bmRvQ2xpcHBpbmcoXzc5NC5lZmZlY3RzWzBdLmVsZW1lbnQsXzc5MSk7DQpzLnVuZG9Qb3NpdGlvbmVkKF83OTQuZWZmZWN0c1swXS5lbGVtZW50KTsNCnMuc2V0U3R5bGUoXzc5NC5lZmZlY3RzWzBdLmVsZW1lbnQsXzc4ZCk7DQp9fSxfNzg5KTsNCnJldHVybiBuZXcgdi5QYXJhbGxlbChbbmV3IHYuT3BhY2l0eShfNzg4LHtzeW5jOnRydWUsdG86MCxmcm9tOjEsdHJhbnNpdGlvbjpfNzg5Lm9wYWNpdHlUcmFuc2l0aW9ufSksbmV3IHYuU2NhbGUoXzc4OCwvT3BlcmEvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk/MTowLHtzY2FsZU1vZGU6e29yaWdpbmFsSGVpZ2h0OmRpbXMuaCxvcmlnaW5hbFdpZHRoOmRpbXMud30sc3luYzp0cnVlLHRyYW5zaXRpb246Xzc4OS5zY2FsZVRyYW5zaXRpb24sc2NhbGVDb250ZW50Ol83ODkuc2NhbGVDb250ZW50LHNjYWxlRnJvbUNlbnRlcjpfNzg5LnNjYWxlRnJvbUNlbnRlcixyZXN0b3JlQWZ0ZXJGaW5pc2g6dHJ1ZX0pLG5ldyB2Lk1vdmUoXzc4OCx7eDpfNzhmLHk6Xzc5MCxzeW5jOnRydWUsdHJhbnNpdGlvbjpfNzg5Lm1vdmVUcmFuc2l0aW9ufSldLF83OTIpOw0KfTsNCk1vY2hpS2l0LlZpc3VhbC5wdWxzYXRlPWZ1bmN0aW9uKF83OTUsXzc5Nil7DQp2YXIgZD1Nb2NoaUtpdC5ET007DQp2YXIgdj1Nb2NoaUtpdC5WaXN1YWw7DQp2YXIgYj1Nb2NoaUtpdC5CYXNlOw0KdmFyIF83OWE9TW9jaGlLaXQuU3R5bGUuZ2V0U3R5bGUoXzc5NSwib3BhY2l0eSIpOw0KXzc5Nj1iLnVwZGF0ZSh7ZHVyYXRpb246Myxmcm9tOjAsYWZ0ZXJGaW5pc2hJbnRlcm5hbDpmdW5jdGlvbihfNzliKXsNCk1vY2hpS2l0LlN0eWxlLnNldFN0eWxlKF83OWIuZWxlbWVudCx7Im9wYWNpdHkiOl83OWF9KTsNCn19LF83OTYpOw0KdmFyIF83OWM9Xzc5Ni50cmFuc2l0aW9ufHx2LlRyYW5zaXRpb25zLnNpbm9pZGFsOw0KXzc5Ni50cmFuc2l0aW9uPWZ1bmN0aW9uKHBvcyl7DQpyZXR1cm4gXzc5YygxLXYuVHJhbnNpdGlvbnMucHVsc2UocG9zLF83OTYucHVsc2VzKSk7DQp9Ow0KcmV0dXJuIG5ldyB2Lk9wYWNpdHkoXzc5NSxfNzk2KTsNCn07DQpNb2NoaUtpdC5WaXN1YWwuZm9sZD1mdW5jdGlvbihfNzllLF83OWYpew0KdmFyIGQ9TW9jaGlLaXQuRE9NOw0KdmFyIHY9TW9jaGlLaXQuVmlzdWFsOw0KdmFyIHM9TW9jaGlLaXQuU3R5bGU7DQpfNzllPWQuZ2V0RWxlbWVudChfNzllKTsNCnZhciBfN2EzPXMuZ2V0RWxlbWVudERpbWVuc2lvbnMoXzc5ZSx0cnVlKTsNCnZhciBfN2E0PXt0b3A6Xzc5ZS5zdHlsZS50b3AsbGVmdDpfNzllLnN0eWxlLmxlZnQsd2lkdGg6Xzc5ZS5zdHlsZS53aWR0aCxoZWlnaHQ6Xzc5ZS5zdHlsZS5oZWlnaHR9Ow0KdmFyIF83YTU9cy5tYWtlQ2xpcHBpbmcoXzc5ZSk7DQpfNzlmPU1vY2hpS2l0LkJhc2UudXBkYXRlKHtzY2FsZUNvbnRlbnQ6ZmFsc2Usc2NhbGVYOmZhbHNlLHNjYWxlTW9kZTp7b3JpZ2luYWxIZWlnaHQ6XzdhMy5oLG9yaWdpbmFsV2lkdGg6XzdhMy53fSxhZnRlckZpbmlzaEludGVybmFsOmZ1bmN0aW9uKF83YTYpew0KbmV3IHYuU2NhbGUoXzc5ZSwxLHtzY2FsZUNvbnRlbnQ6ZmFsc2Usc2NhbGVZOmZhbHNlLHNjYWxlTW9kZTp7b3JpZ2luYWxIZWlnaHQ6XzdhMy5oLG9yaWdpbmFsV2lkdGg6XzdhMy53fSxhZnRlckZpbmlzaEludGVybmFsOmZ1bmN0aW9uKF83YTcpew0Kcy5oaWRlRWxlbWVudChfN2E3LmVsZW1lbnQpOw0Kcy51bmRvQ2xpcHBpbmcoXzdhNy5lbGVtZW50LF83YTUpOw0Kcy5zZXRTdHlsZShfN2E3LmVsZW1lbnQsXzdhNCk7DQp9fSk7DQp9fSxfNzlmKTsNCnJldHVybiBuZXcgdi5TY2FsZShfNzllLDUsXzc5Zik7DQp9Ow0KTW9jaGlLaXQuQmFzZS5uYW1lRnVuY3Rpb25zKE1vY2hpS2l0LlZpc3VhbCk7DQpNb2NoaUtpdC5CYXNlLl9leHBvcnRTeW1ib2xzKHRoaXMsTW9jaGlLaXQuVmlzdWFsKTsNCmlmKHR5cGVvZiAoTW9jaGlLaXQpPT0idW5kZWZpbmVkIil7DQpNb2NoaUtpdD17fTsNCn0NCmlmKHR5cGVvZiAoTW9jaGlLaXQuTW9jaGlLaXQpPT0idW5kZWZpbmVkIil7DQpNb2NoaUtpdC5Nb2NoaUtpdD17fTsNCn0NCk1vY2hpS2l0Lk1vY2hpS2l0Lk5BTUU9Ik1vY2hpS2l0Lk1vY2hpS2l0IjsNCk1vY2hpS2l0Lk1vY2hpS2l0LlZFUlNJT049IjEuNSI7DQpNb2NoaUtpdC5Nb2NoaUtpdC5fX3JlcHJfXz1mdW5jdGlvbigpew0KcmV0dXJuICJbIit0aGlzLk5BTUUrIiAiK3RoaXMuVkVSU0lPTisiXSI7DQp9Ow0KTW9jaGlLaXQuTW9jaGlLaXQudG9TdHJpbmc9ZnVuY3Rpb24oKXsNCnJldHVybiB0aGlzLl9fcmVwcl9fKCk7DQp9Ow0KTW9jaGlLaXQuTW9jaGlLaXQuU1VCTU9EVUxFUz1bIkJhc2UiLCJJdGVyIiwiTG9nZ2luZyIsIkRhdGVUaW1lIiwiRm9ybWF0IiwiVGV4dCIsIkFzeW5jIiwiRE9NIiwiU2VsZWN0b3IiLCJTdHlsZSIsIkxvZ2dpbmdQYW5lIiwiQ29sb3IiLCJTaWduYWwiLCJQb3NpdGlvbiIsIlZpc3VhbCIsIkRyYWdBbmREcm9wIiwiU29ydGFibGUiXTsNCihmdW5jdGlvbigpew0KaWYodHlwZW9mIChkb2N1bWVudCk9PSJ1bmRlZmluZWQiKXsNCnJldHVybjsNCn0NCnZhciBfODc0PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTsNCnZhciBfODc1PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjsNCnZhciBfODc2PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7DQp2YXIgXzg3Nz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI7DQp2YXIgXzg3OD0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9rZXltYXN0ZXIvZ2F0ZWtlZXBlci90aGVyZS5pcy5vbmx5Lnh1bCI7DQp2YXIgYmFzZT1udWxsOw0KdmFyIF84N2E9bnVsbDsNCnZhciBfODdiPXt9Ow0KdmFyIGk7DQp2YXIgc3JjOw0KZm9yKGk9MDtpPF84NzQubGVuZ3RoO2krKyl7DQpzcmM9bnVsbDsNCnN3aXRjaChfODc0W2ldLm5hbWVzcGFjZVVSSSl7DQpjYXNlIF84NzY6DQpzcmM9Xzg3NFtpXS5nZXRBdHRyaWJ1dGVOUyhfODc3LCJocmVmIik7DQpicmVhazsNCmRlZmF1bHQ6DQpzcmM9Xzg3NFtpXS5nZXRBdHRyaWJ1dGUoInNyYyIpOw0KYnJlYWs7DQp9DQppZighc3JjKXsNCmNvbnRpbnVlOw0KfQ0KXzg3YltzcmNdPXRydWU7DQppZihzcmMubWF0Y2goL01vY2hpS2l0LmpzKFw/LiopPyQvKSl7DQpiYXNlPXNyYy5zdWJzdHJpbmcoMCxzcmMubGFzdEluZGV4T2YoIk1vY2hpS2l0LmpzIikpOw0KXzg3YT1fODc0W2ldOw0KfQ0KfQ0KaWYoYmFzZT09PW51bGwpew0KcmV0dXJuOw0KfQ0KdmFyIF84N2U9TW9jaGlLaXQuTW9jaGlLaXQuU1VCTU9EVUxFUzsNCmZvcih2YXIgaT0wO2k8Xzg3ZS5sZW5ndGg7aSsrKXsNCmlmKE1vY2hpS2l0W184N2VbaV1dKXsNCmNvbnRpbnVlOw0KfQ0KdmFyIHVyaT1iYXNlK184N2VbaV0rIi5qcyI7DQppZih1cmkgaW4gXzg3Yil7DQpjb250aW51ZTsNCn0NCmlmKF84N2EubmFtZXNwYWNlVVJJPT1fODc2fHxfODdhLm5hbWVzcGFjZVVSST09Xzg3OCl7DQp2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXzg3YS5uYW1lc3BhY2VVUkksInNjcmlwdCIpOw0Kcy5zZXRBdHRyaWJ1dGUoImlkIiwiTW9jaGlLaXRfIitiYXNlK184N2VbaV0pOw0KaWYoXzg3YS5uYW1lc3BhY2VVUkk9PV84NzYpew0Kcy5zZXRBdHRyaWJ1dGVOUyhfODc3LCJocmVmIix1cmkpOw0KfWVsc2V7DQpzLnNldEF0dHJpYnV0ZSgic3JjIix1cmkpOw0KfQ0Kcy5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKTsNCl84N2EucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChzKTsNCn1lbHNlew0KZG9jdW1lbnQud3JpdGUoIjwiK184N2Eubm9kZU5hbWUrIiBzcmM9XCIiK3VyaSsiXCIgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPjwvc2NyaXB0PiIpOw0KfQ0KfQ0KfSkoKTsNCg0KDQoK""")
interpreter = b64decode(r"""LyoKCiAgICBJbnRlcnByZXRlcjogSmF2YVNjcmlwdCBJbnRlcmFjdGl2ZSBJbnRlcnByZXRlcgoKKi8KSW50ZXJwcmV0ZXJNYW5hZ2VyID0gZnVuY3Rpb24gKCkgewogICAgYmluZE1ldGhvZHModGhpcyk7Cn07CgpJbnRlcnByZXRlck1hbmFnZXIucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7CiAgICBjb25uZWN0KCJpbnRlcnByZXRlcl90ZXh0IiwgIm9ua2V5dXAiLCB0aGlzLmtleVVwKTsKICAgIGNvbm5lY3QoImludGVycHJldGVyX3RleHRhcmVhIiwgIm9ua2V5ZG93biIsIHRoaXMuYXJlYUtleURvd24pOwogICAgY29ubmVjdCgiaW50ZXJwcmV0ZXJfZm9ybSIsICJvbnN1Ym1pdCIsIHRoaXMuc3VibWl0KTsKICAgIGdldEVsZW1lbnQoImludGVycHJldGVyX3RleHQiKS5mb2N1cygpOwoKICAgIHRoaXMuYmFubmVyKCk7CiAgICB0aGlzLmxpbmVzID0gW107CiAgICB0aGlzLmhpc3RvcnkgPSBbXTsKICAgIHRoaXMuY3VycmVudEhpc3RvcnkgPSAiIjsKICAgIHRoaXMuaGlzdG9yeVBvcyA9IC0xOwogICAgdGhpcy5ibG9ja2luZ09uID0gbnVsbDsKICAgIGlmICh0eXBlb2YodGhpcy5kb0V2YWwpID09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgLy8gZGV0ZWN0IGJyb2tlbiBldmFsLCB3YXJuIGF0IHNvbWUgcG9pbnQgaWYgYSBuYW1lc3BhY2UgZXZlciBnZXRzIHVzZWQKICAgICAgICB0aGlzLmRvRXZhbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGV2YWwoYXJndW1lbnRzWzBdKTsKICAgICAgICB9CiAgICB9CiAgICB3aW5kb3cuaGVscCA9IHRoaXMuaGVscDsKICAgIHRoaXMuaGVscC5OQU1FID0gJ3R5cGUgaGVscChmdW5jKSBmb3IgaGVscCBvbiBhIE1vY2hpS2l0IGZ1bmN0aW9uJzsKfTsKCkludGVycHJldGVyTWFuYWdlci5wcm90b3R5cGUuYmFubmVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIF91YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50OwogICAgdmFyIHVhID0gX3VhLnJlcGxhY2UoL15Nb3ppbGxhXC8uKj9cKC4qP1wpXHMqLywgIiIpOwogICAgaWYgKHVhID09ICIiKSB7CiAgICAgICAgLy8gTVNJRQogICAgICAgIHVhID0gX3VhLnJlcGxhY2UoL15Nb3ppbGxhXC80XC4wIFwoY29tcGF0aWJsZTsgTVMoSUUgLio/KTsuKiQvLCAiJDEiKTsKICAgIH0KICAgIGFwcGVuZENoaWxkTm9kZXMoImludGVycHJldGVyX291dHB1dCIsCiAgICAgICAgU1BBTih7ImNsYXNzIjogImJhbm5lciJ9LAogICAgICAgICAgICAiTW9jaGlLaXQgdiIgKyBNb2NoaUtpdC5CYXNlLlZFUlNJT04gKyAiIFsiICsgdWEgKyAiXSIsCiAgICAgICAgICAgIEJSKCksCiAgICAgICAgICAgICJUeXBlIHlvdXIgZXhwcmVzc2lvbiBpbiB0aGUgaW5wdXQgYm94IGJlbG93IGFuZCBwcmVzcyByZXR1cm4sIG9yIHNlZSB0aGUgbm90ZXMgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiwKICAgICAgICAgICAgQlIoKQogICAgICAgICksCiAgICAgICAgQlIoKQogICAgKTsKfTsKCkludGVycHJldGVyTWFuYWdlci5wcm90b3R5cGUuc3VibWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBpZiAodGhpcy5ibG9ja2luZ09uKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5ibG9ja2luZ09uLmNhbmNlbCgpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgdGhpcy5zaG93RXJyb3IoZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuYmxvY2tpbmdPbiA9IG51bGw7CiAgICB9CiAgICB0aGlzLmRvU3VibWl0KCk7CiAgICB0aGlzLmRvU2Nyb2xsKCk7CiAgICBldmVudC5zdG9wKCk7Cn07CgpJbnRlcnByZXRlck1hbmFnZXIucHJvdG90eXBlLmhlbHAgPSBmdW5jdGlvbiAoZm4pIHsKICAgIGlmIChmbiAmJiBmbi5OQU1FKSB7CiAgICAgICAgZm4gPSBmbi5OQU1FOwogICAgfQogICAgaWYgKHR5cGVvZihmbikgIT0gInN0cmluZyIgfHwgZm4ubGVuZ3RoID09IDApIHsKICAgICAgICB3cml0ZWxuKCJoZWxwKGZ1bmMpIG9uIGFueSBNb2NoaUtpdCBmdW5jdGlvbiBmb3IgaGVscCIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBjb21wcyA9IGZuLnNwbGl0KCcuJyk7CiAgICB2YXIgYmFzZSA9IGNvbXBzLnNwbGljZSgwLCAyKTsKICAgIHZhciBzaG9ydGZuID0gY29tcHMuam9pbignLicpOwogICAgdmFyIHVybCA9ICcuLi8uLi9kb2MvaHRtbC8nICsgYmFzZS5qb2luKCcvJykgKyAnLmh0bWwnOwogICAgdmFyIGQgPSBkb1hIUih1cmwsIHttaW1lVHlwZTogJ3RleHQveG1sJ30pOwogICAgZC5hZGRDYWxsYmFjayhmdW5jdGlvbiAocmVxKSB7CiAgICAgICAgdmFyIGVscyA9IGdldEVsZW1lbnRzQnlUYWdBbmRDbGFzc05hbWUoCiAgICAgICAgICAgICdhJywgJ21vY2hpZGVmJywgcmVxLnJlc3BvbnNlWE1MKTsKICAgICAgICB2YXIgbWF0Y2ggPSAnI2ZuLScgKyBzaG9ydGZuLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGVsZW0gPSBlbHNbaV07CiAgICAgICAgICAgIHZhciBocmVmID0gZWxlbS5ocmVmOwogICAgICAgICAgICB2YXIgaWR4ID0gaHJlZi5pbmRleE9mKCcjJyk7CiAgICAgICAgICAgIGlmIChpZHggIT0gLTEgJiYgaHJlZi5zdWJzdHJpbmcoaWR4KSA9PSBtYXRjaCkgewogICAgICAgICAgICAgICAgd3JpdGVsbihBKHtocmVmOiB1cmwgKyBtYXRjaCwgdGFyZ2V0OiAnX2JsYW5rJ30sCiAgICAgICAgICAgICAgICAgICAgc2NyYXBlVGV4dChlbGVtKSkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdyaXRlbG4oJ2RvY3VtZW50YXRpb24gZm9yICcgKyBmbiArICcgbm90IGZvdW5kJyk7CiAgICB9KTsKICAgIGJsb2NrT24oZCk7Cn07CgoKSW50ZXJwcmV0ZXJNYW5hZ2VyLnByb3RvdHlwZS5kb1Njcm9sbCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBwID0gZ2V0RWxlbWVudCgiaW50ZXJwcmV0ZXJfb3V0cHV0IikubGFzdENoaWxkOwogICAgaWYgKHR5cGVvZihwKSA9PSAidW5kZWZpbmVkIiB8fCBwID09IG51bGwpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgYXJlYSA9IGdldEVsZW1lbnQoImludGVycHJldGVyX2FyZWEiKTsKICAgIGlmIChhcmVhLm9mZnNldEhlaWdodCA+IGFyZWEuc2Nyb2xsSGVpZ2h0KSB7CiAgICAgICAgYXJlYS5zY3JvbGxUb3AgPSAwOwogICAgfSBlbHNlIHsKICAgICAgICBhcmVhLnNjcm9sbFRvcCA9IGFyZWEuc2Nyb2xsSGVpZ2h0OwogICAgfQp9OwoKSW50ZXJwcmV0ZXJNYW5hZ2VyLnByb3RvdHlwZS5tb3ZlSGlzdG9yeSA9IGZ1bmN0aW9uIChkaXIpIHsKICAgIC8vIHRvdGFsbHkgYm9ndXMgdmFsdWUKICAgIGlmIChkaXIgPT0gMCB8fCB0aGlzLmhpc3RvcnkubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgZWxlbSA9IGdldEVsZW1lbnQoImludGVycHJldGVyX3RleHQiKTsKICAgIGlmICh0aGlzLmhpc3RvcnlQb3MgPT0gLTEpIHsKICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5ID0gZWxlbS52YWx1ZTsKICAgICAgICBpZiAoZGlyID4gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaGlzdG9yeVBvcyA9IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxOwogICAgICAgIGVsZW0udmFsdWUgPSB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5UG9zXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5oaXN0b3J5UG9zID09IDAgJiYgZGlyIDwgMCkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLmhpc3RvcnlQb3MgPT0gdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEgJiYgZGlyID4gMCkgewogICAgICAgIHRoaXMuaGlzdG9yeVBvcyA9IC0xOwogICAgICAgIGVsZW0udmFsdWUgPSB0aGlzLmN1cnJlbnRIaXN0b3J5OwogICAgICAgIHJldHVybjsKICAgIH0gCiAgICB0aGlzLmhpc3RvcnlQb3MgKz0gZGlyOwogICAgZWxlbS52YWx1ZSA9IHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlQb3NdOwp9CgpJbnRlcnByZXRlck1hbmFnZXIucHJvdG90eXBlLnJ1bk11bHRpcGxlTGluZXMgPSBmdW5jdGlvbiAodGV4dCkgewogICAgdmFyIGxpbmVzID0gcnN0cmlwKHRleHQpLnJlcGxhY2UoIlxyXG4iLCAiXG4iKS5zcGxpdCgvXG4vKTsKICAgIGFwcGVuZENoaWxkTm9kZXMoImludGVycHJldGVyX291dHB1dCIsCiAgICAgICAgU1BBTih7ImNsYXNzIjogImNvZGUifSwgIj4+PiAiLCBpemlwKGxpbmVzLCBpbWFwKEJSLCBjeWNsZShbbnVsbF0pKSkpCiAgICApOwogICAgdGhpcy5ydW5Db2RlKHRleHQpOwp9CgpJbnRlcnByZXRlck1hbmFnZXIucHJvdG90eXBlLmFyZWFLZXlEb3duID0gZnVuY3Rpb24gKGUpIHsKICAgIHZhciBtb2QgPSBlLm1vZGlmaWVyKCk7CiAgICB2YXIgaGFzTW9kID0gbW9kLmFsdCB8fCBtb2QuY3RybCB8fCBtb2QubWV0YTsKICAgIGlmIChlLmtleSgpLnN0cmluZyA9PSAnS0VZX0VOVEVSJyAmJiBoYXNNb2QpIHsKICAgICAgICB2YXIgZWxlbSA9IGdldEVsZW1lbnQoImludGVycHJldGVyX3RleHRhcmVhIik7CiAgICAgICAgdmFyIHRleHQgPSBlbGVtLnZhbHVlOwogICAgICAgIGVsZW0udmFsdWUgPSAiIjsKICAgICAgICB0aGlzLnJ1bk11bHRpcGxlTGluZXModGV4dCk7CiAgICAgICAgZS5zdG9wKCk7CiAgICB9Cn07CgpJbnRlcnByZXRlck1hbmFnZXIucHJvdG90eXBlLmtleVVwID0gZnVuY3Rpb24gKGUpIHsKICAgIHZhciBrZXkgPSBlLmtleSgpOwogICAgLy8gaWYgYW55IG1ldGEga2V5IGlzIHByZXNzZWQsIGRvbid0IGhhbmRsZSB0aGUgc2lnbmFsCiAgICBpZiAoZS5tb2RpZmllcigpLmFueSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHN3aXRjaCAoa2V5LnN0cmluZykgewogICAgICAgIGNhc2UgJ0tFWV9BUlJPV19VUCc6IHRoaXMubW92ZUhpc3RvcnkoLTEpOyBicmVhazsKICAgICAgICBjYXNlICdLRVlfQVJST1dfRE9XTic6IHRoaXMubW92ZUhpc3RvcnkoMSk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IHJldHVybjsKICAgIH0KICAgIGUuc3RvcCgpOwp9OwoKSW50ZXJwcmV0ZXJNYW5hZ2VyLnByb3RvdHlwZS5ibG9ja09uID0gZnVuY3Rpb24gKGQpIHsKICAgIHZhciBub2RlID0gU1BBTih7ImNsYXNzIjogImJhbm5lciJ9LCAiYmxvY2tpbmcgb24gIiArIHJlcHIoZCkgKyAiLi4uIik7CiAgICB0aGlzLmJsb2NraW5nT24gPSBkOwogICAgYXBwZW5kQ2hpbGROb2RlcygiaW50ZXJwcmV0ZXJfb3V0cHV0Iiwgbm9kZSk7CiAgICB0aGlzLmRvU2Nyb2xsKCk7CiAgICBkLmFkZEJvdGgoZnVuY3Rpb24gKHJlcykgewogICAgICAgIHN3YXBET00obm9kZSk7CiAgICAgICAgdGhpcy5ibG9ja2luZ09uID0gbnVsbDsKICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgQ2FuY2VsbGVkRXJyb3IpIHsKICAgICAgICAgICAgd2luZG93LndyaXRlbG4oU1BBTih7ImNsYXNzIjogImVycm9yIn0sIHJlcHIoZCkgKyAiIGNhbmNlbGxlZCEiKSk7CiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9KTsKICAgIGQuYWRkQ2FsbGJhY2tzKHRoaXMuc2hvd1Jlc3VsdCwgdGhpcy5zaG93RXJyb3IpOwp9OwoKSW50ZXJwcmV0ZXJNYW5hZ2VyLnByb3RvdHlwZS5zaG93RXJyb3IgPSBmdW5jdGlvbiAoZSkgewogICAgaWYgKHR5cGVvZihlKSAhPSAib2JqZWN0IikgewogICAgICAgIGUgPSBuZXcgRXJyb3IoZSk7CiAgICB9CiAgICBhcHBlbmRDaGlsZE5vZGVzKCJpbnRlcnByZXRlcl9vdXRwdXQiLAogICAgICAgIFNQQU4oeyJjbGFzcyI6ICJlcnJvciJ9LCAiRXJyb3I6IiksCiAgICAgICAgVEFCTEUoeyJjbGFzcyI6ICJlcnJvciJ9LAogICAgICAgICAgICBUSEVBRCh7ImNsYXNzIjogImludmlzaWJsZSJ9LCBURCh7ImNvbHNwYW4iOiAyfSkpLAogICAgICAgICAgICBURk9PVCh7ImNsYXNzIjogImludmlzaWJsZSJ9LCBURCh7ImNvbHNwYW4iOiAyfSkpLAogICAgICAgICAgICBUQk9EWShudWxsLAogICAgICAgICAgICAgICAgbWFwKGZ1bmN0aW9uIChrdikgewogICAgICAgICAgICAgICAgICAgIHZhciB2ID0ga3ZbMV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2KSA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2KSA9PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgICAgICAgICB2ID0gcmVwcih2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSKG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIFREKHsiY2xhc3MiOiAiZXJyb3IifSwga3ZbMF0pLAogICAgICAgICAgICAgICAgICAgICAgICBURCh7ImNsYXNzIjogImRhdGEifSwgdikKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSwgc29ydGVkKGl0ZW1zKGUpKSkKICAgICAgICAgICAgKQogICAgICAgICkKICAgICk7CiAgICB3aW5kb3cubGFzdF9leGMgPSBlOwogICAgdGhpcy5kb1Njcm9sbCgpOwp9OwoKRXZhbEZ1bmN0aW9ucyA9IHsKICAgIGV2YWxXaXRoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgd2l0aCAoYXJndW1lbnRzWzFdIHx8IHdpbmRvdykgeyByZXR1cm4gZXZhbChhcmd1bWVudHNbMF0pOyB9OwogICAgfSwKICAgIGV2YWxDYWxsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIGV2YWwuY2FsbChhcmd1bWVudHNbMV0gfHwgd2luZG93LCBhcmd1bWVudHNbMF0pOwogICAgfSwKICAgIGNob29zZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBucyA9IHtfX3Rlc3RfXzogdGhpc307CiAgICAgICAgdmFyIGU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHRoaXMuZXZhbFdpdGgoInJldHVybiBfX3Rlc3RfXyIsIG5zKSA9PT0gdGhpcykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbFdpdGg7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIHBhc3MKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHRoaXMuZXZhbENhbGwoInJldHVybiBfX3Rlc3RfXyIsIG5zKSA9PT0gdGhpcykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbENhbGw7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIHBhc3MKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KfTsKICAgICAgICAKSW50ZXJwcmV0ZXJNYW5hZ2VyLnByb3RvdHlwZS5kb0V2YWwgPSBFdmFsRnVuY3Rpb25zLmNob29zZSgpOwoKSW50ZXJwcmV0ZXJNYW5hZ2VyLnByb3RvdHlwZS5kb1N1Ym1pdCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtID0gZ2V0RWxlbWVudCgiaW50ZXJwcmV0ZXJfdGV4dCIpOwogICAgdmFyIGNvZGUgPSBlbGVtLnZhbHVlOwogICAgZWxlbS52YWx1ZSA9ICIiOwogICAgdmFyIGlzQ29udGludWF0aW9uID0gZmFsc2U7CiAgICBpZiAoY29kZS5sZW5ndGggPj0gMiAmJiBjb2RlLmxhc3RJbmRleE9mKCIvLyIpID09IGNvZGUubGVuZ3RoIC0gMikgewogICAgICAgIGlzQ29udGludWF0aW9uID0gdHJ1ZTsKICAgICAgICBjb2RlID0gY29kZS5zdWJzdHIoMCwgY29kZS5sZW5ndGggLSAyKTsKICAgIH0KICAgIGFwcGVuZENoaWxkTm9kZXMoImludGVycHJldGVyX291dHB1dCIsCiAgICAgICAgU1BBTih7ImNsYXNzIjogImNvZGUifSwgIj4+PiAiLCBjb2RlKSwKICAgICAgICBCUigpCiAgICApOwogICAgdGhpcy5saW5lcy5wdXNoKGNvZGUpOwogICAgdGhpcy5oaXN0b3J5LnB1c2goY29kZSk7CiAgICB0aGlzLmhpc3RvcnlQb3MgPSAtMTsKICAgIHRoaXMuY3VycmVudEhpc3RvcnkgPSAiIjsKICAgIGlmIChpc0NvbnRpbnVhdGlvbikgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBhbGxDb2RlID0gdGhpcy5saW5lcy5qb2luKCJcbiIpOwogICAgdGhpcy5saW5lcyA9IFtdOwogICAgdGhpcy5ydW5Db2RlKGFsbENvZGUpOwogICAgcmV0dXJuOwp9OwoKSW50ZXJwcmV0ZXJNYW5hZ2VyLnByb3RvdHlwZS5ydW5Db2RlID0gZnVuY3Rpb24gKGFsbENvZGUpIHsKICAgIHZhciByZXM7CiAgICB0cnkgewogICAgICAgIHJlcyA9IHRoaXMuZG9FdmFsKGFsbENvZGUpOwogICAgfSBjYXRjaCAoZSkgewogICAgICAgIC8vIG1vemlsbGEgc2hvd3Mgc29tZSBrZXlzIG1vcmUgdGhhbiBvbmNlIQogICAgICAgIHRoaXMuc2hvd0Vycm9yKGUpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuc2hvd1Jlc3VsdChyZXMpOwp9OwoKSW50ZXJwcmV0ZXJNYW5hZ2VyLnByb3RvdHlwZS5zaG93UmVzdWx0ID0gZnVuY3Rpb24gKHJlcykgewogICAgaWYgKHR5cGVvZihyZXMpICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgd2luZG93Ll8gPSByZXM7CiAgICB9CiAgICBpZiAodHlwZW9mKHJlcykgIT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBhcHBlbmRDaGlsZE5vZGVzKCJpbnRlcnByZXRlcl9vdXRwdXQiLAogICAgICAgICAgICBTUEFOKHsiY2xhc3MiOiAiZGF0YSJ9LCByZXByKHJlcykpLAogICAgICAgICAgICBCUigpCiAgICAgICAgKTsKICAgICAgICB0aGlzLmRvU2Nyb2xsKCk7CiAgICB9Cn07Cgp3aW5kb3cud3JpdGVsbiA9IGZ1bmN0aW9uICgpIHsKICAgIGFwcGVuZENoaWxkTm9kZXMoImludGVycHJldGVyX291dHB1dCIsCiAgICAgICAgU1BBTih7ImNsYXNzIjogImRhdGEifSwgYXJndW1lbnRzKSwKICAgICAgICBCUigpCiAgICApOwogICAgaW50ZXJwcmV0ZXJNYW5hZ2VyLmRvU2Nyb2xsKCk7Cn07Cgp3aW5kb3cuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CiAgICByZXBsYWNlQ2hpbGROb2RlcygiaW50ZXJwcmV0ZXJfb3V0cHV0Iik7CiAgICBnZXRFbGVtZW50KCJpbnRlcnByZXRlcl9hcmVhIikuc2Nyb2xsVG9wID0gMDsKfTsKCndpbmRvdy5ibG9ja09uID0gZnVuY3Rpb24gKGQpIHsKICAgIGlmICghKGQgaW5zdGFuY2VvZiBEZWZlcnJlZCkpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHJlcHIoZCkgKyAiIGlzIG5vdCBhIERlZmVycmVkISIpOwogICAgfQogICAgaW50ZXJwcmV0ZXJNYW5hZ2VyLmJsb2NrT24oZCk7Cn07Cgp3aW5kb3cuZGlyID0gZnVuY3Rpb24gKG8pIHsKICAgIC8vIFB5dGhvbiBtdXNjbGUgbWVtb3J5IQogICAgcmV0dXJuIHNvcnRlZChrZXlzKG8pKTsKfTsKCndpbmRvdy5pbnNwZWN0ID0gZnVuY3Rpb24gKG8pIHsKICAgIHdpbmRvdy5fID0gbzsKICAgIGlmICgodHlwZW9mKG8pICE9ICJmdW5jdGlvbiIgJiYgdHlwZW9mKG8pICE9ICJvYmplY3QiKSB8fCBvID09IG51bGwpIHsKICAgICAgICB3aW5kb3cud3JpdGVsbihyZXByKG8pKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgcGFpcnMgPSBpdGVtcyhvKTsKICAgIGlmIChwYWlycy5sZW5ndGggPT0gMCkgewogICAgICAgIHdpbmRvdy53cml0ZWxuKHJlcHIobykpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy53cml0ZWxuKFRBQkxFKHsiYm9yZGVyIjogIjEifSwKICAgICAgICBUSEVBRCh7ImNsYXNzIjogImludmlzaWJsZSJ9LCBUUihudWxsLCBURCgpLCBURCgpKSksCiAgICAgICAgVEZPT1QoeyJjbGFzcyI6ICJpbnZpc2libGUifSwgVFIobnVsbCwgVEQoKSwgVEQoKSkpLAogICAgICAgIFRCT0RZKG51bGwsCiAgICAgICAgICAgIG1hcCgKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChrdikgewogICAgICAgICAgICAgICAgICAgIHZhciBjbGljayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5pbnNwZWN0KGt2WzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXJNYW5hZ2VyLnNob3dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBUUihudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBURChudWxsLCBBKHtocmVmOiAiIyIsIG9uY2xpY2s6IGNsaWNrfSwga3ZbMF0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgVEQobnVsbCwgcmVwcihrdlsxXSkpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwYWlycwogICAgICAgICAgICApCiAgICAgICAgKQogICAgKSk7Cn07CiAgICAKaW50ZXJwcmV0ZXJNYW5hZ2VyID0gbmV3IEludGVycHJldGVyTWFuYWdlcigpOwphZGRMb2FkRXZlbnQoaW50ZXJwcmV0ZXJNYW5hZ2VyLmluaXRpYWxpemUpOwoKLy8gcmV3cml0ZSB0aGUgdmlldy1zb3VyY2UgbGlua3MKYWRkTG9hZEV2ZW50KGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtcyA9IGdldEVsZW1lbnRzQnlUYWdBbmRDbGFzc05hbWUoIkEiLCAidmlldy1zb3VyY2UiKTsKICAgIHZhciBwYWdlID0gImludGVycHJldGVyLyI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGVsZW0gPSBlbGVtc1tpXTsKICAgICAgICB2YXIgaHJlZiA9IGVsZW0uaHJlZi5zcGxpdCgvXC8vKS5wb3AoKTsKICAgICAgICBlbGVtLnRhcmdldCA9ICJfYmxhbmsiOwogICAgICAgIGVsZW0uaHJlZiA9ICIuLi92aWV3LXNvdXJjZS92aWV3LXNvdXJjZS5odG1sIyIgKyBwYWdlICsgaHJlZjsKICAgIH0KfSk7""")
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.