WyI8IS0tIEZhY2Vib29rIFBpeGVsIENvZGUgLS0+XG4gICAgPHNjcmlwdD5cbiAgICAgICAgZnVuY3Rpb24gZ2V0RkJDb29raWUoY25hbWUpIHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gY25hbWUgKyBcIj1cIjtcbiAgICAgICAgICAgIGxldCBkZWNvZGVkQ29va2llID0gZGVjb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmNvb2tpZSk7XG4gICAgICAgICAgICBsZXQgY2EgPSBkZWNvZGVkQ29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGMgPSBjYVtpXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoYy5jaGFyQXQoMCkgPT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnN1YnN0cmluZyhuYW1lLmxlbmd0aCwgYy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VXJsUGFyYW1ldGVyKHBhcmFtKSB7XG4gICAgICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICAgICAgcmV0dXJuIHVybFBhcmFtcy5nZXQocGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICFmdW5jdGlvbiAoZiwgYiwgZSwgdiwgbiwgdCwgcykge1xuICAgICAgICAgICAgaWYgKGYuZmJxKSByZXR1cm47XG4gICAgICAgICAgICBuID0gZi5mYnEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbi5jYWxsTWV0aG9kID9cbiAgICAgICAgICAgICAgICAgICAgbi5jYWxsTWV0aG9kLmFwcGx5KG4sIGFyZ3VtZW50cykgOiBuLnF1ZXVlLnB1c2goYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoIWYuX2ZicSkgZi5fZmJxID0gbjtcbiAgICAgICAgICAgIG4ucHVzaCA9IG47XG4gICAgICAgICAgICBuLmxvYWRlZCA9ICEwO1xuICAgICAgICAgICAgbi52ZXJzaW9uID0gXCIyLjBcIjtcbiAgICAgICAgICAgIG4ucXVldWUgPSBbXTtcbiAgICAgICAgICAgIHQgPSBiLmNyZWF0ZUVsZW1lbnQoZSk7XG4gICAgICAgICAgICB0LmFzeW5jID0gITA7XG4gICAgICAgICAgICB0LnNyYyA9IHY7XG4gICAgICAgICAgICBzID0gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShlKVswXTtcbiAgICAgICAgICAgIHMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCwgcyk7XG4gICAgICAgIH0od2luZG93LCBkb2N1bWVudCwgXCJzY3JpcHRcIixcbiAgICAgICAgICAgIFwiaHR0cHM6Ly9jb25uZWN0LmZhY2Vib29rLm5ldC9lbl9VUy9mYmV2ZW50cy5qc1wiKTtcblxuICAgICAgICBmYnEoXCJpbml0XCIsICcxNjExMjExODUzOTk3OTQ2Jyk7XG4gICAgICAgICAgICAgICAgbGV0IGV2ZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBmYnAgPSBnZXRGQkNvb2tpZSgnX2ZicCcpO1xuICAgICAgICBsZXQgZmJjID0gZ2V0RkJDb29raWUoJ19mYmMnKTtcbiAgICAgICAgbGV0IGZiY2xpZCA9IGdldFVybFBhcmFtZXRlcignZmJjbGlkJyk7XG5cbiAgICAgICAgXG4gICAgICAgIGlmIChmYmMgPT09IFwiXCIgJiYgZmJjbGlkKSB7XG4gICAgICAgICAgICBmYmMgPSBgZmIuMS4ke2V2ZW50VGltZX0uJHtmYmNsaWR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHhJZCA9IGdldFVybFBhcmFtZXRlcignZm9ybV9zdWJtaXNzaW9uX2lkJykgPz8gZXZlbnRUaW1lO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBldmVudCA9IGdldFVybFBhcmFtZXRlcignZm9ybV9zdWJtaXNzaW9uX2lkJykgPyAnTGVhZCcgOiAnUGFnZVZpZXcnO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRJRCA9IGBwYWdlLiR7ZXZlbnR9LnR4XyR7dHhJZH1gO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGRlZHVwbGljYXRpb25LZXkgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9zdCA9IHtcbiAgICAgICAgICAgICAgZG9tYWluOiAnc2NoZWZmZW5iZXJnaC5ubCcsXG4gICAgICAgICAgICAgIGNvbnZlcnNpb25fdHlwZTogJ1BhZ2VWaWV3JyxcbiAgICAgICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50SUQsXG4gICAgICAgICAgICAgIGV2ZW50X3RpbWU6IGV2ZW50VGltZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChnZXRVcmxQYXJhbWV0ZXIoXCJwYWdlc2VcIikpIHtcbiAgICAgICAgICAgICAgcG9zdC5lbWFpbCA9IGdldFVybFBhcmFtZXRlcihcInBhZ2VzZVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdldFVybFBhcmFtZXRlcihcInBhZ2VzZlwiKSkge1xuICAgICAgICAgICAgICBwb3N0LmZpcnN0X25hbWUgPSBnZXRVcmxQYXJhbWV0ZXIoXCJwYWdlc2ZcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChnZXRVcmxQYXJhbWV0ZXIoXCJwYWdlc2xcIikpIHtcbiAgICAgICAgICAgICAgcG9zdC5sYXN0X25hbWUgPSBnZXRVcmxQYXJhbWV0ZXIoXCJwYWdlc2xcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmYnAgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgcG9zdC5mYnAgPSBmYnA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmYmMgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgcG9zdC5mYmMgPSBmYmM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL3NjaGVmZmVuYmVyZ2gubmwvY2xpZW50L2ZhY2Vib29rLWNvbnZlcnNpb24vZXZlbnRzJztcbiAgICAgICAgICAgIGxldCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCB1cmwsIHRydWUpO1xuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04XCIpO1xuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLVJlcXVlc3RlZC1XaXRoXCIsIFwiWE1MSHR0cFJlcXVlc3RcIik7XG4gICAgICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShwb3N0KSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBldmVudFN0b3JhZ2VLZXkgPSBkZWR1cGxpY2F0aW9uS2V5ID8gJ2ZiX2V2ZW50XycgKyBkZWR1cGxpY2F0aW9uS2V5IDogbnVsbDtcbiAgICAgICAgICAgIGxldCBldmVudFRyYWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChldmVudFN0b3JhZ2VLZXkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBldmVudFRyYWNrZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShldmVudFN0b3JhZ2VLZXkpICE9PSBudWxsO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxTdG9yYWdlIG1heSBiZSB1bmF2YWlsYWJsZSAocHJpdmF0ZSBtb2RlIC8gZGlzYWJsZWQgc3RvcmFnZSk7IGZpcmUgYW55d2F5LlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFldmVudFRyYWNrZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmJEYXRhID0ge307XG5cbiAgICAgICAgICAgICAgICBpZiAoZmJwICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGZiRGF0YS5mYnAgPSBmYnA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZiYyAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBmYkRhdGEuZmJjID0gZmJjO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGZicShcInRyYWNrXCIsICdQYWdlVmlldycsIGZiRGF0YSwgeyBldmVudElEOiBldmVudElEIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50U3RvcmFnZUtleSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oZXZlbnRTdG9yYWdlS2V5LCBldmVudFRpbWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBzdG9yYWdlIGZhaWx1cmVzIChxdW90YSAvIHByaXZhdGUgbW9kZSkuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIDwvc2NyaXB0PlxuICAgIDwhLS0gRW5kIEZhY2Vib29rIFBpeGVsIENvZGUgLS0+XG4iLHsibmFtZSI6ImZiIiwibG9jYXRpb24iOiJoZWFkIiwiY29uc2VudFR5cGUiOiJzdGF0aXN0aWNhbCIsImNvbnRlbnQiOiI8IS0tIEZhY2Vib29rIFBpeGVsIENvZGUgLS0+XG4gICAgPHNjcmlwdD5cbiAgICAgICAgZnVuY3Rpb24gZ2V0RkJDb29raWUoY25hbWUpIHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gY25hbWUgKyBcIj1cIjtcbiAgICAgICAgICAgIGxldCBkZWNvZGVkQ29va2llID0gZGVjb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmNvb2tpZSk7XG4gICAgICAgICAgICBsZXQgY2EgPSBkZWNvZGVkQ29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGMgPSBjYVtpXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoYy5jaGFyQXQoMCkgPT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnN1YnN0cmluZyhuYW1lLmxlbmd0aCwgYy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VXJsUGFyYW1ldGVyKHBhcmFtKSB7XG4gICAgICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICAgICAgcmV0dXJuIHVybFBhcmFtcy5nZXQocGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICFmdW5jdGlvbiAoZiwgYiwgZSwgdiwgbiwgdCwgcykge1xuICAgICAgICAgICAgaWYgKGYuZmJxKSByZXR1cm47XG4gICAgICAgICAgICBuID0gZi5mYnEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbi5jYWxsTWV0aG9kID9cbiAgICAgICAgICAgICAgICAgICAgbi5jYWxsTWV0aG9kLmFwcGx5KG4sIGFyZ3VtZW50cykgOiBuLnF1ZXVlLnB1c2goYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoIWYuX2ZicSkgZi5fZmJxID0gbjtcbiAgICAgICAgICAgIG4ucHVzaCA9IG47XG4gICAgICAgICAgICBuLmxvYWRlZCA9ICEwO1xuICAgICAgICAgICAgbi52ZXJzaW9uID0gXCIyLjBcIjtcbiAgICAgICAgICAgIG4ucXVldWUgPSBbXTtcbiAgICAgICAgICAgIHQgPSBiLmNyZWF0ZUVsZW1lbnQoZSk7XG4gICAgICAgICAgICB0LmFzeW5jID0gITA7XG4gICAgICAgICAgICB0LnNyYyA9IHY7XG4gICAgICAgICAgICBzID0gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShlKVswXTtcbiAgICAgICAgICAgIHMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCwgcyk7XG4gICAgICAgIH0od2luZG93LCBkb2N1bWVudCwgXCJzY3JpcHRcIixcbiAgICAgICAgICAgIFwiaHR0cHM6Ly9jb25uZWN0LmZhY2Vib29rLm5ldC9lbl9VUy9mYmV2ZW50cy5qc1wiKTtcblxuICAgICAgICBmYnEoXCJpbml0XCIsICcxNjExMjExODUzOTk3OTQ2Jyk7XG4gICAgICAgICAgICAgICAgbGV0IGV2ZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBmYnAgPSBnZXRGQkNvb2tpZSgnX2ZicCcpO1xuICAgICAgICBsZXQgZmJjID0gZ2V0RkJDb29raWUoJ19mYmMnKTtcbiAgICAgICAgbGV0IGZiY2xpZCA9IGdldFVybFBhcmFtZXRlcignZmJjbGlkJyk7XG5cbiAgICAgICAgXG4gICAgICAgIGlmIChmYmMgPT09IFwiXCIgJiYgZmJjbGlkKSB7XG4gICAgICAgICAgICBmYmMgPSBgZmIuMS4ke2V2ZW50VGltZX0uJHtmYmNsaWR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHhJZCA9IGdldFVybFBhcmFtZXRlcignZm9ybV9zdWJtaXNzaW9uX2lkJykgPz8gZXZlbnRUaW1lO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBldmVudCA9IGdldFVybFBhcmFtZXRlcignZm9ybV9zdWJtaXNzaW9uX2lkJykgPyAnTGVhZCcgOiAnUGFnZVZpZXcnO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRJRCA9IGBwYWdlLiR7ZXZlbnR9LnR4XyR7dHhJZH1gO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGRlZHVwbGljYXRpb25LZXkgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9zdCA9IHtcbiAgICAgICAgICAgICAgZG9tYWluOiAnc2NoZWZmZW5iZXJnaC5ubCcsXG4gICAgICAgICAgICAgIGNvbnZlcnNpb25fdHlwZTogJ1BhZ2VWaWV3JyxcbiAgICAgICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50SUQsXG4gICAgICAgICAgICAgIGV2ZW50X3RpbWU6IGV2ZW50VGltZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChnZXRVcmxQYXJhbWV0ZXIoXCJwYWdlc2VcIikpIHtcbiAgICAgICAgICAgICAgcG9zdC5lbWFpbCA9IGdldFVybFBhcmFtZXRlcihcInBhZ2VzZVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdldFVybFBhcmFtZXRlcihcInBhZ2VzZlwiKSkge1xuICAgICAgICAgICAgICBwb3N0LmZpcnN0X25hbWUgPSBnZXRVcmxQYXJhbWV0ZXIoXCJwYWdlc2ZcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChnZXRVcmxQYXJhbWV0ZXIoXCJwYWdlc2xcIikpIHtcbiAgICAgICAgICAgICAgcG9zdC5sYXN0X25hbWUgPSBnZXRVcmxQYXJhbWV0ZXIoXCJwYWdlc2xcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmYnAgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgcG9zdC5mYnAgPSBmYnA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmYmMgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgcG9zdC5mYmMgPSBmYmM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL3NjaGVmZmVuYmVyZ2gubmwvY2xpZW50L2ZhY2Vib29rLWNvbnZlcnNpb24vZXZlbnRzJztcbiAgICAgICAgICAgIGxldCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCB1cmwsIHRydWUpO1xuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04XCIpO1xuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLVJlcXVlc3RlZC1XaXRoXCIsIFwiWE1MSHR0cFJlcXVlc3RcIik7XG4gICAgICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShwb3N0KSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBldmVudFN0b3JhZ2VLZXkgPSBkZWR1cGxpY2F0aW9uS2V5ID8gJ2ZiX2V2ZW50XycgKyBkZWR1cGxpY2F0aW9uS2V5IDogbnVsbDtcbiAgICAgICAgICAgIGxldCBldmVudFRyYWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChldmVudFN0b3JhZ2VLZXkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBldmVudFRyYWNrZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShldmVudFN0b3JhZ2VLZXkpICE9PSBudWxsO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxTdG9yYWdlIG1heSBiZSB1bmF2YWlsYWJsZSAocHJpdmF0ZSBtb2RlIC8gZGlzYWJsZWQgc3RvcmFnZSk7IGZpcmUgYW55d2F5LlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFldmVudFRyYWNrZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmJEYXRhID0ge307XG5cbiAgICAgICAgICAgICAgICBpZiAoZmJwICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGZiRGF0YS5mYnAgPSBmYnA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZiYyAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBmYkRhdGEuZmJjID0gZmJjO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGZicShcInRyYWNrXCIsICdQYWdlVmlldycsIGZiRGF0YSwgeyBldmVudElEOiBldmVudElEIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50U3RvcmFnZUtleSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oZXZlbnRTdG9yYWdlS2V5LCBldmVudFRpbWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBzdG9yYWdlIGZhaWx1cmVzIChxdW90YSAvIHByaXZhdGUgbW9kZSkuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIDwvc2NyaXB0PlxuICAgIDwhLS0gRW5kIEZhY2Vib29rIFBpeGVsIENvZGUgLS0+XG4iLCJhdHRyaWJ1dGVzIjpudWxsfSx7Im5hbWUiOiJHb29nbGUgVGFnIE1hbmFnZXIiLCJsb2NhdGlvbiI6ImhlYWQiLCJjb25zZW50VHlwZSI6Im1hcmtldGluZyIsImNvbnRlbnQiOiI8IS0tIEdvb2dsZSBUYWcgTWFuYWdlciAtLT5cbjxzY3JpcHQ+KGZ1bmN0aW9uKHcsZCxzLGwsaSl7d1tsXT13W2xdfHxbXTt3W2xdLnB1c2goeydndG0uc3RhcnQnOlxubmV3IERhdGUoKS5nZXRUaW1lKCksZXZlbnQ6J2d0bS5qcyd9KTt2YXIgZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpWzBdLFxuaj1kLmNyZWF0ZUVsZW1lbnQocyksZGw9bCE9J2RhdGFMYXllcic/JyZsPScrbDonJztqLmFzeW5jPXRydWU7ai5zcmM9XG4naHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RtLmpzP2lkPScraStkbDtmLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGosZik7XG59KSh3aW5kb3csZG9jdW1lbnQsJ3NjcmlwdCcsJ2RhdGFMYXllcicsJ0dUTS1XTkRMTlJDUycpOzwvc2NyaXB0PlxuPCEtLSBFbmQgR29vZ2xlIFRhZyBNYW5hZ2VyIC0tPlxuIiwiYXR0cmlidXRlcyI6W119XQ==
W3sibmFtZSI6IkhlcmtvbXN0IGRlZWwgMSAtIG9wdmFuZ2VuIiwibG9jYXRpb24iOiJib2R5IiwiY29uc2VudFR5cGUiOiJtYXJrZXRpbmciLCJjb250ZW50IjoiPHNjcmlwdD5cbihmdW5jdGlvbiAoKSB7XG4gIC8vIFNjaGVmZmVuYmVyZ2ggLSBoZXJrb21zdCB2YXN0bGVnZ2VuLCBkZWVsIDEgdmFuIDJcbiAgLy8gVmFuZ3QgVVRNLXBhcmFtZXRlcnMgb2YgcmVmZXJyZXIgb3AgZW4gYmV3YWFydCB6ZSBsb2thYWwuXG4gIC8vIERyYWFpdCBvcCBhbGxlIGxhbmRpbmdzcGFnaW5hJ3MsIE5JRVQgb3AgYmVkYW5rLSBlbiBvcmRlcnBhZ2luYSdzLlxuXG4gIHZhciBCRVdBQVJURVJNSUpOX0RBR0VOID0gOTA7XG5cbiAgdmFyIFVJVEdFU0xPVEVOX1BBREVOID0gW1xuICAgICcvbWFzdGVyY2xhc3MtaW5zY2hyaWp2aW5nLWdlbHVrdCcsXG4gICAgJy93ZWJpbmFyLWdlbHVrdCcsXG4gICAgJy9rZW5uaXNtYWtlbi1jb25zdWx0YW5jeScsXG4gICAgJy9rZW5uaXNtYWtlbi1vdXRzb3VyY2luZycsXG4gICAgJy9iZXN0ZWxvdmVyemljaHQnXG4gIF07XG5cbiAgdmFyIGh1aWRpZ1BhZCA9ICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIHZhciB1aXRnZXNsb3RlbiA9IGZhbHNlO1xuICBmb3IgKHZhciB1ID0gMDsgdSA8IFVJVEdFU0xPVEVOX1BBREVOLmxlbmd0aDsgdSsrKSB7XG4gICAgaWYgKGh1aWRpZ1BhZC5pbmRleE9mKFVJVEdFU0xPVEVOX1BBREVOW3VdKSAhPT0gLTEpIHtcbiAgICAgIHVpdGdlc2xvdGVuID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXVpdGdlc2xvdGVuKSB7XG5cbiAgICBmdW5jdGlvbiBsZWVzVXJsKG5hYW0pIHtcbiAgICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldChuYWFtKSB8fCAnJztcbiAgICB9XG5cbiAgICAvLyBCZXBhYWwgZGUgYnJvbjogVVRNJ3MgaGViYmVuIHZvb3JyYW5nLCBhbmRlcnMgcmVmZXJyZXJcbiAgICBmdW5jdGlvbiBiZXBhYWxIZXJrb21zdCgpIHtcbiAgICAgIHZhciBzb3VyY2UgID0gbGVlc1VybCgndXRtX3NvdXJjZScpO1xuICAgICAgdmFyIG1lZGl1bSAgPSBsZWVzVXJsKCd1dG1fbWVkaXVtJyk7XG4gICAgICB2YXIgY29udGVudCA9IGxlZXNVcmwoJ3V0bV9jb250ZW50Jyk7XG4gICAgICB2YXIgaWQgICAgICA9IGxlZXNVcmwoJ3V0bV9pZCcpO1xuXG4gICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgIHJldHVybiB7IHNvdXJjZTogc291cmNlLCBtZWRpdW06IG1lZGl1bSB8fCAnb25iZWtlbmQnLCBjb250ZW50OiBjb250ZW50LCBpZDogaWQgfTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VlbiBVVE0nczogYWZsZWlkZW4gdWl0IHJlZmVycmVyXG4gICAgICB2YXIgcmVmID0gZG9jdW1lbnQucmVmZXJyZXI7XG5cbiAgICAgIGlmICghcmVmKSB7XG4gICAgICAgIHJldHVybiB7IHNvdXJjZTogJ2RpcmVjdCcsIG1lZGl1bTogJ2RpcmVjdCcsIGNvbnRlbnQ6ICcnLCBpZDogJycgfTtcbiAgICAgIH1cblxuICAgICAgdmFyIGhvc3Q7XG4gICAgICB0cnkgeyBob3N0ID0gbmV3IFVSTChyZWYpLmhvc3RuYW1lLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7IH1cbiAgICAgIGNhdGNoIChlKSB7IHJldHVybiB7IHNvdXJjZTogJ2RpcmVjdCcsIG1lZGl1bTogJ2RpcmVjdCcsIGNvbnRlbnQ6ICcnLCBpZDogJycgfTsgfVxuXG4gICAgICAvLyBFaWdlbiBkb21laW4gPSBpbnRlcm5lIG5hdmlnYXRpZSwgbmlldCBvdmVyc2NocmlqdmVuXG4gICAgICBpZiAoaG9zdC5pbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKC9ed3d3XFwuLywgJycpKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICgvZ29vZ2xlXFwufGJpbmdcXC58ZHVja2R1Y2tnb1xcLnx5YWhvb1xcLi8udGVzdChob3N0KSkge1xuICAgICAgICByZXR1cm4geyBzb3VyY2U6IGhvc3Quc3BsaXQoJy4nKVswXSwgbWVkaXVtOiAnb3JnYW5pYycsIGNvbnRlbnQ6ICcnLCBpZDogJycgfTtcbiAgICAgIH1cbiAgICAgIGlmICgvbGlua2VkaW5cXC58ZmFjZWJvb2tcXC58aW5zdGFncmFtXFwufHR3aXR0ZXJcXC58eFxcLmNvbXx5b3V0dWJlXFwuLy50ZXN0KGhvc3QpKSB7XG4gICAgICAgIHJldHVybiB7IHNvdXJjZTogaG9zdC5zcGxpdCgnLicpWzBdLCBtZWRpdW06ICdzb2NpYWwnLCBjb250ZW50OiAnJywgaWQ6ICcnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBzb3VyY2U6IGhvc3QsIG1lZGl1bTogJ3JlZmVycmFsJywgY29udGVudDogJycsIGlkOiAnJyB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJld2FhcihzbGV1dGVsLCB3YWFyZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHNsZXV0ZWwsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBkYXRhOiB3YWFyZGUsXG4gICAgICAgICAgdGlqZDogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgfSkpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYWFsT3Aoc2xldXRlbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJ1dyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHNsZXV0ZWwpO1xuICAgICAgICBpZiAoIXJ1dykgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBvYmogPSBKU09OLnBhcnNlKHJ1dyk7XG4gICAgICAgIHZhciBtYXhMZWVmdGlqZCA9IEJFV0FBUlRFUk1JSk5fREFHRU4gKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgICBpZiAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBvYmoudGlqZCA+IG1heExlZWZ0aWpkKSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc2xldXRlbCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iai5kYXRhO1xuICAgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfVxuICAgIH1cblxuICAgIHZhciBoZXJrb21zdCA9IGJlcGFhbEhlcmtvbXN0KCk7XG5cbiAgICAvLyBudWxsID0gaW50ZXJuZSBuYXZpZ2F0aWUsIG5pZXRzIGRvZW5cbiAgICBpZiAoaGVya29tc3QpIHtcbiAgICAgIC8vIEVlcnN0ZSBiZXpvZWsgYWxsZWVuIHNjaHJpanZlbiBhbHMgaGV0IGVyIG5vZyBuaWV0IGlzXG4gICAgICBpZiAoIWhhYWxPcCgnc2JfaGVya29tc3RfZmlyc3QnKSkge1xuICAgICAgICBiZXdhYXIoJ3NiX2hlcmtvbXN0X2ZpcnN0JywgaGVya29tc3QpO1xuICAgICAgfVxuICAgICAgLy8gTGFhdHN0ZSBiZXpvZWsgYWx0aWpkIGJpandlcmtlblxuICAgICAgYmV3YWFyKCdzYl9oZXJrb21zdF9sYXN0JywgaGVya29tc3QpO1xuICAgIH1cbiAgfVxufSkoKTtcbjwvc2NyaXB0PlxuIiwiYXR0cmlidXRlcyI6W119LHsibmFtZSI6Ik1haWxCbHVlIHNpdGUgdHJhY2tpbmciLCJsb2NhdGlvbiI6ImJvZHkiLCJjb25zZW50VHlwZSI6Im1hcmtldGluZyIsImNvbnRlbnQiOiI8c2NyaXB0PlxuICAgIChmdW5jdGlvbihlLHQsbyxuLHAscixpKXtlLnZpc2l0b3JHbG9iYWxPYmplY3RBbGlhcz1uO2VbZS52aXNpdG9yR2xvYmFsT2JqZWN0QWxpYXNdPWVbZS52aXNpdG9yR2xvYmFsT2JqZWN0QWxpYXNdfHxmdW5jdGlvbigpeyhlW2UudmlzaXRvckdsb2JhbE9iamVjdEFsaWFzXS5xPWVbZS52aXNpdG9yR2xvYmFsT2JqZWN0QWxpYXNdLnF8fFtdKS5wdXNoKGFyZ3VtZW50cyl9O2VbZS52aXNpdG9yR2xvYmFsT2JqZWN0QWxpYXNdLmw9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cj10LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7ci5zcmM9bztyLmFzeW5jPXRydWU7aT10LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpWzBdO2kucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixpKX0pKHdpbmRvdyxkb2N1bWVudCxcImh0dHBzOi8vZGlmZnVzZXItY2RuLmFwcC11czEuY29tL2RpZmZ1c2VyL2RpZmZ1c2VyLmpzXCIsXCJ2Z29cIik7XG4gICAgdmdvKCdzZXRBY2NvdW50JywgJzYxMzQ4NDYyNicpO1xuICAgIHZnbygnc2V0VHJhY2tCeURlZmF1bHQnLCB0cnVlKTtcblxuICAgIHZnbygncHJvY2VzcycpO1xuPC9zY3JpcHQ+XG4iLCJhdHRyaWJ1dGVzIjpbXX1d