-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTes2.js
1 lines (1 loc) · 69.9 KB
/
Tes2.js
1
Ci8qISBqUXVlcnkgRWFzaW5nIHYxLjMgPGh0dHA6Ly9nc2dkLmNvLnVrL3NhbmRib3gvanF1ZXJ5L2Vhc2luZz4gKi8hZnVuY3Rpb24obil7bi5lYXNpbmcuanN3aW5nPW4uZWFzaW5nLnN3aW5nLG4uZXh0ZW5kKG4uZWFzaW5nLHtkZWY6ImVhc2VPdXRRdWFkIixzd2luZzpmdW5jdGlvbih0LGUsdSxhLHIpe3JldHVybiBuLmVhc2luZ1tuLmVhc2luZy5kZWZdKHQsZSx1LGEscil9LGVhc2VJblF1YWQ6ZnVuY3Rpb24obix0LGUsdSxhKXtyZXR1cm4gdSoodC89YSkqdCtlfSxlYXNlT3V0UXVhZDpmdW5jdGlvbihuLHQsZSx1LGEpe3JldHVybi11Kih0Lz1hKSoodC0yKStlfSxlYXNlSW5PdXRRdWFkOmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuKHQvPWEvMik8MT91LzIqdCp0K2U6LXUvMiooLS10Kih0LTIpLTEpK2V9LGVhc2VJbkN1YmljOmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuIHUqKHQvPWEpKnQqdCtlfSxlYXNlT3V0Q3ViaWM6ZnVuY3Rpb24obix0LGUsdSxhKXtyZXR1cm4gdSooKHQ9dC9hLTEpKnQqdCsxKStlfSxlYXNlSW5PdXRDdWJpYzpmdW5jdGlvbihuLHQsZSx1LGEpe3JldHVybih0Lz1hLzIpPDE/dS8yKnQqdCp0K2U6dS8yKigodC09MikqdCp0KzIpK2V9LGVhc2VJblF1YXJ0OmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuIHUqKHQvPWEpKnQqdCp0K2V9LGVhc2VPdXRRdWFydDpmdW5jdGlvbihuLHQsZSx1LGEpe3JldHVybi11KigodD10L2EtMSkqdCp0KnQtMSkrZX0sZWFzZUluT3V0UXVhcnQ6ZnVuY3Rpb24obix0LGUsdSxhKXtyZXR1cm4odC89YS8yKTwxP3UvMip0KnQqdCp0K2U6LXUvMiooKHQtPTIpKnQqdCp0LTIpK2V9LGVhc2VJblF1aW50OmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuIHUqKHQvPWEpKnQqdCp0KnQrZX0sZWFzZU91dFF1aW50OmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuIHUqKCh0PXQvYS0xKSp0KnQqdCp0KzEpK2V9LGVhc2VJbk91dFF1aW50OmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuKHQvPWEvMik8MT91LzIqdCp0KnQqdCp0K2U6dS8yKigodC09MikqdCp0KnQqdCsyKStlfSxlYXNlSW5TaW5lOmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuLXUqTWF0aC5jb3ModC9hKihNYXRoLlBJLzIpKSt1K2V9LGVhc2VPdXRTaW5lOmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuIHUqTWF0aC5zaW4odC9hKihNYXRoLlBJLzIpKStlfSxlYXNlSW5PdXRTaW5lOmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuLXUvMiooTWF0aC5jb3MoTWF0aC5QSSp0L2EpLTEpK2V9LGVhc2VJbkV4cG86ZnVuY3Rpb24obix0LGUsdSxhKXtyZXR1cm4gMD09dD9lOnUqTWF0aC5wb3coMiwxMCoodC9hLTEpKStlfSxlYXNlT3V0RXhwbzpmdW5jdGlvbihuLHQsZSx1LGEpe3JldHVybiB0PT1hP2UrdTp1KigtTWF0aC5wb3coMiwtMTAqdC9hKSsxKStlfSxlYXNlSW5PdXRFeHBvOmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuIDA9PXQ/ZTp0PT1hP2UrdToodC89YS8yKTwxP3UvMipNYXRoLnBvdygyLDEwKih0LTEpKStlOnUvMiooLU1hdGgucG93KDIsLTEwKi0tdCkrMikrZX0sZWFzZUluQ2lyYzpmdW5jdGlvbihuLHQsZSx1LGEpe3JldHVybi11KihNYXRoLnNxcnQoMS0odC89YSkqdCktMSkrZX0sZWFzZU91dENpcmM6ZnVuY3Rpb24obix0LGUsdSxhKXtyZXR1cm4gdSpNYXRoLnNxcnQoMS0odD10L2EtMSkqdCkrZX0sZWFzZUluT3V0Q2lyYzpmdW5jdGlvbihuLHQsZSx1LGEpe3JldHVybih0Lz1hLzIpPDE/LXUvMiooTWF0aC5zcXJ0KDEtdCp0KS0xKStlOnUvMiooTWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpK2V9LGVhc2VJbkVsYXN0aWM6ZnVuY3Rpb24obix0LGUsdSxhKXt2YXIgcj0xLjcwMTU4LGk9MCxzPXU7aWYoMD09dClyZXR1cm4gZTtpZigxPT0odC89YSkpcmV0dXJuIGUrdTtpZihpfHwoaT0uMyphKSxzPE1hdGguYWJzKHUpKXtzPXU7dmFyIHI9aS80fWVsc2UgdmFyIHI9aS8oMipNYXRoLlBJKSpNYXRoLmFzaW4odS9zKTtyZXR1cm4tKHMqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKDIqKHQqYS1yKSpNYXRoLlBJL2kpKStlfSxlYXNlT3V0RWxhc3RpYzpmdW5jdGlvbihuLHQsZSx1LGEpe3ZhciByPTEuNzAxNTgsaT0wLHM9dTtpZigwPT10KXJldHVybiBlO2lmKDE9PSh0Lz1hKSlyZXR1cm4gZSt1O2lmKGl8fChpPS4zKmEpLHM8TWF0aC5hYnModSkpe3M9dTt2YXIgcj1pLzR9ZWxzZSB2YXIgcj1pLygyKk1hdGguUEkpKk1hdGguYXNpbih1L3MpO3JldHVybiBzKk1hdGgucG93KDIsLTEwKnQpKk1hdGguc2luKDIqKHQqYS1yKSpNYXRoLlBJL2kpK3UrZX0sZWFzZUluT3V0RWxhc3RpYzpmdW5jdGlvbihuLHQsZSx1LGEpe3ZhciByPTEuNzAxNTgsaT0wLHM9dTtpZigwPT10KXJldHVybiBlO2lmKDI9PSh0Lz1hLzIpKXJldHVybiBlK3U7aWYoaXx8KGk9LjMqYSoxLjUpLHM8TWF0aC5hYnModSkpe3M9dTt2YXIgcj1pLzR9ZWxzZSB2YXIgcj1pLygyKk1hdGguUEkpKk1hdGguYXNpbih1L3MpO3JldHVybiAxPnQ/LS41KnMqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKDIqKHQqYS1yKSpNYXRoLlBJL2kpK2U6cypNYXRoLnBvdygyLC0xMCoodC09MSkpKk1hdGguc2luKDIqKHQqYS1yKSpNYXRoLlBJL2kpKi41K3UrZX0sZWFzZUluQmFjazpmdW5jdGlvbihuLHQsZSx1LGEscil7cmV0dXJuIHZvaWQgMD09ciYmKHI9MS43MDE1OCksdSoodC89YSkqdCooKHIrMSkqdC1yKStlfSxlYXNlT3V0QmFjazpmdW5jdGlvbihuLHQsZSx1LGEscil7cmV0dXJuIHZvaWQgMD09ciYmKHI9MS43MDE1OCksdSooKHQ9dC9hLTEpKnQqKChyKzEpKnQrcikrMSkrZX0sZWFzZUluT3V0QmFjazpmdW5jdGlvbihuLHQsZSx1LGEscil7cmV0dXJuIHZvaWQgMD09ciYmKHI9MS43MDE1OCksKHQvPWEvMik8MT91LzIqdCp0KigoKHIqPTEuNTI1KSsxKSp0LXIpK2U6dS8yKigodC09MikqdCooKChyKj0xLjUyNSkrMSkqdCtyKSsyKStlfSxlYXNlSW5Cb3VuY2U6ZnVuY3Rpb24odCxlLHUsYSxyKXtyZXR1cm4gYS1uLmVhc2luZy5lYXNlT3V0Qm91bmNlKHQsci1lLDAsYSxyKSt1fSxlYXNlT3V0Qm91bmNlOmZ1bmN0aW9uKG4sdCxlLHUsYSl7cmV0dXJuKHQvPWEpPDEvMi43NT83LjU2MjUqdSp0KnQrZToyLzIuNzU+dD91Kig3LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NSkrZToyLjUvMi43NT50P3UqKDcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1KStlOnUqKDcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1KStlfSxlYXNlSW5PdXRCb3VuY2U6ZnVuY3Rpb24odCxlLHUsYSxyKXtyZXR1cm4gci8yPmU/LjUqbi5lYXNpbmcuZWFzZUluQm91bmNlKHQsMiplLDAsYSxyKSt1Oi41Km4uZWFzaW5nLmVhc2VPdXRCb3VuY2UodCwyKmUtciwwLGEscikrLjUqYSt1fX0pfShqUXVlcnkpOwoKCi8qISBoaWdobGlnaHQgdjQsIEhpZ2hsaWdodHMgYXJiaXRyYXJ5IHRlcm1zLiA8aHR0cDovL2pvaGFubmJ1cmthcmQuZGUvYmxvZy9wcm9ncmFtbWluZy9qYXZhc2NyaXB0L2hpZ2hsaWdodC1qYXZhc2NyaXB0LXRleHQtaGlnbGlnaHRpbmctanF1ZXJ5LXBsdWdpbi5odG1sPiBNSVQgbGljZW5zZS4gSm9oYW5uIEJ1cmthcmQgPGh0dHA6Ly9qb2hhbm5idXJrYXJkLmRlPiA8bWFpbHRvOmpiQGVhaW8uY29tPiAqLwoKCiFmdW5jdGlvbigkKXskLmZuLmhsPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSxpKXt2YXIgbj0wO2lmKDM9PWUubm9kZVR5cGUpe3ZhciBoPWUuZGF0YS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoaSk7aWYoaD49MCl7bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtYXJrIiksbi5jbGFzc05hbWU9ImhpZ2hsaWdodCIsaD1lLnNwbGl0VGV4dChoKSxoLnNwbGl0VGV4dChpLmxlbmd0aCk7dmFyIGw9aC5jbG9uZU5vZGUoITApO24uYXBwZW5kQ2hpbGQobCksaC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuLGgpLG49MX19ZWxzZSBpZigxPT1lLm5vZGVUeXBlJiZlLmNoaWxkTm9kZXMmJiEvKHNjcmlwdHxzdHlsZSkvaS50ZXN0KGUudGFnTmFtZSkpZm9yKGg9MDtoPGUuY2hpbGROb2Rlcy5sZW5ndGg7KytoKWgrPXQoZS5jaGlsZE5vZGVzW2hdLGkpO3JldHVybiBufXJldHVybiB0aGlzLmxlbmd0aCYmZSYmZS5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzLGUudG9VcHBlckNhc2UoKSl9KTp0aGlzfSwkLmZuLnJobD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbmQoIm1hcmsuaGlnaGxpZ2h0IikuZWFjaChmdW5jdGlvbigpe3dpdGgodGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQubm9kZU5hbWUsdGhpcy5wYXJlbnROb2RlKXJlcGxhY2VDaGlsZCh0aGlzLmZpcnN0Q2hpbGQsdGhpcyksbm9ybWFsaXplKCl9KS5lbmQoKX19KGpRdWVyeSk7CgoKLyohIGNzc1RyYW5zZm9ybXM6IGpRdWVyeSBjc3NIb29rcyBhZGRpbmcgYSBjcm9zcyBicm93c2VyLCBhbmltYXRpYmxlIHRyYW5zZm9ybXMsIEJvYmJ5IFNjaHVsdHo6IDxodHRwczovL2dpdGh1Yi5jb20vcHVwcHliaXRzL1FUcmFuc2Zvcm0+ICovCgohZnVuY3Rpb24ocil7ZnVuY3Rpb24gcyhzLG4saSxlKXtpZihyLnN1cHBvcnQubWF0cml4RmlsdGVyKXJldHVybiBvKHMsbik7dmFyIGE9dChzKSxmPS9bWHxZXS8uZXhlYyhpKTtmPW51bGw9PT1mPyIiOmZbMF0/ZlswXTpmLGk9Ly4qW15YWV0vLmV4ZWMoaSlbMF0sZT12b2lkIDA9PT1lPyIiOmU7dmFyIGMsdT0iIixtPSExO2lmKG51bGwhPT1hKWZvcih2YXIgcCBpbiBhKWlmKGM9YVtwXSxpPT09cCkibWF0cml4IiE9PWk/KHUrPWkrIigiLHUrPSJYIj09PWZ8fCIiPT09Zj9uK2U6IiIhPT1jWzBdP2NbMF06ci5jc3NIb29rc1tpKyJYIl0uZ2V0KHMpK2UsdSs9IlkiPT09Zj8iLCAiK24rZToiIiE9PWNbMV0/IiwgIitjWzFdOmkrIlkiaW4gci5jc3NIb29rcz8iLCAiK3IuY3NzSG9va3NbaSsiWSJdLmdldChzKStlOiIiLHUrPSIpICIpOnUrPW4rIiAiLG09ITA7ZWxzZXt1Kz1wKyIoIjtmb3IodmFyIGc9MDtnPGMubGVuZ3RoJiYodSs9Y1tnXSxnPGMubGVuZ3RoLTEmJiIiIT09Y1tnKzFdKTtnKyspdSs9IiwgIjt1Kz0iKSAifW18fCh1Kz1pK2YrIigiK24rZSsiKSAiKSxzLnN0eWxlW3IuY3NzUHJvcHMudHJhbnNmb3JtXT11fWZ1bmN0aW9uIHQocyl7dmFyIHQsbixvLGk7cmV0dXJuIHIocy5zdHlsZVtyLmNzc1Byb3BzLnRyYW5zZm9ybV0ucmVwbGFjZSgvKD86XCxcc3xcKXxcKCkvZywifCIpLnNwbGl0KCIgIikpLmVhY2goZnVuY3Rpb24ocixzKXsiIiE9PXMmJih2b2lkIDA9PT10JiYodD17fSksbj1zLnNwbGl0KCJ8Iiksbz1uLnNoaWZ0KCksaT0vLipbXlhZXS8uZXhlYyhvKVswXSx0W2ldfHwodFtpXT1bIiIsIiIsIiIsIiIsIiIsIiJdKSwvWS8udGVzdChvKXx8KHRbaV1bMF09blswXSksL1gvLnRlc3Qobyl8fCh0W2ldWzFdPW5bMV0pLDY9PW4ubGVuZ3RoJiYodFtpXVsyXT1uWzJdLHRbaV1bM109blszXSx0W2ldWzRdPW5bNF0sdFtpXVs1XT1uWzVdKSl9KSx2b2lkIDAhPT10P3Q6bnVsbH1mdW5jdGlvbiBuKHIpe3JldHVybiJudW1iZXIiPT10eXBlb2Ygcj9wYXJzZUZsb2F0KHIpOi0xIT1yLmluZGV4T2YoImRlZyIpP3BhcnNlSW50KHIsMTApKigyKk1hdGguUEkvMzYwKTotMSE9ci5pbmRleE9mKCJncmFkIik/cGFyc2VJbnQociwxMCkqKE1hdGguUEkvMjAwKTp2b2lkIDB9ZnVuY3Rpb24gbyhzLHQpe3ZhciBvLGksZT0ibWF0cml4RmlsdGVyIj09PXIuY3NzUHJvcHMudHJhbnNmb3JtT3JpZ2luPyEwOiExO2lmKG89W3IuY3NzSG9va3Muc2NhbGVYLmdldChzKSxuKHIuY3NzSG9va3Muc2tld1kuZ2V0KHMpKSxuKHIuY3NzSG9va3Muc2tld1guZ2V0KHMpKSxyLmNzc0hvb2tzLnNjYWxlWS5nZXQocyksci5jc3NIb29rcy50cmFuc2xhdGVYLmdldChzKSxyLmNzc0hvb2tzLnRyYW5zbGF0ZVkuZ2V0KHMpXSxlKXtzLnN0eWxlLmZpbHRlcj1bInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5NYXRyaXgoTTExPTEsTTEyPTAsTTIxPTAsTTIyPTEsU2l6aW5nTWV0aG9kPSdhdXRvIGV4cGFuZCcpIl0uam9pbigiIik7dmFyIGE9ci5jc3NIb29rcy50cmFuc2Zvcm1PcmlnaW5YLmdldChzKSxmPXIuY3NzSG9va3MudHJhbnNmb3JtT3JpZ2luWS5nZXQocyk7YT1hLmluZGV4T2YoIiUiKT4wPy9bXGRdKi8uZXhlYyhhKS8xMDA6YSxmPWYuaW5kZXhPZigiJSIpPjA/L1tcZF0qLy5leGVjKGYpLzEwMDpmO3ZhciBjPXMub2Zmc2V0V2lkdGgsdT1zLm9mZnNldEhlaWdodH1pZih0PSJhcnJheSIhPXR5cGVvZiB0fHw2IT09dC5sZW5ndGg/bzpbb1swXSp0WzBdK29bMV0qdFsyXSxvWzBdKnRbMV0rb1sxXSp0WzNdLG9bMl0qdFswXStvWzNdKnRbMl0sb1syXSp0WzFdK29bM10qdFszXSx0WzRdLHRbNV1dLGk9ci5kYXRhKHMsInJvdGF0ZSIpKXtpPW4oaSk7dmFyIG09TWF0aC5jb3MoaSkscD1NYXRoLnNpbihpKTtpPVttLC1wLHAsbV0sdD1bdFswXSppWzBdK3RbMV0qaVsyXSx0WzBdKmlbMV0rdFsxXSppWzNdLHRbMl0qaVswXSt0WzNdKmlbMl0sdFsyXSppWzFdK3RbM10qaVszXSx0WzRdLHRbNV1dfWlmKHMuc3R5bGUuZmlsdGVyPVsicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0Lk1hdHJpeCgiLCJNMTE9Iit0WzBdKyIsICIsIk0xMj0iK3RbMV0rIiwgIiwiTTIxPSIrdFsyXSsiLCAiLCJNMjI9Iit0WzNdKyIsICIsIlNpemluZ01ldGhvZD0nYXV0byBleHBhbmQnIiwiKSJdLmpvaW4oIiIpLGUpe3ZhciBnPXMub2Zmc2V0V2lkdGgsbD1zLm9mZnNldEhlaWdodDtzLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIscy5zdHlsZS5sZWZ0PWEqKGMtZykrKHBhcnNlSW50KHRbNF0pfHwwKSxzLnN0eWxlLnRvcD1mKih1LWwpKyhwYXJzZUludCh0WzVdKXx8MCl9fXZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGU9aS5zdHlsZTtpZihyLmNzc1Byb3BzLnRyYW5zZm9ybT0iIj09PWUuTW96VHJhbnNmb3JtPyJNb3pUcmFuc2Zvcm0iOiIiPT09ZS5tc1RyYW5zZm9ybT8ibXNUcmFuc2Zvcm0iOiIiPT09ZS5XZWJraXRUcmFuc2Zvcm0/IldlYmtpdFRyYW5zZm9ybSI6IiI9PT1lLk9UcmFuc2Zvcm0/Ik9UcmFuc2Zvcm0iOiIiPT09ZS5UcmFuc2Zvcm0/IlRyYW5zZm9ybSI6ITEsci5jc3NQcm9wcy50cmFuc2Zvcm1PcmlnaW49IiI9PT1lLk1velRyYW5zZm9ybU9yaWdpbj8iTW96VHJhbnNmb3JtT3JpZ2luIjoiIj09PWUubXNUcmFuc2Zvcm1PcmlnaW4/Im1zVHJhbnNmb3JtT3JpZ2luIjoiIj09PWUuV2Via2l0VHJhbnNmb3JtT3JpZ2luPyJXZWJraXRUcmFuc2Zvcm1PcmlnaW4iOiIiPT09ZS5PVHJhbnNmb3JtT3JpZ2luPyJPVHJhbnNmb3JtT3JpZ2luIjoiIj09PWUuVHJhbnNmb3JtT3JpZ2luPyJUcmFuc2Zvcm1PcmlnaW4iOiExLHIuc3VwcG9ydC50cmFuc2Zvcm09ci5jc3NQcm9wcy50cmFuc2Zvcm0hPT0hMXx8IiI9PT1lLmZpbHRlcj8hMDohMSxyLnN1cHBvcnQudHJhbnNmb3JtT3JpZ2luPXIuY3NzUHJvcHMudHJhbnNmb3JtT3JpZ2luIT09ITE/ITA6ITEsci5zdXBwb3J0Lm1hdHJpeEZpbHRlcj0iIj09PWUuZmlsdGVyJiZyLmNzc1Byb3BzLnRyYW5zZm9ybT09PSExPyEwOiExLGk9bnVsbCxyLnN1cHBvcnQudHJhbnNmb3JtIT09ITEpe3IuY3NzTnVtYmVyLnNrZXc9ci5jc3NOdW1iZXIuc2tld1g9ci5jc3NOdW1iZXIuc2tld1k9ci5jc3NOdW1iZXIuc2NhbGU9ci5jc3NOdW1iZXIuc2NhbGVYPXIuY3NzTnVtYmVyLnNjYWxlWT1yLmNzc051bWJlci5yb3RhdGU9ci5jc3NOdW1iZXIubWF0cml4PSEwLHIuY3NzTnVtYmVyLnRyYW5zZm9ybU9yaWdpbj1yLmNzc051bWJlci50cmFuc2Zvcm1PcmlnaW5YPXIuY3NzTnVtYmVyLnRyYW5zZm9ybU9yaWdpblk9ITAsci5zdXBwb3J0Lm1hdHJpeEZpbHRlciYmKHIuY3NzTnVtYmVyLnRyYW5zZm9ybU9yaWdpbj1yLmNzc051bWJlci50cmFuc2Zvcm1PcmlnaW5YPXIuY3NzTnVtYmVyLnRyYW5zZm9ybU9yaWdpblk9ITAsci5jc3NQcm9wcy50cmFuc2Zvcm1PcmlnaW49Im1hdHJpeEZpbHRlciIpLHIuY3NzSG9va3MudHJhbnNmb3JtPXtzZXQ6ZnVuY3Rpb24ocyx0KXtyLnN1cHBvcnQubWF0cml4RmlsdGVyP3Muc3R5bGUuZmlsdGVyPVt0XS5qb2luKCIiKTpzLnN0eWxlW3IuY3NzUHJvcHMudHJhbnNmb3JtXT10KyIlIn0sZ2V0OmZ1bmN0aW9uKHMpe3JldHVybiByLnN1cHBvcnQubWF0cml4RmlsdGVyP3Muc3R5bGUuZmlsdGVyOnMuc3R5bGVbci5jc3NQcm9wcy50cmFuc2Zvcm1dfX0sci5jc3NIb29rcy50cmFuc2Zvcm1PcmlnaW49e3NldDpmdW5jdGlvbihzLHQsbil7ci5zdXBwb3J0Lm1hdHJpeEZpbHRlcj8odD10LnNwbGl0KCIsIiksci5jc3NIb29rcy50cmFuc2Zvcm1PcmlnaW5YLnNldChzLHRbMF0pLHQubGVuZ3RoPjEmJnIuY3NzSG9va3MudHJhbnNmb3JtT3JpZ2luWS5zZXQocyx0WzFdKSk6KHQ9InN0cmluZyI9PXR5cGVvZiB0P3Q6dCsobnx8IiUiKSxzLnN0eWxlW3IuY3NzUHJvcHMudHJhbnNmb3JtT3JpZ2luXT10KX0sZ2V0OmZ1bmN0aW9uKHMpe2lmKHIuc3VwcG9ydC5tYXRyaXhGaWx0ZXIpe3ZhciB0PXIuZGF0YShzLCJ0cmFuc2Zvcm1PcmlnaW5YIiksbj1yLmRhdGEocywidHJhbnNmb3JtT3JpZ2luWSIpO3JldHVybiB0JiZuJiZ0PT09bj90OiI1MCUifXJldHVybiBzLnN0eWxlW3IuY3NzUHJvcHMudHJhbnNmb3JtT3JpZ2luXX19LHIuZnguc3RlcC50cmFuc2Zvcm1PcmlnaW49ZnVuY3Rpb24ocyl7ci5jc3NIb29rcy50cmFuc2Zvcm1PcmlnaW4uc2V0KHMuZWxlbSxzLm5vdyxzLnVuaXQpfSxyLmNzc0hvb2tzLnRyYW5zZm9ybU9yaWdpblg9e3NldDpmdW5jdGlvbihzLHQsbil7ci5zdXBwb3J0Lm1hdHJpeEZpbHRlcj8oci5kYXRhKHMsInRyYW5zZm9ybU9yaWdpblgiLG4/dCtuOnQpLG8ocykpOih0PSJzdHJpbmciPT10eXBlb2YgdD90OnQrKG58fCIlIikscy5zdHlsZVtyLmNzc1Byb3BzLnRyYW5zZm9ybU9yaWdpbisiWCJdPXQpfSxnZXQ6ZnVuY3Rpb24ocyl7aWYoci5zdXBwb3J0Lm1hdHJpeEZpbHRlcil7dmFyIHQ9ci5kYXRhKHMsInRyYW5zZm9ybU9yaWdpblgiKTtzd2l0Y2godCl7Y2FzZSJsZWZ0IjpyZXR1cm4iMCUiO2Nhc2UiY2VudGVyIjpyZXR1cm4iNTAlIjtjYXNlInJpZ2h0IjpyZXR1cm4iMTAwJSJ9cmV0dXJuIHQ/dDoiNTAlIn1yZXR1cm4gcy5zdHlsZVtyLmNzc1Byb3BzLnRyYW5zZm9ybU9yaWdpbisiWCJdfX0sci5meC5zdGVwLnRyYW5zZm9ybU9yaWdpblg9ZnVuY3Rpb24ocyl7ci5jc3NIb29rcy50cmFuc2Zvcm1PcmlnaW5YLnNldChzLmVsZW0scy5ub3cscy51bml0KX0sci5jc3NIb29rcy50cmFuc2Zvcm1PcmlnaW5ZPXtzZXQ6ZnVuY3Rpb24ocyx0LG4pe3Iuc3VwcG9ydC5tYXRyaXhGaWx0ZXI/KHIuZGF0YShzLCJ0cmFuc2Zvcm1PcmlnaW5ZIixuP3Qrbjp0KSxvKHMpKToodD0ic3RyaW5nIj09dHlwZW9mIHQ/dDp0KyhufHwiJSIpLHMuc3R5bGVbci5jc3NQcm9wcy50cmFuc2Zvcm1PcmlnaW4rIlkiXT10KX0sZ2V0OmZ1bmN0aW9uKHMpe2lmKHIuc3VwcG9ydC5tYXRyaXhGaWx0ZXIpe3ZhciB0PXIuZGF0YShzLCJ0cmFuc2Zvcm1PcmlnaW5ZIik7c3dpdGNoKHQpe2Nhc2UidG9wIjpyZXR1cm4iMCUiO2Nhc2UiY2VudGVyIjpyZXR1cm4iNTAlIjtjYXNlImJvdHRvbSI6cmV0dXJuIjEwMCUifXJldHVybiB0P3Q6IjUwJSJ9cmV0dXJuIHMuc3R5bGVbci5jc3NQcm9wcy50cmFuc2Zvcm1PcmlnaW4rIlkiXX19LHIuZnguc3RlcC50cmFuc2Zvcm1PcmlnaW5ZPWZ1bmN0aW9uKHMpe3IuY3NzSG9va3MudHJhbnNmb3JtT3JpZ2luWS5zZXQocy5lbGVtLHMubm93LHMudW5pdCl9O3ZhciBhPWZ1bmN0aW9uKHIpe3JldHVybiByfSxmPVtbIlgiLCJZIl0sIlgiLCJZIl0sYz1bWyJBIiwiQiIsIkMiLCJEIiwiWCIsIlkiXSwiQSIsIkIiLCJDIiwiRCIsIlgiLCJZIl0sdT1be3Byb3A6InJvdGF0ZSIsbWF0cml4OltmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5jb3Mocil9LGZ1bmN0aW9uKHIpe3JldHVybi1NYXRoLnNpbihyKX0sZnVuY3Rpb24ocil7cmV0dXJuIE1hdGguc2luKHIpfSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5jb3Mocil9XSx1bml0OiJyYWQiLHN1YlByb3BzOlsiIl0sZm5jOm59LHtwcm9wOiJzY2FsZSIsbWF0cml4OltbYSwwLDAsYV0sW2EsMCwwLDFdLFsxLDAsMCxhXV0sdW5pdDoiIixzdWJQcm9wczpmLGZuYzpwYXJzZUZsb2F0LF9kZWZhdWx0OjF9LHtwcm9wOiJza2V3IixtYXRyaXg6W1sxLGEsYSwxXSxbMSxhLDAsMV0sWzEsMCxhLDFdXSx1bml0OiJyYWQiLHN1YlByb3BzOmYsZm5jOm59LHtwcm9wOiJ0cmFuc2xhdGUiLG1hdHJpeDpbWzEsMCwwLDEsYSxhXSxbMSwwLDAsMSxhLDBdLFsxLDAsMCwxLDAsYV1dLHN0YW5kYXJkVW5pdDoicHgiLHN1YlByb3BzOmYsZm5jOnBhcnNlRmxvYXR9LHtwcm9wOiJtYXRyaXgiLG1hdHJpeDpbW2EsYSxhLGEsYSxhXSxbYSwwLDAsMSwwLDBdLFsxLGEsMCwxLDAsMF0sWzEsMCxhLDEsMCwwXSxbMSwwLDAsYSwwLDBdLFsxLDAsMCwxLDAsYV1dLHN1YlByb3BzOmMsZm5jOnBhcnNlRmxvYXR9XTtqUXVlcnkuZWFjaCh1LGZ1bmN0aW9uKHQsbil7alF1ZXJ5LmVhY2gobi5zdWJQcm9wcyxmdW5jdGlvbih0LG8pe3ZhciBpLGU9bjtpZihyLmlzQXJyYXkobykpe2k9ZS5wcm9wO3ZhciBhPW87ci5jc3NIb29rc1tpXT17c2V0OmZ1bmN0aW9uKHMsdCxuKXtqUXVlcnkuZWFjaChhLGZ1bmN0aW9uKG8sZSl7ci5jc3NIb29rc1tpK2VdLnNldChzLHQsbil9KX0sZ2V0OmZ1bmN0aW9uKHMpe3ZhciB0PVtdO3JldHVybiBqUXVlcnkuZWFjaChhLGZ1bmN0aW9uKG4sbyl7dC5wdXNoKHIuY3NzSG9va3NbaStvXS5nZXQocyx0KSl9KSx0WzBdfHx0WzFdfX19ZWxzZSBpPWUucHJvcCtvLHIuY3NzSG9va3NbaV09e3NldDpmdW5jdGlvbih0LG4sbyl7ci5kYXRhKHQsaSxvP24rbzpuKSxzKHQsZS5mbmMobz9uK286biksaSxlLnVuaXR8fG98fGUuc3RhbmRhcmRVbml0KX0sZ2V0OmZ1bmN0aW9uKHMpe3ZhciB0PXIuZGF0YShzLGkpO3JldHVybiB0JiZ2b2lkIDAhPT10P3Q6ZS5fZGVmYXVsdHx8MH19O3IuZnguc3RlcFtpXT1mdW5jdGlvbihzKXtzLnVuaXQ9InB4Ij09PXMudW5pdCYmci5jc3NOdW1iZXJbaV0/ZS5zdGFuZGFyZFVuaXQ6cy51bml0LHIuY3NzTnVtYmVyW2ldPyIiOnMudW5pdCxyLmNzc0hvb2tzW2ldLnNldChzLmVsZW0scy5ub3cscy51bml0KX19KX0pLHIucm90YXRlPXtyYWRUb0RlZzpmdW5jdGlvbihyKXtyZXR1cm4gMTgwKnIvTWF0aC5QSX19fX0oalF1ZXJ5KTsKCgovKiEgalF1ZXJ5IFRpbnlTY3JvbGxiYXIgQ3VzdG9tIDo6IE9yaWdpbmFsID0+IDxodHRwOi8vd3d3LmJhaWpzLm5sL3RpbnlzY3JvbGxiYXI+LCBtb2RpZmllZCBieSBUYXVmaWsgTnVycm9obWFuIChhZGQga2V5Ym9hcmQgc3VwcG9ydCB2aWEgZm9jdXNlZCBlbGVtZW50IHdpdGggYHRhYmluZGV4YCBhdHRyaWJ1dGUpICovCgohZnVuY3Rpb24odCl7ZnVuY3Rpb24gcyhzLG8pe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbC51cGRhdGUoKSxuKCksbH1mdW5jdGlvbiBhKCl7dmFyIHQ9di50b0xvd2VyQ2FzZSgpO2Yub2JqLmNzcyhqLHcvbS5yYXRpbyksYi5vYmouY3NzKGosLXcpLHkuc3RhcnQ9Zi5vYmoub2Zmc2V0KClbal0sbS5vYmouY3NzKHQseFtvLmF4aXNdKSx4Lm9iai5jc3ModCx4W28uYXhpc10pLGYub2JqLmNzcyh0LGZbby5heGlzXSl9ZnVuY3Rpb24gbigpe00/aC5vYmpbMF0ub250b3VjaHN0YXJ0PWZ1bmN0aW9uKHQpezE9PT10LnRvdWNoZXMubGVuZ3RoJiYoaSh0LnRvdWNoZXNbMF0pLHQuc3RvcFByb3BhZ2F0aW9uKCkpfTooZi5vYmoub24oIm1vdXNlZG93biIsaSkseC5vYmoub24oIm1vdXNldXAiLHUpKSxvLnNjcm9sbCYmd2luZG93LmFkZEV2ZW50TGlzdGVuZXI/KGRbMF0uYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLHIsITEpLGRbMF0uYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsciwhMSksZFswXS5hZGRFdmVudExpc3RlbmVyKCJNb3pNb3VzZVBpeGVsU2Nyb2xsIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCl9LCExKSk6by5zY3JvbGwmJihkWzBdLm9ubW91c2V3aGVlbD1yKX1mdW5jdGlvbiBpKHMpe3ZhciBvPXBhcnNlSW50KGYub2JqLmNzcyhqKSwxMCk7cmV0dXJuIHkuc3RhcnQ9cD9zLnBhZ2VYOnMucGFnZVksay5zdGFydD0iYXV0byI9PW8/MDpvLE0/KGRvY3VtZW50Lm9udG91Y2htb3ZlPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx1KHQudG91Y2hlc1swXSl9LGRvY3VtZW50Lm9udG91Y2hlbmQ9Yyk6KHQoZG9jdW1lbnQpLm9uKCJtb3VzZW1vdmUiLHUpLHQoZG9jdW1lbnQpLm9uKCJtb3VzZXVwIixjKSxmLm9iai5hZGRDbGFzcygiaG9sZCIpLm9uKCJtb3VzZXVwIixjKSksITF9ZnVuY3Rpb24gcihzKXtpZihiLnJhdGlvPDEpe3ZhciBlPXN8fHdpbmRvdy5ldmVudCxhPWUud2hlZWxEZWx0YT9lLndoZWVsRGVsdGEvMTIwOi1lLmRldGFpbC8zO3ctPWEqby53aGVlbCx3PU1hdGgubWluKGJbby5heGlzXS1oW28uYXhpc10sTWF0aC5tYXgoMCx3KSksZi5vYmouY3NzKGosdy9tLnJhdGlvKSxiLm9iai5jc3MoaiwtdyksKG8ubG9ja3Njcm9sbHx8dyE9PWJbby5heGlzXS1oW28uYXhpc10mJjAhPT13KSYmKGU9dC5ldmVudC5maXgoZSksZS5wcmV2ZW50RGVmYXVsdCgpKX19ZnVuY3Rpb24gdSh0KXtiLnJhdGlvPDEmJihrLm5vdz1vLmludmVydHNjcm9sbCYmTT9NYXRoLm1pbih4W28uYXhpc10tZltvLmF4aXNdLE1hdGgubWF4KDAsay5zdGFydCsoeS5zdGFydC0ocD90LnBhZ2VYOnQucGFnZVkpKSkpOk1hdGgubWluKHhbby5heGlzXS1mW28uYXhpc10sTWF0aC5tYXgoMCxrLnN0YXJ0KygocD90LnBhZ2VYOnQucGFnZVkpLXkuc3RhcnQpKSksdz1rLm5vdyptLnJhdGlvLGIub2JqLmNzcyhqLC13KSxmLm9iai5jc3MoaixrLm5vdykpfWZ1bmN0aW9uIGMoKXt0KGRvY3VtZW50KS5vZmYoIm1vdXNlbW92ZSIsdSksdChkb2N1bWVudCkub2ZmKCJtb3VzZXVwIixjKSxmLm9iai5yZW1vdmVDbGFzcygiaG9sZCIpLm9mZigibW91c2V1cCIsYyksZG9jdW1lbnQub250b3VjaG1vdmU9ZG9jdW1lbnQub250b3VjaGVuZD1udWxsfXZhciBsPXRoaXMsZD1zLGg9e29iajp0KCIuc2Nyb2xsLWlubmVyIixzKX0sYj17b2JqOnQoIi5zY3JvbGwtY29udGVudCIscyl9LG09e29iajp0KCIuc2Nyb2xsYmFyIixzKX0seD17b2JqOnQoIi50cmFjayIsbS5vYmopfSxmPXtvYmo6dCgiLnRodW1iIixtLm9iail9LHA9IngiPT09by5heGlzLGo9cD8ibGVmdCI6InRvcCIsdj1wPyJXaWR0aCI6IkhlaWdodCIsdz0wLGs9e3N0YXJ0OjAsbm93OjB9LHk9e30sTT0ib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtyZXR1cm4gdGhpcy5rZXlzdGVwPWZ1bmN0aW9uKHQpe2IucmF0aW88MSYmKHctPXQsdz1NYXRoLm1pbihiW28uYXhpc10taFtvLmF4aXNdLE1hdGgubWF4KDAsdykpLGYub2JqLmNzcyhqLHcvbS5yYXRpbyksYi5vYmouY3NzKGosLXcpKX0sdGhpcy51cGRhdGU9ZnVuY3Rpb24odCl7aFtvLmF4aXNdPWgub2JqWzBdWyJvZmZzZXQiK3ZdLGJbby5heGlzXT1iLm9ialswXVsic2Nyb2xsIit2XSxiLnJhdGlvPWhbby5heGlzXS9iW28uYXhpc10sbS5vYmoudG9nZ2xlQ2xhc3MoImRpc2FibGUiLGIucmF0aW8+PTEpLHhbby5heGlzXT0iYXV0byI9PT1vLnNpemU/aFtvLmF4aXNdOm8uc2l6ZSxmW28uYXhpc109TWF0aC5taW4oeFtvLmF4aXNdLE1hdGgubWF4KDAsImF1dG8iPT09by5zaXpldGh1bWI/eFtvLmF4aXNdKmIucmF0aW86by5zaXpldGh1bWIpKSxtLnJhdGlvPSJhdXRvIj09PW8uc2l6ZXRodW1iP2Jbby5heGlzXS94W28uYXhpc106KGJbby5heGlzXS1oW28uYXhpc10pLyh4W28uYXhpc10tZltvLmF4aXNdKSx3PSJyZWxhdGl2ZSI9PT10JiZiLnJhdGlvPD0xP01hdGgubWluKGJbby5heGlzXS1oW28uYXhpc10sTWF0aC5tYXgoMCx3KSk6MCx3PSJib3R0b20iPT09dCYmYi5yYXRpbzw9MT9iW28uYXhpc10taFtvLmF4aXNdOmlzTmFOKHBhcnNlSW50KHQsMTApKT93OnBhcnNlSW50KHQsMTApLGEoKX0sZSgpfXQudGlueT10LnRpbnl8fHt9LHQudGlueS5zY3JvbGxiYXI9e29wdGlvbnM6e2F4aXM6InkiLHdoZWVsOjMwLHNjcm9sbDohMCxsb2Nrc2Nyb2xsOiEwLHNpemU6ImF1dG8iLHNpemV0aHVtYjoiYXV0byIsaW52ZXJ0c2Nyb2xsOiExLGtleWJvYXJkOiEwLHN0ZXA6MzAsaW5zaWRldGh1bWI6IjxzcGFuPjwvc3Bhbj4ifX0sdC5mbi50cz1mdW5jdGlvbihvKXt2YXIgZT10LmV4dGVuZCh7fSx0LnRpbnkuc2Nyb2xsYmFyLm9wdGlvbnMsbyksYT10aGlzO3JldHVybiBhLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmFkZENsYXNzKCJqcyIpLmF0dHIoInRhYmluZGV4IiwxKS5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIikud3JhcElubmVyKCc8ZGl2IGNsYXNzPSJzY3JvbGwtaW5uZXIiIHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47Ij48ZGl2IGNsYXNzPSJzY3JvbGwtY29udGVudCI+PC9kaXY+PC9kaXY+JykuYXBwZW5kKCc8c3BhbiBjbGFzcz0ic2Nyb2xsYmFyIGRpc2FibGUiPjxzcGFuIGNsYXNzPSJ0cmFjayI+PHNwYW4gY2xhc3M9InRodW1iIj4nK2UuaW5zaWRldGh1bWIrIjwvc3Bhbj48L3NwYW4+PC9zcGFuPiIpLmRhdGEoInRzYiIsbmV3IHModCh0aGlzKSxlKSl9KS5vbigiZm9jdXMiLGZ1bmN0aW9uKCl7ZS5rZXlib2FyZCYmdCh0aGlzKS5vbigia2V5ZG93biIsZnVuY3Rpb24ocyl7cmV0dXJuIDM4PT1zLmtleUNvZGV8fDM3PT1zLmtleUNvZGU/KHQodGhpcykudHNfa3MoZS5zdGVwKSwhMSk6NDA9PXMua2V5Q29kZXx8Mzk9PXMua2V5Q29kZT8odCh0aGlzKS50c19rcygtZS5zdGVwKSwhMSk6dm9pZCAwfSl9KSx0KHdpbmRvdykub24oInJlc2l6ZSIsZnVuY3Rpb24oKXthLnRzX3UoInJlbGF0aXZlIil9KSxhfSx0LmZuLnRzX3U9ZnVuY3Rpb24ocyl7cmV0dXJuIHQodGhpcykuZGF0YSgidHNiIikudXBkYXRlKHMpfSx0LmZuLnRzX2tzPWZ1bmN0aW9uKHMpe3JldHVybiB0KHRoaXMpLmRhdGEoInRzYiIpLmtleXN0ZXAocyl9fShqUXVlcnkpOwoKCi8qISBqUXVlcnkgYXV0byBzZWxlY3QgcHJlICovCgoKd2luZG93Lm5nZF9hdXRvU2VsZWN0PWZ1bmN0aW9uKGUpe2Uub25kYmxjbGljaz1mdW5jdGlvbigpe3ZhciBuLG87d2luZG93LmdldFNlbGVjdGlvbj8obj13aW5kb3cuZ2V0U2VsZWN0aW9uKCksbz1kb2N1bWVudC5jcmVhdGVSYW5nZSgpLG8uc2VsZWN0Tm9kZUNvbnRlbnRzKGUpLG4ucmVtb3ZlQWxsUmFuZ2VzKCksbi5hZGRSYW5nZShvKSk6ZG9jdW1lbnQuc2VsZWN0aW9uJiYobj1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS50ZXh0LG89ZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKSxvLm1vdmVUb0VsZW1lbnRUZXh0KGUpLG8uc2VsZWN0KCkpfX0sd2luZG93Lm5nZF9hZGROdW1iZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGUsbj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJlIiksbz1uLmxlbmd0aCx0PTA7bz50OysrdCl7aWYoZT0nPHNwYW4gY2xhc3M9ImxpbmUtbnVtYmVyIj4nLG5bdF0uaWQ9blt0XS5pZD9uW3RdLmlkOiJjb2RlLWJsb2NrOiIrKHQrMSksLyhefCApbnVtYmVyZWQoIHwkKS8udGVzdChuW3RdLmNsYXNzTmFtZSkpe2Zvcih2YXIgYT1uW3RdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjb2RlIilbMF0sYz0wLGQ9YS5pbm5lckhUTUwuc3BsaXQoL1xuLykubGVuZ3RoO2Q+YzsrK2MpZSs9JzxzcGFuIGlkPSJjb2RlLWxpbmU6JysodCsxKSsiLSIrKGMrMSkrJyI+PHNwYW4+JysoYysxKSsiPC9zcGFuPjxlbT5jb2RlLWxpbmU6IisodCsxKSsiLSIrKGMrMSkrIjwvZW0+PC9zcGFuPiI7blt0XS5pbm5lckhUTUw9ZSs9Ijwvc3Bhbj4iK25bdF0uaW5uZXJIVE1MKyc8c3BhbiBjbGFzcz0iY2wiPjwvc3Bhbj4nfWlmKG5nZF9hdXRvU2VsZWN0KG5bdF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNvZGUiKVswXSksd2luZG93LmxvY2F0aW9uLmhhc2gmJi9jb2RlXC1saW5lXDooWzAtOV0rKVwtKFswLTldKyl8Y29kZVwtYmxvY2tcOihbMC05XSspLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5oYXNoKSl7dmFyIGk9d2luZG93LmxvY2F0aW9uLmhhc2g7d2luZG93LmxvY2F0aW9uLmhhc2g9aX19fTsKCgovKiEgTWFuaXB1bGF0aW9uICovCgohZnVuY3Rpb24oZSl7ZS5jbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCxhLHIpe3JldHVybiBlW25dKHQsJzxpbWcgY2xhc3M9ImxhenkgZW1vIiBkYXRhLXNyYz0iaHR0cHM6Ly9kdGUtcHJvamVjdC5naXRodWIuaW8vYS9lLycrYSsnLmdpZiIgYWx0PSInK3IrJyI+Jyl9dmFyIG49InJlcGxhY2UiLGE9W10scj0iIixpPVtbLyjwn5iHfFxiMDpcLT9cKSkvZywiaGFsbyIsIjA6KSJdLFsvKPCfmIp8XEI6XC0/XCkpL2csImJsdXNoIiwiOikiXSxbLyjwn5iJfFxCO1wtP1wpKS9nLCJ3aW5rIiwiOykiXSxbLyjwn5iDfFxCOlwtP0QpL2csInNtaWxleSIsIjpEIl0sWy8o8J+YgnxcQj1cLT9EKS9nLCJqb3kiLCI9RCJdLFsvKPCfmIZ8KFxCXF46fFxiW3hYXSlcLT9EXGIpL2csImxhdWdoIiwieEQiXSxbLyjwn5iKfFxCXF5cXz9cXikvZywicmVsYXgiLCJeX14iXSxbLyjwn6SofFxiNzpcLT9cKCkvZywiY29uZnVzZSIsIjc6KCJdLFsvKOKYue+4j3xcQjpcLT9cKCkvZywiZnJvd24iLCI6KCJdLFsvKPCfmKl8XEI9XC0/XCgpL2csIndlYXJ5IiwiPSgiXSxbLyjwn6SUfFxCOlwtP1tcL1xcXSkvZywidGhpbmsiLCI6XFwiXSxbLyjwn5i1fFxCQEAsKS9nLCJkaXp6eSIsIkBALCJdLFsvKPCfmIx8WzoqXSh5YSkrWzoqXSkvZ2ksInJlbGlldmUiLCIqeWF5YSoiXSxbLyjwn5iVfFxCOlwtP3MpL2dpLCJzdWxsZW4iLCI6UyJdLFsvKPCfmK18XEI6KCd8XCZcIzM5XDspXC0/XCgpL2csImNyeSIsIjomIzM5OygiXSxbLyjwn5irfFs6Kl13YXsyLH1bOipdKS9naSwidGlyZSIsIip3YXdhKiJdLFsvKPCfmKJ8XGJUXF9UKS9naSwidGVhciIsIlRfVCJdLFsvKPCfmI58XGJbQjhdXC0/XCkpL2csImNvb2wiLCJCKSJdLFsvKPCfmqx8XEI6XC0/USkvZywic21va2UiLCI6USJdLFsvKPCfmJx8XEJcKlwqcCkvZ2ksImNyYXp5IiwiKipwIl0sWy8o8J+PgHxcQls6PV1cLT9bXChwXVwqKS9naSwiYmFza2V0IiwiPXAqIl0sWy8o4pq9fFxCXCo9XC0/cCkvZ2ksInNvY2NlciIsIio9cCJdLFsvKFvwn5ib8J+YnF18XEJbOjtdXC0/cCkvZ2ksInRvbmd1ZSIsIjtwIl0sWy8oW/CfmKrwn5i08J+SpF18XEI6XC0/T3orKS9naSwic2xlZXAiLCI6T3p6eiJdLFsvKPCfpK98XGJ4XC0/QCkvZ2ksImV4cGxvZGUiLCJ4QCJdLFsvKChb8J+YoPCfkqJdXHMqKSt8XGJ4XC0/JihhbXA7KT8pL2dpLCJhcmdoIiwieCZhbXA7YW1wOyJdLFsvKFvwn5ig8J+Sol18XGI3OlwtP08pL2dpLCJhbmdyeSIsIjc6TyJdLFsvKPCfmIB8XEJcXG9cLykvZ2ksInlheSIsIlxcby8iXSxbLyjwn6SffFxCXFxtXC8pL2dpLCJtZXRhbCIsIlxcbS8iXSxbLyjwn5iNfFxCKCZsdDszfDpcLT9cKikpL2csImxvdmUiLCI6KiJdLFsvKPCfkbx8XEJcXm9cXikvZ2ksImFuZ2VsIiwiXm9eIl0sWy8o8J+krnxcQjpcLT9hKS9naSwidm9taXQiLCI6YSJdLFsvKPCfpKx8WzoqXWZ1P2NrWzoqXSkvZ2ksImFzZGYiLCIqZnVjayoiXSxbLyhb8J+Yp/Cfl6NdfFxieFwtP1YpL2dpLCJzaG91dCIsInhWIl0sWy8oKPCfkY1ccyopK3xcQjtcLT9iP2QpL2csInRodW1icyIsIjtiZCJdLFsvKPCfkY18XEJcKHlcKXxcQjpcLT9iP2QpL2csInRodW1iIiwiOmJkIl0sWy8o8J+YknxcQlwtW18sXVwtXEJ8XEJcfnhcLT9cKCspL2dpLCJ1bmFtdXNlIiwifngoIl0sWy8o8J+Zi3xbOipdYnllWzoqXSkvZ2ksImJ5ZSIsIipieWUqIl0sWy8o8J+kk3xcQjpcLT9XKS9naSwibmVyZCIsIjpXIl0sWy8o8J+Ru3xcKFwtXC5cLSxcKSkvZywiZ2hvc3QiLCIoLS4tLCkiXSxbLyjwn427fFs6Kl1jZW5kb2xbOipdKS9naSwiY2VuZG9sIiwiKmNlbmRvbCoiXSxbLygo8J+OiVxzKikrfPCfjop8XEIoPHwmbHQ7KT1cLT9cKSkvZywicGFydHktMiIsIiZhbXA7bHQ7PSkiXSxbLyjwn46JfFxCKDx8Jmx0Oyk6XC0/XCkpL2csInBhcnR5IiwiJmFtcDtsdDs6KSJdLFsvKPCfpKN8WzoqXShyb2xsKGVkKT98Z3VsaW5nKVs6Kl0pL2dpLCJyb2xsIiwiKmd1bGluZyoiXSxbLyjwn5isfFs6Kl1iYW5nWzoqXSkvZ2ksImJhbmciLCIqYmFuZyoiXSxbLyhb8J+TnuKYjl18XEInJ0opL2dpLCJjYWxsIiwiJiMzOTsmIzM5O0oiXSxbLyjwn5uifFs6Kl0oZHJ1bShtP2VyKT8pWzoqXSkvZ2ksImRydW0iLCIqZHJ1bSoiXSxbLyhb8J+OuPCfkoDimKBdfFs6Kl0ocm9ja3xndWl0YXIoaXN0KT98Z2l0YXIoaXMpPylbOipdKS9naSwiZ3VpdGFyIiwiKnJvY2sqIl0sWy8o8J+OmXxbOipdKHZvY2FsKGlzdCk/fHZva2FsKGlzKT8pWzoqXSkvZ2ksInNpbmciLCIqc2luZyoiXSxbL/CfjJ8vZywia2luZyIsIvCfjJ8iXV07ZVtuXSgvKFtePD5dKj8pKDxpIHJlbD0iKD86cHJlfGNvZGUpIj5bXHNcU10qPzxcL2k+fDxjb2RlKD86XHNbXjw+XSo/KT8+W1xzXFNdKj88XC9jb2RlPnw8XC8/Wy06XHddKyg/OlxzW148Pl0qPyk/PnwkKS9nLGZ1bmN0aW9uKGUsdCxuKXt0JiZhLnB1c2godCksbiYmYS5wdXNoKG4pfSk7Cgpmb3IodmFyIG89MCxzPWEubGVuZ3RoO3M+bzsrK28pe3ZhciBjPWFbb107aWYoYyYmIjwiPT09Y1swXSYmIj4iPT09Yy5zbGljZSgtMSkpcis9YzsKCmVsc2V7Zm9yKHZhciBsLHU9MCxmPWkubGVuZ3RoO2Y+dTsrK3UpbD1pW3VdLGM9dChjLGxbMF0sbFsxXSxsWzJdKTtyKz1jfX0KCnJldHVybiByPXJbbl0oL14oPGJyICpcLz8+fCZuYnNwOykrL2ksIiIpW25dKC9cQDxhKCArfCArY2xhc3M9ImFsbG93IilocmVmPSIjY1xkKyIoICtyZWw9Im5vZm9sbG93Iik/Pi4qPzxcL2E+Oj8gKi9nLCIiKVtuXSgvXFtub3RlXF0oLio/KVxbXC9ub3RlXF0vZ2ksIjxkaXYgY2xhc3M9J25vdGUnPiQxPC9kaXY+Iilbbl0oL1xbKHlvdXR1YmV8aWZyYW1lKVxdKC4qPylcW1wvKHlvdXR1YmV8aWZyYW1lKVxdL2dpLCI8ZGl2IGNsYXNzPSdmbHVpZC1tZWRpYSBsb2FkZXInPjxpZnJhbWUgY2xhc3M9J3ZpZGVvJyBkYXRhLXNyYz0nJDInIGZyYW1lYm9yZGVyPScwJz48L2lmcmFtZT48L2Rpdj4iKVtuXSgvXFsobGlua3x1cmwpXF0oLio/KVxbXC8obGlua3x1cmwpXF0vZ2ksIjxhIGNsYXNzPSdhbGxvdycgaHJlZj0nJDInIHJlbD0nbm9mb2xsb3cnPiQxPC9hPiIpW25dKC9cW3VybFw9WyciXT8oW14nIl0qPylbJyJdP1xdKC4qPylcW1wvdXJsXF0vZ2ksIjxhIGNsYXNzPSdhbGxvdycgaHJlZj0nJDEnIHJlbD0nbm9mb2xsb3cnPiQyPC9hPiIpW25dKC9cW2ltZ1xdKC4qPylcW1wvaW1nXF0vZ2ksIjxpbWcgY2xhc3M9J2NlbnRlciBpbWctYXR0YWNobWVudCcgZGF0YS1zcmM9JyQxJyBhbHQ9J0xvYWRpbmcmaGVsbGlwOyc+Iil9fSh3aW5kb3csZG9jdW1lbnQpOwoKCgohZnVuY3Rpb24odCxlKXt0Ll9tZW1vPXtzZXQ6ZnVuY3Rpb24odCxuLGkpe3ZhciBvLHI7aT8obz1uZXcgRGF0ZSxvLnNldFRpbWUoby5nZXRUaW1lKCkrMjQqaSo2MCo2MCoxZTMpLHI9IjsgZXhwaXJlcz0iK28udG9HTVRTdHJpbmcoKSk6cj0iIixlLmNvb2tpZT10KyI9IituK3IrIjsgcGF0aD0vIn0sZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPXQrIj0iLG89ZS5jb29raWUuc3BsaXQoIjsiKSxyPTA7cjxvLmxlbmd0aDtyKyspe2ZvcihuPW9bcl07IiAiPT1uLmNoYXJBdCgwKTspbj1uLnN1YnN0cmluZygxLG4ubGVuZ3RoKTtpZigwPT1uLmluZGV4T2YoaSkpcmV0dXJuIG4uc3Vic3RyaW5nKGkubGVuZ3RoLG4ubGVuZ3RoKX1yZXR1cm4gbnVsbH0sZGVsOmZ1bmN0aW9uKHQpe3RoaXMuc2V0KHQsIiIsLTEpfX19KHdpbmRvdyxkb2N1bWVudCk7CgoKdmFyIF9nYXEgPSBfZ2FxIHx8IFtdOwpfZ2FxLnB1c2goWyJfc2V0QWNjb3VudCIsICJVQS14eHh4eHh4eHgtMSJdKTsKX2dhcS5wdXNoKFsiX3RyYWNrUGFnZXZpZXciXSk7CgoKLyohIEdsb2JhbCBmZWVkcyAqLwoKIWZ1bmN0aW9uKGUsdCl7dmFyIGEsbixpLGwscyxyLGMsbyx1LGwsbSxkLHAsZyxoLGY9Imh0dHBzOi8vbmd1ZGFuZy1wcm9qZWN0Lmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9ob3N0L2ltYWdlL25vLWltYWdlcy5wbmciLGI9WyJKYW51YXJpIiwiRmVicnVhcmkiLCJNYXJldCIsIkFwcmlsIiwiTWVpIiwiSnVuaSIsIkp1bGkiLCJBZ3VzdHVzIiwiU2VwdGVtYmVyIiwiT2t0b2JlciIsIk5vdmVtYmVyIiwiRGVzZW1iZXIiXTsKCi8qCmUuZmVlZF8xPWZ1bmN0aW9uKGUpe2lmKGN0PXQuZ2V0RWxlbWVudEJ5SWQoInNlYXJjaC1yZXN1bHQtY29udGFpbmVyIiksaD10LmdldEVsZW1lbnRCeUlkKCJmb3JtLXNlYXJjaCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1jYWNoZWQta2V5d29yZCIpLCJlbnRyeSJpbiBlLmZlZWQpe2lmKGE9ZS5mZWVkLmVudHJ5LHM9IjxoND5IYXNpbCBwZW5lbHVzdXJhbiB1bnR1ayBrYXRhIGt1bmNpICYjODIyMDsiK2grJyYjODIyMTs8L2g0Pjx1bCBjbGFzcz0ibGlzdC1tZWRpYSI+JywhY3QpcmV0dXJuO2Zvcih2YXIgcj0wLGM9YS5sZW5ndGg7Yz5yO3IrKyl7aT0ic3VtbWFyeSJpbiBhW3JdP2Fbcl0uc3VtbWFyeS4kdC5yZXBsYWNlKC88YnIgP1wvPz4vZywiICIpLnJlcGxhY2UoLzwuKj8+L2csIiIpLnJlcGxhY2UoL1s8Pl0vZywiIikuc3Vic3RyaW5nKDAsMTcwKSsiJmhlbGxpcDsiOiJUaWRhayBhZGEgdGVrcy4iLGw9Im1lZGlhJHRodW1ibmFpbCJpbiBhW3JdP2Fbcl0ubWVkaWEkdGh1bWJuYWlsLnVybC5yZXBsYWNlKC9cL3NbMC05XSsoXC1jKT8vLCIvczQwLWMiKTpmO2Zvcih2YXIgbz0wLHU9YVtyXS5saW5rLmxlbmd0aDt1Pm87bysrKW49ImFsdGVybmF0ZSI9PWFbcl0ubGlua1tvXS5yZWw/YVtyXS5saW5rW29dLmhyZWY6Ii80MDQiO3MrPSc8bGk+PGltZyBjbGFzcz0ibGlzdC1tZWRpYS10aHVtYm5haWwiIGFsdD0iTWVtdWF0Li4uIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHNyYz0iJytsKyciPjxzdHJvbmcgY2xhc3M9Imxpc3QtbWVkaWEtdGl0bGUiPjxhIGhyZWY9IicrbisnIj4nK2Fbcl0udGl0bGUuJHQrJzwvYT48L3N0cm9uZz48c3BhbiBjbGFzcz0ibGlzdC1tZWRpYS1jb250ZW50Ij4nK2krIjwvc3Bhbj48L2xpPiJ9Y3QuaW5uZXJIVE1MPXMrJzwvdWw+PGJyPjxwIGNsYXNzPSJ0ZXh0LWNlbnRlciI+PGEgaHJlZj0iI3ByZXZpb3VzLXJlc3VsdHMiIGNsYXNzPSJidXR0b24gYnV0dG9uLWNpbGlrIHByZXZpb3VzLXJlc3VsdHMiPlNlYmVsdW1ueWE8L2E+IDxhIGhyZWY9IiNuZXh0LXJlc3VsdHMiIGNsYXNzPSJidXR0b24gYnV0dG9uLWNpbGlrIG5leHQtcmVzdWx0cyI+QmVyaWt1dG55YTwvYT48L3A+J31lbHNlIGN0LmlubmVySFRNTD0iPGg0PlBlbmVsdXN1cmFuIHBvc3RpbmcgZGVuZ2FuIGthdGEga3VuY2kgJiM4MjIwOyIraCsiJiM4MjIxOyB0aWRhayBkaXRlbXVrYW4uPC9oND4iOyJ1bmRlZmluZWQiIT10eXBlb2YgalF1ZXJ5JiYiaGwiaW4galF1ZXJ5LmZuJiZqUXVlcnkoIiNzZWFyY2gtcmVzdWx0LWNvbnRhaW5lciAubGlzdC1tZWRpYSIpLmhsKGgpfSwKCgplLmZlZWRfND1mdW5jdGlvbihlKXtpZihyPWUuZmVlZC5lbnRyeSxzPSc8YSBocmVmPSIjY2xvc2UiIGNsYXNzPSJjbG9zZSIgdGl0bGU9IlR1dHVwIiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgmIzM5O2xhdGVzdC1jb21tZW50cyYjMzk7KS5yZW1vdmVBdHRyaWJ1dGUoJiMzOTtzdHlsZSYjMzk7KTtyZXR1cm4gZmFsc2U7Ij48c3BhbiBjbGFzcz0ic3IiPlR1dHVwPC9zcGFuPjwvYT48dWwgY2xhc3M9Imxpc3QtbWVkaWEgcmVjZW50LWNvbW1lbnRzIj4nLGN0PXQuZ2V0RWxlbWVudEJ5SWQoImxhdGVzdC1jb21tZW50cyIpLGN0KXtmb3IodmFyIGE9MCxoPXIubGVuZ3RoO2g+YTthKyspe2k9ImNvbnRlbnQiaW4gclthXT9yW2FdLmNvbnRlbnQuJHQ6IlRpZGFrIGFkYSBrb21lbnRhci4iLG89clthXS5hdXRob3JbMF0ubmFtZS4kdCx1PXJbYV0uYXV0aG9yWzBdLnVyaS4kdCxsPXJbYV0uYXV0aG9yWzBdLmdkJGltYWdlLnNyYy5yZXBsYWNlKC9cL3NbMC05XSsoXC1jKT8vLCIvczQwLWMiKSxjPXJbYV0ucHVibGlzaGVkLiR0LnN1YnN0cmluZygwLDE2KS5zcGxpdCgiLSIpLGQ9clthXS5pZC4kdC5yZXBsYWNlKC9eLio/YmxvZ1wtKFswLTldKykuKj9wb3N0XC0oWzAtOV0rKS8sImh0dHA6Ly93d3cuYmxvZ2dlci5jb20vZGVsZXRlLWNvbW1lbnQuZz9ibG9nSUQ9JDEmcG9zdElEPSQyIikscD1yW2FdWyJ0aHIkaW4tcmVwbHktdG8iXS5zb3VyY2Uuc3BsaXQoImRlZmF1bHQvIilbMV0sZz1yW2FdLmlkLiR0LnJlcGxhY2UoL14uKj9ibG9nXC0oWzAtOV0rKS4qP3Bvc3RcLShbMC05XSspLywiaHR0cDovL3d3dy5ibG9nZ2VyLmNvbS9jb21tZW50LWlmcmFtZS5nP2Jsb2dJRD0kMSZwb3N0SUQ9IitwKyImcGFyZW50SUQ9JDIiKTtmb3IodmFyIGY9MCxrPXJbYV0ubGluay5sZW5ndGg7az5mO2YrKylpZigiYWx0ZXJuYXRlIj09clthXS5saW5rW2ZdLnJlbCl7bj1yW2FdLmxpbmtbZl0uaHJlZjticmVha31tPW4uc3Vic3RyaW5nKG4ubGFzdEluZGV4T2YoIi8iKSsxLG4ubGFzdEluZGV4T2YoIi5odG1sIikpLnJlcGxhY2UoLy0vZywiICIpLHMrPSc8bGk+PGltZyBjbGFzcz0ibGlzdC1tZWRpYS10aHVtYm5haWwiIGFsdD0iTWVtdWF0Li4uIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHNyYz0iJytsKyciPjxzdHJvbmcgY2xhc3M9Imxpc3QtbWVkaWEtdGl0bGUiPjxhIGhyZWY9IicrdSsnIiB0aXRsZT0iVVJMIFByb2ZpbCI+JytvKyc8L2E+IHBhZGEgPGEgaHJlZj0iJytuKyciIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iVVJMIFBlcm1hbGluayBLb21lbnRhciI+JyttLnNwbGl0KCIiKVswXS50b1VwcGVyQ2FzZSgpK20uc2xpY2UoMSkrJy4uLjwvYT48L3N0cm9uZz48c3BhbiBjbGFzcz0ibGlzdC1tZWRpYS1jb250ZW50Ij4nK2krJzwvc3Bhbj48c3BhbiBjbGFzcz0ibGlzdC1tZWRpYS1tZXRhIHRleHQtcmlnaHQiPjx0aW1lIGRhdGV0aW1lPSInK2Muam9pbigiLSIpKyciPjxiPicrKGNbMl0uc3BsaXQoIlQiKVsxXSsiPC9iPiAtICIrY1syXS5zcGxpdCgiVCIpWzBdKyIgIitiW3BhcnNlSW50KGNbMV0sMTApLTFdKyIgIitjWzBdKSsnPC90aW1lPiAmbWlkZG90OyA8YSBocmVmPSInK2crJyIgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5ocmVmLCYjMzk7X2NmJiMzOTssJiMzOTtzY3JvbGxiYXJzPTEsd2lkdGg9NDcwLGhlaWdodD0yNTAsbGVmdD0zNTUsdG9wPTEzNSYjMzk7KTtyZXR1cm4gZmFsc2U7IiB0aXRsZT0iQmFsYXMga29tZW50YXIgaW5pLi4uIj5CYWxhczwvYT4gPGEgaHJlZj0iJytkKyciIHRpdGxlPSJIYXB1cyBrb21lbnRhciBpbmkuLi4iIHRhcmdldD0iX2JsYW5rIj5IYXB1czwvYT48L3NwYW4+PC9saT4nfSJ1bmRlZmluZWQiIT10eXBlb2YgY20/Y3QuaW5uZXJIVE1MPWNtKHMrIjwvdWw+Iik6cysiPC91bD4ifX0sKi8KCmUuZmVlZF81PWZ1bmN0aW9uKHQpe2UuX3o9cGFyc2VJbnQoL2Jsb2dcLVswLTldKy8uZXhlYyh0LmZlZWQuaWQuJHQpWzBdLnNsaWNlKDUpLDEwKX19KHdpbmRvdyxkb2N1bWVudCk7CgoKLyohIFRoZSBqcyAqLwohIGZ1bmN0aW9uICh0LCBlLCBhKSB7CiAgICBmdW5jdGlvbiBpKHQsIGUsIGksIG4pIHsKICAgICAgICB2YXIgbzsKICAgICAgICAianMiID09IHQgPyAobyA9IGEuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksIG8uaWQgPSBpLCBvLnNyYyA9IGUpIDogImNzcyIgPT0gdCAmJiAobyA9IGEuY3JlYXRlRWxlbWVudCgibGluayIpLCBvLnJlbCA9ICJzdHlsZXNoZWV0Iiwgby5ocmVmID0gZSksIG8ub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAiZnVuY3Rpb24iID09IHR5cGVvZiBuICYmIG4oKSwgbiA9IG51bGwKICAgICAgICB9LCBvLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgKDQgPT0gcy5yZWFkeVN0YXRlIHx8ICJjb21wbGV0ZSIgPT0gcy5yZWFkeVN0YXRlKSAmJiAoImZ1bmN0aW9uIiA9PSB0eXBlb2YgbiAmJiBuKCksIG4gPSBudWxsKQogICAgICAgIH0sIHUuYXBwZW5kQ2hpbGQobykKICAgIH0KICAgIGZ1bmN0aW9uIG4oYSkgewogICAgICAgIGguY3NzKHsKICAgICAgICAgICAgInRleHQtYWxpZ24iOiAianVzdGlmeSIsCiAgICAgICAgICAgICJmbG9hdCI6ICJyaWdodCIsCiAgICAgICAgICAgIG92ZXJmbG93OiAidmlzaWJsZSIsCiAgICAgICAgICAgIHBhZGRpbmc6IDAsCiAgICAgICAgICAgIG1hcmdpbjogMAogICAgICAgIH0pLCBmLmFwcGVuZCgnPGltZyBpZD0ibG9nby03NyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7cG9zaXRpb246Zml4ZWQhaW1wb3J0YW50O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo0MCU7bGVmdDo1MCU7bWFyZ2luOjAgMCAwIC02MHB4O3otaW5kZXg6OTk5OTkiIHNyYz0iJyArIEQgKyAnIi8+JyksIGUuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBoLnByZXBlbmQoJzxpbWcgY2xhc3M9ImxvZ28tY2hpbGQiIHN0eWxlPSJmbG9hdDpsZWZ0O2N1cnNvcjpub25lO2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7cG9zaXRpb246cmVsYXRpdmU7bGVmdDonICsgTWF0aC5yb3VuZCg5OTkgKiBNYXRoLnJhbmRvbSgpKSArICJweDt0b3A6IiArIE1hdGgucm91bmQoOTkgKiBNYXRoLnJhbmRvbSgpKSArICJweDt6LWluZGV4Ojk5OTk5O3dpZHRoOiIgKyBNYXRoLnJvdW5kKDUwICogTWF0aC5yYW5kb20oKSkgKyAncHg7aGVpZ2h0OmF1dG8haW1wb3J0YW50IiBzcmM9IicgKyBEICsgJyI+JykKICAgICAgICB9LCAxMDApLCBhID0gdCgiI2xvZ28tNzciKSwgZS5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGEuY3NzKCJtYXJnaW4tdG9wIiwgIjEwcHgiID09IGEuY3NzKCJtYXJnaW4tdG9wIikgPyAiLTEwcHgiIDogIjEwcHgiKQogICAgICAgIH0sIDMwMCkKICAgIH0KICAgIGZ1bmN0aW9uIG8oZSwgYSwgaSkgewogICAgICAgIHQoZSkucmVwbGFjZVdpdGgoZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gYSArIHRoaXMuaW5uZXJIVE1MICsgaQogICAgICAgIH0pCiAgICB9CiAgICBmdW5jdGlvbiByKCkgewogICAgICAgIHQoIi5pbWctYXR0YWNobWVudFtkYXRhLXNyY10iKS5hdHRyKCJzcmMiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0KHRoaXMpLmRhdGEoInNyYyIpLnJlcGxhY2UoLzxicltePl0qPi9nLCAiIikucmVwbGFjZSgvXC9zXGQrKFwtYyk/XC8vaSwgIi9zMjAwLyIpCiAgICAgICAgfSkub24oImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBlLm9wZW4odCh0aGlzKS5kYXRhKCJzcmMiKS5yZXBsYWNlKC88YnJbXj5dKj4vZywgIiIpKQogICAgICAgIH0pLnJlbW92ZUF0dHIoImRhdGEtc3JjIikuYXR0cigidGl0bGUiLCAiVGFtcGlsa2FuIHVrdXJhbiBwZW51aCEiKQogICAgfQogICAgZnVuY3Rpb24gbCgpIHsKICAgICAgICBnLmZpbmQoIi52aWRlbyIpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAveW91dHViZVwuY29tXC9lbWJlZC8udGVzdCh0KHRoaXMpLmRhdGEoInNyYyIpKSA/IHQodGhpcykuYXR0cigic3JjIiwgdCh0aGlzKS5kYXRhKCJzcmMiKSkgOiB0KHRoaXMpLnBhcmVudCgpLnJlcGxhY2VXaXRoKCc8ZGl2IGNsYXNzPSJhbGVydCI+PHA+SW52YWxpZCBWaWRlbyBVUkwhPC9wPjwvZGl2PicpCiAgICAgICAgfSkucmVtb3ZlQXR0cigiZGF0YS1zcmMiKQogICAgfQogICAgZnVuY3Rpb24gYyhlLCBhKSB7CiAgICAgICAgaSgianMiLCAiaHR0cDovLyIgKyBtLmIgKyAiL2ZlZWRzL2NvbW1lbnRzL2RlZmF1bHQ/YWx0PWpzb24taW4tc2NyaXB0Jm9yZGVyYnk9cHVibGlzaGVkJm1heC1yZXN1bHRzPSIgKyBlICsgIiZjYWxsYmFjaz1mZWVkXzQmbm9jYWNoZT0iICsgKG5ldyBEYXRlKS5nZXRUaW1lKCksICJmZWVkXzQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGIuc2hvdygpLnRzKCksICJ1bmRlZmluZWQiICE9IHR5cGVvZiBobGpzICYmIGIuZmluZCgnaVtyZWw9InByZSJdJykucmVwbGFjZVdpdGgoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHQoIjxwcmU+PGNvZGU+IiArIGhsanMuaGlnaGxpZ2h0QXV0byh0aGlzLmlubmVySFRNTC5yZXBsYWNlKC8mL2csICImIikucmVwbGFjZSgvJmx0Oy9nLCAiPCIpLnJlcGxhY2UoLyZndDsvZywgIj4iKS5yZXBsYWNlKC88YnIgP1wvPz4vZ2ksICJcbiIpKS52YWx1ZSArICI8L2NvZGU+PC9wcmU+IikKICAgICAgICAgICAgfSksIGIuZmluZCgiaS5lbW8iKS5yZXBsYWNlV2l0aChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdCgnPGltZyBjbGFzcz0iZW1vIiBzcmM9IicgKyB0KHRoaXMpLmRhdGEoImVtbyIpICsgJyIgYWx0PSInICsgdGhpcy50aXRsZSArICciPicpCiAgICAgICAgICAgIH0pLCByKCksIGIuZmluZCgibGk6bHQoIiArIGEgKyAiKSIpLmFkZENsYXNzKCJzZWxlY3RlZCIpLCBILmZpbmQoIi5idXR0b24tbm90aWYiKS5yZW1vdmUoKSwgYi50c191KCkKICAgICAgICB9KQogICAgfQogICAgZnVuY3Rpb24gZCgpIHsKICAgICAgICBnLmZpbmQoIi5jb21tZW50X2F2YXRhcl93cmFwW2RhdGEtc3JjXSIpLmh0bWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gJzxpbWcgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiBzcmM9IicgKyB0KHRoaXMpLmRhdGEoInNyYyIpLnJlcGxhY2UoL1wvc1swLTldKyhcLWMpPy8sICIvczUwLWMiKSArICciIGFsdD0iQXZhdGFyIEF1dGhvciI+JwogICAgICAgIH0pLnJlbW92ZUF0dHIoImRhdGEtc3JjIikKICAgIH0KICAgIHZhciBtID0gewogICAgICAgIGE6IGUubG9jYXRpb24sCiAgICAgICAgYjogZS5sb2NhdGlvbi5ob3N0bmFtZSwKICAgICAgICBjOiBlLmxvY2F0aW9uLnByb3RvY29sLAogICAgICAgIGQ6IGUubG9jYXRpb24ub3JpZ2luLAogICAgICAgIGU6IGUubG9jYXRpb24ucGF0aG5hbWUsCiAgICAgICAgZjogZS5sb2NhdGlvbi5zZWFyY2gsCiAgICAgICAgZzogZS5sb2NhdGlvbi5oYXNoLAogICAgICAgIGg6IGUubG9jYXRpb24ucG9ydCwKICAgICAgICBpOiBlLmxvY2F0aW9uLm9yaWdpbiwKICAgICAgICBqOiBlLmxvY2F0aW9uLmhyZWYKICAgIH0sIHUgPSBhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sCiAgICAgICAgcCA9IHQoJ1tkYXRhLWF1dGhvcj0iY29iYW5nZXRpayJdJyksCiAgICAgICAgaCA9IHQoYS5ib2R5KS5maW5kKCIqIiksCiAgICAgICAgZiA9IHQoYS5ib2R5KS5hdHRyKCJzcGVsbGNoZWNrIiwgITEpLAogICAgICAgIGcgPSB0KCIjY29tbWVudHMiKSwKICAgICAgICBBID0gdCgiI2NvbW1lbnRzLWJsb2NrIiksCiAgICAgICAgdiA9IHQoIi5lbW90a2kiKSwKICAgICAgICBiID0gdCgiI2xhdGVzdC1jb21tZW50cyIpLAogICAgICAgIHkgPSB0KCJpLmVtbyIpLAogICAgICAgIHcgPSBhLnRpdGxlLAogICAgICAgIHggPSAodCgiI290dy1zY3JvbCIpLnRzKCksIHQoIiNuYXYyIikpLAogICAgICAgIFQgPSB0KCIuc2lkZWJhci10b2dnbGUiKSwKICAgICAgICBfID0gdCgiLnRvcCIpLAogICAgICAgIE0gPSB0KCIua29tZW50YXJlIiksCiAgICAgICAgSCA9IHQoIiNzdGlja2VkLXBhbmVsIiksCiAgICAgICAgSSA9ICh0KCJpbWcuaW1nLWF0dGFjaG1lbnQiKSwgdChlKSksCiAgICAgICAgaiA9IHQoYSksCiAgICAgICAgUSA9IHQoIi5mb3JtLXNlYXJjaCIpLAogICAgICAgIEIgPSB0KCIuZm9ybS1zZWFyY2gtb3B0aW9ucyIpLAogICAgICAgIEQgPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFOEFBQUJQQ0FZQUFBSGRNNmdRQUFBQUNYQklXWE1BQUE3REFBQU93d0hIYjZoa0FBQUFJR05JVWswQUFIb2xBQUNBZ3dBQStmOEFBSURwQUFCMU1BQUE2bUFBQURxWUFBQVhiNUpmeFVZQUFBSmdTVVJCVkhqYVlqekR3UENmZ1FqQXhFQWtvS0ZDRXlRYUc1c0pKbkFHaXlsbjBFMDhRNFRWakFNWFBBQUFBQUQvLzJJY2lqR0RIa3RZVFRUQndjWlFlQVlwT3M4TW51QUJBQUFBLy84aTJtcXEyenk0REVTUFJ4TXM4Y21BUXh4bmdrRG1uOEdUNzRrcUpQQ1ZCNFI4TkJyTGxBTUFBQUFBLy84YURjTlJBNmxob0FtSnBRMERKYVVOSWNOd1ZueTRXaHNNUkpSRVRJUTBrMklZVVRVdW9aTGFoRkJleGxWS1kvT0JDU1UxK0doT0dUVVFBUUFBQUFELy82SjZzaG4wUGg1MTRLZ0RSeDFJWjhCQ1NsOEJ2Y296d2FQdkRKbG1FdTFBRXhJY2ZnWkh3K0FNaVdhUzNHYzhRMEt2ak5pWUlOVk1Ga0lkV2dZcWhBS3hacDRodDZvem9YSWFKTlNVRzYyTFJ4MDQ2c0JSQjQ0NkVBRUFBQUFBLy8vczJFc0t3Q0FNUlZGd1RXLy9LOGlpT20rcHhIeEtvTmVoZzNCOENZS092Z2NYclFVSERodzRjT0QrZzJ2NXdyQkVUWGR5Q3A1WVJUWERiYjAvbk8zTG1aT3pSU2N0UDYyNXFtRGVwQzJUM0JUWUE2ZUd1VkhIVmFMTnZoVkQzMnF1cnBRcXhtTDBIMTRxT1F2Q2VGU0RBd2NPSERodzRNQ1ZyUXNBQVAvLzdKcEJEb0F3Q0FTTjRVbjgvd1Y5bENldmFoSG9hbVp2SHRxc1UwQWFsSi9IY3JMQVE4QURIdkNBQnp3RVBPQUJEM2dJZUhXeXJJMml2d1hjclovWm84Tm5Lanh2V0pjeHQzU2x5UFBpMDgrYVhIdGgydTZLNE03bnNTZ3JTaUxQTDE2NjJ1aE05SFg1dENpNHNXbXEwNmU5aVRabGFCMCtMVkl6dXIrVTBkcFc3Yk85U1ZaTjk2Vk5jbGIwUENuc0tnZVFObnFjN2R4OVVlUkszVEF5MHRjL211b012YnR2R0FoNHdBTWU4SUNIZ0FjODRBRVBBUTk0d1B1SERnQUFBUC8vQXdBY01YY0xuVmtVR0FBQUFBQkpSVTVFcmtKZ2dnPT0iLAogICAgICAgIE8gPSB0KCIudG9nZ2xlLW9wdGlvbiIpLAogICAgICAgIFAgPSB0KCIjc2VhcmNoLXJlc3VsdCIpLAogICAgICAgIHEgPSB0KCIjbWFpbi13cmFwIiksCiAgICAgICAgVSA9IHQoIi5mb3JtX2tvbnRhayIpLAogICAgICAgIEwgPSB0KCIua3QiKSwKICAgICAgICBSID0gewogICAgICAgICAgICBhOiA2MCwKICAgICAgICAgICAgYjogMCwKICAgICAgICAgICAgYzogLTEsCiAgICAgICAgICAgIGQ6IHQoImh0bWwsYm9keSIpLAogICAgICAgICAgICBlOiB0KCIudmlzaWJsZSIpLAogICAgICAgICAgICBmOiB0KCIjY29tbWVudC1lZGl0b3IiKSwKICAgICAgICAgICAgZzogITEsCiAgICAgICAgICAgIGg6IHQoIiNjb21tZW50LWZvcm0iKSwKICAgICAgICAgICAgaTogITEsCiAgICAgICAgICAgIGo6ICIjY29tbWVudC1mb3JtIC5idXR0b24tY2FuY2VsIiwKICAgICAgICAgICAgazogMCwKICAgICAgICAgIGw6IHQoIi5pbmRleF9ibG9nLXBhZ2VyIiksCiAgICAgICAgICBtOiB0KCIubWFhZiIpCiAgICAgICAgfSwgRSA9IFIuZi5sZW5ndGggPiAwID8gUi5mLmF0dHIoInNyYyIpLnNwbGl0KCIjIikgOiBbXTsKICAgICAgICBmLm9uKCJjbGljayIsICIuaW5kZXhfYmxvZy1wYWdlciBhIiwgZnVuY3Rpb24gKCkgewogICAgICAgIFIuZC5zdG9wKCkuYW5pbWF0ZSh7CiAgICAgICAgICAgIHNjcm9sbFRvcDogMAogICAgICAgIH0sIDJlMywgImVhc2VPdXRRdWFydCIpCiAgICAgICAgcmV0dXJuIHQuZ2V0KHRoaXMuaHJlZiwge30sIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgIHZhciBpID0gdCh0KGEpLmZpbmQoIi5wb3N0LWhvbWVwYWdlIikubGVuZ3RoID8gYSA6ICI8ZGl2PjwvZGl2PiIpOwogICAgICAgICAgICBSLm0uaHRtbChpLmZpbmQoIi5tYWFmIikuaHRtbCgpKSwgUi5sLmh0bWwoaS5maW5kKCIuaW5kZXhfYmxvZy1wYWdlciBhIikuY2xvbmUoKSksUi5tLnJlbW92ZUNsYXNzKCJsb2FkaW5nIHlhIikKICAgICAgICB9LCAiaHRtbCIpLCB0KHRoaXMpLmFkZENsYXNzKCJkaXNhYmxlZCIpLnJlbW92ZUF0dHIoImhyZWYiKSxSLm0uYWRkQ2xhc3MoImxvYWRpbmcgeWEiKSwgITEKICAgIH0pLCBwLmxlbmd0aCB8fCBuKCksIF9tZW1vLmdldCgibm90aWZpY2F0aW9uLWRpc2FibGVkIikgfHwgZS5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgdC5nZXQoImh0dHA6Ly8iICsgbS5iICsgIi9mZWVkcy9jb21tZW50cy9kZWZhdWx0P3JlZGlyZWN0PWZhbHNlJm1heC1yZXN1bHRzPTAmYWx0PWpzb24taW4tc2NyaXB0IiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgX21lbW8uZ2V0KCJub3RpZmljYXRpb24iKSA/IChfbWVtby5zZXQoIm5vdGlmaWNhdGlvbi1vbGQiLCBwYXJzZUludChfbWVtby5nZXQoIm5vdGlmaWNhdGlvbiIpLCAxMCksIDdlMyksIF9tZW1vLnNldCgibm90aWZpY2F0aW9uIiwgcGFyc2VJbnQoX21lbW8uZ2V0KCJub3RpZmljYXRpb24tb2xkIiksIDEwKSwgN2UzKSkgOiBfbWVtby5zZXQoIm5vdGlmaWNhdGlvbiIsIDAsIDdlMyk7CiAgICAgICAgICAgIHZhciBhID0gcGFyc2VJbnQoZS5mZWVkLm9wZW5TZWFyY2gkdG90YWxSZXN1bHRzLiR0LCAxMCk7CiAgICAgICAgICAgIGlmIChfbWVtby5nZXQoIm5vdGlmaWNhdGlvbiIpID8gcGFyc2VJbnQoX21lbW8uZ2V0KCJub3RpZmljYXRpb24iKSwgMTApIDogMCwgX21lbW8uc2V0KCJub3RpZmljYXRpb24iLCBhLCA3ZTMpLCBfbWVtby5nZXQoIm5vdGlmaWNhdGlvbiIpKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IHBhcnNlSW50KF9tZW1vLmdldCgibm90aWZpY2F0aW9uIiksIDEwKSAtIHBhcnNlSW50KF9tZW1vLmdldCgibm90aWZpY2F0aW9uLW9sZCIpLCAxMCk7CiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIGlmICh0KCIuYnV0dG9uLW5vdGlmIikubGVuZ3RoID4gMCAmJiBwYXJzZUludCh0KCIuYnV0dG9uLW5vdGlmIikudGV4dCgpLCAxMCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBwYXJzZUludCh0KCIuYnV0dG9uLW5vdGlmIikudGV4dCgpLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgYS50aXRsZSA9ICIoIiArIChpICsgbiA+IDUwID8gIjUwKyIgOiBpICsgbikgKyAiKSAiICsgdywgSC5maW5kKCIuYnV0dG9uLW5vdGlmIikucmVtb3ZlKCksIHQoJzxzcGFuIGNsYXNzPSJidXR0b24tbm90aWYiPicgKyAoaSArIG4gPiA1MCA/ICI1MCsiIDogaSArIG4pICsgIjwvc3Bhbj4iKS5vbigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQodGhpcykuaHRtbCgiTWVtdWF0JmhlbGxpcDsiKSwgYS50aXRsZSA9IHcsIGMoaSArIG4gPiA1MCA/IGkgKyBuIDogNTAsIGkgKyBuKQogICAgICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKEgpCiAgICAgICAgICAgICAgICB9IGVsc2UgYS50aXRsZSA9ICIoIiArIChpID4gNTAgPyAiNTArIiA6IGkpICsgIikgIiArIHcsIEguZmluZCgiLmJ1dHRvbi1ub3RpZiIpLnJlbW92ZSgpLCB0KCc8c3BhbiBjbGFzcz0iYnV0dG9uLW5vdGlmIj4nICsgKGkgPiA1MCA/ICI1MCsiIDogaSkgKyAiPC9zcGFuPiIpLm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0KHRoaXMpLmh0bWwoIk1lbXVhdCZoZWxsaXA7IiksIGEudGl0bGUgPSB3LCBjKGkgPiA1MCA/IGkgOiA1MCwgaSkKICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKEgpCiAgICAgICAgICAgIH0KICAgICAgICB9LCAianNvbnAiKQogICAgfSwgM2U0KSwgbCgpLCBvKCdiW3JlbD0icXVvdGUiXScsICI8YmxvY2txdW90ZT4iLCAiPC9ibG9ja3F1b3RlPiIpLCBvKCdpW3JlbD0iY29kZSJdJywgIjxjb2RlPiIsICI8L2NvZGU+IiksIG8oJ2lbcmVsPSJwcmUiXScsICI8cHJlPjxjb2RlPiIsICI8L2NvZGU+PC9wcmU+IiksIG8oJ2lbcmVsPSJub3RlIl0nLCAnPGRpdiBjbGFzcz0ibm90ZSI+JywgIjwvZGl2PiIpLCB0KCJkaXYscCx0ZCxsaSIpLmNoaWxkcmVuKCJjb2RlIikud3JhcElubmVyKGZ1bmN0aW9uICgpIHsKICAgICAgLyogIHJldHVybiAnPGEgY2xhc3M9ImFsbG93IiB0aXRsZT0iQXBhIGluaSA/IiBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jby5pZC9jc2U/cT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHQodGhpcykudGV4dCgpKSArICcmY3g9eHh4eHh4Y3h4eHh4eHh4eHh4eHh4Ol9idWNwaDhfcnJ1JnNhPVRlbHVzdXJpIiB0YXJnZXQ9Il9ibGFuayI+PC9hPicqLwogICAgfSksIGcuZmluZCgiLmNvbW1lbnQtYm9keSIpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBlID0gdCh0aGlzKSwKICAgICAgICAgICAgYSA9IGUuZmluZCgiYSIpLmZpbHRlcigiOm5vdCguYWxsb3cpIiksCiAgICAgICAgICAgIGkgPSBlLmh0bWwoKSwKICAgICAgICAgICAgbiA9IC8oXnwgfD58XC98XCh8InwnfCZxdW90O3wmIzM5O3xcWykoT09UfE9UVHxrZWx1YXIgdG9waWt8b3V0IG9mIHRvcGljfG9mZiB0b3BpY3xkaWx1YXIgdG9waWt8ZGkgbHVhciB0b3Bpa3x0aWRhayBzZXN1YWkgZGVuZ2FuIHBlbWJhaGFzYW58dGlkYWsgc2VzdWFpIHRvcGlrfHRpZGFrIHNlc3VhaSBkZW5nYW4gdG9waWt8bWVueWltcGFuZyBkYXJpIHRvcGlrfG1pbnRhIHRlbXBsYXRlfGJsYWNrYmVycnl8bm9raWF8YWNlcnxzYW1zdW5nfHRvZ2VsfHJlYWR5IHN0b2NrfG1lbmF3YXJrYW4gcHJvZHVrfHByb2R1ayB5YW5nIGRpdGF3YXJrYW58cHJvZHVrIHlhbmcga2FtaSB0YXdhcmthbnxwcm9tb3xudW1wYW5nIHByb21vKShcXXxueWF8InwnfCZxdW90O3wmIzM5O3xcLHxcLnxcIXxcP3xcOnxcO3xcKXxcL3w8fCB8JCkvZ2k7CiAgICAgICAgYS5sZW5ndGggPiAwICYmIGUuaXMoIi52aXNpdG9yLWNvbW1lbnQiKSAmJiAoZS53cmFwSW5uZXIoIjxkZWw+PC9kZWw+IikuY2xvc2VzdCgiLmNvbW1lbnQiKS5hZGRDbGFzcygic3BhbSIpLCBtLmcgJiYgdCgiLiIgKyBtLmcucmVwbGFjZSgvXCM/YyhbMC05XSspLywgImMkMSIpKS5oYXNDbGFzcygic3BhbSIpICYmIEMoZS5jbG9zZXN0KCIuY29tbWVudCIpLm9mZnNldCgpLnRvcCAtIDEwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIFMoIlRhdXRhbiBBbmRhIHRlcnBha3NhIFNheWEgYmxva2lyIHVudHVrIGFsYXNhbiBrZW55YW1hbmFuIHBlbWJhY2EgbGFpbi4gV2ViIGluaSBkaWd1bmFrYW4gdW50dWsga2FsYW5nYW4gdW11bSwgbXVuZ2tpbiBha2FuIGxlYmloIGJhaWsgamlrYSBBbmRhIHRpZGFrIG1lbnllcnRha2FuIHRhdXRhbi10YXV0YW4gZGkgYXJlYSBrb21lbnRhciB1bnR1ayBtZW5jZWdhaCBwcmFzYW5na2EgYnVydWsgZGFyaSBwZW1iYWNhIHlhbmcgbGFpbiB0ZXJoYWRhcCBBbmRhLjxicj48YnI+SmlrYSBBbmRhIG1lcmFzYSBiYWh3YSBpbmkgYWRhbGFoIGtlc2FsYWhhbiBvdG9tYXRpc2FzaSBzaXN0ZW0sIGN1a3VwIHR1bGlza2FuIGtlbWJhbGkga29tZW50YXIgbGFtYSBBbmRhIGRlbmdhbiBmb3JtYXQgeWFuZyBzYW1hIHNlcGVydGkgc2ViZWx1bW55YSwgbmFtdW4gdGFucGEgYWRhbnlhIHRhdXRhbiBha3RpZiBkaSBkYWxhbW55YSwgbWlzYWxueWEgYmVydXBhIHRla3MgVVJMLiBUZXJpbWEga2FzaWguIikKICAgICAgICB9KSksIG4udGVzdChpKSAmJiBlLmlzKCIudmlzaXRvci1jb21tZW50IikgJiYgKHQodGhpcykuaHRtbCgiPGRlbD4iICsgaS5yZXBsYWNlKG4sICIkMTwvZGVsPjxtYXJrPjxhIGNsYXNzPSdhbGxvdycgaHJlZj0nLzIwMTQvMDEvb290LXJlcXVlc3QtdHV0b3JpYWwuaHRtbCcgdGl0bGU9J0thdGEgaW5pIHRpZGFrIGRpcGVyYm9sZWhrYW4gYWRhIGRpIGRhbGFtIGtvbWVudGFyJz4kMjwvYT48L21hcms+PGRlbD4kMyIpICsgIjwvZGVsPiIpLmNsb3Nlc3QoIi5jb21tZW50IikuYWRkQ2xhc3MoInNwYW0iKS5vbigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHQodGhpcykucmVtb3ZlQ2xhc3MoInNwYW0iKQogICAgICAgIH0pLCBtLmcgJiYgdCgiLiIgKyBtLmcucmVwbGFjZSgvXCM/YyhbMC05XSspLywgImMkMSIpKS5oYXNDbGFzcygic3BhbSIpICYmIEMoZS5jbG9zZXN0KCIuY29tbWVudCIpLm9mZnNldCgpLnRvcCAtIDEwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIFMoIkthdGEta2F0YSB5YW5nIGRpdGFuZGFpIHN1ZGFoIHRpZGFrIGRpcGVyYm9sZWhrYW4gbGFnaSBhZGEgZGkgZGFsYW0ga29tZW50YXIuIikKICAgICAgICB9KSksIGUuZmluZCgiYSIpLmZpbHRlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAvXihodHRwXDpcL1wvKT8ob2Jlc2l0eXN0cmlrZVwuYmxvZ3Nwb3RcLmNvbSk/Lio/XC8uKj9cP3Nob3dDb21tZW50XD1bMC05XStcI2NbMC05XSsvLnRlc3QodGhpcy5ocmVmKQogICAgICAgIH0pLmF0dHIoewogICAgICAgICAgICB0aXRsZTogIktsaWsgdW50dWsgbWVtdWF0IGphd2FiYW4vcGVydGFueWFhbiBzZWplbmlzLiIKICAgICAgICB9KS5vbigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBhID0gdGhpcy5ocmVmLAogICAgICAgICAgICAgICAgaSA9IGEuc3BsaXQoIiMiKTsKICAgICAgICAgICAgcmV0dXJuIHQoJzxkaXYgY2xhc3M9ImNtX3dyYXAtY29udGFpbmVyIGxvYWRlciIgaWQ9ImNtX3dyYXAtY29udGFpbmVyIiBzdHlsZT0iaGVpZ2h0OjUwcHg7Ij48L2Rpdj4nKS5sb2FkKGlbMF0uc3BsaXQoIj8iKVswXSArICIgIyIgKyBpWzFdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9IHQodGhpcyk7CiAgICAgICAgICAgICAgICBlLnJlbW92ZUNsYXNzKCJsb2FkZXIiKS5yZW1vdmVBdHRyKCJzdHlsZSIpLmZpbmQoIi5idXR0b25fcmVwbHkiKS5oaWRlKCksIHQoJzxzcGFuPjxicj48YnI+PHNtYWxsPjxiPlRhdXRhbiBTdW1iZXI6PC9iPiA8YSBocmVmPSInICsgYSArICciPicgKyBhICsgIjwvYT48L3NtYWxsPjwvc3Bhbj4iKS5hcHBlbmRUbyhlLmZpbmQoIi5jb21tZW50LWJvZHkiKSksIGQoKSwgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGhsanMgJiYgdCgnaVtyZWw9InByZSJdJywgdGhpcykucmVwbGFjZVdpdGgoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0KCI8cHJlPjxjb2RlPiIgKyBobGpzLmhpZ2hsaWdodEF1dG8odGhpcy5pbm5lckhUTUwucmVwbGFjZSgvJi9nLCAiJiIpLnJlcGxhY2UoLyZsdDsvZywgIjwiKS5yZXBsYWNlKC8mZ3Q7L2csICI+IikucmVwbGFjZSgvPGJyID9cLz8+L2dpLCAiXG4iKSkudmFsdWUgKyAiPC9jb2RlPjwvcHJlPiIpCiAgICAgICAgICAgICAgICB9KSwgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGNtICYmIChjbSh0aGlzLCB0aGlzLmlubmVySFRNTCksIGUuZmluZCgiaS5lbW8iKS5yZXBsYWNlV2l0aChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoJzxpbWcgY2xhc3M9ImVtbyIgc3JjPSInICsgdCh0aGlzKS5kYXRhKCJlbW8iKSArICciIGFsdD0iJyArIHRoaXMudGl0bGUgKyAnIj4nKQogICAgICAgICAgICAgICAgfSksIGwoKSkKICAgICAgICAgICAgfSkuYXBwZW5kVG8oZS5jbG9zZXN0KCIuY29tbWVudCIpKSwgITEKICAgICAgICB9KQogICAgfSksIHguZmluZCgiLm5hdiBhIikuZmlsdGVyKGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdCh0aGlzKS5uZXh0KCkuaXMoInVsIikKICAgIH0pLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgcmV0dXJuIHguZmluZCgiYSIpLm5vdCh0aGlzKS5yZW1vdmVDbGFzcygiYWN0aXZlIikubmV4dCgpLmhpZGUoKSwgdCh0aGlzKS50b2dnbGVDbGFzcygiYWN0aXZlIikubmV4dCgpLnNsaWRlVG9nZ2xlKDIwMCwgImVhc2VPdXRRdWFydCIpLCBlLnN0b3BQcm9wYWdhdGlvbigpLCAhMQogICAgfSksIEwub24oImNsaWNrIiwgZnVuY3Rpb24gKHQpIHsKICAgICAgICByZXR1cm4gZi5yZW1vdmVDbGFzcygic2lkZWJhci1pcy12aXNpYmxlIiksIFUuc2xpZGVUb2dnbGUoMjAwLCAiZWFzZU91dFF1YXJ0IiksIHQuc3RvcFByb3BhZ2F0aW9uKCksICExCiAgICB9KSwgai5vbigia2V5ZG93biIsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgcmV0dXJuIHQuY3RybEtleSAmJiA3MCA9PSB0LmtleUNvZGUgPyAoZi5yZW1vdmVDbGFzcygic2lkZWJhci1pcy12aXNpYmxlIiksIFEudG9nZ2xlQ2xhc3MoInN0aWNrZWQiKS5hdHRyKCJkYXRhLW1vZGUiLCAicGFnZSIpLmZpbmQoIi5mb3JtLXNlYXJjaC10ZXh0IikudHJpZ2dlcigiZm9jdXMiKSwgQi5maW5kKCdbZGF0YS1zZWFyY2gtbW9kZT0icGFnZSJdJykucGFyZW50KCkuYWRkQ2xhc3MoInNlbGVjdGVkIikuc2libGluZ3MoKS5yZW1vdmVDbGFzcygic2VsZWN0ZWQiKSwgQi5wcmV2KCkuYXR0cigiZGF0YS1pY29uIiwgQi5maW5kKCdbZGF0YS1zZWFyY2gtbW9kZT0icGFnZSJdJykuYXR0cigiZGF0YS1pY29uIikpLCAhMSkgOiB2b2lkIDAKICAgIH0pLCBCLmZpbmQoImEiKS5vbigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgICAgIHJldHVybiBRLmF0dHIoImRhdGEtbW9kZSIsIHQodGhpcykuZGF0YSgic2VhcmNoTW9kZSIpKS5maW5kKCIuZm9ybS1zZWFyY2gtdGV4dCIpLnRyaWdnZXIoImZvY3VzIiksIEIuaGlkZSgpLCBPLnJlbW92ZUNsYXNzKCJvbiIpLmF0dHIoImRhdGEtaWNvbiIsIHQodGhpcykuZGF0YSgiaWNvbiIpKSwgdCh0aGlzKS5wYXJlbnQoKS5hZGRDbGFzcygic2VsZWN0ZWQiKS5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCJzZWxlY3RlZCIpLCBlLnN0b3BQcm9wYWdhdGlvbigpLCAhMQogICAgfSksIFEub24oInN1Ym1pdCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBmLnJlbW92ZUNsYXNzKCJzaWRlYmFyLWlzLXZpc2libGUiKSwgVC5yZW1vdmVDbGFzcygiYWN0aXZlIik7CiAgICAgICAgdmFyIGEgPSB0KHRoaXMpLmF0dHIoImRhdGEtbW9kZSIpLAogICAgICAgICAgICBuID0gdCgiLmZvcm0tc2VhcmNoLXRleHQiLCB0aGlzKS52YWwoKTsKICAgICAgICBpZiAodCh0aGlzKS5yZW1vdmVDbGFzcygic3RpY2tlZCIpLmF0dHIoImRhdGEtY2FjaGVkLWtleXdvcmQiLCBuKSwgIndlYiIgPT0gYSkgcmV0dXJuIGUub3BlbigiaHR0cDovL3d3dy5nb29nbGUuY28uaWQvY3NlP3E9IiArIG4gKyAiJmN4PXh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4Ol9idWNwaDhfcnJ1JnNhPVRlbHVzdXJpIiksICExOwogICAgICAgIGlmICgiYmxvZyIgPT0gYSkgewogICAgICAgICAgICBSLmIrKzsKICAgICAgICAgICAgdmFyIG8gPSBxLm9mZnNldCgpLnRvcCAtIDEwOwogICAgICAgICAgICByZXR1cm4gUi5kLnN0b3AoKS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogbwogICAgICAgICAgICB9LCA0MDAsICJlYXNlT3V0UXVhcnQiKSwgUC5zaG93KCksIHQoIiNmZWVkXzEiKS5yZW1vdmUoKSwgUC5maW5kKCIuaW5uZXItYXN1IikuaHRtbCgnPGRpdiBjbGFzcz0ibG9hZGVyIGFsdC0xIiBzdHlsZT0iaGVpZ2h0OjYwcHg7Ij48L2Rpdj4nKSwgaSgianMiLCAiaHR0cDovLyIgKyBtLmIgKyAiL2ZlZWRzL3Bvc3RzL3N1bW1hcnk/YWx0PWpzb24taW4tc2NyaXB0Jm9yZGVyYnk9dXBkYXRlZCZxPSIgKyBuICsgIiZzdGFydC1pbmRleD0iICsgKFIuYiA8PSAxID8gUi5iIDogNTAgKiAoUi5iIC0gMSkgKyAxKSArICImbWF4LXJlc3VsdHM9MTUmY2FsbGJhY2s9ZmVlZF8xIiwgImZlZWRfMSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIFAuZmluZCgiLnByZXZpb3VzLXJlc3VsdHMiKVtSLmIgPD0gMSA/ICJoaWRlIiA6ICJzaG93Il0oKQogICAgICAgICAgICB9KSwgITEKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJwYWdlIiA9PSBhID8gKFIuYysrLCB0KHRoaXMpLmFkZENsYXNzKCJzdGlja2VkIiksIHEucmhsKCkuaGwobiksIGUuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHEuZmluZCgibWFyay5oaWdobGlnaHQiKS5sZW5ndGggPiAwID8gUi5kLnN0b3AoKS5hbmltYXRlKHsKICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogcS5maW5kKCJtYXJrLmhpZ2hsaWdodCIpLmVxKFIuYykub2Zmc2V0KCkudG9wIC0gMTAKICAgICAgICAgICAgfSwgNDAwLCAiZWFzZU91dFF1YXJ0IiwgaykgOiAoZS5hbGVydCgiVGFrIGRpdGVtdWthbiEiKSwgUS5yZW1vdmVDbGFzcygic3RpY2tlZCIpKQogICAgICAgIH0sIDQwMCksICExKSA6IHZvaWQgMAogICAgfSkuZmluZCgiLmNsb3NlIikub24oImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBxLnJobCgpLCBQLmhpZGUoKSwgUS5oYXNDbGFzcygic3RpY2tlZCIpIHx8IChSLmQuc2Nyb2xsVG9wKDApLCBRLnRyaWdnZXIoImZvY3VzIikpLCB0KHRoaXMpLmhpZGUoKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygic3RpY2tlZCIpLmZpbmQoIi5mb3JtLXNlYXJjaC10ZXh0IikudmFsKCIiKSwgZi5yZW1vdmVDbGFzcygic2lkZWJhci1pcy12aXNpYmxlIiksIFQucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLCBSLmIgPSAwLCBSLmMgPSAtMSwgITEKICAgIH0pLCBQLmZpbmQoIi5jbG9zZSIpLm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gUC5oaWRlKCksIFEuZmluZCgiLmZvcm0tc2VhcmNoLXRleHQiKS52YWwoIiIpLnRyaWdnZXIoImZvY3VzIiksIFIuZC5zY3JvbGxUb3AoMCksIFEuZmluZCgiLmNsb3NlIikuaGlkZSgpLCBSLmIgPSAwLCBSLmMgPSAtMSwgITEKICAgIH0pLCBRLmZpbmQoIi5mb3JtLXNlYXJjaC10ZXh0Iikub24oImtleXVwIiwgZnVuY3Rpb24gKCkgewogICAgICAgIFEuZmluZCgiLmNsb3NlIilbIiIgPT09IHRoaXMudmFsdWUgPyAiaGlkZSIgOiAic2hvdyJdKCkuZmluZCgiLnRvb2x0aXAiKS5oaWRlKCksIHRoaXMudmFsdWUgIT0gUS5hdHRyKCJkYXRhLWNhY2hlZC1rZXl3b3JkIikgJiYgKFIuYiA9IDAsIFIuYyA9IC0xKQogICAgfSksIFAub24oImNsaWNrIiwgIi5uZXh0LXJlc3VsdHMiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIFEudHJpZ2dlckhhbmRsZXIoInN1Ym1pdCIpLCAhMQogICAgfSksIFAub24oImNsaWNrIiwgIi5wcmV2aW91cy1yZXN1bHRzIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBSLmIgPSBSLmIgLSAyLCBRLnRyaWdnZXJIYW5kbGVyKCJzdWJtaXQiKSwgITEKICAgIH0pLCBULm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdCh0aGlzKS50b2dnbGVDbGFzcygiYWN0aXZlIiksIGYudG9nZ2xlQ2xhc3MoInNpZGViYXItaXMtdmlzaWJsZSIpLCAhMQogICAgfSksIE8ub24oImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICB0KHRoaXMpLnRvZ2dsZUNsYXNzKCJvbiIpLm5leHQoKVt0KHRoaXMpLm5leHQoKS5pcygiOmhpZGRlbiIpID8gInNob3ciIDogImhpZGUiXSgpLCBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICB9KSwgZi5vbigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgTy5yZW1vdmVDbGFzcygib24iKS5uZXh0KCkuaGlkZSgpLCB4LmZpbmQoIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIikubmV4dCgpLnNsaWRlVXAoMjAwLCAiZWFzZU91dFF1YXJ0IiksIHQoIi5lbW8ta2V5IikucmVtb3ZlKCkKICAgIH0pLCBmLm9uKCJjbGljayIsICIuZW1vIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICB0KCIuZW1vLWtleSIpLnJlbW92ZSgpLCB0KHRoaXMpLmFmdGVyKCc8aW5wdXQgY2xhc3M9ImVtby1rZXkiIHR5cGU9InRleHQiIHZhbHVlPSIgJyArIHRoaXMuYWx0ICsgJyI+JyksIHQoIi5lbW8ta2V5IikudHJpZ2dlcigic2VsZWN0IiksIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgIH0pLCB0KGZ1bmN0aW9uICgpIHsKICAgICAgICBJLnNjcm9sbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHQodGhpcykuc2Nyb2xsVG9wKCkgKyA1MSA+PSBqLmhlaWdodCgpIC0gSS5oZWlnaHQoKSA/IF8uYWRkQ2xhc3MoIm5nYWxpaCIpIDogXy5yZW1vdmVDbGFzcygibmdhbGloIikKICAgICAgICB9KQogICAgfSksIF8ucmVtb3ZlQXR0cigiaHJlZiIpLm9uKCJtb3VzZWRvd24iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgUi5kLnN0b3AoKS5hbmltYXRlKHsKICAgICAgICAgICAgc2Nyb2xsVG9wOiAwCiAgICAgICAgfSwgMmUzLCAiZWFzZU91dFF1YXJ0IikKICAgIH0pLm9uKCJjbGljayIsICExKSwgTS5vbigiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIGEudGl0bGUgPSB3LCBILmh0bWwoJzxzcGFuIGNsYXNzPSJidXR0b24tbm90aWYiPk1lbXVhdC4uLjwvc3Bhbj4nKSwgYyg1MCwgMCksICExCiAgICB9KSwgLyppKCJqcyIsICgiaHR0cHM6IiA9PSBtLmMgPyAiaHR0cHM6Ly9zc2wiIDogImh0dHA6Ly93d3ciKSArICIuZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMiLCAiZ2Ffc2NyaXB0IiwgbnVsbCksICoveS5yZXBsYWNlV2l0aChmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHQoJzxpbWcgY2xhc3M9ImVtbyIgc3JjPSInICsgdCh0aGlzKS5kYXRhKCJlbW8iKSArICciIGFsdD0iJyArIHRoaXMudGl0bGUgKyAnIj4nKQogICAgfSksIGYub24oImNsaWNrIiwgIi5lbW8iLCBmdW5jdGlvbiAoZSkgewogICAgICAgIHQoIi5lbW8ta2V5IikucmVtb3ZlKCksIHQodGhpcykuYWZ0ZXIoJzxpbnB1dCBjbGFzcz0iZW1vLWtleSIgdHlwZT0idGV4dCIgdmFsdWU9IiAnICsgdGhpcy5hbHQgKyAnIj4nKSwgdCgiLmVtby1rZXkiKS50cmlnZ2VyKCJzZWxlY3QiKSwgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgfSksIGUuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKG0uZyAmJiAvY1swLTldKyQvLnRlc3QobS5nKSkgewogICAgICAgICAgICB2YXIgdCA9IGcuZmluZChtLmcpLmZpcnN0KCksCiAgICAgICAgICAgICAgICBlID0gdC5vZmZzZXQoKS50b3AgLSA2MDsKICAgICAgICAgICAgUi5kLmFuaW1hdGUoewogICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBlCiAgICAgICAgICAgIH0sIDFlNCwgImVhc2VPdXRRdWFydCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHQuYWRkQ2xhc3MoInNlbGVjdGVkIikuc2libGluZ3MoKS5yZW1vdmVDbGFzcygic2VsZWN0ZWQiKQogICAgICAgICAgICB9KQogICAgICAgIH0KICAgIH0sIDFlMyksIFIuZS5jb250ZW50cygpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgIHQoIiNnYXdvayIpLnJlbW92ZSgpLCA4ID09IHRoaXMubm9kZVR5cGUgJiYgdCh0aGlzKS5yZW1vdmUoKQogICAgfSksICJ1bmRlZmluZWQiICE9IHR5cGVvZiBjbSAmJiBBWzBdICYmIChBWzBdLmlubmVySFRNTCA9IGNtKEFbMF0uaW5uZXJIVE1MKSksICJ1bmRlZmluZWQiICE9IHR5cGVvZiBjbSAmJiB2WzBdICYmICh2WzBdLmlubmVySFRNTCA9IGNtKHZbMF0uaW5uZXJIVE1MKSksIHIoKSwgZy5maW5kKCIuYnV0dG9uX3JlcGx5IikucmVtb3ZlQXR0cigib25jbGljayBocmVmIikub24oImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBlID0gdCh0aGlzKVswXS5nZXRBdHRyaWJ1dGUoImRhdGEtcnQiKSwKICAgICAgICAgICAgYSA9IHQodGhpcykuY2xvc2VzdCgiLmNvbW1lbnQiKSwKICAgICAgICAgICAgaSA9IHQodGhpcykuY2xvc2VzdCgiLmNvbW1lbnQtcG9zdCIpOwogICAgICAgIHJldHVybiBSLmZbMF0uc3JjID0gRVswXSArICImcGFyZW50SUQ9IiArIGUgKyAiIyIgKyBFWzFdLCBhWzBdLmluc2VydEJlZm9yZShSLmhbMF0sIG51bGwpLCBSLmQuc3RvcCgpLmFuaW1hdGUoewogICAgICAgICAgICBzY3JvbGxUb3A6IGEub2Zmc2V0KCkudG9wICsgaS5oZWlnaHQoKSArIDEwCiAgICAgICAgfSwgNDAwLCAiZWFzZU91dFF1YXJ0IiksIFIuZi5hZGRDbGFzcygidHJhbnNwYXJlbnQiKS5vbigibG9hZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdCh0aGlzKS5yZW1vdmVDbGFzcygidHJhbnNwYXJlbnQiKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygibG9hZGVyIikKICAgICAgICB9KS5wYXJlbnQoKS5hZGRDbGFzcygibG9hZGVyIiksICExCiAgICB9KSwgZy5vbigiY2xpY2siLCBSLmosIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gUi5mWzBdLnNyYyA9IEUuam9pbigiIyIpLCBnWzBdLmluc2VydEJlZm9yZShSLmhbMF0sIG51bGwpLCBSLmQuc3RvcCgpLmFuaW1hdGUoewogICAgICAgICAgICBzY3JvbGxUb3A6IFIuZi5vZmZzZXQoKS50b3AgLSAxMDAgCiAgICAgICAgfSwgMWUzLCAiZWFzZU91dFF1YXJ0IiksIFIuZi5hZGRDbGFzcygidHJhbnNwYXJlbnQiKS5vbigibG9hZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdCh0aGlzKS5yZW1vdmVDbGFzcygidHJhbnNwYXJlbnQiKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygibG9hZGVyIikKICAgICAgICB9KS5wYXJlbnQoKS5hZGRDbGFzcygibG9hZGVyIiksICExCiAgICB9KQp9KGpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7CgoKLyohIFN5bnRheCBoaWdobGlnaHRpbmcgd2l0aCBsYW5ndWFnZSBhdXRvZGV0ZWN0aW9uIDxodHRwOi8vaGlnaGxpZ2h0anMub3JnPiAqLwoKdmFyIGhsanM9bmV3IGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShwKXtyZXR1cm4gcC5yZXBsYWNlKC8mL2dtLCImYW1wOyIpLnJlcGxhY2UoLzwvZ20sIiZsdDsiKX0KZnVuY3Rpb24gYyhyLHEscCl7cmV0dXJuIFJlZ0V4cChxLCJtIisoci5jST8iaSI6IiIpKyhwPyJnIjoiIikpfQpmdW5jdGlvbiBqKHIpe2Zvcih2YXIgcD0wO3A8ci5jaGlsZE5vZGVzLmxlbmd0aDtwKyspe3ZhciBxPXIuY2hpbGROb2Rlc1twXTtpZihxLm5vZGVOYW1lPT0iQ09ERSJ8fHEubm9kZU5hbWU9PSJTUEFOIil7cmV0dXJuIHF9CmlmKCEocS5ub2RlVHlwZT09MyYmcS5ub2RlVmFsdWUubWF0Y2goL1xzKy8pKSl7YnJlYWt9fX0KZnVuY3Rpb24gZyh0LHMpe3ZhciByPSIiO2Zvcih2YXIgcT0wO3E8dC5jaGlsZE5vZGVzLmxlbmd0aDtxKyspe2lmKHQuY2hpbGROb2Rlc1txXS5ub2RlVHlwZT09Myl7dmFyIHA9dC5jaGlsZE5vZGVzW3FdLm5vZGVWYWx1ZTtpZihzKXtwPXAucmVwbGFjZSgvXG4vZywiIil9CnIrPXB9ZWxzZXtpZih0LmNoaWxkTm9kZXNbcV0ubm9kZU5hbWU9PSJCUiIpe3IrPSJcbiJ9ZWxzZXtyKz1nKHQuY2hpbGROb2Rlc1txXSl9fX0KaWYoL01TSUUgWzY3OF0vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe3I9ci5yZXBsYWNlKC9cci9nLCJcbiIpfQpyZXR1cm4gcn0KZnVuY3Rpb24gYShzKXt2YXIgcT1zLmNsYXNzTmFtZS5zcGxpdCgvXHMrLyk7cT1xLmNvbmNhdChzLnBhcmVudE5vZGUuY2xhc3NOYW1lLnNwbGl0KC9ccysvKSk7Zm9yKHZhciBwPTA7cDxxLmxlbmd0aDtwKyspe3ZhciByPXFbcF0ucmVwbGFjZSgvXmxhbmd1YWdlLS8sIiIpO2lmKGRbcl18fHI9PSJuby1oaWdobGlnaHQiKXtyZXR1cm4gcn19fQpmdW5jdGlvbiBiKHApe3ZhciBxPVtdOyhmdW5jdGlvbihzLHQpe2Zvcih2YXIgcj0wO3I8cy5jaGlsZE5vZGVzLmxlbmd0aDtyKyspe2lmKHMuY2hpbGROb2Rlc1tyXS5ub2RlVHlwZT09Myl7dCs9cy5jaGlsZE5vZGVzW3JdLm5vZGVWYWx1ZS5sZW5ndGh9ZWxzZXtpZihzLmNoaWxkTm9kZXNbcl0ubm9kZU5hbWU9PSJCUiIpe3QrPTF9ZWxzZXtxLnB1c2goe2V2ZW50OiJzdGFydCIsb2Zmc2V0OnQsbm9kZTpzLmNoaWxkTm9kZXNbcl19KTt0PWFyZ3VtZW50cy5jYWxsZWUocy5jaGlsZE5vZGVzW3JdLHQpO3EucHVzaCh7ZXZlbnQ6InN0b3AiLG9mZnNldDp0LG5vZGU6cy5jaGlsZE5vZGVzW3JdfSl9fX0KcmV0dXJuIHR9KShwLDApO3JldHVybiBxfQpmdW5jdGlvbiBsKHkseix4KXt2YXIgcj0wO3ZhciB3PSIiO3ZhciB0PVtdO2Z1bmN0aW9uIHUoKXtpZih5Lmxlbmd0aCYmei5sZW5ndGgpe2lmKHlbMF0ub2Zmc2V0IT16WzBdLm9mZnNldCl7cmV0dXJuKHlbMF0ub2Zmc2V0PHpbMF0ub2Zmc2V0KT95Onp9ZWxzZXtyZXR1cm4gelswXS5ldmVudD09InN0YXJ0Ij95Onp9fWVsc2V7cmV0dXJuIHkubGVuZ3RoP3k6en19CmZ1bmN0aW9uIHMoQyl7dmFyIEQ9IjwiKyBDLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Zm9yKHZhciBBPTA7QTxDLmF0dHJpYnV0ZXMubGVuZ3RoO0ErKyl7dmFyIEI9Qy5hdHRyaWJ1dGVzW0FdO0QrPSIgIisgQi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKEIubm9kZVZhbHVlIT11bmRlZmluZWQmJkIubm9kZVZhbHVlIT1mYWxzZSYmQi5ub2RlVmFsdWUhPW51bGwpe0QrPSc9IicrIG0oQi5ub2RlVmFsdWUpKyciJ319CnJldHVybiBEKyI+In0Kd2hpbGUoeS5sZW5ndGh8fHoubGVuZ3RoKXt2YXIgdj11KCkuc3BsaWNlKDAsMSlbMF07dys9bSh4LnN1YnN0cihyLHYub2Zmc2V0LSByKSk7cj12Lm9mZnNldDtpZih2LmV2ZW50PT0ic3RhcnQiKXt3Kz1zKHYubm9kZSk7dC5wdXNoKHYubm9kZSl9ZWxzZXtpZih2LmV2ZW50PT0ic3RvcCIpe3ZhciBxPXQubGVuZ3RoO2Rve3EtLTt2YXIgcD10W3FdO3crPSgiPC8iKyBwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkrIj4iKX13aGlsZShwIT12Lm5vZGUpO3Quc3BsaWNlKHEsMSk7d2hpbGUocTx0Lmxlbmd0aCl7dys9cyh0W3FdKTtxKyt9fX19CncrPXguc3Vic3RyKHIpO3JldHVybiB3fQpmdW5jdGlvbiBpKCl7ZnVuY3Rpb24gcCh1LHQsdil7aWYodS5jb21waWxlZCl7cmV0dXJufQppZighdil7dS5iUj1jKHQsdS5iP3UuYjoiXFxCfFxcYiIpO2lmKCF1LmUmJiF1LmVXKXt1LmU9IlxcQnxcXGIifQppZih1LmUpe3UuZVI9Yyh0LHUuZSl9fQppZih1Lmkpe3UuaVI9Yyh0LHUuaSl9CmlmKHUucj09dW5kZWZpbmVkKXt1LnI9MX0KaWYodS5rKXt1LmxSPWModCx1Lmx8fGhsanMuSVIsdHJ1ZSl9CmZvcih2YXIgcyBpbiB1Lmspe2lmKCF1LmsuaGFzT3duUHJvcGVydHkocykpe2NvbnRpbnVlfQppZih1Lmtbc11pbnN0YW5jZW9mIE9iamVjdCl7dS5rRz11Lmt9ZWxzZXt1LmtHPXtrZXl3b3JkOnUua319CmJyZWFrfQppZighdS5jKXt1LmM9W119CnUuY29tcGlsZWQ9dHJ1ZTtmb3IodmFyIHI9MDtyPHUuYy5sZW5ndGg7cisrKXtwKHUuY1tyXSx0LGZhbHNlKX0KaWYodS5zdGFydHMpe3AodS5zdGFydHMsdCxmYWxzZSl9fQpmb3IodmFyIHEgaW4gZCl7aWYoIWQuaGFzT3duUHJvcGVydHkocSkpe2NvbnRpbnVlfQpwKGRbcV0uZE0sZFtxXSx0cnVlKX19CmZ1bmN0aW9uIGUoSixEKXtpZighaS5jYWxsZWQpe2koKTtpLmNhbGxlZD10cnVlfQpmdW5jdGlvbiB6KHIsTSl7Zm9yKHZhciBMPTA7TDxNLmMubGVuZ3RoO0wrKyl7aWYoTS5jW0xdLmJSLnRlc3Qocikpe3JldHVybiBNLmNbTF19fX0KZnVuY3Rpb24gdyhMLHIpe2lmKENbTF0uZSYmQ1tMXS5lUi50ZXN0KHIpKXtyZXR1cm4gMX0KaWYoQ1tMXS5lVyl7dmFyIE09dyhMLSAxLHIpO3JldHVybiBNP00rIDE6MH0KcmV0dXJuIDB9CmZ1bmN0aW9uIHgocixMKXtyZXR1cm4gTC5pUiYmTC5pUi50ZXN0KHIpfQpmdW5jdGlvbiBBKE8sTil7dmFyIE09W107Zm9yKHZhciBMPTA7TDxPLmMubGVuZ3RoO0wrKyl7TS5wdXNoKE8uY1tMXS5iKX0KdmFyIHI9Qy5sZW5ndGgtIDE7ZG97aWYoQ1tyXS5lKXtNLnB1c2goQ1tyXS5lKX0Kci0tfXdoaWxlKENbcisgMV0uZVcpO2lmKE8uaSl7TS5wdXNoKE8uaSl9CnJldHVybiBjKE4sIigiKyBNLmpvaW4oInwiKSsiKSIsdHJ1ZSl9CmZ1bmN0aW9uIHMoTSxMKXt2YXIgTj1DW0MubGVuZ3RoLSAxXTtpZighTi50KXtOLnQ9QShOLEgpfQpOLnQubGFzdEluZGV4PUw7dmFyIHI9Ti50LmV4ZWMoTSk7aWYocil7cmV0dXJuW00uc3Vic3RyKEwsci5pbmRleC0gTCksclswXSxmYWxzZV19ZWxzZXtyZXR1cm5bTS5zdWJzdHIoTCksIiIsdHJ1ZV19fQpmdW5jdGlvbiBwKE8scil7dmFyIEw9SC5jST9yWzBdLnRvTG93ZXJDYXNlKCk6clswXTtmb3IodmFyIE4gaW4gTy5rRyl7aWYoIU8ua0cuaGFzT3duUHJvcGVydHkoTikpe2NvbnRpbnVlfQp2YXIgTT1PLmtHW05dLmhhc093blByb3BlcnR5KEwpO2lmKE0pe3JldHVybltOLE1dfX0KcmV0dXJuIGZhbHNlfQpmdW5jdGlvbiBGKE0sTyl7aWYoIU8uayl7cmV0dXJuIG0oTSl9CnZhciBOPSIiO3ZhciBQPTA7Ty5sUi5sYXN0SW5kZXg9MDt2YXIgTD1PLmxSLmV4ZWMoTSk7d2hpbGUoTCl7Tis9bShNLnN1YnN0cihQLEwuaW5kZXgtIFApKTt2YXIgcj1wKE8sTCk7aWYocil7dCs9clsxXTtOKz0nPHNwYW4gY2xhc3M9IicrIHJbMF0rJyI+JysgbShMWzBdKSsiPC9zcGFuPiJ9ZWxzZXtOKz1tKExbMF0pfQpQPU8ubFIubGFzdEluZGV4O0w9Ty5sUi5leGVjKE0pfQpOKz1tKE0uc3Vic3RyKFAsTS5sZW5ndGgtIFApKTtyZXR1cm4gTn0KZnVuY3Rpb24gSyhyLE0pe2lmKE0uc0wmJmRbTS5zTF0pe3ZhciBMPWUoTS5zTCxyKTt0Kz1MLmtleXdvcmRfY291bnQ7cmV0dXJuIEwudmFsdWV9ZWxzZXtyZXR1cm4gRihyLE0pfX0KZnVuY3Rpb24gSShNLHIpe3ZhciBMPU0uY04/JzxzcGFuIGNsYXNzPSInKyBNLmNOKyciPic6IiI7aWYoTS5yQil7cSs9TDtNLmJ1ZmZlcj0iIn1lbHNle2lmKE0uZUIpe3ErPW0ocikrIEw7TS5idWZmZXI9IiJ9ZWxzZXtxKz1MO00uYnVmZmVyPXJ9fQpDLnB1c2goTSk7Qis9TS5yfQpmdW5jdGlvbiBFKE8sTCxRKXt2YXIgUj1DW0MubGVuZ3RoLSAxXTtpZihRKXtxKz1LKFIuYnVmZmVyKyBPLFIpO3JldHVybiBmYWxzZX0KdmFyIE09eihMLFIpO2lmKE0pe3ErPUsoUi5idWZmZXIrIE8sUik7SShNLEwpO3JldHVybiBNLnJCfQp2YXIgcj13KEMubGVuZ3RoLSAxLEwpO2lmKHIpe3ZhciBOPVIuY04/Ijwvc3Bhbj4iOiIiO2lmKFIuckUpe3ErPUsoUi5idWZmZXIrIE8sUikrIE59ZWxzZXtpZihSLmVFKXtxKz1LKFIuYnVmZmVyKyBPLFIpKyBOKyBtKEwpfWVsc2V7cSs9SyhSLmJ1ZmZlcisgTysgTCxSKSsgTn19CndoaWxlKHI+MSl7Tj1DW0MubGVuZ3RoLSAyXS5jTj8iPC9zcGFuPiI6IiI7cSs9TjtyLS07Qy5sZW5ndGgtLX0KdmFyIFA9Q1tDLmxlbmd0aC0gMV07Qy5sZW5ndGgtLTtDW0MubGVuZ3RoLSAxXS5idWZmZXI9IiI7aWYoUC5zdGFydHMpe0koUC5zdGFydHMsIiIpfQpyZXR1cm4gUi5yRX0KaWYoeChMLFIpKXt0aHJvdyJJbGxlZ2FsIn19CnZhciBIPWRbSl07dmFyIEM9W0guZE1dO3ZhciBCPTA7dmFyIHQ9MDt2YXIgcT0iIjt0cnl7dmFyIHY9MDtILmRNLmJ1ZmZlcj0iIjtkb3t2YXIgeT1zKEQsdik7dmFyIHU9RSh5WzBdLHlbMV0seVsyXSk7dis9eVswXS5sZW5ndGg7aWYoIXUpe3YrPXlbMV0ubGVuZ3RofX13aGlsZSgheVsyXSk7aWYoQy5sZW5ndGg+MSl7dGhyb3ciSWxsZWdhbCJ9CnJldHVybntyOkIsa2V5d29yZF9jb3VudDp0LHZhbHVlOnF9fWNhdGNoKEcpe2lmKEc9PSJJbGxlZ2FsIil7cmV0dXJue3I6MCxrZXl3b3JkX2NvdW50OjAsdmFsdWU6bShEKX19ZWxzZXt0aHJvdyBHfX19CmZ1bmN0aW9uIGYodCl7dmFyIHI9e2tleXdvcmRfY291bnQ6MCxyOjAsdmFsdWU6bSh0KX07dmFyIHE9cjtmb3IodmFyIHAgaW4gZCl7aWYoIWQuaGFzT3duUHJvcGVydHkocCkpe2NvbnRpbnVlfQp2YXIgcz1lKHAsdCk7cy5sYW5ndWFnZT1wO2lmKHMua2V5d29yZF9jb3VudCsgcy5yPnEua2V5d29yZF9jb3VudCsgcS5yKXtxPXN9CmlmKHMua2V5d29yZF9jb3VudCsgcy5yPnIua2V5d29yZF9jb3VudCsgci5yKXtxPXI7cj1zfX0KaWYocS5sYW5ndWFnZSl7ci5zZWNvbmRfYmVzdD1xfQpyZXR1cm4gcn0KZnVuY3Rpb24gaChyLHEscCl7aWYocSl7cj1yLnJlcGxhY2UoL14oKDxbXj5dKz58XHQpKykvZ20sZnVuY3Rpb24odCx3LHYsdSl7cmV0dXJuIHcucmVwbGFjZSgvXHQvZyxxKX0pfQppZihwKXtyPXIucmVwbGFjZSgvXG4vZywiPGJyPiIpfQpyZXR1cm4gcn0KZnVuY3Rpb24gbyh1LHgscSl7dmFyIHk9Zyh1LHEpO3ZhciBzPWEodSk7aWYocz09Im5vLWhpZ2hsaWdodCIpe3JldHVybn0KaWYocyl7dmFyIHc9ZShzLHkpfWVsc2V7dmFyIHc9Zih5KTtzPXcubGFuZ3VhZ2V9CnZhciBwPWIodSk7aWYocC5sZW5ndGgpe3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpO3IuaW5uZXJIVE1MPXcudmFsdWU7dy52YWx1ZT1sKHAsYihyKSx5KX0Kdy52YWx1ZT1oKHcudmFsdWUseCxxKTt2YXIgdD11LmNsYXNzTmFtZTtpZighdC5tYXRjaCgiKFxcc3xeKShsYW5ndWFnZS0pPyIrIHMrIihcXHN8JCkiKSl7dD10Pyh0KyIgIisgcyk6c30KaWYoL01TSUUgWzY3OF0vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJnUudGFnTmFtZT09IkNPREUiJiZ1LnBhcmVudE5vZGUudGFnTmFtZT09IlBSRSIpe3ZhciByPXUucGFyZW50Tm9kZTt2YXIgdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt2LmlubmVySFRNTD0iPHByZT48Y29kZT4iKyB3LnZhbHVlKyI8L2NvZGU+PC9wcmU+Ijt1PXYuZmlyc3RDaGlsZC5maXJzdENoaWxkO3YuZmlyc3RDaGlsZC5jTj1yLmNOO3IucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodi5maXJzdENoaWxkLHIpfWVsc2V7dS5pbm5lckhUTUw9dy52YWx1ZX0KdS5jbGFzc05hbWU9dDt1LnJlc3VsdD17bGFuZ3VhZ2U6cyxrdzp3LmtleXdvcmRfY291bnQscmU6dy5yfTtpZih3LnNlY29uZF9iZXN0KXt1LnNlY29uZF9iZXN0PXtsYW5ndWFnZTp3LnNlY29uZF9iZXN0Lmxhbmd1YWdlLGt3Oncuc2Vjb25kX2Jlc3Qua2V5d29yZF9jb3VudCxyZTp3LnNlY29uZF9iZXN0LnJ9fX0KZnVuY3Rpb24gaygpe2lmKGsuY2FsbGVkKXtyZXR1cm59CmsuY2FsbGVkPXRydWU7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpO2Zvcih2YXIgcD0wO3A8ci5sZW5ndGg7cCsrKXt2YXIgcT1qKHJbcF0pO2lmKHEpe28ocSxobGpzLnRhYlJlcGxhY2UpfX0KbmdkX2FkZE51bWJlcigpfQpmdW5jdGlvbiBuKCl7aWYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixrLGZhbHNlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsayxmYWxzZSl9ZWxzZXtpZih3aW5kb3cuYXR0YWNoRXZlbnQpe3dpbmRvdy5hdHRhY2hFdmVudCgib25sb2FkIixrKX1lbHNle3dpbmRvdy5vbmxvYWQ9a319fQp2YXIgZD17fTt0aGlzLkxBTkdVQUdFUz1kO3RoaXMuaGlnaGxpZ2h0PWU7dGhpcy5oaWdobGlnaHRBdXRvPWY7dGhpcy5maXhNYXJrdXA9aDt0aGlzLmhpZ2hsaWdodEJsb2NrPW87dGhpcy5pbml0SGlnaGxpZ2h0aW5nPWs7dGhpcy5pbml0SGlnaGxpZ2h0aW5nT25Mb2FkPW47dGhpcy5JUj0iW2EtekEtWl1bYS16QS1aMC05X10qIjt0aGlzLlVJUj0iW2EtekEtWl9dW2EtekEtWjAtOV9dKiI7dGhpcy5OUj0iXFxiXFxkKyhcXC5cXGQrKT8iO3RoaXMuQ05SPSJcXGIoMHhbQS1aYS16MC05XSt8XFxkKyhcXC5cXGQrKT8pIjt0aGlzLlJTUj0iIXwhPXwhPT18JXwlPXwmfCYmfCY9fFxcKnxcXCo9fFxcK3xcXCs9fCx8XFwufC18LT18L3wvPXw6fDt8PHw8PHw8PD18PD18PXw9PXw9PT18Pnw+PXw+Pnw+Pj18Pj4+fD4+Pj18XFw/fFxcW3xcXHt8XFwofFxcXnxcXF49fFxcfHxcXHw9fFxcfFxcfHx+Ijt0aGlzLkJFPXtiOiJcXFxcLiIscjowfTt0aGlzLkFTTT17Y046InN0cmluZyIsYjoiJyIsZToiJyIsaToiXFxuIixjOlt0aGlzLkJFXSxyOjB9O3RoaXMuUVNNPXtjTjoic3RyaW5nIixiOiciJyxlOiciJyxpOiJcXG4iLGM6W3RoaXMuQkVdLHI6MH07dGhpcy5DTENNPXtjTjoiX2NvbW1lbnQiLGI6Ii8vIixlOiIkIn07dGhpcy5DQkxDTE09e2NOOiJfY29tbWVudCIsYjoiL1xcKiIsZToiXFwqLyJ9O3RoaXMuSENNPXtjTjoiX2NvbW1lbnQiLGI6IiMiLGU6IiQifTt0aGlzLk5NPXtjTjoibnVtYmVyIixiOnRoaXMuTlIscjowfTt0aGlzLkNOTT17Y046Im51bWJlciIsYjp0aGlzLkNOUixyOjB9O3RoaXMuaW5oZXJpdD1mdW5jdGlvbihwLHMpe3ZhciByPXt9O2Zvcih2YXIgcSBpbiBwKXtyW3FdPXBbcV19CmlmKHMpe2Zvcih2YXIgcSBpbiBzKXtyW3FdPXNbcV19fQpyZXR1cm4gcn19KCk7aGxqcy5MQU5HVUFHRVMuamF2YXNjcmlwdD17ZE06e2s6e2tleXdvcmQ6eyJpbiI6MSwiaWYiOjEsImZvciI6MSwid2hpbGUiOjEsImZpbmFsbHkiOjEsInZhciI6MSwibmV3IjoxLCJmdW5jdGlvbiI6MSwiZG8iOjEsInJldHVybiI6MSwidm9pZCI6MSwiZWxzZSI6MSwiYnJlYWsiOjEsImNhdGNoIjoxLCJpbnN0YW5jZW9mIjoxLCJ3aXRoIjoxLCJ0aHJvdyI6MSwiY2FzZSI6MSwiZGVmYXVsdCI6MSwidHJ5IjoxLCJ0aGlzIjoxLCJzd2l0Y2giOjEsImNvbnRpbnVlIjoxLCJ0eXBlb2YiOjEsImRlbGV0ZSI6MX0sbGl0ZXJhbDp7InRydWUiOjEsImZhbHNlIjoxLCJudWxsIjoxfX0sYzpbaGxqcy5BU00saGxqcy5RU00saGxqcy5DTENNLGhsanMuQ0JMQ0xNLGhsanMuQ05NLHtiOiIoIisgaGxqcy5SU1IrInxjYXNlfHJldHVybnx0aHJvdylcXHMqIixrOnsicmV0dXJuIjoxLCJ0aHJvdyI6MSwiY2FzZSI6MX0sYzpbaGxqcy5DTENNLGhsanMuQ0JMQ0xNLHtjTjoicmVnZXhwIixiOiIvIixlOiIvW2dpbV0qIixjOlt7YjoiXFxcXC8ifV19XSxyOjB9LHtjTjoiZnVuY3Rpb24iLGI6IlxcYmZ1bmN0aW9uXFxiIixlOiJ7IixrOnsiZnVuY3Rpb24iOjF9LGM6W3tjTjoidGl0bGUiLGI6IltBLVphLXokX11bMC05QS1aYS16JF9dKiJ9LHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsYzpbaGxqcy5BU00saGxqcy5RU00saGxqcy5DTENNLGhsanMuQ0JMQ0xNXX1dfV19fTtobGpzLkxBTkdVQUdFUy5jc3M9ZnVuY3Rpb24oKXt2YXIgYT17Y046ImZ1bmN0aW9uIixiOmhsanMuSVIrIlxcKCIsZToiXFwpIixjOlt7ZVc6dHJ1ZSxlRTp0cnVlLGM6W2hsanMuTk0saGxqcy5BU00saGxqcy5RU01dfV19O3JldHVybntjSTp0cnVlLGRNOntpOiJbPS98J10iLGM6W2hsanMuQ0JMQ0xNLHtjTjoiaWQiLGI6IlxcI1tBLVphLXowLTlfLV0rIn0se2NOOiJjbGFzcyIsYjoiXFwuW0EtWmEtejAtOV8tXSsiLHI6MH0se2NOOiJhdHRyX3NlbGVjdG9yIixiOiJcXFsiLGU6IlxcXSIsaToiJCJ9LHtjTjoicHNldWRvIixiOiI6KDopP1thLXpBLVowLTlcXF9cXC1cXCtcXChcXClcXFwiXFwnXSsifSx7Y046ImF0X3J1bGUiLGI6IkAoZm9udC1mYWNlfHBhZ2UpIixsOiJbYS16LV0rIixrOnsiZm9udC1mYWNlIjoxLHBhZ2U6MX19LHtjTjoiYXRfcnVsZSIsYjoiQCIsZToiW3s7XSIsZUU6dHJ1ZSxrOnsiaW1wb3J0IjoxLHBhZ2U6MSxtZWRpYToxLGNoYXJzZXQ6MX0sYzpbYSxobGpzLkFTTSxobGpzLlFTTSxobGpzLk5NXX0se2NOOiJ0YWciLGI6aGxqcy5JUixyOjB9LHtjTjoicnVsZXMiLGI6InsiLGU6In0iLGk6IlteXFxzXSIscjowLGM6W2hsanMuQ0JMQ0xNLHtjTjoicnVsZSIsYjoiW15cXHNdIixyQjp0cnVlLGU6IjsiLGVXOnRydWUsYzpbe2NOOiJhdHRyaWJ1dGUiLGI6IltBLVpcXF9cXC5cXC1dKyIsZToiOiIsZUU6dHJ1ZSxpOiJbXlxcc10iLHN0YXJ0czp7Y046InZhbHVlIixlVzp0cnVlLGVFOnRydWUsYzpbYSxobGpzLk5NLGhsanMuUVNNLGhsanMuQVNNLGhsanMuQ0JMQ0xNLHtjTjoiaGV4Y29sb3IiLGI6IlxcI1swLTlBLUZdKyJ9LHtjTjoiaW1wb3J0YW50IixiOiIhaW1wb3J0YW50In1dfX1dfV19XX19fSgpO2hsanMuTEFOR1VBR0VTLnhtbD1mdW5jdGlvbigpe3ZhciBiPSJbQS1aYS16MC05XFwuXzotXSsiO3ZhciBhPXtlVzp0cnVlLGM6W3tjTjoiYXR0cmlidXRlIixiOmIscjowfSx7YjonPSInLHJCOnRydWUsZTonIicsYzpbe2NOOiJ2YWx1ZSIsYjonIicsZVc6dHJ1ZX1dfSx7YjoiPSciLHJCOnRydWUsZToiJyIsYzpbe2NOOiJ2YWx1ZSIsYjoiJyIsZVc6dHJ1ZX1dfSx7YjoiPSIsYzpbe2NOOiJ2YWx1ZSIsYjoiW15cXHMvPl0rIn1dfV19O3JldHVybntjSTp0cnVlLGRNOntjOlt7Y046InBpIixiOiI8XFw/IixlOiJcXD8+IixyOjEwfSx7Y046ImRvY3R5cGUiLGI6IjwhRE9DVFlQRSIsZToiPiIscjoxMCxjOlt7YjoiXFxbIixlOiJcXF0ifV19LHtjTjoiX2NvbW1lbnQiLGI6IjwhLS0iLGU6Ii0tPiIscjoxMH0se2NOOiJjZGF0YSIsYjoiPFxcIVxcW0NEQVRBXFxbIixlOiJcXF1cXF0+IixyOjEwfSx7Y046InRhZyIsYjoiPHN0eWxlIixlOiI+IixrOnt0aXRsZTp7c3R5bGU6MX19LGM6W2FdLHN0YXJ0czp7Y046ImNzcyIsZToiPC9zdHlsZT4iLHJFOnRydWUsc0w6ImNzcyJ9fSx7Y046InRhZyIsYjoiPHNjcmlwdCIsZToiPiIsazp7dGl0bGU6e3NjcmlwdDoxfX0sYzpbYV0sc3RhcnRzOntjTjoiamF2YXNjcmlwdCIsZToiPFwvc2NyaXB0PiIsckU6dHJ1ZSxzTDoiamF2YXNjcmlwdCJ9fSx7Y046InZic2NyaXB0IixiOiI8JSIsZToiJT4iLHNMOiJ2YnNjcmlwdCJ9LHtjTjoidGFnIixiOiI8Lz8iLGU6Ii8/PiIsYzpbe2NOOiJ0aXRsZSIsYjoiW14gLz5dKyJ9LGFdfV19fX0oKTtobGpzLkxBTkdVQUdFUy5qYXZhPXtkTTp7azp7ImZhbHNlIjoxLCJzeW5jaHJvbml6ZWQiOjEsImludCI6MSwiYWJzdHJhY3QiOjEsImZsb2F0IjoxLCJwcml2YXRlIjoxLCJjaGFyIjoxLCJpbnRlcmZhY2UiOjEsImJvb2xlYW4iOjEsInN0YXRpYyI6MSwibnVsbCI6MSwiaWYiOjEsImNvbnN0IjoxLCJmb3IiOjEsInRydWUiOjEsIndoaWxlIjoxLCJsb25nIjoxLCJ0aHJvdyI6MSxzdHJpY3RmcDoxLCJmaW5hbGx5IjoxLCJwcm90ZWN0ZWQiOjEsImV4dGVuZHMiOjEsImltcG9ydCI6MSwibmF0aXZlIjoxLCJmaW5hbCI6MSwiaW1wbGVtZW50cyI6MSwicmV0dXJuIjoxLCJ2b2lkIjoxLCJlbnVtIjoxLCJlbHNlIjoxLCJicmVhayI6MSwidHJhbnNpZW50IjoxLCJuZXciOjEsImNhdGNoIjoxLCJpbnN0YW5jZW9mIjoxLCJieXRlIjoxLCJzdXBlciI6MSwiY2xhc3MiOjEsInZvbGF0aWxlIjoxLCJjYXNlIjoxLGFzc2VydDoxLCJzaG9ydCI6MSwicGFja2FnZSI6MSwiZGVmYXVsdCI6MSwiZG91YmxlIjoxLCJwdWJsaWMiOjEsInRyeSI6MSwidGhpcyI6MSwic3dpdGNoIjoxLCJjb250aW51ZSI6MSwidGhyb3dzIjoxfSxjOlt7Y046ImphdmFkb2MiLGI6Ii9cXCpcXCoiLGU6IlxcKi8iLGM6W3tjTjoiamF2YWRvY3RhZyIsYjoiQFtBLVphLXpdKyJ9XSxyOjEwfSxobGpzLkNMQ00saGxqcy5DQkxDTE0saGxqcy5BU00saGxqcy5RU00se2NOOiJjbGFzcyIsYjoiKGNsYXNzIHxpbnRlcmZhY2UgKSIsZToieyIsazp7ImNsYXNzIjoxLCJpbnRlcmZhY2UiOjF9LGk6IjoiLGM6W3tiOiIoaW1wbGVtZW50c3xleHRlbmRzKSIsazp7ImV4dGVuZHMiOjEsImltcGxlbWVudHMiOjF9LHI6MTB9LHtjTjoidGl0bGUiLGI6aGxqcy5VSVJ9XX0saGxqcy5DTk0se2NOOiJhbm5vdGF0aW9uIixiOiJAW0EtWmEtel0rIn1dfX07aGxqcy5MQU5HVUFHRVMucGhwPXtjSTp0cnVlLGRNOntrOnthbmQ6MSxpbmNsdWRlX29uY2U6MSxsaXN0OjEsImFic3RyYWN0IjoxLGdsb2JhbDoxLCJwcml2YXRlIjoxLGVjaG86MSwiaW50ZXJmYWNlIjoxLGFzOjEsInN0YXRpYyI6MSxlbmRzd2l0Y2g6MSxhcnJheToxLCJudWxsIjoxLCJpZiI6MSxlbmR3aGlsZToxLG9yOjEsImNvbnN0IjoxLCJmb3IiOjEsZW5kZm9yZWFjaDoxLHNlbGY6MSwidmFyIjoxLCJ3aGlsZSI6MSxpc3NldDoxLCJwdWJsaWMiOjEsInByb3RlY3RlZCI6MSxleGl0OjEsZm9yZWFjaDoxLCJ0aHJvdyI6MSxlbHNlaWY6MSwiZXh0ZW5kcyI6MSxpbmNsdWRlOjEsX19GSUxFX186MSxlbXB0eToxLHJlcXVpcmVfb25jZToxLCJmdW5jdGlvbiI6MSwiZG8iOjEseG9yOjEsInJldHVybiI6MSwiaW1wbGVtZW50cyI6MSxwYXJlbnQ6MSxjbG9uZToxLHVzZToxLF9fQ0xBU1NfXzoxLF9fTElORV9fOjEsImVsc2UiOjEsImJyZWFrIjoxLHByaW50OjEsImV2YWwiOjEsIm5ldyI6MSwiY2F0Y2giOjEsX19NRVRIT0RfXzoxLCJjbGFzcyI6MSwiY2FzZSI6MSxleGNlcHRpb246MSxwaHBfdXNlcl9maWx0ZXI6MSwiZGVmYXVsdCI6MSxkaWU6MSxyZXF1aXJlOjEsX19GVU5DVElPTl9fOjEsZW5kZGVjbGFyZToxLCJmaW5hbCI6MSwidHJ5IjoxLCJ0aGlzIjoxLCJzd2l0Y2giOjEsImNvbnRpbnVlIjoxLGVuZGZvcjoxLGVuZGlmOjEsZGVjbGFyZToxLHVuc2V0OjEsInRydWUiOjEsImZhbHNlIjoxLG5hbWVzcGFjZToxfSxjOltobGpzLkNMQ00saGxqcy5IQ00se2NOOiJfY29tbWVudCIsYjoiL1xcKiIsZToiXFwqLyIsYzpbe2NOOiJwaHBkb2MiLGI6Ilxcc0BbQS1aYS16XSsiLHI6MTB9XX0saGxqcy5DTk0saGxqcy5pbmhlcml0KGhsanMuQVNNLHtpOm51bGx9KSxobGpzLmluaGVyaXQoaGxqcy5RU00se2k6bnVsbH0pLHtjTjoidmFyaWFibGUiLGI6IlxcJFthLXpBLVpfXHg3Zi1ceGZmXVthLXpBLVowLTlfXHg3Zi1ceGZmXSoifSx7Y046InByZXByb2Nlc3NvciIsYjoiPFxcP3BocCIscjoxMH0se2NOOiJwcmVwcm9jZXNzb3IiLGI6IlxcPz4ifV19fTsKaGxqcy50YWJSZXBsYWNlID0gJyAgICAnOwpobGpzLmluaXRIaWdobGlnaHRpbmcoKTsK