xiaomianao666

插件名:global_网盘直链下载助手

Feb 24th, 2024
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_网盘直链下载助手@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIOe9keebmOebtOmTvuS4i+i9veWKqeaJiwovLyBAbmFtZXNwYWNlICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3N5aHl6MTk5MC9iYWlkdXl1bgovLyBAdmVyc2lvbiAgICAgICAgICAgNi4xLjYKLy8gQGF1dGhvciAgICAgICAgICAgIEdyZWFzeUZvcmsKLy8gQGRlc2NyaXB0aW9uICAgICAgIPCfkYbwn5GG8J+RhvCfkYbwn5GG8J+RhvCfkYYgLSDmlK/mjIHmibnph4/ojrflj5Yg4pyF55m+5bqm572R55uYIOKchemYv+mHjOS6keebmCDinIXlpKnnv7zkupHnm5gg4pyF6L+F6Zu35LqR55uYIOKcheWkuOWFi+e9keebmCDinIXnp7vliqjkupHnm5gg5YWt5aSn572R55uY55qE55u06ZO+5LiL6L295Zyw5Z2A77yM6YWN5ZCIIElETe+8jFhkb3du77yMQXJpYTLvvIxDdXJs77yM5q+U54m55b2X5pif562J5bel5YW36auY5pWI8J+agPCfmoDwn5qA5LiL6L2977yM5a6M576O6YCC6YWNIENocm9tZe+8jEVkZ2XvvIxGaXJlRm9477yMMzYw77yMUVHvvIzmkJzni5fvvIznmb7liIbvvIzpgajmuLjvvIzmmJ/mhL/vvIxPcGVyYe+8jOeMjuixue+8jFZpdmFsZGnvvIxZYW5kZXjvvIxLaXdpIOetiSAxOCDnp43mtY/op4jlmajjgILlj6/lnKjml6Dms5Xlronoo4XlrqLmiLfnq6/nmoTnjq/looPkuIvkvb/nlKjvvIzliqnmiYvlhY3otLnlvIDmupDjgILwn5iOCi8vIEBsaWNlbnNlICAgICAgICAgICBBR1BMLTMuMC1vci1sYXRlcgovLyBAaG9tZXBhZ2UgICAgICAgICAgaHR0cHM6Ly93d3cueW91eGlhb2hvdS5jb20vaW5zdGFsbC5odG1sCi8vIEBzdXBwb3J0VVJMICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vc3loeXoxOTkwL2JhaWR1eXVuCi8vIEBhbnRpZmVhdHVyZSAgICAgICBtZW1iZXJzaGlwCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL21haW4qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9kaXNrL21haW4qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL3MvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vc2hhcmUvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vc2hhcmUvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9kcml2ZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly93d3cuYWxpcGFuLmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly93d3cuYWxpcGFuLmNvbS9kcml2ZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9jbG91ZC4xODkuY24vd2ViLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4ueHVubGVpLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLnF1YXJrLmNuLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uMTM5LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vY2FpeXVuLjEzOS5jb20vKgovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly9yZWdpc3RyeS5ucG1taXJyb3IuY29tL2pxdWVyeS8zLjcuMC9maWxlcy9kaXN0L2pxdWVyeS5taW4uanMKLy8gQHJlcXVpcmUgICAgICAgICAgIGh0dHBzOi8vcmVnaXN0cnkubnBtbWlycm9yLmNvbS9zd2VldGFsZXJ0Mi8xMC4xNi42L2ZpbGVzL2Rpc3Qvc3dlZXRhbGVydDIuYWxsLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly9yZWdpc3RyeS5ucG1taXJyb3IuY29tL2pzLW1kNS8wLjcuMy9maWxlcy9idWlsZC9tZDUubWluLmpzCi8vIEBjb25uZWN0ICAgICAgICAgICBiYWlkdS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGJhaWR1cGNzLmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgYWxpeXVuZHJpdmUuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBhbGlwYW4uY29tCi8vIEBjb25uZWN0ICAgICAgICAgICAxODkuY24KLy8gQGNvbm5lY3QgICAgICAgICAgIHh1bmxlaS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIHF1YXJrLmNuCi8vIEBjb25uZWN0ICAgICAgICAgICB5b3V4aWFvaG91LmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgeXVuLjEzOS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGNhaXl1bi4xMzkuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBsb2NhbGhvc3QKLy8gQGNvbm5lY3QgICAgICAgICAgICoKLy8gQHJ1bi1hdCAgICAgICAgICAgIGRvY3VtZW50LWlkbGUKLy8gQGdyYW50ICAgICAgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAZ3JhbnQgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTV9vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2luZm8KLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2Nvb2tpZQovLyBAaWNvbiAgICAgICAgICAgICAgZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXhNamdnTVRJNElqNDhjR0YwYUNCa1BTSk5NVEF6TGpZZ01UQTNMalJqTXk0MUxUSXVNaUE0TGprdE5pNHhJREV6TGpndE1USXVOWE0zTGpNdE1USXVOU0E0TGpVdE1UWXVOV011TlMweExqY2dNaTR5TFRjdU5TQXlMakl0TVRRdU55QXdMVEV3TGpFdE15NHpMVEkxTGpFdE1UVXVOQzB6Tmk0NExURTBMalV0TVRRdE16SXVNUzB4TkM0ekxUTTFMamN0TVRRdU15MDRJREF0TVRVdU55QXhMamt0TWpJdU5pQTFMakpETkRRZ01qTWdNelV1TnlBek1TNDBJRE13TGpnZ05ERXVOMk10TVM0eklESXVPQzAwSURRdU55MDNMakVnTlMwMElDNHpMVGN1TlNBMExqUXRPQzQ1SURrdU5pMHVOU0F4TGprdE1TNDJJRE11TlMwekxqRWdOQzQzUXpRdU5DQTJOaTQ0SURBZ056VXVOeUF3SURnMVl6QWdOaTQ0SURJdU15QXhNeTR4SURZdU1TQXhPQzR5SURVdU5TQTNMalFnTVRRdU1pQXhNaTR5SURJMElERXlMakpvTkRjdU1XTTBMalFnTUNBeE1TMHVOU0F4T0M0ekxUTXVOU0F6TGpJdE1TNDBJRFV1T1MweklEZ3VNUzAwTGpWNklpQm1hV3hzUFNJak5EUTBJaTgrUEhCaGRHZ2daRDBpVFRFeE9TNDRJRFkwTGpOakxqRXRNVGN1TVMweE1DNDBMVEk0TFRFeUxqVXRNekF1TVVNNU5TQXlNaTR4SURjNUxqa2dNakV1T0NBM05pNDVJREl4TGpoakxURTNMallnTUMwek15NHpJREV3TGpVdE16a3VPU0F5Tmk0M0xTNDJJREV1TXkweExqZ2dNaTR6TFRNdU5DQXlMak5vTFM0MFl5MDFMamdnTUMweE1DNDJJRFF1T0MweE1DNDJJREV3TGpkMkxqVmpNQ0F4TGpRdExqZ2dNaTQyTFRFdU9TQXpMak5ETVRNdU5DQTJPU0E0TGpnZ056WXVPQ0E0TGpnZ09EVmpNQ0F4TWk0eUlEa3VPU0F5TWk0eklESXlMaklnTWpJdU0yZzBOUzR5WXpNdU5pMHVNU0F4Tnk0MkxTNDVJREk1TGpZdE1USWdNaTQ1TFRJdU9DQXhNeTQ1TFRFekxqY2dNVFF0TXpGNklpQm1hV3hzUFNJak1UTTVOMlE0SWk4K1BIQmhkR2dnWkQwaVRURXhNQzQ0SURVM0xqUnNMaklnTXk0ell6QWdNUzR6TFRFdU1TQXlMalF0TWk0eklESXVOQzB4TGpNZ01DMHlMak10TVM0eExUSXVNeTB5TGpSc0xTNHhMVEl1T0hZdExqTmpNQzB4TGpJdU9TMHlMaklnTWk0eExUSXVNMmd1TTJNdU55QXdJREV1TXk0eklERXVOeTQzTFM0eUxqRXVNeTQxTGpRZ01TNDBlbTB0TXk0ekxURXdMak5qTUNBeExqSXRNU0F5TGpNdE1pNHlJREl1TTJndExqRmpMUzQ0SURBdE1TNDJMUzQxTFRJdE1TNHlMVFF1TmkwNExqTXRNVE11TXkweE15NDFMVEl5TGpndE1UTXVOUzB4TGpJZ01DMHlMak10TVMweUxqTXRNaTR5ZGkwdU1XTXdMVEV1TWlBeExUSXVNeUF5TGpJdE1pNHphQzR4WVRNd0xqTTNJRE13TGpNM0lEQWdNQ0F4SURFMUxqZ2dOQzQwWXpRdU5pQXlMamdnT0M0MElEWXVPQ0F4TVM0eElERXhMalV1TVM0ekxqSXVOeTR5SURFdU1YcE5PRGd1TXlBM015NDRURGN6TGpVZ09UTXVNbU10TVM0MUlERXVPUzB6TGpVZ015NHhMVFV1TnlBekxqVm9MUzR5WXkwdU5DNHhMUzQ0TGpFdE1TNHlMakV0TGpZZ01DMHhMakV0TGpFdE1TNDJMUzR5TFRJdU1pMHVOQzAwTGpJdE1TNDNMVFV1TmkwekxqVk1ORFF1TXlBM015NDVZeTB5TFRJdU5pMHlMalV0TlM0MExURXVOQzAzTGpjdU1TMHVNUzR4TFM0eUxqSXRMaklnTVM0eUxUSWdNeTQxTFRNdU1pQTJMalF0TXk0eWFEWXVObll0TlM0M1l6QXROaTQ0SURRdU55MHhNaUF4TUM0NUxURXlJRFF1T0NBd0lEZ3VOU0F5TGpZZ01UQXVNeUEzTGpJdU5TQXhMak10TGpJZ01pNDNMVEV1TlNBekxqSnpMVEl1T0MwdU1TMHpMak10TVM0MFl5MHhMakV0TWk0M0xUSXVPUzAwTFRVdU5TMDBMVE11TlNBd0xUWWdNeTAySURkMk9DNHhZekFnTGpVdExqSWdNUzB1TmlBeExqUXRMall1TnkweExqY2dNUzR4TFRJdU5pQXhMakZvTFRndU5HTXRNUzR6SURBdE1pQXVOQzB5TGpFdU55MHVNaTQwSURBZ01TNHpMamtnTWk0MFREWXpMakVnT1RCakxqa2dNUzR5SURJdU1TQXhMamdnTXk0eklERXVPSE15TGpNdExqWWdNeTR4TFRFdU4yd3hOQzQ0TFRFNUxqTmpMamt0TVM0eElERXVNUzB5SUM0NUxUSXVOQzB1TWkwdU15MHVPUzB1TnkweUxqRXRMamRvTFRjdU5tTXRMamtnTUMweExqY3RMalV0TWk0eExURXVNaTB1TXkwdU5DMHVOQzB1T0MwdU5DMHhMak1nTUMweExqUWdNUzR4TFRJdU5TQXlMalV0TWk0MWFEY3VObU16TGpFZ01DQTFMalVnTVM0eklEWXVOaUF6TGpWc0xqTXVOMk11TnlBeUxqRXVNU0EwTGpZdE1TNDNJRFl1T1hvaUlHWnBiR3c5SWlNME5EUWlMejQ4TDNOMlp6ND0KLy8gQGRvd25sb2FkVVJMIGh0dHBzOi8vdXBkYXRlLmdyZWFzeWZvcmsub3JnL3NjcmlwdHMvNDM2NDQ2LyVFNyVCRCU5MSVFNyU5QiU5OCVFNyU5QiVCNCVFOSU5MyVCRSVFNCVCOCU4QiVFOCVCRCVCRCVFNSU4QSVBOSVFNiU4OSU4Qi51c2VyLmpzCi8vIEB1cGRhdGVVUkwgaHR0cHM6Ly91cGRhdGUuZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy80MzY0NDYvJUU3JUJEJTkxJUU3JTlCJTk4JUU3JTlCJUI0JUU5JTkzJUJFJUU0JUI4JThCJUU4JUJEJUJEJUU1JThBJUE5JUU2JTg5JThCLm1ldGEuanMKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGxldCBwdCA9ICcnLCBzZWxlY3RMaXN0ID0gW10sIHBhcmFtcyA9IHt9LCBtb2RlID0gJycsIHdpZHRoID0gODAwLCBwYW4gPSB7fSwgY29sb3IgPSAnJywKICAgICAgICBkb2MgPSAkKGRvY3VtZW50KSwgcHJvZ3Jlc3MgPSB7fSwgcmVxdWVzdCA9IHt9LCBpbnMgPSB7fSwgaWRtID0ge307CiAgICBjb25zdCBzY3JpcHRJbmZvID0gR01faW5mby5zY3JpcHQ7CiAgICBjb25zdCB2ZXJzaW9uID0gc2NyaXB0SW5mby52ZXJzaW9uOwogICAgY29uc3QgYXV0aG9yID0gc2NyaXB0SW5mby5hdXRob3I7CiAgICBjb25zdCBuYW1lID0gc2NyaXB0SW5mby5uYW1lOwogICAgY29uc3QgY3VzdG9tQ2xhc3MgPSB7CiAgICAgICAgcG9wdXA6ICdwbC1wb3B1cCcsCiAgICAgICAgaGVhZGVyOiAncGwtaGVhZGVyJywKICAgICAgICB0aXRsZTogJ3BsLXRpdGxlJywKICAgICAgICBjbG9zZUJ1dHRvbjogJ3BsLWNsb3NlJywKICAgICAgICBjb250ZW50OiAncGwtY29udGVudCcsCiAgICAgICAgaW5wdXQ6ICdwbC1pbnB1dCcsCiAgICAgICAgZm9vdGVyOiAncGwtZm9vdGVyJwogICAgfTsKCiAgICBjb25zdCB0ZXJtaW5hbFR5cGUgPSB7CiAgICAgICAgd2M6ICJXaW5kb3dzIENNRCIsCiAgICAgICAgd3A6ICJXaW5kb3dzIFBvd2VyU2hlbGwiLAogICAgICAgIGx0OiAiTGludXgg57uI56uvIiwKICAgICAgICBsczogIkxpbnV4IFNoZWxsIiwKICAgICAgICBtdDogIk1hY09TIOe7iOerryIsCiAgICB9OwoKICAgIGxldCB0b2FzdCA9IFN3YWwubWl4aW4oewogICAgICAgIHRvYXN0OiB0cnVlLAogICAgICAgIHBvc2l0aW9uOiAndG9wJywKICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCiAgICAgICAgdGltZXI6IDM1MDAsCiAgICAgICAgdGltZXJQcm9ncmVzc0JhcjogZmFsc2UsCiAgICAgICAgZGlkT3BlbjogKHRvYXN0KSA9PiB7CiAgICAgICAgICAgIHRvYXN0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBTd2FsLnN0b3BUaW1lcik7CiAgICAgICAgICAgIHRvYXN0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBTd2FsLnJlc3VtZVRpbWVyKTsKICAgICAgICB9CiAgICB9KTsKCiAgICBjb25zdCBtZXNzYWdlID0gewogICAgICAgIHN1Y2Nlc3M6ICh0ZXh0KSA9PiB7CiAgICAgICAgICAgIHRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnc3VjY2Vzcyd9KTsKICAgICAgICB9LAogICAgICAgIGVycm9yOiAodGV4dCkgPT4gewogICAgICAgICAgICB0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ2Vycm9yJ30pOwogICAgICAgIH0sCiAgICAgICAgd2FybmluZzogKHRleHQpID0+IHsKICAgICAgICAgICAgdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICd3YXJuaW5nJ30pOwogICAgICAgIH0sCiAgICAgICAgaW5mbzogKHRleHQpID0+IHsKICAgICAgICAgICAgdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdpbmZvJ30pOwogICAgICAgIH0sCiAgICAgICAgcXVlc3Rpb246ICh0ZXh0KSA9PiB7CiAgICAgICAgICAgIHRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAncXVlc3Rpb24nfSk7CiAgICAgICAgfQogICAgfTsKCiAgICBsZXQgYmFzZSA9IHsKCiAgICAgICAgZ2V0Q29va2llKG5hbWUpIHsKICAgICAgICAgICAgbGV0IGNuYW1lID0gbmFtZSArICI9IjsKICAgICAgICAgICAgbGV0IGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2EubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxldCBjID0gY2FbaV0udHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihjbmFtZSkgPT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKGNuYW1lLmxlbmd0aCwgYy5sZW5ndGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfSwKCiAgICAgICAgaXNUeXBlKG9iaikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikucmVwbGFjZSgvXlxbb2JqZWN0ICguKylcXSQvLCAnJDEnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0sCgogICAgICAgIGdldFZhbHVlKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIEdNX2dldFZhbHVlKG5hbWUpOwogICAgICAgIH0sCgogICAgICAgIHNldFZhbHVlKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKG5hbWUsIHZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICBnZXRTdG9yYWdlKGtleSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc2V0U3RvcmFnZShrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzVHlwZSh2YWx1ZSkgPT09ICdvYmplY3QnIHx8IHRoaXMuaXNUeXBlKHZhbHVlKSA9PT0gJ2FycmF5JykgewogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgc2V0Q2xpcGJvYXJkKHRleHQpIHsKICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHRleHQsICd0ZXh0Jyk7CiAgICAgICAgfSwKCiAgICAgICAgZShzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpKTsKICAgICAgICB9LAoKICAgICAgICBkKHN0cikgewogICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShhdG9iKHN0cikpKTsKICAgICAgICB9LAoKICAgICAgICBnZXRFeHRlbnNpb24obmFtZSkgewogICAgICAgICAgICBjb25zdCByZWcgPSAvKD8hXC4pXHcrJC87CiAgICAgICAgICAgIGlmIChyZWcudGVzdChuYW1lKSkgewogICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5tYXRjaChyZWcpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzBdLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0sCgogICAgICAgIHNpemVGb3JtYXQodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlID09PSArdmFsdWUpIHsKICAgICAgICAgICAgICAgIGxldCB1bml0ID0gWyJCIiwgIktCIiwgIk1CIiwgIkdCIiwgIlRCIiwgIlBCIiwgIkVCIiwgIlpCIiwgIllCIl07CiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGgubG9nKDEwMjQpKTsKICAgICAgICAgICAgICAgIGxldCBzaXplID0gdmFsdWUgLyBNYXRoLnBvdygxMDI0LCBpbmRleCk7CiAgICAgICAgICAgICAgICBzaXplID0gc2l6ZS50b0ZpeGVkKDEpOwogICAgICAgICAgICAgICAgcmV0dXJuIHNpemUgKyB1bml0W2luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKCiAgICAgICAgc29ydEJ5TmFtZShhcnIpIHsKICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gKCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIChhLCBiKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcDEgPSBhLmZpbGVuYW1lID8gYS5maWxlbmFtZSA6IGEuc2VydmVyX2ZpbGVuYW1lOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHAyID0gYi5maWxlbmFtZSA/IGIuZmlsZW5hbWUgOiBiLnNlcnZlcl9maWxlbmFtZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDEubG9jYWxlQ29tcGFyZShwMiwgInpoLUNOIik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICBhcnIuc29ydChoYW5kbGUoKSk7CiAgICAgICAgfSwKCiAgICAgICAgZml4RmlsZW5hbWUobmFtZSkgewogICAgICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9bIT8mfGAiJypcLzo8PlxcXS9nLCAnXycpOwogICAgICAgIH0sCgogICAgICAgIGJsb2JEb3dubG9hZChibG9iLCBmaWxlbmFtZSkgewogICAgICAgICAgICBpZiAoYmxvYiBpbnN0YW5jZW9mIEJsb2IpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICAgICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICAgICAgYS5ocmVmID0gdXJsOwogICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lOwogICAgICAgICAgICAgICAgYS5jbGljaygpOwogICAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMsIHR5cGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNUeXBlKGRhdGEpID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsIHVybCwgaGVhZGVycywgZGF0YSwKICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IHR5cGUgfHwgJ2pzb24nLAogICAgICAgICAgICAgICAgICAgIG9ubG9hZDogKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09PSAnYmxvYicgPyByZXNvbHZlKHJlcykgOiByZXNvbHZlKHJlcy5yZXNwb25zZSB8fCByZXMucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBnZXQodXJsLCBoZWFkZXJzLCB0eXBlLCBleHRyYSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHJlcXVlc3RPYmogPSBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwgdXJsLCBoZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogdHlwZSB8fCAnanNvbicsCiAgICAgICAgICAgICAgICAgICAgb25sb2FkOiAocmVzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RPYmouYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbVtleHRyYS5pbmRleF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnYmxvYicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IDIwMCAmJiBiYXNlLmJsb2JEb3dubG9hZChyZXMucmVzcG9uc2UsIGV4dHJhLmZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzLnJlc3BvbnNlIHx8IHJlcy5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbnByb2dyZXNzOiAocmVzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYSAmJiBleHRyYS5maWxlbmFtZSAmJiBleHRyYS5pbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnRvdGFsID4gMCA/IHByb2dyZXNzW2V4dHJhLmluZGV4XSA9IChyZXMubG9hZGVkICogMTAwIC8gcmVzLnRvdGFsKS50b0ZpeGVkKDIpIDogcHJvZ3Jlc3NbZXh0cmEuaW5kZXhdID0gMC4wMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25sb2Fkc3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhICYmIGV4dHJhLmZpbGVuYW1lICYmIGV4dHJhLmluZGV4ICYmIChyZXF1ZXN0W2V4dHJhLmluZGV4XSA9IHJlcXVlc3RPYmopOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25lcnJvcjogKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGdldEZpbmFsVXJsKHVybCwgaGVhZGVycykgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHJlcXVlc3RPYmogPSBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwgdXJsLCBoZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIG9ubG9hZDogKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5maW5hbFVybCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgc3RyaW5naWZ5KG9iaikgewogICAgICAgICAgICBsZXQgc3RyID0gJyc7CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9ialtrZXldOwogICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWVbaV0pICsgJyYnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSArICcmJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN0ci5zbGljZSgwLCAtMSk7IC8vIOWOu+aOieacq+WwvueahCAiJiIKICAgICAgICB9LAoKICAgICAgICBhZGRTdHlsZShpZCwgdGFnLCBjc3MpIHsKICAgICAgICAgICAgdGFnID0gdGFnIHx8ICdzdHlsZSc7CiAgICAgICAgICAgIGxldCBkb2MgPSBkb2N1bWVudCwgc3R5bGVEb20gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpOwogICAgICAgICAgICBpZiAoc3R5bGVEb20pIHJldHVybjsKICAgICAgICAgICAgbGV0IHN0eWxlID0gZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgICAgICAgICAgc3R5bGUucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICAgICAgICBzdHlsZS5pZCA9IGlkOwogICAgICAgICAgICB0YWcgPT09ICdzdHlsZScgPyBzdHlsZS5pbm5lckhUTUwgPSBjc3MgOiBzdHlsZS5ocmVmID0gY3NzOwogICAgICAgICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgfSwKCiAgICAgICAgc2xlZXAodGltZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpKTsKICAgICAgICB9LAoKICAgICAgICBmaW5kUmVhY3QoZG9tLCB0cmF2ZXJzZVVwID0gMCkgewogICAgICAgICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhkb20pLmZpbmQoa2V5ID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBrZXkuc3RhcnRzV2l0aCgiX19yZWFjdEZpYmVyJCIpCiAgICAgICAgICAgICAgICAgICAgfHwga2V5LnN0YXJ0c1dpdGgoIl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc3QgZG9tRmliZXIgPSBkb21ba2V5XTsKICAgICAgICAgICAgaWYgKGRvbUZpYmVyID09IG51bGwpIHJldHVybiBudWxsOwoKICAgICAgICAgICAgaWYgKGRvbUZpYmVyLl9jdXJyZW50RWxlbWVudCkgewogICAgICAgICAgICAgICAgbGV0IGNvbXBGaWJlciA9IGRvbUZpYmVyLl9jdXJyZW50RWxlbWVudC5fb3duZXI7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYXZlcnNlVXA7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbXBGaWJlciA9IGNvbXBGaWJlci5fY3VycmVudEVsZW1lbnQuX293bmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBGaWJlci5faW5zdGFuY2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IEdldENvbXBGaWJlciA9IGZpYmVyID0+IHsKICAgICAgICAgICAgICAgIGxldCBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjsKICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlb2YgcGFyZW50RmliZXIudHlwZSA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudEZpYmVyOwogICAgICAgICAgICB9OwogICAgICAgICAgICBsZXQgY29tcEZpYmVyID0gR2V0Q29tcEZpYmVyKGRvbUZpYmVyKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmF2ZXJzZVVwOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbXBGaWJlciA9IEdldENvbXBGaWJlcihjb21wRmliZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb21wRmliZXIuc3RhdGVOb2RlIHx8IGNvbXBGaWJlcjsKICAgICAgICB9LAoKICAgICAgICBpbml0RGVmYXVsdENvbmZpZygpIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gW3sKICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX3JwY19kb21haW4nLAogICAgICAgICAgICAgICAgdmFsdWU6ICdodHRwOi8vbG9jYWxob3N0JwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19ycGNfcG9ydCcsCiAgICAgICAgICAgICAgICB2YWx1ZTogJzE2ODAwJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19ycGNfcGF0aCcsCiAgICAgICAgICAgICAgICB2YWx1ZTogJy9qc29ucnBjJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19ycGNfdG9rZW4nLAogICAgICAgICAgICAgICAgdmFsdWU6ICcnCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX3JwY19kaXInLAogICAgICAgICAgICAgICAgdmFsdWU6ICdEOicKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfdGVybWluYWxfdHlwZScsCiAgICAgICAgICAgICAgICB2YWx1ZTogJ3djJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ190aGVtZV9jb2xvcicsCiAgICAgICAgICAgICAgICB2YWx1ZTogJyMwOUFBRkYnCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX2luaXRfY29kZScsCiAgICAgICAgICAgICAgICB2YWx1ZTogJycKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ2xpY2Vuc2UnLAogICAgICAgICAgICAgICAgdmFsdWU6ICcnCiAgICAgICAgICAgIH1dOwoKICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgYmFzZS5nZXRWYWx1ZSh2Lm5hbWUpID09PSB1bmRlZmluZWQgJiYgYmFzZS5zZXRWYWx1ZSh2Lm5hbWUsIHYudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBzaG93U2V0dGluZygpIHsKICAgICAgICAgICAgbGV0IGRvbSA9ICcnLCBidG4gPSAnJywKICAgICAgICAgICAgICAgIGNvbG9yTGlzdCA9IFsnIzA5QUFGRicsICcjY2MzMjM1JywgJyM1MjZlZmEnLCAnIzUxOGMxNycsICcjZWQ5NDRiJywgJyNmOTY5YTUnLCAnI2JjYTI4MCddOwogICAgICAgICAgICBkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+S4u+acujwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiAgcGxhY2Vob2xkZXI9IuS4u+acuuWcsOWdgO+8jOmcgOW4puS4imh0dHAocyk6Ly8iIGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci1kb21haW4iIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpfSI+PC9sYWJlbD5gOwogICAgICAgICAgICBkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+err+WPozwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i56uv5Y+j5Y+377yM5L6L5aaC77yaTW90cml45Li6MTY4MDAiIGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci1wb3J0IiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0Jyl9Ij48L2xhYmVsPmA7CiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD6Lev5b6EPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLot6/lvoTvvIzpu5jorqTkuLovanNvbnJwYyIgY2xhc3M9InBsLWlucHV0IGxpc3RlbmVyLXBhdGgiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKX0iPjwvbGFiZWw+YDsKICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPlr4bpkqU8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IuaXoOWvhumSpeaXoOmcgOWhq+WGmSIgY2xhc3M9InBsLWlucHV0IGxpc3RlbmVyLXRva2VuIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfSI+PC9sYWJlbD5gOwogICAgICAgICAgICBkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS/neWtmOi3r+W+hDwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i5paH5Lu25LiL6L295ZCO5L+d5a2Y6Lev5b6E77yM5L6L5aaC77yaRDoiIGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci1kaXIiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpfSI+PC9sYWJlbD5gOwoKICAgICAgICAgICAgY29sb3JMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgIGJ0biArPSBgPGRpdiBkYXRhLWNvbG9yPSIke3Z9IiBzdHlsZT0iYmFja2dyb3VuZDogJHt2fTtib3JkZXI6IDFweCBzb2xpZCAke3Z9IiBjbGFzcz0icGwtY29sb3ItYm94IGxpc3RlbmVyLWNvbG9yICR7diA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicpID8gJ2NoZWNrZWQnIDogJyd9Ij48L2Rpdj5gOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7nu4jnq6/nsbvlnos8L2Rpdj48c2VsZWN0IGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci10ZXJtaW5hbCI+YDsKICAgICAgICAgICAgT2JqZWN0LmtleXModGVybWluYWxUeXBlKS5mb3JFYWNoKGsgPT4gewogICAgICAgICAgICAgICAgZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke2t9IiAke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpID09PSBrID8gJ3NlbGVjdGVkJyA6ICcnfT4ke3Rlcm1pbmFsVHlwZVtrXX08L29wdGlvbj5gOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9tICs9IGA8L3NlbGVjdD48L2xhYmVsPmA7CiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Li76aKY6aKc6ImyPC9kaXY+IDxkaXYgY2xhc3M9InBsLWNvbG9yIj4ke2J0bn08ZGl2PjwvbGFiZWw+YDsKICAgICAgICAgICAgZG9tID0gJzxkaXY+JyArIGRvbSArICc8L2Rpdj4nOwoKICAgICAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlOiAn5Yqp5omL6YWN572uJywKICAgICAgICAgICAgICAgIGh0bWw6IGRvbSwKICAgICAgICAgICAgICAgIGljb246ICdpbmZvJywKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIGZvb3RlcjogcGFuLmZvb3RlciwKICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+iuvue9ruaIkOWKn++8gScpOwogICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1jb2xvcicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJywgZS50YXJnZXQuZGF0YXNldC5jb2xvcik7CiAgICAgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+iuvue9ruaIkOWKn++8gScpOwogICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLWRvbWFpbicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1wb3J0JywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1wYXRoJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci10b2tlbicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicsIGUudGFyZ2V0LnZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLWRpcicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NoYW5nZScsICcubGlzdGVuZXItdGVybWluYWwnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICByZWdpc3Rlck1lbnVDb21tYW5kKCkgewogICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCfimpnvuI8g6K6+572uJywgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zaG93U2V0dGluZygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjcmVhdGVUaXAoKSB7CiAgICAgICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgY2xhc3M9InBsLXRvb2x0aXAiPjwvZGl2PicpOwoKICAgICAgICAgICAgZG9jLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCAnLmxpc3RlbmVyLXRpcCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VlbnRlcicpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBlLmN1cnJlbnRUYXJnZXQuaW5uZXJUZXh0OwogICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuc2l6ZTsKICAgICAgICAgICAgICAgICAgICBsZXQgdGlwID0gYCR7ZmlsZW5hbWV9PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2NvbG9yOiAjZjU2YzZjOyI+JHtzaXplfTwvc3Bhbj5gOwogICAgICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5jc3Moe29wYWNpdHk6ICcwLjUnfSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLXRvb2x0aXAnKS5odG1sKHRpcCkuY3NzKHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2xlZnQnOiBlLnBhZ2VYICsgMTAgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICAgICAndG9wJzogZS5wYWdlWSAtIGUuY3VycmVudFRhcmdldC5vZmZzZXRUb3AgPiAxNCA/IGUucGFnZVkgKyAncHgnIDogZS5wYWdlWSArIDIwICsgJ3B4JwogICAgICAgICAgICAgICAgICAgIH0pLnNob3coKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmNzcyh7b3BhY2l0eTogJzEnfSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLXRvb2x0aXAnKS5oaWRlKDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjcmVhdGVMb2FkaW5nKCkgewogICAgICAgICAgICByZXR1cm4gJCgnPGRpdiBjbGFzcz0icGwtbG9hZGluZyI+PGRpdiBjbGFzcz0icGwtbG9hZGluZy1ib3giPjxkaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicpOwogICAgICAgIH0sCgogICAgICAgIGNyZWF0ZURvd25sb2FkSWZyYW1lKCkgewogICAgICAgICAgICBsZXQgJGRpdiA9ICQoJzxkaXYgc3R5bGU9InBhZGRpbmc6MDttYXJnaW46MDtkaXNwbGF5OmJsb2NrIj48L2Rpdj4nKTsKICAgICAgICAgICAgbGV0ICRpZnJhbWUgPSAkKCc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDo7IiBpZD0iZG93bmxvYWRJZnJhbWUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvaWZyYW1lPicpOwogICAgICAgICAgICAkZGl2LmFwcGVuZCgkaWZyYW1lKTsKICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkZGl2KTsKICAgICAgICB9LAoKICAgICAgICBnZXRNaXJyb3JMaXN0KGxpbmssIG1pcnJvciwgdGhyZWFkID0gMikgewogICAgICAgICAgICBsZXQgaG9zdCA9IG5ldyBVUkwobGluaykuaG9zdDsKICAgICAgICAgICAgbGV0IG1pcnJvcnMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaXJyb3IubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhyZWFkOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGxpbmsucmVwbGFjZShob3N0LCBtaXJyb3JbaV0pICsgJyYnLnJlcGVhdChqKTsKICAgICAgICAgICAgICAgICAgICBtaXJyb3JzLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG1pcnJvcnMuam9pbignXG4nKTsKICAgICAgICB9LAoKICAgICAgICBsaXN0ZW5FbGVtZW50KGVsZW1lbnQsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGNvbnN0IGNoZWNrSW50ZXJ2YWwgPSA1MDA7IC8vIOajgOafpeWFg+e0oOeahOmXtOmalOaXtumXtO+8iOavq+enku+8iQogICAgICAgICAgICBsZXQgd2FzRWxlbWVudEZvdW5kID0gZmFsc2U7IC8vIOeUqOS6jui3n+i4quWFg+e0oOaYr+WQpuS5i+WJjeW3sue7j+aJvuWIsAoKICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tFbGVtZW50KCkgewogICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICB3YXNFbGVtZW50Rm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdhc0VsZW1lbnRGb3VuZCkgewogICAgICAgICAgICAgICAgICAgIHdhc0VsZW1lbnRGb3VuZCA9IGZhbHNlOyAvLyDlhYPntKDmtojlpLHlkI7ph43nva7moIflv5cKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRWxlbWVudCwgY2hlY2tJbnRlcnZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoZWNrRWxlbWVudCgpOwogICAgICAgIH0sCgogICAgICAgIGFkZFBhbkxpbmtlclN0eWxlKCkgewogICAgICAgICAgICBjb2xvciA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKTsKICAgICAgICAgICAgbGV0IGNzcyA9IGAKICAgICAgICAgICAgYm9keTo6LXdlYmtpdC1zY3JvbGxiYXIgeyBkaXNwbGF5OiBub25lIH0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhciB7IHdpZHRoOiA2cHg7IGhlaWdodDogMTBweCB9CiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgeyBib3JkZXItcmFkaXVzOiAwOyBiYWNrZ3JvdW5kOiBub25lIH0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoODUsODUsODUsLjQpIH0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsgYm9yZGVyLXJhZGl1czogNXB4OyAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCA2cHggcmdiYSgwLDAsMCwuMikgfQogICAgICAgICAgICA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg4NSw4NSw4NSwuMykgfQogICAgICAgICAgICAuc3dhbDItcG9wdXAgeyBmb250LXNpemU6IDE2cHggIWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtcG9wdXAgeyBmb250LXNpemU6IDEycHggIWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtcG9wdXAgYSB7IGNvbG9yOiAke2NvbG9yfSAhaW1wb3J0YW50OyB9CiAgICAgICAgICAgIC5wbC1oZWFkZXIgeyBwYWRkaW5nOiAwIWltcG9ydGFudDthbGlnbi1pdGVtczogZmxleC1zdGFydCFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlIWltcG9ydGFudDsgbWFyZ2luOiAwIDAgMTBweCFpbXBvcnRhbnQ7IHBhZGRpbmc6IDAgMCA1cHghaW1wb3J0YW50OyB9CiAgICAgICAgICAgIC5wbC10aXRsZSB7IGZvbnQtc2l6ZTogMTZweCFpbXBvcnRhbnQ7IGxpbmUtaGVpZ2h0OiAxIWltcG9ydGFudDt3aGl0ZS1zcGFjZTogbm93cmFwIWltcG9ydGFudDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXMhaW1wb3J0YW50O30KICAgICAgICAgICAgLnBsLWNvbnRlbnQgeyBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogMTJweCFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgLnBsLW1haW4geyBtYXgtaGVpZ2h0OiA0MDBweDtvdmVyZmxvdy15OnNjcm9sbDsgfQogICAgICAgICAgICAucGwtZm9vdGVyIHtmb250LXNpemU6IDEycHghaW1wb3J0YW50O2p1c3RpZnktY29udGVudDogZmxleC1zdGFydCFpbXBvcnRhbnQ7IG1hcmdpbjogMTBweCAwIDAhaW1wb3J0YW50OyBwYWRkaW5nOiA1cHggMCAwIWltcG9ydGFudDsgY29sb3I6ICNmNTZjNmMhaW1wb3J0YW50OyB9CiAgICAgICAgICAgIC5wbC1pdGVtIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbGluZS1oZWlnaHQ6IDIycHg7IH0KICAgICAgICAgICAgLnBsLWl0ZW0tbmFtZSB7IGZsZXg6IDAgMCAxNTBweDsgdGV4dC1hbGlnbjogbGVmdDttYXJnaW4tcmlnaHQ6IDEwcHg7IG92ZXJmbG93OiBoaWRkZW47IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyBjdXJzb3I6ZGVmYXVsdDsgfQogICAgICAgICAgICAucGwtaXRlbS1saW5rIHsgZmxleDogMTsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1hbGlnbjogbGVmdDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Y3Vyc29yOnBvaW50ZXIgfQogICAgICAgICAgICAucGwtaXRlbS1idG4geyBiYWNrZ3JvdW5kOiAke2NvbG9yfTsgcGFkZGluZzogNHB4IDVweDsgYm9yZGVyLXJhZGl1czogM3B4OyBsaW5lLWhlaWdodDogMTsgY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogI2ZmZjsgfQogICAgICAgICAgICAucGwtaXRlbS10aXAgeyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47ZmxleDogMTsgfQogICAgICAgICAgICAucGwtYmFjayB7IHdpZHRoOiA3MHB4OyBiYWNrZ3JvdW5kOiAjZGRkOyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjpwb2ludGVyOyBtYXJnaW46MXB4IDA7IH0KICAgICAgICAgICAgLnBsLWV4dCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDQ0cHg7IGJhY2tncm91bmQ6ICM5OTk7IGNvbG9yOiAjZmZmOyBoZWlnaHQ6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxNnB4OyBmb250LXNpemU6IDEycHg7IGJvcmRlci1yYWRpdXM6IDNweDt9CiAgICAgICAgICAgIC5wbC1yZXRyeSB7cGFkZGluZzogM3B4IDEwcHg7IGJhY2tncm91bmQ6ICNjYzMyMzU7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjogcG9pbnRlcjt9CiAgICAgICAgICAgIC5wbC1icm93c2VyZG93bmxvYWQgeyBwYWRkaW5nOiAzcHggMTBweDsgYmFja2dyb3VuZDogJHtjb2xvcn07IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjogcG9pbnRlcjt9CiAgICAgICAgICAgIC5wbC1pdGVtLXByb2dyZXNzIHsgZGlzcGxheTpmbGV4O2ZsZXg6IDE7YWxpZ24taXRlbXM6Y2VudGVyfQogICAgICAgICAgICAucGwtcHJvZ3Jlc3MgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTt3aWR0aDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveDtsaW5lLWhlaWdodDogMTtwb3NpdGlvbjogcmVsYXRpdmU7aGVpZ2h0OjE1cHg7IGZsZXg6IDF9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1vdXRlciB7IGhlaWdodDogMTVweDtib3JkZXItcmFkaXVzOiAxMDBweDtiYWNrZ3JvdW5kLWNvbG9yOiAjZWJlZWY1O292ZXJmbG93OiBoaWRkZW47cG9zaXRpb246IHJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7fQogICAgICAgICAgICAucGwtcHJvZ3Jlc3MtaW5uZXJ7IHBvc2l0aW9uOiBhYnNvbHV0ZTtsZWZ0OiAwO3RvcDogMDtiYWNrZ3JvdW5kLWNvbG9yOiAjNDA5ZWZmO3RleHQtYWxpZ246IHJpZ2h0O2JvcmRlci1yYWRpdXM6IDEwMHB4O2xpbmUtaGVpZ2h0OiAxO3doaXRlLXNwYWNlOiBub3dyYXA7dHJhbnNpdGlvbjogd2lkdGggLjZzIGVhc2U7fQogICAgICAgICAgICAucGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2NvbG9yOiAjZDFkMWQxO2ZvbnQtc2l6ZTogMTJweDttYXJnaW46IDAgNXB4O2hlaWdodDogMTVweH0KICAgICAgICAgICAgLnBsLXByb2dyZXNzLXRpcHsgZmxleDoxO3RleHQtYWxpZ246cmlnaHR9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1ob3d7IGZsZXg6IDAgMCA5MHB4OyBiYWNrZ3JvdW5kOiAjZGRkOyBib3JkZXItcmFkaXVzOiAzcHg7IG1hcmdpbi1sZWZ0OiAxMHB4OyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtYWxpZ246IGNlbnRlcjt9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1zdG9weyBmbGV4OiAwIDAgNTBweDsgcGFkZGluZzogMCAxMHB4OyBiYWNrZ3JvdW5kOiAjY2MzMjM1OyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6IHBvaW50ZXI7bWFyZ2luLWxlZnQ6MTBweDtoZWlnaHQ6MjBweH0KICAgICAgICAgICAgLnBsLXByb2dyZXNzLWlubmVyLXRleHQ6YWZ0ZXIgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Y29udGVudDogIiI7aGVpZ2h0OiAxMDAlO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7fQogICAgICAgICAgICAucGwtYnRuLXByaW1hcnkgeyBiYWNrZ3JvdW5kOiAke2NvbG9yfTsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IGNvbG9yOiAjZmZmZmZmOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTJweDsgb3V0bGluZTogbm9uZTsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgbWFyZ2luOiAycHggMDsgcGFkZGluZzogNnB4IDA7dHJhbnNpdGlvbjogMC4zcyBvcGFjaXR5OyB9CiAgICAgICAgICAgIC5wbC1idG4tcHJpbWFyeTpob3ZlciB7IG9wYWNpdHk6IDAuOTt0cmFuc2l0aW9uOiAwLjNzIG9wYWNpdHk7IH0KICAgICAgICAgICAgLnBsLWJ0bi1zdWNjZXNzIHsgYmFja2dyb3VuZDogIzU1YWYyODsgYW5pbWF0aW9uOiBlYXNlT3BhY2l0eSAxLjJzIDI7IGFuaW1hdGlvbi1maWxsLW1vZGU6Zm9yd2FyZHMgfQogICAgICAgICAgICAucGwtYnRuLWluZm8geyBiYWNrZ3JvdW5kOiAjNjA2MjY2OyB9CiAgICAgICAgICAgIC5wbC1idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkYTkzMjg7IH0KICAgICAgICAgICAgLnBsLWJ0bi13YXJuaW5nIHsgYmFja2dyb3VuZDogI2RhOTMyODsgfQogICAgICAgICAgICAucGwtYnRuLWRhbmdlciB7IGJhY2tncm91bmQ6ICNjYzMyMzU7IH0KICAgICAgICAgICAgLmFsaS1idXR0b24ge2Rpc3BsYXk6IGlubGluZS1mbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ym9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6IDVweDtib3gtc2hhZG93OiAwIDAgMCAwIHRyYW5zcGFyZW50O3dpZHRoOiBmaXQtY29udGVudDt3aGl0ZS1zcGFjZTogbm93cmFwO2ZsZXgtc2hyaW5rOiAwO2ZvbnQtc2l6ZTogMTRweDtsaW5lLWhlaWdodDogMS41O291dGxpbmU6IDA7dG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247dHJhbnNpdGlvbjogYmFja2dyb3VuZCAuM3MgZWFzZSxjb2xvciAuM3MgZWFzZSxib3JkZXIgLjNzIGVhc2UsYm94LXNoYWRvdyAuM3MgZWFzZTtjb2xvcjogI2ZmZjtiYWNrZ3JvdW5kOiByZ2IoOTkgMTI1IDI1NSk7bWFyZ2luLWxlZnQ6IDIwcHg7cGFkZGluZzogMXB4IDEycHg7cG9zaXRpb246IHJlbGF0aXZlOyBjdXJzb3I6cG9pbnRlcjsgaGVpZ2h0OiAzMnB4O30KICAgICAgICAgICAgLmFsaS1idXR0b246aG92ZXIge2JhY2tncm91bmQ6IHJnYigxMjIsIDE0NCwgMjU1KX0KICAgICAgICAgICAgLnRpYW55aS1idXR0b24ge21hcmdpbi1yaWdodDogMjBweDsgcGFkZGluZzogNHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDRweDsgY29sb3I6ICNmZmY7IGZvbnQtc2l6ZTogMTJweDsgYm9yZGVyOiAxcHggc29saWQgIzAwNzNlMzsgYmFja2dyb3VuZDogIzJiODllYTsgY3Vyc29yOiBwb2ludGVyOyBwb3NpdGlvbjogcmVsYXRpdmU7fQogICAgICAgICAgICAudGlhbnlpLWJ1dHRvbjpob3ZlciB7Ym9yZGVyLWNvbG9yOiAjMTg3NGQzOyBiYWNrZ3JvdW5kOiAjMzY5OWZmO30KICAgICAgICAgICAgLnlpZG9uZy1idXR0b24ge2Zsb2F0OiBsZWZ0OyBwb3NpdGlvbjogcmVsYXRpdmU7IG1hcmdpbjogMjBweCAyNHB4IDIwcHggMDsgd2lkdGg6IDk4cHg7IGhlaWdodDogMzZweDsgYmFja2dyb3VuZDogIzMxODFmOTsgYm9yZGVyLXJhZGl1czogMnB4OyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiAjZmZmOyBsaW5lLWhlaWdodDogMzlweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjdXJzb3I6IHBvaW50ZXI7fQogICAgICAgICAgICAueWlkb25nLXNoYXJlLWJ1dHRvbiB7ZGlzcGxheTogaW5saW5lLWJsb2NrOyBwb3NpdGlvbjogcmVsYXRpdmU7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDM2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICNmZmY7IGJvcmRlcjogMXB4IHNvbGlkICM1YTlhZmE7IGJvcmRlci1yYWRpdXM6IDJweDsgcGFkZGluZzogMCAyNHB4OyBtYXJnaW4tbGVmdDogMjRweDsgYmFja2dyb3VuZDogIzMxODFmOTt9CiAgICAgICAgICAgIC55aWRvbmctYnV0dG9uOmhvdmVyIHtiYWNrZ3JvdW5kOiAjMmQ3NmU1O30KICAgICAgICAgICAgLnh1bmxlaS1idXR0b24ge2Rpc3BsYXk6IGlubGluZS1mbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ym9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6IDVweDtib3gtc2hhZG93OiAwIDAgMCAwIHRyYW5zcGFyZW50O3dpZHRoOiBmaXQtY29udGVudDt3aGl0ZS1zcGFjZTogbm93cmFwO2ZsZXgtc2hyaW5rOiAwO2ZvbnQtc2l6ZTogMTRweDtsaW5lLWhlaWdodDogMS41O291dGxpbmU6IDA7dG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247dHJhbnNpdGlvbjogYmFja2dyb3VuZCAuM3MgZWFzZSxjb2xvciAuM3MgZWFzZSxib3JkZXIgLjNzIGVhc2UsYm94LXNoYWRvdyAuM3MgZWFzZTtjb2xvcjogI2ZmZjtiYWNrZ3JvdW5kOiAjM2Y4NWZmO21hcmdpbi1sZWZ0OiAxMnB4O3BhZGRpbmc6IDBweCAxMnB4O3Bvc2l0aW9uOiByZWxhdGl2ZTsgY3Vyc29yOnBvaW50ZXI7IGhlaWdodDogMzZweDt9CiAgICAgICAgICAgIC54dW5sZWktYnV0dG9uOmhvdmVyIHtiYWNrZ3JvdW5kOiAjNjE5YmZmfQogICAgICAgICAgICAucXVhcmstYnV0dG9uIHtkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IGJvcmRlci1yYWRpdXM6IDhweDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgZmxleC1zaHJpbms6IDA7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDEuNTsgb3V0bGluZTogMDsgY29sb3I6ICMzMzM7IGJhY2tncm91bmQ6ICNmZmY7IG1hcmdpbi1yaWdodDogMTBweDsgcGFkZGluZzogMHB4IDE0cHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgY3Vyc29yOiBwb2ludGVyOyBoZWlnaHQ6IDM2cHg7fQogICAgICAgICAgICAucXVhcmstYnV0dG9uOmhvdmVyIHsgYmFja2dyb3VuZDojZjZmNmY2IH0KICAgICAgICAgICAgLnBsLWRyb3Bkb3duLW1lbnUge3Bvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDogMDt0b3A6IDMwcHg7cGFkZGluZzogNXB4IDA7Y29sb3I6IHJnYigzNywgMzgsIDQzKTtiYWNrZ3JvdW5kOiAjZmZmO3otaW5kZXg6IDk5OTt3aWR0aDogMTAycHg7Ym9yZGVyOiAxcHggc29saWQgI2RkZDtib3JkZXItcmFkaXVzOiAxMHB4OyBib3gtc2hhZG93OiAwIDAgMXB4IDFweCByZ2IoMjggMjggMzIgLyA1JSksIDAgOHB4IDI0cHggcmdiKDI4IDI4IDMyIC8gMTIlKTt9CiAgICAgICAgICAgIC5wbC1kcm9wZG93bi1tZW51LWl0ZW0geyBoZWlnaHQ6IDMwcHg7ZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogY2VudGVyO2N1cnNvcjpwb2ludGVyIH0KICAgICAgICAgICAgLnBsLWRyb3Bkb3duLW1lbnUtaXRlbTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTMyLDEzMywxNDEsMC4wOCk7fQogICAgICAgICAgICAucGwtYnV0dG9uIC5wbC1kcm9wZG93bi1tZW51IHsgZGlzcGxheTogbm9uZTsgfQogICAgICAgICAgICAucGwtYnV0dG9uOmhvdmVyIC5wbC1kcm9wZG93bi1tZW51IHsgZGlzcGxheTogYmxvY2shaW1wb3J0YW50OyB9CiAgICAgICAgICAgIC5wbC1idXR0b24taW5pdCB7IG9wYWNpdHk6IDAuNTsgYW5pbWF0aW9uOiBlYXNlSW5pdE9wYWNpdHkgMS4ycyAzOyBhbmltYXRpb24tZmlsbC1tb2RlOmZvcndhcmRzIH0KICAgICAgICAgICAgIEBrZXlmcmFtZXMgZWFzZUluaXRPcGFjaXR5IHsgZnJvbSB7IG9wYWNpdHk6IDAuNTsgfSA1MCUgeyBvcGFjaXR5OiAxIH0gdG8geyBvcGFjaXR5OiAwLjU7IH0gfQogICAgICAgICAgICAgQGtleWZyYW1lcyBlYXNlT3BhY2l0eSB7IGZyb20geyBvcGFjaXR5OiAxOyB9IDUwJSB7IG9wYWNpdHk6IDAuMzUgfSB0byB7IG9wYWNpdHk6IDE7IH0gfQogICAgICAgICAgICAuZWxlbWVudC1jbGlja2VkIHsgb3BhY2l0eTogMC41OyB9CiAgICAgICAgICAgIC5wbC1leHRyYSB7IG1hcmdpbi10b3A6IDEwcHg7ZGlzcGxheTpmbGV4fQogICAgICAgICAgICAucGwtZXh0cmEgYnV0dG9uIHsgZmxleDogMX0KICAgICAgICAgICAgLnBvaW50ZXIgeyBjdXJzb3I6cG9pbnRlciB9CiAgICAgICAgICAgIC5wbC1zZXR0aW5nLWxhYmVsIHsgZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtwYWRkaW5nLXRvcDogMTBweDsgfQogICAgICAgICAgICAucGwtbGFiZWwgeyBmbGV4OiAwIDAgMTAwcHg7dGV4dC1hbGlnbjpsZWZ0OyB9CiAgICAgICAgICAgIC5wbC1pbnB1dCB7IGZsZXg6IDE7IHBhZGRpbmc6IDhweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjYzJjMmMyOyBib3JkZXItcmFkaXVzOiA1cHg7IGZvbnQtc2l6ZTogMTRweCB9CiAgICAgICAgICAgIC5wbC1jb2xvciB7IGZsZXg6IDE7ZGlzcGxheTogZmxleDtmbGV4LXdyYXA6IHdyYXA7IG1hcmdpbi1yaWdodDogLTEwcHg7fQogICAgICAgICAgICAucGwtY29sb3ItYm94IHsgd2lkdGg6IDM1cHg7aGVpZ2h0OiAzNXB4O21hcmdpbjoxMHB4IDEwcHggMCAwOzsgYm94LXNpemluZzogYm9yZGVyLWJveDtib3JkZXI6MXB4IHNvbGlkICNmZmY7Y3Vyc29yOnBvaW50ZXIgfQogICAgICAgICAgICAucGwtY29sb3ItYm94LmNoZWNrZWQgeyBib3JkZXI6M3B4IGRhc2hlZCAjMTExIWltcG9ydGFudCB9CiAgICAgICAgICAgIC5wbC1jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDA7IGJveC1zaGFkb3c6IG5vbmU7IH0KICAgICAgICAgICAgLnRhZy1kYW5nZXIge2NvbG9yOiNjYzMyMzU7bWFyZ2luOiAwIDVweDt9CiAgICAgICAgICAgIC5wbC10b29sdGlwIHsgcG9zaXRpb246IGFic29sdXRlOyBjb2xvcjogI2ZmZmZmZjsgbWF4LXdpZHRoOiA2MDBweDsgZm9udC1zaXplOiAxMnB4OyBwYWRkaW5nOiA1cHggMTBweDsgYmFja2dyb3VuZDogIzMzMzsgYm9yZGVyLXJhZGl1czogNXB4OyB6LWluZGV4OiAxMTAwMDA7IGxpbmUtaGVpZ2h0OiAxLjM7IGRpc3BsYXk6bm9uZTsgd29yZC1icmVhazogYnJlYWstYWxsO30KICAgICAgICAgICAgIEBrZXlmcmFtZXMgbG9hZCB7IDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZykgfSAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9IH0KICAgICAgICAgICAgLnBsLWxvYWRpbmctYm94ID4gZGl2ID4gZGl2IHsgcG9zaXRpb246IGFic29sdXRlO2JvcmRlci1yYWRpdXM6IDUwJTt9CiAgICAgICAgICAgIC5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdjpudGgtY2hpbGQoMSkgeyB0b3A6IDlweDtsZWZ0OiA5cHg7d2lkdGg6IDgycHg7aGVpZ2h0OiA4MnB4O2JhY2tncm91bmQ6ICNmZmZmZmY7fQogICAgICAgICAgICAucGwtbG9hZGluZy1ib3ggPiBkaXYgPiBkaXY6bnRoLWNoaWxkKDIpIHsgdG9wOiAxNHB4O2xlZnQ6IDM4cHg7d2lkdGg6IDI1cHg7aGVpZ2h0OiAyNXB4O2JhY2tncm91bmQ6ICM2NjY2NjY7YW5pbWF0aW9uOiBsb2FkIDFzIGxpbmVhciBpbmZpbml0ZTt0cmFuc2Zvcm0tb3JpZ2luOiAxMnB4IDM2cHg7fQogICAgICAgICAgICAucGwtbG9hZGluZyB7IHdpZHRoOiAxNnB4O2hlaWdodDogMTZweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7b3ZlcmZsb3c6IGhpZGRlbjtiYWNrZ3JvdW5kOiBub25lO30KICAgICAgICAgICAgLnBsLWxvYWRpbmctYm94IHsgd2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO3Bvc2l0aW9uOiByZWxhdGl2ZTt0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCkgc2NhbGUoMC4xNik7YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO3RyYW5zZm9ybS1vcmlnaW46IDAgMDt9CiAgICAgICAgICAgIC5wbC1sb2FkaW5nLWJveCBkaXYgeyBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgfQogICAgICAgICAgICAuc3dhbDItY29udGFpbmVyIHsgei1pbmRleDoxMDAwMDAhaW1wb3J0YW50OyB9CiAgICAgICAgICAgIGJvZHkuc3dhbDItaGVpZ2h0LWF1dG8geyBoZWlnaHQ6IGluaGVyaXQhaW1wb3J0YW50OyB9CiAgICAgICAgICAgIC5idG4tb3BlcmF0ZSAuYnRuLW1haW4geyBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgfQogICAgICAgICAgICBgOwogICAgICAgICAgICB0aGlzLmFkZFN0eWxlKCdwYW5saW5rZXItc3R5bGUnLCAnc3R5bGUnLCBjc3MpOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGluaXREaWFsb2coKSB7CiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgdGl0bGU6IHBhbi5pbml0WzBdLAogICAgICAgICAgICAgICAgaHRtbDogYDxkaXY+PGltZyBzdHlsZT0id2lkdGg6IDI1MHB4O21hcmdpbi1ib3R0b206IDEwcHg7IiBzcmM9IiR7cGFuLmltZ30iIGFsdD0iJHtwYW4uaW1nfSI+PGlucHV0IGNsYXNzPSJzd2FsMi1pbnB1dCIgaWQ9ImluaXQiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSIke3Bhbi5pbml0WzFdfSI+PC9kaXY+YCwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0Rpc21pc3NlZCAmJiByZXN1bHQuZGlzbWlzcyA9PT0gJ2Nsb3NlJykgcmV0dXJuOwogICAgICAgICAgICBpZiAocGFuLm51bSA9PT0gJCgnI2luaXQnKS52YWwoKSB8fCBwYW4ubGljZW5zZSA9PT0gJCgnI2luaXQnKS52YWwoKSkgewogICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCBwYW4ubnVtKTsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0VmFsdWUoJ2xpY2Vuc2UnLCBwYW4ubGljZW5zZSk7CiAgICAgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MocGFuLmluaXRbMl0pOwogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKTsKICAgICAgICAgICAgICAgIH0sIDE1MDApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYXdhaXQgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGFuLmluaXRbM10sCiAgICAgICAgICAgICAgICAgICAgdGV4dDogcGFuLmluaXRbNF0sCiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfph43mlrDovpPlhaUnLAogICAgICAgICAgICAgICAgICAgIGltYWdlVXJsOiBwYW4uaW1nLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmluaXREaWFsb2coKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICB9OwoKICAgIGxldCBiYWlkdSA9IHsKCiAgICAgICAgX2dldEV4dHJhKCkgewogICAgICAgICAgICBsZXQgc2VLZXkgPSBkZWNvZGVVUklDb21wb25lbnQoYmFzZS5nZXRDb29raWUoJ0JEQ0xORCcpKTsKICAgICAgICAgICAgcmV0dXJuICd7JyArICcic2VrZXkiOiInICsgc2VLZXkgKyAnIicgKyAifSI7CiAgICAgICAgfSwKCiAgICAgICAgX2dldFN1cmwoKSB7CiAgICAgICAgICAgIGxldCByZWcgPSAvKD88PXNcL3xzdXJsPSkoW2EtekEtWjAtOV8tXSspL2c7CiAgICAgICAgICAgIGlmIChyZWcudGVzdChsb2NhdGlvbi5ocmVmKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2gocmVnKVswXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKCiAgICAgICAgX2dldEZpZExpc3QoKSB7CiAgICAgICAgICAgIGxldCBmaWRsaXN0ID0gW107CiAgICAgICAgICAgIHNlbGVjdExpc3QuZm9yRWFjaCh2ID0+IHsKICAgICAgICAgICAgICAgIGlmICgrdi5pc2RpciA9PT0gMSkgcmV0dXJuOwogICAgICAgICAgICAgICAgZmlkbGlzdC5wdXNoKHYuZnNfaWQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuICdbJyArIGZpZGxpc3QgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX3Jlc2V0RGF0YSgpIHsKICAgICAgICAgICAgcHJvZ3Jlc3MgPSB7fTsKICAgICAgICAgICAgJC5lYWNoKHJlcXVlc3QsIChrZXkpID0+IHsKICAgICAgICAgICAgICAgIChyZXF1ZXN0W2tleV0pLmFib3J0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkLmVhY2goaW5zLCAoa2V5KSA9PiB7CiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGluc1trZXldKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlkbSA9IHt9OwogICAgICAgICAgICBpbnMgPSB7fTsKICAgICAgICAgICAgcmVxdWVzdCA9IHt9OwogICAgICAgIH0sCgogICAgICAgIHNldEJEVVNTKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgR01fY29va2llICYmIEdNX2Nvb2tpZSgnbGlzdCcsIHtuYW1lOiAnQkRVU1MnfSwgKGNvb2tpZXMsIGVycm9yKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBiYXNlLnNldFN0b3JhZ2UoImJhaWR1eXVuUGx1Z2luX0JEVVNTIiwge0JEVVNTOiBjb29raWVzWzBdLnZhbHVlfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJEVVNTKCkgewogICAgICAgICAgICBsZXQgYmFpZHV5dW5QbHVnaW5fQkRVU1MgPSBiYXNlLmdldFN0b3JhZ2UoJ2JhaWR1eXVuUGx1Z2luX0JEVVNTJykgPyBiYXNlLmdldFN0b3JhZ2UoJ2JhaWR1eXVuUGx1Z2luX0JEVVNTJykgOiAneyJiYWlkdXl1blBsdWdpbl9CRFVTUyI6IiJ9JzsKICAgICAgICAgICAgcmV0dXJuIGJhaWR1eXVuUGx1Z2luX0JEVVNTLkJEVVNTIHx8ICcnOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7CiAgICAgICAgICAgIGlmICghIUJEVVNTKSB7CiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJVc2VyLUFnZW50OiAke3VhfSIgLS1oZWFkZXIgIkNvb2tpZTogQkRVU1M9JHtCRFVTU30iYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGxpbms6IHBhbi5hc3Npc3RhbnQsCiAgICAgICAgICAgICAgICB0ZXh0OiBwYW4uaW5pdFs1XQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IEJEVVNTID0gdGhpcy5nZXRCRFVTUygpOwogICAgICAgICAgICBpZiAoISFCRFVTUykgewogICAgICAgICAgICAgICAgbGV0IGNvb2tpZSA9IGBCRFVTUz0ke0JEVVNTfWA7CiAgICAgICAgICAgICAgICBsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfSZjb29raWU9JHtlbmNvZGVVUklDb21wb25lbnQoY29va2llKX0mdXNlcl9hZ2VudD0ke2VuY29kZVVSSUNvbXBvbmVudCh1YSl9WlpgOwogICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lKGJjKX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbGluazogcGFuLmFzc2lzdGFudCwKICAgICAgICAgICAgICAgIHRleHQ6IHBhbi5pbml0WzVdCiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCBCRFVTUyA9IHRoaXMuZ2V0QkRVU1MoKTsKICAgICAgICAgICAgaWYgKCEhQkRVU1MpIHsKICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOwogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iIC1BICIke3VhfSIgLWIgIkJEVVNTPSR7QkRVU1N9ImApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBsaW5rOiBwYW4uYXNzaXN0YW50LAogICAgICAgICAgICAgICAgdGV4dDogcGFuLmluaXRbNV0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICBhZGRQYWdlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mYWN0b3J5KGUpIHsKICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUudGFyZ2V0KTsKICAgICAgICAgICAgICAgIGxldCBpdGVtID0gdGFyZ2V0LnBhcmVudHMoJy5wbC1pdGVtJyk7CiAgICAgICAgICAgICAgICBsZXQgbGluayA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tbGluaycpOwogICAgICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gaXRlbS5maW5kKCcucGwtaXRlbS1wcm9ncmVzcycpOwogICAgICAgICAgICAgICAgbGV0IHRpcCA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tdGlwJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGl0ZW0sIGxpbmssIHByb2dyZXNzLCB0aXAsIHRhcmdldCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIF9yZXNldChpKSB7CiAgICAgICAgICAgICAgICBpbnNbaV0gJiYgY2xlYXJJbnRlcnZhbChpbnNbaV0pOwogICAgICAgICAgICAgICAgcmVxdWVzdFtpXSAmJiByZXF1ZXN0W2ldLmFib3J0KCk7CiAgICAgICAgICAgICAgICBwcm9ncmVzc1tpXSA9IDA7CiAgICAgICAgICAgICAgICBpZG1baV0gPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZG9jLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2xpY2snLCAnLnBsLWJ1dHRvbi5nLWRyb3Bkb3duLWJ1dHRvbicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VsZWF2ZScpIHsKICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkucmVtb3ZlQ2xhc3MoJ2J1dHRvbi1vcGVuJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygnYnV0dG9uLW9wZW4nKTsKICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuZmluZCgnLnBsLWRyb3Bkb3duLW1lbnUnKS5zaG93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ21vdXNlbGVhdmUnLCAnLnBsLWJ1dHRvbi5nLWRyb3Bkb3duLWJ1dHRvbiAucGwtZHJvcGRvd24tbWVudScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuaGlkZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIG1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CiAgICAgICAgICAgICAgICBTd2FsLnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICB0aGlzLmdldFBDU0xpbmsoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGxldCBvID0gX2ZhY3RvcnkoZSk7CiAgICAgICAgICAgICAgICBsZXQgJHdpZHRoID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lcicpOwogICAgICAgICAgICAgICAgbGV0ICR0ZXh0ID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lci10ZXh0Jyk7CiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBvLmxpbmtbMF0uZGF0YXNldC5maWxlbmFtZTsKICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwogICAgICAgICAgICAgICAgX3Jlc2V0KGluZGV4KTsKICAgICAgICAgICAgICAgIGJhc2UuZ2V0KG8ubGlua1swXS5kYXRhc2V0LmxpbmssIHsiVXNlci1BZ2VudCI6IHBhbi51YX0sICdibG9iJywge2ZpbGVuYW1lLCBpbmRleH0pOwogICAgICAgICAgICAgICAgaW5zW2luZGV4XSA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZyA9ICtwcm9ncmVzc1tpbmRleF0gfHwgMDsKICAgICAgICAgICAgICAgICAgICBsZXQgaXNJRE0gPSBpZG1baW5kZXhdIHx8IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0lETSkgewogICAgICAgICAgICAgICAgICAgICAgICBvLnRpcC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHJvZ3Jlc3MuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBvLmxpbmsudGV4dCgn5bey5oiQ5Yqf5ZSk6LW3SURN77yM6K+35p+l55yLSURN5LiL6L295qGG77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWRtW2luZGV4XSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ubGluay5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgby5wcm9ncmVzcy5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICR3aWR0aC5jc3MoJ3dpZHRoJywgcHJvZyArICclJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0ZXh0LnRleHQocHJvZyArICclJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9nID09PSAxMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1tpbmRleF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1zdG9wJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy10aXAnKS5odG1sKCfkuIvovb3lrozmiJDvvIzmraPlnKjlvLnlh7rmtY/op4jlmajkuIvovb3moYbvvIEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1yZXRyeScsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbyA9IF9mYWN0b3J5KGUpOwogICAgICAgICAgICAgICAgby50aXAuaGlkZSgpOwogICAgICAgICAgICAgICAgby5saW5rLnNob3coKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWhvdycsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbyA9IF9mYWN0b3J5KGUpOwogICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gby5saW5rWzBdLmRhdGFzZXQuaW5kZXg7CiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFtpbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0W2luZGV4XS5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgby5wcm9ncmVzcy5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgby50aXAuc2hvdygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXN0b3AnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsKICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RbaW5kZXhdKSB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGluc1tpbmRleF0pOwogICAgICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBvLnByb2dyZXNzLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBvLmxpbmsuc2hvdygwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWJhY2snLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsKICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgIG8ubGluay5zaG93KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBpZiAoIWUudGFyZ2V0LmRhdGFzZXQubGluaykgewogICAgICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnJlbW92ZUNsYXNzKCdsaXN0ZW5lci1jb3B5LWFsbCcpLmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBiYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CiAgICAgICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5Yqf77yM5b+r5Y6757KY6LS05ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcuaWNvbicpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5wbC1sb2FkaW5nJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQucHJlcGVuZChiYXNlLmNyZWF0ZUxvYWRpbmcoKSk7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKICAgICAgICAgICAgICAgIGlmIChyZXMgPT09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/vvIzlv6vljrvnnIvnnIvlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PT0gJ2Fzc2lzdGFudCcpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKGAke3Bhbi5pbml0WzVdffCfkYk8YSBocmVmPSIke3Bhbi5hc3Npc3RhbnR9IiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9InBsLWEiPueCueWHu+atpOWkhOWuieijhTwvYT7wn5GIYCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLnRleHQoJ+WPkemAgeWksei0pe+8jOivt+ajgOafpeaCqOeahFJQQ+mFjee9ruS/oeaBr++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNob3dTZXR0aW5nKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ycGMtdGFzaycsICgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICB9KSwgdXJsID0gYCR7cGFuLmR9Lz9ycGM9JHtiYXNlLmUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CiAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiB+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3BsLWEnKSkgewogICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHRydWUpOwogICAgICAgIH0sCgogICAgICAgIGFkZEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIHBvaW50ZXIgcGwtYnV0dG9uIj48ZGl2IHN0eWxlPSJjb2xvcjojZmZmO2JhY2tncm91bmQ6ICR7Y29sb3J9O2JvcmRlci1jb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uIGctYnV0dG9uLWJsdWUiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZG93bmxvYWQiPjwvZW0+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogNjBweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0ibWVudSIgc3R5bGU9IndpZHRoOmF1dG87ei1pbmRleDo0MTtib3JkZXItY29sb3I6JHtjb2xvcn0iPjxkaXYgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvZGl2PjxkaXYgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIj5Bcmlh5LiL6L29PC9kaXY+PGRpdiBzdHlsZT0iY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9kaXY+PGRpdiBzdHlsZT0iY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2Rpdj48ZGl2IHN0eWxlPSJjb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiPkJD5LiL6L29PC9kaXY+JHtwYW4uY29kZSA9PSAyMDAgJiYgdmVyc2lvbiA8IHBhbi52ZXJzaW9uID8gcGFuLm5ldyA6ICcnfTwvZGl2PjwvZGl2PmApOwogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwogICAgICAgICAgICBpZiAocHQgPT09ICdtYWluJykgewogICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLm1haW4pOwogICAgICAgICAgICAgICAgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InBsLWJ1dHRvbiIgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW4tcmlnaHQ6IDhweDsiPjxidXR0b24gY2xhc3M9InUtYnV0dG9uIHUtYnV0dG9uLS1wcmltYXJ5IHUtYnV0dG9uLS1zbWFsbCBpcy1yb3VuZCBpcy1oYXMtaWNvbiIgc3R5bGU9ImJhY2tncm91bmQ6ICR7Y29sb3J9O2JvcmRlci1jb2xvcjogJHtjb2xvcn07Zm9udC1zaXplOiAxNHB4OyBwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyOiBub25lOyI+PGkgY2xhc3M9InUtaWNvbiB1LWljb24tZG93bmxvYWQiPjwvaT48c3Bhbj7kuIvovb3liqnmiYs8L3NwYW4+PC9idXR0b24+PHVsIGNsYXNzPSJkcm9wZG93bi1saXN0IG5kLWNvbW1vbi1mbG9hdC1tZW51IHBsLWRyb3Bkb3duLW1lbnUiPjxsaSBjbGFzcz0ic3ViIGN1cnNvci1wIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InN1YiBjdXJzb3ItcCBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIj5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InN1YiBjdXJzb3ItcCBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+JHtwYW4uY29kZSA9PSAyMDAgJiYgdmVyc2lvbiA8IHBhbi52ZXJzaW9uID8gcGFuLm5ld1ggOiAnJ308L3VsPjwvZGl2PmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgIHRoaXMuc2V0QkRVU1MoKTsKICAgICAgICAgICAgdGhpcy5hZGRQYWdlTGlzdGVuZXIoKTsKICAgICAgICB9LAoKICAgICAgICBhZGRJbml0QnV0dG9uKCkgewogICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47CiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7CiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0iZy1kcm9wZG93bi1idXR0b24gcG9pbnRlciBwbC1idXR0b24taW5pdCIgc3R5bGU9Im9wYWNpdHk6LjUiPjxkaXYgc3R5bGU9ImNvbG9yOiNmZmY7YmFja2dyb3VuZDogJHtjb2xvcn07Ym9yZGVyLWNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZSI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kb3dubG9hZCI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiA2MHB4OyI+5LiL6L295Yqp5omLPC9zcGFuPjwvc3Bhbj48L2Rpdj48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpICR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnbWFpbicpIHsKICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5tYWluKTsKICAgICAgICAgICAgICAgICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJwbC1idXR0b24taW5pdCIgc3R5bGU9Im9wYWNpdHk6LjU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXJpZ2h0OiA4cHg7Ij48YnV0dG9uIGNsYXNzPSJ1LWJ1dHRvbiB1LWJ1dHRvbi0tcHJpbWFyeSB1LWJ1dHRvbi0tc21hbGwgaXMtcm91bmQgaXMtaGFzLWljb24iIHN0eWxlPSJiYWNrZ3JvdW5kOiAke2NvbG9yfTtib3JkZXItY29sb3I6ICR7Y29sb3J9O2ZvbnQtc2l6ZTogMTRweDsgcGFkZGluZzogOHB4IDE2cHg7IGJvcmRlcjogbm9uZTsiPjxpIGNsYXNzPSJ1LWljb24gdS1pY29uLWRvd25sb2FkIj48L2k+PHNwYW4+5LiL6L295Yqp5omLPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGdldFRva2VuKCkgewogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzNdKTsKICAgICAgICAgICAgaWYgKHJlcy5pbmRleE9mKCdhY2Nlc3NfdG9rZW4nKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIGxldCBodG1sID0gYXdhaXQgYmFzZS5nZXQocGFuLnBjc1szXSwge30sICd0ZXh0Jyk7CiAgICAgICAgICAgICAgICBsZXQgYmRzdG9rZW4gPSBodG1sLm1hdGNoKC9uYW1lPSJiZHN0b2tlbiJccyt2YWx1ZT0iKFteIl0rKSIvKT8uWzFdOwogICAgICAgICAgICAgICAgbGV0IGNsaWVudF9pZCA9IGh0bWwubWF0Y2goL25hbWU9ImNsaWVudF9pZCJccyt2YWx1ZT0iKFteIl0rKSIvKT8uWzFdOwogICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZ3JhbnRfcGVybWlzc2lvbnNfYXJyOiAnbmV0ZGlzaycsCiAgICAgICAgICAgICAgICAgICAgYmRzdG9rZW46IGJkc3Rva2VuLAogICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50X2lkLAogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU6ICJ0b2tlbiIsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogInBhZ2UiLAogICAgICAgICAgICAgICAgICAgIGdyYW50X3Blcm1pc3Npb25zOiAiYmFzaWMsbmV0ZGlzayIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzNdLCBiYXNlLnN0cmluZ2lmeShkYXRhKSwgewogICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICBsZXQgcmVzMiA9IGF3YWl0IGJhc2UuZ2V0RmluYWxVcmwocGFuLnBjc1szXSk7CiAgICAgICAgICAgICAgICBsZXQgYWNjZXNzVG9rZW4gPSByZXMyLm1hdGNoKC9hY2Nlc3NfdG9rZW49KFteJl0rKS8pPy5bMV07CiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbiAmJiBiYXNlLnNldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pOwogICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1Rva2VuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IHJlcy5tYXRjaCgvYWNjZXNzX3Rva2VuPShbXiZdKykvKT8uWzFdOwogICAgICAgICAgICBhY2Nlc3NUb2tlbiAmJiBiYXNlLnNldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pOwogICAgICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZ2V0UENTTGluayhtYXhSZXF1ZXN0VGltZSA9IDIpIHsKICAgICAgICAgICAgc2VsZWN0TGlzdCA9IHRoaXMuZ2V0U2VsZWN0ZWRMaXN0KCk7CiAgICAgICAgICAgIGxldCBmaWRMaXN0ID0gdGhpcy5fZ2V0RmlkTGlzdCgpLCB1cmwsIHJlczsKCiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnIHx8IHB0ID09PSAnbWFpbicpIHsKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjli77pgInopoHkuIvovb3nmoTmlofku7bvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChmaWRMaXN0Lmxlbmd0aCA9PT0gMikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fmiZPlvIDmlofku7blpLnlkI7li77pgInmlofku7bvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpZExpc3QgPSBlbmNvZGVVUklDb21wb25lbnQoZmlkTGlzdCk7CiAgICAgICAgICAgICAgICBsZXQgYWNjZXNzVG9rZW4gPSBiYXNlLmdldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJykgfHwgYXdhaXQgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgdXJsID0gYCR7cGFuLnBjc1swXX0mZnNpZHM9JHtmaWRMaXN0fSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gOwogICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgYmFzZS5nZXQodXJsLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2hhcmVEYXRhKCk7CiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlkTGlzdC5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35omT5byA5paH5Lu25aS55ZCO5Yu+6YCJ5paH5Lu277yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5zaWduKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGAke3Bhbi5wY3NbMl19JnN1cmw9JHtwYXJhbXMuc3VybH0mbG9naWQ9JHtwYXJhbXMubG9naWR9YDsKICAgICAgICAgICAgICAgICAgICBsZXQgciA9IGF3YWl0IGJhc2UuZ2V0KHVybCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIuZXJybm8gPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNpZ24gPSByLmRhdGEuc2lnbjsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnRpbWVzdGFtcCA9IHIuZGF0YS50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpYWxvZyA9IGF3YWl0IFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdpbmZvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBg5o+Q56S677ya6K+35bCG5paH5Lu2PHNwYW4gY2xhc3M9InRhZy1kYW5nZXIiPlvkv53lrZjliLDnvZHnm5hdPC9zcGFuPvCfkYnliY3lvoA8c3BhbiBjbGFzcz0idGFnLWRhbmdlciI+W+aIkeeahOe9keebmF08L3NwYW4+5Lit5LiL6L2977yBYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfngrnlh7vkv53lrZgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5pc0NvbmZpcm1lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLnRvb2xzLXNoYXJlLXNhdmUtaGInKVswXS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5iZHN0b2tlbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjnmbvlvZXnvZHnm5jvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdlbmNyeXB0JywgcGFyYW1zLmVuY3J5cHQpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdwcm9kdWN0JywgcGFyYW1zLnByb2R1Y3QpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCd1aycsIHBhcmFtcy51ayk7CiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3ByaW1hcnlpZCcsIHBhcmFtcy5wcmltYXJ5aWQpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWRfbGlzdCcsIGZpZExpc3QpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdsb2dpZCcsIHBhcmFtcy5sb2dpZCk7CiAgICAgICAgICAgICAgICBwYXJhbXMuc2hhcmVUeXBlID09PSAnc2VjcmV0JyA/IGZvcm1EYXRhLmFwcGVuZCgnZXh0cmEnLCBwYXJhbXMuZXh0cmEpIDogJyc7CiAgICAgICAgICAgICAgICB1cmwgPSBgJHtwYW4ucGNzWzFdfSZzaWduPSR7cGFyYW1zLnNpZ259JnRpbWVzdGFtcD0ke3BhcmFtcy50aW1lc3RhbXB9YDsKICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIGZvcm1EYXRhLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVzLmVycm5vID09PSAwKSB7CiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20ocmVzLmxpc3QpOwogICAgICAgICAgICAgICAgdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmVycm5vID09PSAxMTIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJrpobXpnaLov4fmnJ/vvIzor7fliLfmlrDph43or5XvvIEnKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZXJybm8gPT09IDkwMTkpIHsKICAgICAgICAgICAgICAgIG1heFJlcXVlc3RUaW1lLS07CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgICAgICBpZiAobWF4UmVxdWVzdFRpbWUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRQQ1NMaW5rKG1heFJlcXVlc3RUaW1lKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcign5o+Q56S677ya6I635Y+W5LiL6L296ZO+5o6l5aSx6LSl77yB6K+35Yi35paw572R6aG15ZCO6YeN6K+V77yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJrojrflj5bkuIvovb3pk77mjqXlpLHotKXvvIHor7fliLfmlrDnvZHpobXlkI7ph43or5XvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdlbmVyYXRlRG9tKGxpc3QpIHsKICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKICAgICAgICAgICAgbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwogICAgICAgICAgICBiYXNlLnNvcnRCeU5hbWUobGlzdCk7CiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHYuaXNkaXIgPT09IDEpIHJldHVybjsKICAgICAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IHYuc2VydmVyX2ZpbGVuYW1lIHx8IHYuZmlsZW5hbWU7CiAgICAgICAgICAgICAgICBsZXQgZXh0ID0gYmFzZS5nZXRFeHRlbnNpb24oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5zaXplKTsKICAgICAgICAgICAgICAgIGxldCBkbGluayA9IHYuZGxpbms7CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FwaScpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXBpIiBocmVmPSIke2RsaW5rfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtaW5kZXg9IiR7aX0iPiR7ZGxpbmt9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tdGlwIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+PHNwYW4+6Iul5rKh5pyJ5by55Ye6SURN5LiL6L295qGG77yM5om+5YiwSURNIDxiPumAiemhuTwvYj4gLT4gPGI+5paH5Lu257G75Z6LPC9iPiAtPiA8Yj7nrKzkuIDkuKrmoYY8L2I+IOS4rea3u+WKoOWQjue8gCA8c3BhbiBjbGFzcz0icGwtZXh0Ij4ke2V4dH08L3NwYW4+77yMPGEgaHJlZj0iJHtwYW4uaWRtfSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7or6bop4HmraTlpIQ8L2E+PC9zcGFuPiA8c3BhbiBjbGFzcz0icGwtYmFjayBsaXN0ZW5lci1iYWNrIj7ov5Tlm548L3NwYW4+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1wcm9ncmVzcyIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcy1vdXRlciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcy1pbm5lciIgc3R5bGU9IndpZHRoOjUlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCI+MCU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXN0b3AgbGlzdGVuZXItc3RvcCI+5Y+W5raI5LiL6L29PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtdGlwIj7mnKrlj5HnjrBJRE3vvIzkvb/nlKjoh6rluKbmtY/op4jlmajkuIvovb08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1ob3cgbGlzdGVuZXItaG93Ij7lpoLkvZXllKTotbdJRE3vvJ88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChhbGluaykgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rLmxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluay50ZXh0KX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7mjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0N1cmwoZGxpbmssIGZpbGVuYW1lLCBwYW4udWEpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYmMnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQkMoZGxpbmssIGZpbGVuYW1lLCBwYW4udWEpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGVudCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIHJldHVybiBjb250ZW50OwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKICAgICAgICAgICAgbGV0IHJwYyA9IHsKICAgICAgICAgICAgICAgIGRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCiAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICBwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCiAgICAgICAgICAgICAgICB0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKICAgICAgICAgICAgICAgIGRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGxldCBCRFVTUyA9IHRoaXMuZ2V0QkRVU1MoKTsKICAgICAgICAgICAgaWYgKCFCRFVTUykgcmV0dXJuICdhc3Npc3RhbnQnOwoKICAgICAgICAgICAgbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwogICAgICAgICAgICBsZXQgcnBjRGF0YSA9IHsKICAgICAgICAgICAgICAgIGlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLAogICAgICAgICAgICAgICAgbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKICAgICAgICAgICAgICAgIHBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsKICAgICAgICAgICAgICAgICAgICBkaXI6IHJwYy5kaXIsCiAgICAgICAgICAgICAgICAgICAgb3V0OiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IFtgVXNlci1BZ2VudDogJHtwYW4udWF9YCwgYENvb2tpZTogQkRVU1M9JHtCRFVTU31gXQogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QodXJsLCBycGNEYXRhLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9LCAnJyk7CiAgICAgICAgICAgICAgICBpZiAocmVzLnJlc3VsdCkgcmV0dXJuICdzdWNjZXNzJzsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRTZWxlY3RlZExpc3QoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWlyZSgnc3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzJykuaW5zdGFuY2VGb3JTeXN0ZW0ubGlzdC5nZXRTZWxlY3RlZCgpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndwLXMtY29yZS1wYW4nKS5fX3Z1ZV9fLnNlbGVjdGVkTGlzdDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldExvZ2lkKCkgewogICAgICAgICAgICBsZXQgdXQgPSByZXF1aXJlKCJzeXN0ZW0tY29yZTpjb250ZXh0L2NvbnRleHQuanMiKS5pbnN0YW5jZUZvclN5c3RlbS50b29scy5iYXNlU2VydmljZTsKICAgICAgICAgICAgcmV0dXJuIHV0LmJhc2U2NEVuY29kZShiYXNlLmdldENvb2tpZSgiQkFJRFVJRCIpKTsKICAgICAgICB9LAoKICAgICAgICBnZXRTaGFyZURhdGEoKSB7CiAgICAgICAgICAgIGxldCByZXMgPSBsb2NhbHMuZHVtcCgpOwogICAgICAgICAgICBwYXJhbXMuc2hhcmVUeXBlID0gJ3NlY3JldCc7CiAgICAgICAgICAgIHBhcmFtcy5zaWduID0gJyc7CiAgICAgICAgICAgIHBhcmFtcy50aW1lc3RhbXAgPSAnJzsKICAgICAgICAgICAgcGFyYW1zLmJkc3Rva2VuID0gcmVzLmJkc3Rva2VuLnZhbHVlOwogICAgICAgICAgICBwYXJhbXMuY2hhbm5lbCA9ICdjaHVubGVpJzsKICAgICAgICAgICAgcGFyYW1zLmNsaWVudHR5cGUgPSAwOwogICAgICAgICAgICBwYXJhbXMud2ViID0gMTsKICAgICAgICAgICAgcGFyYW1zLmFwcF9pZCA9IDI1MDUyODsKICAgICAgICAgICAgcGFyYW1zLmVuY3J5cHQgPSAwOwogICAgICAgICAgICBwYXJhbXMucHJvZHVjdCA9ICdzaGFyZSc7CiAgICAgICAgICAgIHBhcmFtcy5sb2dpZCA9IHRoaXMuZ2V0TG9naWQoKTsKICAgICAgICAgICAgcGFyYW1zLnByaW1hcnlpZCA9IHJlcy5zaGFyZWlkLnZhbHVlOwogICAgICAgICAgICBwYXJhbXMudWsgPSByZXMuc2hhcmVfdWsudmFsdWU7CiAgICAgICAgICAgIHBhcmFtcy5zaGFyZVR5cGUgPT09ICdzZWNyZXQnICYmIChwYXJhbXMuZXh0cmEgPSB0aGlzLl9nZXRFeHRyYSgpKTsKICAgICAgICAgICAgcGFyYW1zLnN1cmwgPSB0aGlzLl9nZXRTdXJsKCk7CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZWN0UGFnZSgpIHsKICAgICAgICAgICAgbGV0IHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgaWYgKC9eXC9kaXNrXC9ob21lLy50ZXN0KHBhdGgpKSByZXR1cm4gJ2hvbWUnOwogICAgICAgICAgICBpZiAoL15cL2Rpc2tcL21haW4vLnRlc3QocGF0aCkpIHJldHVybiAnbWFpbic7CiAgICAgICAgICAgIGlmICgvXlwvKHN8c2hhcmUpXC8vLnRlc3QocGF0aCkpIHJldHVybiAnc2hhcmUnOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9LAoKICAgICAgICBzaG93TWFpbkRpYWxvZyh0aXRsZSwgaHRtbCwgZm9vdGVyKSB7CiAgICAgICAgICAgIFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICB0aXRsZSwKICAgICAgICAgICAgICAgIGh0bWwsCiAgICAgICAgICAgICAgICBmb290ZXIsCiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsCiAgICAgICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzLAogICAgICAgICAgICB9KS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0RGF0YSgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBpbml0UGFuTGlua2VyKCkgewogICAgICAgICAgICBiYXNlLmluaXREZWZhdWx0Q29uZmlnKCk7CiAgICAgICAgICAgIGJhc2UuYWRkUGFuTGlua2VyU3R5bGUoKTsKICAgICAgICAgICAgcHQgPSB0aGlzLmRldGVjdFBhZ2UoKTsKICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdAogICAgICAgICAgICAoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mj92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKICAgICAgICAgICAgcGFuID0gSlNPTi5wYXJzZShiYXNlLmQocmVzKSk7CiAgICAgICAgICAgIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShwYW4pOwogICAgICAgICAgICBwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8CiAgICAgICAgICAgIHBhbi5saWNlbnNlID09PSBiYXNlLmdldFZhbHVlKCdsaWNlbnNlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CiAgICAgICAgICAgIGJhc2UuY3JlYXRlVGlwKCk7CiAgICAgICAgICAgIGJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwogICAgICAgIH0KICAgIH07CgogICAgbGV0IGFsaSA9IHsKCiAgICAgICAgY29udmVydExpbmtUb0FyaWEobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGFyaWEyYyAiJHtsaW5rfSIgLS1vdXQgIiR7ZmlsZW5hbWV9IiAtLWhlYWRlciAiUmVmZXJlcjogaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLyJgKTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9JnJlZmVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KCdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyl9WlpgOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmUoYmMpfWApOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSIgLWUgImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8iYCk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkUGFnZUxpc3RlbmVyKCkgewogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBtb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwogICAgICAgICAgICAgICAgU3dhbC5zaG93TG9hZGluZygpOwogICAgICAgICAgICAgICAgdGhpcy5nZXRQQ1NMaW5rKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBsZXQgZGF0YXNldCA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0OwogICAgICAgICAgICAgICAgbGV0IGhyZWYgPSBkYXRhc2V0Lmxpbms7CiAgICAgICAgICAgICAgICBsZXQgdXJsID0gYXdhaXQgdGhpcy5nZXRSZWFsTGluayhkYXRhc2V0LmRpZCwgZGF0YXNldC5maWQpOwogICAgICAgICAgICAgICAgaWYgKHVybCkgaHJlZiA9IHVybDsKICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZElmcmFtZScpLmF0dHIoJ3NyYycsIGhyZWYpOwogICAgICAgICAgICAgICAgLy8gbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICAgICAgICAgICAgICAvLyBkLmRvd25sb2FkID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWU7CiAgICAgICAgICAgICAgICAvLyBkLnJlbCA9ICJub29wZW5lciI7CiAgICAgICAgICAgICAgICAvLyBkLmhyZWYgPSBocmVmOwogICAgICAgICAgICAgICAgLy8gZC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCJjbGljayIpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpLWJ0bicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldENsaXBib2FyZChlLnRhcmdldC5kYXRhc2V0LmZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXJpYSwgLmxpc3RlbmVyLWNvcHktYWxsJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0Q2xpcGJvYXJkKGRlY29kZVVSSUNvbXBvbmVudChlLnRhcmdldC5kYXRhc2V0LmxpbmspKTsKICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKn++8jOW/q+WOu+eymOi0tOWQp++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstcnBjJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7CiAgICAgICAgICAgICAgICB0YXJnZXQuZmluZCgnLmljb24nKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcucGwtbG9hZGluZycpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LnByZXBlbmQoYmFzZS5jcmVhdGVMb2FkaW5nKCkpOwogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZExpbmtUb1JQQyhlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5maWxlbmFtZSwgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CiAgICAgICAgICAgICAgICBpZiAocmVzID09PSAnc3VjY2VzcycpIHsKICAgICAgICAgICAgICAgICAgICAkKCcubGlzdGVuZXItcnBjLXRhc2snKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUNsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbCgn5Y+R6YCB5oiQ5Yqf77yM5b+r5Y6755yL55yL5ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS50ZXh0KCflj5HpgIHlpLHotKXvvIzor7fmo4Dmn6XmgqjnmoRSUEPphY3nva7kv6Hmga/vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1zZW5kLXJwYycsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAkKCcubGlzdGVuZXItbGluay1ycGMnKS5jbGljaygpOwogICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5Y+R6YCB5a6M5oiQ77yM5Y+R6YCB57uT5p6c6KeB5LiK5pa55oyJ6ZKu77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zaG93U2V0dGluZygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgICAgIGRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCiAgICAgICAgICAgICAgICAgICAgcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAogICAgICAgICAgICAgICAgfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwogICAgICAgICAgICAgICAgR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBnZXRSZWFsTGluayhkLCBmKSB7CiAgICAgICAgICAgIGxldCBhdXRob3JpemF0aW9uID0gYCR7YmFzZS5nZXRTdG9yYWdlKCd0b2tlbicpLnRva2VuX3R5cGV9ICR7YmFzZS5nZXRTdG9yYWdlKCd0b2tlbicpLmFjY2Vzc190b2tlbn1gOwogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHBhbi5wY3NbMV0sIHsKICAgICAgICAgICAgICAgIGRyaXZlX2lkOiBkLAogICAgICAgICAgICAgICAgZmlsZV9pZDogZgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uLAogICAgICAgICAgICAgICAgImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgiLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHJlcy51cmwpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXMudXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9LAoKICAgICAgICBhZGRCdXR0b24oKSB7CiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsKICAgICAgICAgICAgbGV0ICR0b29sV3JhcDsKICAgICAgICAgICAgbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJhbGktYnV0dG9uIHBsLWJ1dHRvbiI+PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTg1My4zMzMgOTM4LjY2N0gxNzAuNjY3YTg1LjMzMyA4NS4zMzMgMCAwIDEtODUuMzM0LTg1LjMzNHYtMzg0QTg1LjMzMyA4NS4zMzMgMCAwIDEgMTcwLjY2NyAzODRIMjg4YTMyIDMyIDAgMCAxIDAgNjRIMTcwLjY2N2EyMS4zMzMgMjEuMzMzIDAgMCAwLTIxLjMzNCAyMS4zMzN2Mzg0YTIxLjMzMyAyMS4zMzMgMCAwIDAgMjEuMzM0IDIxLjMzNGg2ODIuNjY2YTIxLjMzMyAyMS4zMzMgMCAwIDAgMjEuMzM0LTIxLjMzNHYtMzg0QTIxLjMzMyAyMS4zMzMgMCAwIDAgODUzLjMzMyA0NDhINzM2YTMyIDMyIDAgMCAxIDAtNjRoMTE3LjMzM2E4NS4zMzMgODUuMzMzIDAgMCAxIDg1LjMzNCA4NS4zMzN2Mzg0YTg1LjMzMyA4NS4zMzMgMCAwIDEtODUuMzM0IDg1LjMzNHoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNNzE1LjAzIDU0My41NTJhMzIuODEgMzIuODEgMCAwIDAtNDYuMjUxIDBMNTU0LjAwNSA2NTcuODEzdi01NDAuNDhhMzIgMzIgMCAwIDAtNjQgMHY1MzkuNzM0TDM3NS44OTMgNTQzLjQ4OGEzMi43OSAzMi43OSAwIDAgMC00Ni4yMjkgMCAzMi40MjcgMzIuNDI3IDAgMCAwIDAgNDYuMDM3bDE2OS41NTcgMTY4LjgxMWEzMi44MSAzMi44MSAwIDAgMCA0Ni4yNTEgMGwxNjkuNTU3LTE2OC44MWEzMi40NyAzMi40NyAwIDAgMCAwLTQ1Ljk3NHoiIGZpbGw9IiNGRjlDMDAiLz48L3N2Zz48c3Bhbj7kuIvovb3liqnmiYs8L3NwYW4+PHVsIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT4ke3Bhbi5jb2RlID09IDIwMCAmJiB2ZXJzaW9uIDwgcGFuLnZlcnNpb24gPyBwYW4ubmV3IDogJyd9PC91bD48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAuYXBwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgICRidXR0b24uY3NzKHsnbWFyZ2luLXJpZ2h0JzogJzEwcHgnfSk7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmFzZS5jcmVhdGVEb3dubG9hZElmcmFtZSgpOwogICAgICAgICAgICB0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwogICAgICAgIH0sCgogICAgICAgIGFkZEluaXRCdXR0b24oKSB7CiAgICAgICAgICAgIGlmICghcHQpIHJldHVybjsKICAgICAgICAgICAgbGV0ICR0b29sV3JhcDsKICAgICAgICAgICAgbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJhbGktYnV0dG9uIHBsLWJ1dHRvbi1pbml0Ij48c3ZnIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNODUzLjMzMyA5MzguNjY3SDE3MC42NjdhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQtODUuMzM0di0zODRBODUuMzMzIDg1LjMzMyAwIDAgMSAxNzAuNjY3IDM4NEgyODhhMzIgMzIgMCAwIDEgMCA2NEgxNzAuNjY3YTIxLjMzMyAyMS4zMzMgMCAwIDAtMjEuMzM0IDIxLjMzM3YzODRhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQgMjEuMzM0aDY4Mi42NjZhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQtMjEuMzM0di0zODRBMjEuMzMzIDIxLjMzMyAwIDAgMCA4NTMuMzMzIDQ0OEg3MzZhMzIgMzIgMCAwIDEgMC02NGgxMTcuMzMzYTg1LjMzMyA4NS4zMzMgMCAwIDEgODUuMzM0IDg1LjMzM3YzODRhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQgODUuMzM0eiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik03MTUuMDMgNTQzLjU1MmEzMi44MSAzMi44MSAwIDAgMC00Ni4yNTEgMEw1NTQuMDA1IDY1Ny44MTN2LTU0MC40OGEzMiAzMiAwIDAgMC02NCAwdjUzOS43MzRMMzc1Ljg5MyA1NDMuNDg4YTMyLjc5IDMyLjc5IDAgMCAwLTQ2LjIyOSAwIDMyLjQyNyAzMi40MjcgMCAwIDAgMCA0Ni4wMzdsMTY5LjU1NyAxNjguODExYTMyLjgxIDMyLjgxIDAgMCAwIDQ2LjI1MSAwbDE2OS41NTctMTY4LjgxYTMyLjQ3IDMyLjQ3IDAgMCAwIDAtNDUuOTc0eiIgZmlsbD0iI0ZGOUMwMCIvPjwvc3ZnPjxzcGFuPuS4i+i9veWKqeaJizwvc3Bhbj48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5hcHBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgewogICAgICAgICAgICAgICAgJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG8taW5pdCcpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGJ1dHRvbi5jbGljaygoKSA9PiBiYXNlLmluaXREaWFsb2coKSk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZ2V0UENTTGluaygpIHsKICAgICAgICAgICAgbGV0IHJlYWN0RG9tR3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFuLmRvbS5ncmlkKTsKICAgICAgICAgICAgaWYgKHJlYWN0RG9tR3JpZCkgewogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmj5DnpLonLAogICAgICAgICAgICAgICAgICAgIGh0bWw6ICc8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ij7or7flhYjliIfmjaLliLAgPGI+5YiX6KGo6KeG5Zu+PC9iPu+8iDxzdmcgY2xhc3M9Imljb24iIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNMTMyIDkyOGMtMzIuOCAwLTU5LjItMjYuNC01OS4yLTU5LjJzMjYuNC01OS4yIDU5LjItNTkuMmg3NjBjMzIuOCAwIDU5LjIgMjYuNCA1OS4yIDU5LjJTOTI0LjggOTI4IDg5MiA5MjhIMTMyem0wLTM1Ni44Yy0zMi44IDAtNTkuMi0yNi40LTU5LjItNTkuMnMyNi40LTU5LjIgNTkuMi01OS4yaDc2MGMzMi44IDAgNTkuMiAyNi40IDU5LjIgNTkuMnMtMjYuNCA1OS4yLTU5LjIgNTkuMkgxMzJ6bTAtMzU2Yy0zMi44IDAtNTkuMi0yNi40LTU5LjItNTkuMlM5OS4yIDk2LjggMTMyIDk2LjhoNzYwYzMyLjggMCA1OS4yIDI2LjQgNTkuMiA1OS4ycy0yNi40IDU5LjItNTkuMiA1OS4ySDEzMnoiLz48L3N2Zz7vvInlkI7ojrflj5bvvIE8L2Rpdj4nLAogICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn54K55Ye75YiH5o2iJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYW4uZG9tLnN3aXRjaCkuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5zdWNjZXNzKCfliIfmjaLmiJDlip/vvIzor7fph43mlrDojrflj5bkuIvovb3pk77mjqXvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuaXNPbmx5Rm9sZGVyKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fmiZPlvIDmlofku7blpLnlkI7li77pgInmlofku7bvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0Lmxlbmd0aCA+IDIwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muWNleasoeacgOWkmuWPr+WLvumAiSAyMCDkuKrmlofku7bvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvcml6YXRpb24gPSBgJHtiYXNlLmdldFN0b3JhZ2UoJ3Rva2VuJykudG9rZW5fdHlwZX0gJHtiYXNlLmdldFN0b3JhZ2UoJ3Rva2VuJykuYWNjZXNzX3Rva2VufWA7CiAgICAgICAgICAgICAgICAgICAgbGV0IHhTaGFyZVRva2VuID0gYmFzZS5nZXRTdG9yYWdlKCdzaGFyZVRva2VuJykuc2hhcmVfdG9rZW47CgogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHBhbi5wY3NbMF0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZV9zZWM6IDYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQ6IHNlbGVjdExpc3RbaV0uZmlsZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVfaWQ6IHNlbGVjdExpc3RbaV0uc2hhcmVJZAogICAgICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIngtc2hhcmUtdG9rZW4iOiB4U2hhcmVUb2tlbgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kb3dubG9hZF91cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdExpc3RbaV0uZG93bmxvYWRVcmwgPSByZXMuZG93bmxvYWRfdXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjnmbvlvZXnvZHnm5jvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20oc2VsZWN0TGlzdCk7CiAgICAgICAgICAgIHRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwogICAgICAgIH0sCgogICAgICAgIGdlbmVyYXRlRG9tKGxpc3QpIHsKICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKICAgICAgICAgICAgbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwogICAgICAgICAgICBsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKICAgICAgICAgICAgICAgIGlmICh2LnR5cGUgPT09ICdmb2xkZXInKSByZXR1cm47CiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSB2Lm5hbWU7CiAgICAgICAgICAgICAgICBsZXQgZmlkID0gdi5maWxlSWQ7CiAgICAgICAgICAgICAgICBsZXQgZGlkID0gdi5kcml2ZUlkOwogICAgICAgICAgICAgICAgbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5zaXplKTsKICAgICAgICAgICAgICAgIGxldCBkbGluayA9IHYuZG93bmxvYWRVcmwgfHwgdi51cmw7CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FwaScpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFwaSIgZGF0YS1kaWQ9IiR7ZGlkfSIgZGF0YS1maWQ9IiR7ZmlkfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtaW5kZXg9IiR7aX0iPiR7ZGxpbmt9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tYnRuIGxpc3RlbmVyLWxpbmstYXBpLWJ0biIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iPuWkjeWItuaWh+S7tuWQjTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQXJpYShkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAgICAgICAgIGFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7mjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0N1cmwoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdiYycpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9CQyhkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRlbnQgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICByZXR1cm4gY29udGVudDsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CiAgICAgICAgICAgIGxldCBycGMgPSB7CiAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAogICAgICAgICAgICAgICAgcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAogICAgICAgICAgICAgICAgcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAogICAgICAgICAgICAgICAgdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCiAgICAgICAgICAgICAgICBkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwogICAgICAgICAgICBsZXQgcnBjRGF0YSA9IHsKICAgICAgICAgICAgICAgIGlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLAogICAgICAgICAgICAgICAgbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKICAgICAgICAgICAgICAgIHBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsKICAgICAgICAgICAgICAgICAgICBkaXI6IHJwYy5kaXIsCiAgICAgICAgICAgICAgICAgICAgb3V0OiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IFtgUmVmZXJlcjogaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL2BdCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICB9OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHsiUmVmZXJlciI6ICJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vIn0sICcnKTsKICAgICAgICAgICAgICAgIGlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldFNlbGVjdGVkTGlzdCgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZExpc3QgPSBbXTsKICAgICAgICAgICAgICAgIGxldCByZWFjdERvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFuLmRvbS5saXN0KTsKICAgICAgICAgICAgICAgIGxldCByZWFjdE9iaiA9IGJhc2UuZmluZFJlYWN0KHJlYWN0RG9tLCAxKTsKICAgICAgICAgICAgICAgIGxldCBwcm9wcyA9IHJlYWN0T2JqLnBlbmRpbmdQcm9wczsKICAgICAgICAgICAgICAgIGlmIChwcm9wcykgewogICAgICAgICAgICAgICAgICAgIGxldCBmaWxlTGlzdCA9IHByb3BzLmRhdGFTb3VyY2UgfHwgW107CiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkS2V5cyA9IHByb3BzLnNlbGVjdGVkS2V5cy5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goKHZhbCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRLZXlzLmluY2x1ZGVzKHZhbC5maWxlSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExpc3QucHVzaCh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRMaXN0OwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkZXRlY3RQYWdlKCkgewogICAgICAgICAgICBsZXQgcGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgICAgICBpZiAoL15cLyhkcml2ZSkvLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CiAgICAgICAgICAgIGlmICgvXlwvKHN8c2hhcmUpXC8vLnRlc3QocGF0aCkpIHJldHVybiAnc2hhcmUnOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKCiAgICAgICAgaXNPbmx5Rm9sZGVyKCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0W2ldLnR5cGUgPT09ICdmaWxlJykgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIHNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsKICAgICAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlLAogICAgICAgICAgICAgICAgaHRtbCwKICAgICAgICAgICAgICAgIGZvb3RlciwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJywKICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICAgICAgcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAogICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3MsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CiAgICAgICAgICAgIGJhc2UuaW5pdERlZmF1bHRDb25maWcoKTsKICAgICAgICAgICAgYmFzZS5hZGRQYW5MaW5rZXJTdHlsZSgpOwogICAgICAgICAgICBwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0CiAgICAgICAgICAgIChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL2FsaT92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKICAgICAgICAgICAgcGFuID0gSlNPTi5wYXJzZShiYXNlLmQocmVzKSk7CiAgICAgICAgICAgIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShwYW4pOwogICAgICAgICAgICBwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8CiAgICAgICAgICAgIHBhbi5saWNlbnNlID09PSBiYXNlLmdldFZhbHVlKCdsaWNlbnNlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CiAgICAgICAgICAgIGJhc2UuY3JlYXRlVGlwKCk7CiAgICAgICAgICAgIGJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwogICAgICAgIH0KICAgIH07CgogICAgbGV0IHRpYW55aSA9IHsKCiAgICAgICAgY29udmVydExpbmtUb0FyaWEobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGFyaWEyYyAiJHtsaW5rfSIgLS1vdXQgIiR7ZmlsZW5hbWV9ImApOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IGJjID0gYEFBLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKX0vP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX1aWmA7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGJjOi8vaHR0cC8ke2Jhc2UuZShiYyl9YCk7CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOwogICAgICAgICAgICBmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGAke3Rlcm1pbmFsICE9PSAnd3AnID8gJ2N1cmwnIDogJ2N1cmwuZXhlJ30gLUwgLUMgLSAiJHtsaW5rfSIgLW8gIiR7ZmlsZW5hbWV9ImApOwogICAgICAgIH0sCgogICAgICAgIGFkZFBhZ2VMaXN0ZW5lcigpIHsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcucGwtYnV0dG9uLW1vZGUnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgbW9kZSA9IGUudGFyZ2V0LmRhdGFzZXQubW9kZTsKICAgICAgICAgICAgICAgIFN3YWwuc2hvd0xvYWRpbmcoKTsKICAgICAgICAgICAgICAgIHRoaXMuZ2V0UENTTGluaygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBiYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip/vvIzlv6vljrvnspjotLTlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLnNlbmRMaW5rVG9SUEMoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwogICAgICAgICAgICAgICAgaWYgKHJlcyA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLmxpc3RlbmVyLXJwYy10YXNrJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoJ+WPkemAgeaIkOWKn++8jOW/q+WOu+eci+eci+WQp++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM6K+35qOA5p+l5oKo55qEUlBD6YWN572u5L+h5oGv77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc2VuZC1ycGMnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgJCgnLmxpc3RlbmVyLWxpbmstcnBjJykuY2xpY2soKTsKICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WPkemAgeWujOaIkO+8jOWPkemAgee7k+aenOingeS4iuaWueaMiemSru+8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLW9wZW4tc2V0dGluZycsICgpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2hvd1NldHRpbmcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAogICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKICAgICAgICAgICAgICAgIH0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZShycGMpfSMke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9YDsKICAgICAgICAgICAgICAgIEdNX29wZW5JblRhYih1cmwsIHthY3RpdmU6IHRydWV9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkQnV0dG9uKCkgewogICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47CiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7CiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0idGlhbnlpLWJ1dHRvbiBwbC1idXR0b24iPuS4i+i9veWKqeaJizx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSIgc3R5bGU9InRvcDogMjZweDsiPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIiA+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIiA+QkPkuIvovb08L2xpPiR7cGFuLmNvZGUgPT0gMjAwICYmIHZlcnNpb24gPCBwYW4udmVyc2lvbiA/IHBhbi5uZXcgOiAnJ308L3VsPjwvZGl2PmApOwogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgewogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBiYXNlLmNyZWF0ZURvd25sb2FkSWZyYW1lKCk7CiAgICAgICAgICAgIHRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkSW5pdEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InRpYW55aS1idXR0b24gcGwtYnV0dG9uLWluaXQiPuS4i+i9veWKqeaJizwvZGl2PmApOwogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgewogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgewogICAgICAgICAgICAgICAgJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgICRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGdldFRva2VuKCkgewogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzFdLCB7fSk7CiAgICAgICAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IHJlcy5tYXRjaCgvYWNjZXNzVG9rZW49KFx3KykvKT8uWzFdOwogICAgICAgICAgICBhY2Nlc3NUb2tlbiAmJiBiYXNlLnNldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pOwogICAgICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZ2V0RmlsZVVybEJ5T25jZShpdGVtLCBpbmRleCwgdG9rZW4pIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLmRvd25sb2FkVXJsKSByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiBpdGVtLmRvd25sb2FkVXJsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpLAogICAgICAgICAgICAgICAgICAgIGZpbGVJZCA9IGl0ZW0uZmlsZUlkLAogICAgICAgICAgICAgICAgICAgIG8gPSAiQWNjZXNzVG9rZW49IiArIHRva2VuICsgIiZUaW1lc3RhbXA9IiArIHRpbWUgKyAiJmZpbGVJZD0iICsgZmlsZUlkLAogICAgICAgICAgICAgICAgICAgIHVybCA9IHBhbi5wY3NbMl0gKyAnP2ZpbGVJZD0nICsgZmlsZUlkOwogICAgICAgICAgICAgICAgaWYgKGl0ZW0uc2hhcmVJZCkgewogICAgICAgICAgICAgICAgICAgIG8gPSAiQWNjZXNzVG9rZW49IiArIHRva2VuICsgIiZUaW1lc3RhbXA9IiArIHRpbWUgKyAiJmR0PTEmZmlsZUlkPSIgKyBmaWxlSWQgKyAiJnNoYXJlSWQ9IiArIGl0ZW0uc2hhcmVJZDsKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZkdD0xJnNoYXJlSWQ9JyArIGl0ZW0uc2hhcmVJZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBzaWduID0gbWQ1KG8pLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQodXJsLCB7CiAgICAgICAgICAgICAgICAgICAgImFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgiLAogICAgICAgICAgICAgICAgICAgICJzaWduLXR5cGUiOiAxLAogICAgICAgICAgICAgICAgICAgICJhY2Nlc3N0b2tlbiI6IHRva2VuLAogICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAiOiB0aW1lLAogICAgICAgICAgICAgICAgICAgICJzaWduYXR1cmUiOiBzaWduCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChyZXMucmVzX2NvZGUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmw6IHJlcy5maWxlRG93bmxvYWRVcmwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZXJyb3JDb2RlID09PSAnSW52YWxpZFNlc3Npb25LZXknKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiAn5o+Q56S677ya6K+35YWI55m75b2V572R55uY77yBJwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5yZXNfY29kZSA9PT0gJ1NoYXJlTm90Rm91bmRGbGF0RGlyJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogJ+aPkOekuu+8muivt+WFiFvovazlrZhd5paH5Lu277yM8J+RieWJjeW+gFvmiJHnmoTnvZHnm5hd5Lit5LiL6L2977yBJwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogJ+iOt+WPluS4i+i9veWcsOWdgOWksei0pe+8jOivt+WIt+aWsOmHjeivle+8gScKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM6K+35Yi35paw6YeN6K+V77yBJwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGdldFBDU0xpbmsoKSB7CiAgICAgICAgICAgIHNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwogICAgICAgICAgICBpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjli77pgInopoHkuIvovb3nmoTmlofku7bvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+aJk+W8gOaWh+S7tuWkueWQjuWLvumAieaWh+S7tu+8gScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCB0b2tlbiA9IGJhc2UuZ2V0U3RvcmFnZSgnYWNjZXNzVG9rZW4nKSB8fCBhd2FpdCB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGlmICghdG9rZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjnmbvlvZXnvZHnm5jvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgcXVldWUgPSBbXTsKICAgICAgICAgICAgc2VsZWN0TGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgcXVldWUucHVzaCh0aGlzLmdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgsIHRva2VuKSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVldWUpOwogICAgICAgICAgICByZXMuZm9yRWFjaCh2YWwgPT4gewogICAgICAgICAgICAgICAgc2VsZWN0TGlzdFt2YWwuaW5kZXhdLmRvd25sb2FkVXJsID0gdmFsLmRvd25sb2FkVXJsOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGxldCBodG1sID0gdGhpcy5nZW5lcmF0ZURvbShzZWxlY3RMaXN0KTsKICAgICAgICAgICAgdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2VuZXJhdGVEb20obGlzdCkgewogICAgICAgICAgICBsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOwogICAgICAgICAgICBsZXQgYWxpbmtBbGxUZXh0ID0gJyc7CiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHYuaXNGb2xkZXIpIHJldHVybjsKICAgICAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IHYuZmlsZU5hbWU7CiAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LnNpemUpOwogICAgICAgICAgICAgICAgbGV0IGRsaW5rID0gdi5kb3dubG9hZFVybDsKICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXBpJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXBpIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdycGMnKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAgICAgICAgIGFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2JjJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGVudCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIHJldHVybiBjb250ZW50OwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKICAgICAgICAgICAgbGV0IHJwYyA9IHsKICAgICAgICAgICAgICAgIGRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCiAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICBwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCiAgICAgICAgICAgICAgICB0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKICAgICAgICAgICAgICAgIGRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CiAgICAgICAgICAgIGxldCBycGNEYXRhID0gewogICAgICAgICAgICAgICAgaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICAgICAgICAganNvbnJwYzogJzIuMCcsCiAgICAgICAgICAgICAgICBtZXRob2Q6ICdhcmlhMi5hZGRVcmknLAogICAgICAgICAgICAgICAgcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewogICAgICAgICAgICAgICAgICAgIGRpcjogcnBjLmRpciwKICAgICAgICAgICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcjogW10KICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwge30sICcnKTsKICAgICAgICAgICAgICAgIGlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldFNlbGVjdGVkTGlzdCgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuYy1maWxlLWxpc3QiKS5fX3Z1ZV9fLnNlbGVjdGVkTGlzdDsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaW5mby1kZXRhaWwiKS5fX3Z1ZV9fLmZpbGVEZXRhaWxdOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGV0ZWN0UGFnZSgpIHsKICAgICAgICAgICAgbGV0IHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgaWYgKC9eXC93ZWJcL21haW4vLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CiAgICAgICAgICAgIGlmICgvXlwvd2ViXC9zaGFyZS8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9LAoKICAgICAgICBpc09ubHlGb2xkZXIoKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RMaXN0W2ldLmlzRm9sZGVyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewogICAgICAgICAgICBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgdGl0bGUsCiAgICAgICAgICAgICAgICBodG1sLAogICAgICAgICAgICAgICAgZm9vdGVyLAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAogICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLAogICAgICAgICAgICAgICAgd2lkdGgsCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMTVweCAyMHB4IDVweCcsCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcywKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgaW5pdFBhbkxpbmtlcigpIHsKICAgICAgICAgICAgYmFzZS5pbml0RGVmYXVsdENvbmZpZygpOwogICAgICAgICAgICBiYXNlLmFkZFBhbkxpbmtlclN0eWxlKCk7CiAgICAgICAgICAgIHB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CiAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QKICAgICAgICAgICAgKGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvdjIvdGlhbnlpP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwogICAgICAgICAgICBwYW4gPSBKU09OLnBhcnNlKGJhc2UuZChyZXMpKTsKICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CiAgICAgICAgICAgIHBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwKICAgICAgICAgICAgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICBiYXNlLmNyZWF0ZVRpcCgpOwogICAgICAgICAgICBiYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKICAgICAgICB9CiAgICB9OwoKICAgIGxldCB4dW5sZWkgPSB7CgogICAgICAgIGNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSJgKTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9WlpgOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmUoYmMpfWApOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSJgKTsKICAgICAgICB9LAoKICAgICAgICBhZGRQYWdlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIG1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CiAgICAgICAgICAgICAgICBTd2FsLnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICB0aGlzLmdldFBDU0xpbmsoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZElmcmFtZScpLmF0dHIoJ3NyYycsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGktYnRuJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0Q2xpcGJvYXJkKGUudGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5YqfJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1iYy1idG4nLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG1pcnJvciA9IGJhc2UuZ2V0TWlycm9yTGlzdChlLnRhcmdldC5kYXRhc2V0LmRsaW5rLCBwYW4ubWlycm9yKTsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0Q2xpcGJvYXJkKG1pcnJvcik7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBiYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip/vvIzlv6vljrvnspjotLTlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLnNlbmRMaW5rVG9SUEMoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwogICAgICAgICAgICAgICAgaWYgKHJlcyA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLmxpc3RlbmVyLXJwYy10YXNrJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoJ+WPkemAgeaIkOWKn++8jOW/q+WOu+eci+eci+WQp++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM6K+35qOA5p+l5oKo55qEUlBD6YWN572u5L+h5oGv77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc2VuZC1ycGMnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgJCgnLmxpc3RlbmVyLWxpbmstcnBjJykuY2xpY2soKTsKICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WPkemAgeWujOaIkO+8jOWPkemAgee7k+aenOingeS4iuaWueaMiemSru+8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLW9wZW4tc2V0dGluZycsICgpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2hvd1NldHRpbmcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAogICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKICAgICAgICAgICAgICAgIH0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZShycGMpfSMke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9YDsKICAgICAgICAgICAgICAgIEdNX29wZW5JblRhYih1cmwsIHthY3RpdmU6IHRydWV9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkQnV0dG9uKCkgewogICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47CiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7CiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0ieHVubGVpLWJ1dHRvbiBwbC1idXR0b24iPjxpIGNsYXNzPSJ4bHBmb250IHhscC1kb3dubG9hZCI+PC9pPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzcHg7bWFyZ2luLWxlZnQ6IDZweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDM0cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT4ke3Bhbi5jb2RlID09IDIwMCAmJiB2ZXJzaW9uIDwgcGFuLnZlcnNpb24gPyBwYW4ubmV3IDogJyd9PC91bD48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0ID09PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICAkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4J30pOwogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJhc2UuY3JlYXRlRG93bmxvYWRJZnJhbWUoKTsKICAgICAgICAgICAgdGhpcy5hZGRQYWdlTGlzdGVuZXIoKTsKICAgICAgICB9LAoKICAgICAgICBhZGRJbml0QnV0dG9uKCkgewogICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47CiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7CiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0ieHVubGVpLWJ1dHRvbiBwbC1idXR0b24taW5pdCI+PGkgY2xhc3M9InhscGZvbnQgeGxwLWRvd25sb2FkIj48L2k+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTNweDttYXJnaW4tbGVmdDogNnB4OyI+5LiL6L295Yqp5omLPC9zcGFuPjwvZGl2PmApOwogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgewogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgewogICAgICAgICAgICAgICAgJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgICRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwogICAgICAgIH0sCgogICAgICAgIGdldFRva2VuKCkgewogICAgICAgICAgICBsZXQgY3JlZGVudGlhbHMgPSB7fSwgY2FwdGNoYSA9IHt9OwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsU3RvcmFnZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKC9eY3JlZGVudGlhbHNfLy50ZXN0KGxvY2FsU3RvcmFnZS5rZXkoaSkpKSB7CiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMgPSBiYXNlLmdldFN0b3JhZ2UobG9jYWxTdG9yYWdlLmtleShpKSk7CiAgICAgICAgICAgICAgICAgICAgYmFzZS5zZXRTdG9yYWdlKCcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgvXmNhcHRjaGFfW1x3XXsxNn0vLnRlc3QobG9jYWxTdG9yYWdlLmtleShpKSkpIHsKICAgICAgICAgICAgICAgICAgICBjYXB0Y2hhID0gYmFzZS5nZXRTdG9yYWdlKGxvY2FsU3RvcmFnZS5rZXkoaSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBkZXZpY2VpZCA9IC8oXHd7MzJ9KS8uZXhlYyhiYXNlLmdldFN0b3JhZ2UoJ2RldmljZWlkJykuc3BsaXQoJywnKSlbMF07CiAgICAgICAgICAgIGxldCB0b2tlbiA9IHsKICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzLAogICAgICAgICAgICAgICAgY2FwdGNoYSwKICAgICAgICAgICAgICAgIGRldmljZWlkCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBnZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4LCB0b2tlbikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKGl0ZW0uZG93bmxvYWRVcmwpIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmw6IGl0ZW0uZG93bmxvYWRVcmwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQocGFuLnBjc1swXSArIGl0ZW0uaWQsIHsKICAgICAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGAke3Rva2VuLmNyZWRlbnRpYWxzLnRva2VuX3R5cGV9ICR7dG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzX3Rva2VufWAsCiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgICAgICAgICAneC1jYXB0Y2hhLXRva2VuJzogdG9rZW4uY2FwdGNoYS50b2tlbiwKICAgICAgICAgICAgICAgICAgICAneC1kZXZpY2UtaWQnOiB0b2tlbi5kZXZpY2VpZCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKHJlcy53ZWJfY29udGVudF9saW5rKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiByZXMud2ViX2NvbnRlbnRfbGluawogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogJ+iOt+WPluS4i+i9veWcsOWdgOWksei0pe+8jOivt+WIt+aWsOmHjeivle+8gScKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI55m75b2V572R55uY5ZCO5Yi35paw6aG16Z2i77yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBhc3luYyBnZXRQQ1NMaW5rKCkgewogICAgICAgICAgICBzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuaXNPbmx5Rm9sZGVyKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fmiZPlvIDmlofku7blpLnlkI7li77pgInmlofku7bvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgewogICAgICAgICAgICAgICAgbGV0IHF1ZXVlID0gW107CiAgICAgICAgICAgICAgICBsZXQgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgICAgICBzZWxlY3RMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaCh0aGlzLmdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgsIHRva2VuKSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXVlKTsKICAgICAgICAgICAgICAgIHJlcy5mb3JFYWNoKHZhbCA9PiB7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0TGlzdFt2YWwuaW5kZXhdLmRvd25sb2FkVXJsID0gdmFsLmRvd25sb2FkVXJsOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fkv53lrZjliLDoh6rlt7HnvZHnm5jlkI7ljrvnvZHnm5jkuLvpobXkuIvovb3vvIEnKTsKICAgICAgICAgICAgICAgIGF3YWl0IGJhc2Uuc2xlZXAoMTAwMCk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2F2ZVRvQ2xvdWQnKS5jbGljaygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBodG1sID0gdGhpcy5nZW5lcmF0ZURvbShzZWxlY3RMaXN0KTsKICAgICAgICAgICAgdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CgogICAgICAgIH0sCgogICAgICAgIGdlbmVyYXRlRG9tKGxpc3QpIHsKICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKICAgICAgICAgICAgbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwogICAgICAgICAgICBsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKICAgICAgICAgICAgICAgIGlmICh2LmtpbmQgPT09ICdkcml2ZSNmb2xkZXInKSByZXR1cm47CiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSB2Lm5hbWU7CiAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCgrdi5zaXplKTsKICAgICAgICAgICAgICAgIGxldCBkbGluayA9IHYuZG93bmxvYWRVcmw7CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FwaScpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFwaSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtaW5kZXg9IiR7aX0iPiR7ZGxpbmt9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tYnRuIGxpc3RlbmVyLWxpbmstYXBpLWJ0biIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iPuWkjeWItuaWh+S7tuWQjTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQXJpYShkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAgICAgICAgIGFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7mjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0N1cmwoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdiYycpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9CQyhkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1idG4gbGlzdGVuZXItbGluay1iYy1idG4iIGRhdGEtZGxpbms9IiR7ZGxpbmt9Ij7lpI3liLbplZzlg4/lnLDlnYA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGVudCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CiAgICAgICAgICAgIHJldHVybiBjb250ZW50OwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKICAgICAgICAgICAgbGV0IHJwYyA9IHsKICAgICAgICAgICAgICAgIGRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCiAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICBwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCiAgICAgICAgICAgICAgICB0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKICAgICAgICAgICAgICAgIGRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CiAgICAgICAgICAgIGxldCBycGNEYXRhID0gewogICAgICAgICAgICAgICAgaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICAgICAgICAganNvbnJwYzogJzIuMCcsCiAgICAgICAgICAgICAgICBtZXRob2Q6ICdhcmlhMi5hZGRVcmknLAogICAgICAgICAgICAgICAgcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewogICAgICAgICAgICAgICAgICAgIGRpcjogcnBjLmRpciwKICAgICAgICAgICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcjogW10KICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwge30sICcnKTsKICAgICAgICAgICAgICAgIGlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdmYWlsJzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldFNlbGVjdGVkTGlzdCgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxldCBkb21zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLlNvdXJjZUxpc3RJdGVtX19pdGVtLS1YeHBPQycpOwogICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChsZXQgZG9tIG9mIGRvbXMpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZG9tVnVlID0gZG9tLl9fdnVlX187CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbVZ1ZS5zZWxlY3RlZC5pbmNsdWRlcyhkb21WdWUuaW5mby5pZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMaXN0LnB1c2goZG9tVnVlLmluZm8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZExpc3Q7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVjdFBhZ2UoKSB7CiAgICAgICAgICAgIGxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgICAgIGlmICgvXlwvJC8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKICAgICAgICAgICAgaWYgKC9eXC8oc3xzaGFyZSlcLy8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9LAoKICAgICAgICBpc09ubHlGb2xkZXIoKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3RbaV0ua2luZCA9PT0gJ2RyaXZlI2ZpbGUnKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewogICAgICAgICAgICBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgdGl0bGUsCiAgICAgICAgICAgICAgICBodG1sLAogICAgICAgICAgICAgICAgZm9vdGVyLAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAogICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLAogICAgICAgICAgICAgICAgd2lkdGgsCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMTVweCAyMHB4IDVweCcsCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcywKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgaW5pdFBhbkxpbmtlcigpIHsKICAgICAgICAgICAgYmFzZS5pbml0RGVmYXVsdENvbmZpZygpOwogICAgICAgICAgICBiYXNlLmFkZFBhbkxpbmtlclN0eWxlKCk7CiAgICAgICAgICAgIHB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CiAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QKICAgICAgICAgICAgKGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvdjIveHVubGVpP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwogICAgICAgICAgICBwYW4gPSBKU09OLnBhcnNlKGJhc2UuZChyZXMpKTsKICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CiAgICAgICAgICAgIHBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwKICAgICAgICAgICAgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKICAgICAgICAgICAgYmFzZS5jcmVhdGVUaXAoKTsKICAgICAgICAgICAgYmFzZS5yZWdpc3Rlck1lbnVDb21tYW5kKCk7CiAgICAgICAgfQogICAgfTsKCiAgICBsZXQgcXVhcmsgPSB7CgogICAgICAgIGNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSIgLS1oZWFkZXIgIkNvb2tpZTogJHtkb2N1bWVudC5jb29raWV9ImApOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IGJjID0gYEFBLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKX0vP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX0mY29va2llPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmNvb2tpZSl9WlpgOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmUoYmMpfWApOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSIgLWIgIiR7ZG9jdW1lbnQuY29va2llfSJgKTsKICAgICAgICB9LAoKICAgICAgICBhZGRQYWdlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGxldCBob21lID0gJ2h0dHBzOi8vcGFuLnF1YXJrLmNuL2xpc3QjLycsIGFsbCA9ICdodHRwczovL3Bhbi5xdWFyay5jbi9saXN0Iy9saXN0L2FsbCc7CiAgICAgICAgICAgICAgICBpZiAoZS5vbGRVUkwgPT09IGhvbWUgJiYgZS5uZXdVUkwgPT09IGFsbCkgcmV0dXJuOwogICAgICAgICAgICAgICAgYXdhaXQgYmFzZS5zbGVlcCgxNTApOwogICAgICAgICAgICAgICAgaWYgKCQoJy5xdWFyay1idXR0b24nKS5sZW5ndGggPiAwKSByZXR1cm47CiAgICAgICAgICAgICAgICBwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8CiAgICAgICAgICAgICAgICBwYW4ubGljZW5zZSA9PT0gYmFzZS5nZXRWYWx1ZSgnbGljZW5zZScpID8gdGhpcy5hZGRCdXR0b24oKSA6IHRoaXMuYWRkSW5pdEJ1dHRvbigpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcucGwtYnV0dG9uLW1vZGUnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgbW9kZSA9IGUudGFyZ2V0LmRhdGFzZXQubW9kZTsKICAgICAgICAgICAgICAgIFN3YWwuc2hvd0xvYWRpbmcoKTsKICAgICAgICAgICAgICAgIHRoaXMuZ2V0UENTTGluaygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBiYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip/vvIzlv6vljrvnspjotLTlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLnNlbmRMaW5rVG9SUEMoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwogICAgICAgICAgICAgICAgaWYgKHJlcyA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLmxpc3RlbmVyLXJwYy10YXNrJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoJ+WPkemAgeaIkOWKn++8jOW/q+WOu+eci+eci+WQp++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM6K+35qOA5p+l5oKo55qEUlBD6YWN572u5L+h5oGv77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc2VuZC1ycGMnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgJCgnLmxpc3RlbmVyLWxpbmstcnBjJykuY2xpY2soKTsKICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRleHQoJ+WPkemAgeWujOaIkO+8jOWPkemAgee7k+aenOingeS4iuaWueaMiemSru+8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLW9wZW4tc2V0dGluZycsICgpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2hvd1NldHRpbmcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAogICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKICAgICAgICAgICAgICAgIH0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZShycGMpfSMke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9YDsKICAgICAgICAgICAgICAgIEdNX29wZW5JblRhYih1cmwsIHthY3RpdmU6IHRydWV9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkQnV0dG9uKCkgewogICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47CiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7CiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0icXVhcmstYnV0dG9uIHBsLWJ1dHRvbiI+PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiM1NTUiIHN0cm9rZS13aWR0aD0iMiI+PHBhdGggc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNOSAxMmwyIDIgMi0yeiIvPjxwYXRoIGQ9Ik0xNCA4aDEuNTUzYy44NSAwIDEuMTYuMDkzIDEuNDcuMjY3LjMxMS4xNzQuNTU2LjQzLjcyMi43NTYuMTY2LjMyNi4yNTUuNjUuMjU1IDEuNTR2NC44NzNjMCAuODkyLS4wODkgMS4yMTUtLjI1NSAxLjU0LS4xNjYuMzI3LS40MS41ODMtLjcyMi43NTctLjMxLjE3NC0uNjIuMjY3LTEuNDcuMjY3SDYuNDQ3Yy0uODUgMC0xLjE2LS4wOTMtMS40Ny0uMjY3YTEuNzc4IDEuNzc4IDAgMDEtLjcyMi0uNzU2Yy0uMTY2LS4zMjYtLjI1NS0uNjUtLjI1NS0xLjU0di00Ljg3M2MwLS44OTIuMDg5LTEuMjE1LjI1NS0xLjU0LjE2Ni0uMzI3LjQxLS41ODMuNzIyLS43NTcuMzEtLjE3NC42Mi0uMjY3IDEuNDctLjI2N0gxMSIvPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTExIDN2MTAiLz48L2c+PC9zdmc+PGI+5LiL6L295Yqp5omLPC9iPjx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiID5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+JHtwYW4uY29kZSA9PSAyMDAgJiYgdmVyc2lvbiA8IHBhbi52ZXJzaW9uID8gcGFuLm5ldyA6ICcnfTwvdWw+PC9kaXY+YCk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSB7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5ob21lLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwogICAgICAgICAgICAgICAgICAgICQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgICRidXR0b24uY3NzKHsnbWFyZ2luLXJpZ2h0JzogJzEwcHgnfSk7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgYWRkSW5pdEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InF1YXJrLWJ1dHRvbiBwbC1idXR0b24taW5pdCI+PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiM1NTUiIHN0cm9rZS13aWR0aD0iMiI+PHBhdGggc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNOSAxMmwyIDIgMi0yeiIvPjxwYXRoIGQ9Ik0xNCA4aDEuNTUzYy44NSAwIDEuMTYuMDkzIDEuNDcuMjY3LjMxMS4xNzQuNTU2LjQzLjcyMi43NTYuMTY2LjMyNi4yNTUuNjUuMjU1IDEuNTR2NC44NzNjMCAuODkyLS4wODkgMS4yMTUtLjI1NSAxLjU0LS4xNjYuMzI3LS40MS41ODMtLjcyMi43NTctLjMxLjE3NC0uNjIuMjY3LTEuNDcuMjY3SDYuNDQ3Yy0uODUgMC0xLjE2LS4wOTMtMS40Ny0uMjY3YTEuNzc4IDEuNzc4IDAgMDEtLjcyMi0uNzU2Yy0uMTY2LS4zMjYtLjI1NS0uNjUtLjI1NS0xLjU0di00Ljg3M2MwLS44OTIuMDg5LTEuMjE1LjI1NS0xLjU0LjE2Ni0uMzI3LjQxLS41ODMuNzIyLS43NTcuMzEtLjE3NC42Mi0uMjY3IDEuNDctLjI2N0gxMSIvPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTExIDN2MTAiLz48L2c+PC9zdmc+PGI+5LiL6L295Yqp5omLPC9iPjwvZGl2PmApOwogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgewogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgewogICAgICAgICAgICAgICAgJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgICRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGdldFBDU0xpbmsoKSB7CiAgICAgICAgICAgIHNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwogICAgICAgICAgICBpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjli77pgInopoHkuIvovb3nmoTmlofku7bvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+aJk+W8gOaWh+S7tuWkueWQjuWLvumAieaWh+S7tu+8gScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBmaWRzID0gW107CiAgICAgICAgICAgIHNlbGVjdExpc3QuZm9yRWFjaCh2YWwgPT4gewogICAgICAgICAgICAgICAgZmlkcy5wdXNoKHZhbC5maWQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1swXSwgewogICAgICAgICAgICAgICAgICAgICJmaWRzIjogZmlkcwogICAgICAgICAgICAgICAgfSwgeyJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04IiwgInVzZXItYWdlbnQiOiBwYW4udWF9KTsKICAgICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMzEwMDEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI55m75b2V572R55uY77yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocmVzLmNvZGUgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6I635Y+W6ZO+5o6l5aSx6LSl77yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20ocmVzLmRhdGEpOwogICAgICAgICAgICAgICAgdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fkv53lrZjliLDoh6rlt7HnvZHnm5jlkI7ljrvnvZHnm5jkuLvpobXkuIvovb3vvIEnKTsKICAgICAgICAgICAgICAgIGF3YWl0IGJhc2Uuc2xlZXAoMTAwMCk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsZS1pbmZvX3InKS5jbGljaygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2VuZXJhdGVEb20obGlzdCkgewogICAgICAgICAgICBsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOwogICAgICAgICAgICBsZXQgYWxpbmtBbGxUZXh0ID0gJyc7CiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHYuZmlsZSA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IHYuZmlsZV9uYW1lOwogICAgICAgICAgICAgICAgbGV0IGZpZCA9IHYuZmlkOwogICAgICAgICAgICAgICAgbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5zaXplKTsKICAgICAgICAgICAgICAgIGxldCBkbGluayA9IHYuZG93bmxvYWRfdXJsOwogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcGknKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcGkiIGRhdGEtZmlkPSIke2ZpZH0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0FyaWEoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmFyaWEyY+mTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstcnBjIHBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1pbmZvIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+PGVtIGNsYXNzPSJpY29uIGljb24tZGV2aWNlIj48L2VtPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4OyI+5o6o6YCB5YiwIFJQQyDkuIvovb3lmag8L3NwYW4+PC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9DdXJsKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYmMnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQkMoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayIgaHJlZj0iJHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb250ZW50ICs9ICc8L2Rpdj4nOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKQogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYWxsIiBkYXRhLWxpbms9IiR7YWxpbmtBbGxUZXh0fSI+5aSN5Yi25YWo6YOo6ZO+5o6lPC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdycGMnKSB7CiAgICAgICAgICAgICAgICBsZXQgcnBjID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJykgKyAnOicgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JykgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyk7CiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItc2VuZC1ycGMiPuWPkemAgeWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gdGl0bGU9IiR7cnBjfSIgY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4Ij7orr7nva4gUlBDIOWPguaVsO+8iOW9k+WJjeS4uu+8miR7cnBjfe+8iTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1zdWNjZXNzIGxpc3RlbmVyLXJwYy10YXNrIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7ZGlzcGxheTogbm9uZSI+5p+l55yL5LiL6L295Lu75YqhPC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2N1cmwnKQogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYWxsIiBkYXRhLWxpbms9IiR7YWxpbmtBbGxUZXh0fSI+5aSN5Yi25YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Ij7orr7nva7nu4jnq6/nsbvlnovvvIjlvZPliY3kuLrvvJoke3Rlcm1pbmFsVHlwZVtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKV1977yJPC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgc2VuZExpbmtUb1JQQyhmaWxlbmFtZSwgbGluaykgewogICAgICAgICAgICBsZXQgcnBjID0gewogICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgIHBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKICAgICAgICAgICAgICAgIHBhdGg6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKSwKICAgICAgICAgICAgICAgIHRva2VuOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpLAogICAgICAgICAgICAgICAgZGlyOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGxldCB1cmwgPSBgJHtycGMuZG9tYWlufToke3JwYy5wb3J0fSR7cnBjLnBhdGh9YDsKICAgICAgICAgICAgbGV0IHJwY0RhdGEgPSB7CiAgICAgICAgICAgICAgICBpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICBqc29ucnBjOiAnMi4wJywKICAgICAgICAgICAgICAgIG1ldGhvZDogJ2FyaWEyLmFkZFVyaScsCiAgICAgICAgICAgICAgICBwYXJhbXM6IFtgdG9rZW46JHtycGMudG9rZW59YCwgW2xpbmtdLCB7CiAgICAgICAgICAgICAgICAgICAgZGlyOiBycGMuZGlyLAogICAgICAgICAgICAgICAgICAgIG91dDogZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBbYENvb2tpZTogJHtkb2N1bWVudC5jb29raWV9YF0KICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwgeyJDb29raWUiOiBkb2N1bWVudC5jb29raWV9LCAnJyk7CiAgICAgICAgICAgICAgICBpZiAocmVzLnJlc3VsdCkgcmV0dXJuICdzdWNjZXNzJzsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnZmFpbCc7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRTZWxlY3RlZExpc3QoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRMaXN0ID0gW107CiAgICAgICAgICAgICAgICBsZXQgcmVhY3REb20gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLWxpc3QnKVswXTsKICAgICAgICAgICAgICAgIGxldCByZWFjdE9iaiA9IGJhc2UuZmluZFJlYWN0KHJlYWN0RG9tKTsKICAgICAgICAgICAgICAgIGxldCBwcm9wcyA9IHJlYWN0T2JqLnByb3BzOwogICAgICAgICAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVMaXN0ID0gcHJvcHMubGlzdCB8fCBbXTsKICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRLZXlzID0gcHJvcHMuc2VsZWN0ZWRSb3dLZXlzIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIGZpbGVMaXN0LmZvckVhY2goKHZhbCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRLZXlzLmluY2x1ZGVzKHZhbC5maWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExpc3QucHVzaCh2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRMaXN0OwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkZXRlY3RQYWdlKCkgewogICAgICAgICAgICBsZXQgcGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgICAgICBpZiAoL15cLyhsaXN0KS8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKICAgICAgICAgICAgaWYgKC9eXC8oc3xzaGFyZSlcLy8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9LAoKICAgICAgICBpc09ubHlGb2xkZXIoKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3RbaV0uZmlsZSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIHNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsKICAgICAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlLAogICAgICAgICAgICAgICAgaHRtbCwKICAgICAgICAgICAgICAgIGZvb3RlciwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJywKICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICAgICAgcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAogICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3MsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CiAgICAgICAgICAgIGJhc2UuaW5pdERlZmF1bHRDb25maWcoKTsKICAgICAgICAgICAgYmFzZS5hZGRQYW5MaW5rZXJTdHlsZSgpOwogICAgICAgICAgICBwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0CiAgICAgICAgICAgIChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL3F1YXJrP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwogICAgICAgICAgICBwYW4gPSBKU09OLnBhcnNlKGJhc2UuZChyZXMpKTsKICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CiAgICAgICAgICAgIHBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwKICAgICAgICAgICAgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKICAgICAgICAgICAgdGhpcy5hZGRQYWdlTGlzdGVuZXIoKTsKICAgICAgICAgICAgYmFzZS5jcmVhdGVUaXAoKTsKICAgICAgICAgICAgYmFzZS5jcmVhdGVEb3dubG9hZElmcmFtZSgpOwogICAgICAgICAgICBiYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKICAgICAgICB9CiAgICB9OwoKICAgIGxldCB5aWRvbmcgPSB7CgogICAgICAgIGNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSJgKTsKICAgICAgICB9LAoKICAgICAgICBjb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9WlpgOwogICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmUoYmMpfWApOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSJgKTsKICAgICAgICB9LAoKICAgICAgICBhZGRQYWdlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIG1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CiAgICAgICAgICAgICAgICBTd2FsLnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICB0aGlzLmdldFBDU0xpbmsoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZElmcmFtZScpLmF0dHIoJ3NyYycsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcmlhLCAubGlzdGVuZXItY29weS1hbGwnLCAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwogICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5Yqf77yM5b+r5Y6757KY6LS05ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcuaWNvbicpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5wbC1sb2FkaW5nJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQucHJlcGVuZChiYXNlLmNyZWF0ZUxvYWRpbmcoKSk7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKICAgICAgICAgICAgICAgIGlmIChyZXMgPT09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/vvIzlv6vljrvnnIvnnIvlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLnRleHQoJ+WPkemAgeWksei0pe+8jOivt+ajgOafpeaCqOeahFJQQ+mFjee9ruS/oeaBr++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNob3dTZXR0aW5nKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ycGMtdGFzaycsICgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICB9KSwgdXJsID0gYCR7cGFuLmR9Lz9ycGM9JHtiYXNlLmUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CiAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFkZEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InlpZG9uZy1idXR0b24gcGwtYnV0dG9uIj7kuIvovb3liqnmiYs8dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDM2cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT4ke3Bhbi5jb2RlID09IDIwMCAmJiB2ZXJzaW9uIDwgcGFuLnZlcnNpb24gPyBwYW4ubmV3IDogJyd9PC91bD48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0ID09PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICAkYnV0dG9uLnJlbW92ZUNsYXNzKCd5aWRvbmctYnV0dG9uJykuYWRkQ2xhc3MoJ3lpZG9uZy1zaGFyZS1idXR0b24nKTsKICAgICAgICAgICAgICAgIGJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICBiYXNlLmNyZWF0ZURvd25sb2FkSWZyYW1lKCk7CiAgICAgICAgICAgIHRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CiAgICAgICAgfSwKCiAgICAgICAgYWRkSW5pdEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InlpZG9uZy1idXR0b24gcGwtYnV0dG9uLWluaXQiPuS4i+i9veWKqeaJizwvZGl2PmApOwogICAgICAgICAgICBpZiAocHQgPT09ICdob21lJykgewogICAgICAgICAgICAgICAgYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKICAgICAgICAgICAgICAgICAgICAkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgewogICAgICAgICAgICAgICAgJGJ1dHRvbi5yZW1vdmVDbGFzcygneWlkb25nLWJ1dHRvbicpLmFkZENsYXNzKCd5aWRvbmctc2hhcmUtYnV0dG9uJyk7CiAgICAgICAgICAgICAgICBiYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKICAgICAgICB9LAoKICAgICAgICBnZXRSYW5kb21TdHJpbmcobGVuKSB7CiAgICAgICAgICAgIGxlbiA9IGxlbiB8fCAxNjsKICAgICAgICAgICAgbGV0ICRjaGFycyA9ICdBQkNERUZHSEpLTU5QUVJTVFdYWVphYmNkZWZoaWprbW5wcnN0d3h5ejIzNDU2NzgnOwogICAgICAgICAgICBsZXQgbWF4UG9zID0gJGNoYXJzLmxlbmd0aDsKICAgICAgICAgICAgbGV0IHB3ZCA9ICcnOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBwd2QgKz0gJGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXhQb3MpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcHdkOwogICAgICAgIH0sCgogICAgICAgIHV0b2Ioc3RyKSB7CiAgICAgICAgICAgIGNvbnN0IHUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOwogICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGRl18W15ceDAwLVx4N0ZdL2csICh0KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodC5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSB0LmNoYXJDb2RlQXQoMCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPCAxMjggPyB0IDogZSA8IDIwNDggPyB1KDE5MiB8IGUgPj4+IDYpICsgdSgxMjggfCA2MyAmIGUpIDogdSgyMjQgfCBlID4+PiAxMiAmIDE1KSArIHUoMTI4IHwgZSA+Pj4gNiAmIDYzKSArIHUoMTI4IHwgNjMgJiBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGUgPSA2NTUzNiArIDEwMjQgKiAodC5jaGFyQ29kZUF0KDApIC0gNTUyOTYpICsgKHQuY2hhckNvZGVBdCgxKSAtIDU2MzIwKTsKICAgICAgICAgICAgICAgIHJldHVybiB1KDI0MCB8IGUgPj4+IDE4ICYgNykgKyB1KDEyOCB8IGUgPj4+IDEyICYgNjMpICsgdSgxMjggfCBlID4+PiA2ICYgNjMpICsgdSgxMjggfCA2MyAmIGUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBnZXRTaWduKGUsIHQsIGEsIG4pIHsKICAgICAgICAgICAgbGV0IHIgPSAiIiwKICAgICAgICAgICAgICAgIGkgPSAiIjsKICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgIGxldCBzID0gT2JqZWN0LmFzc2lnbih7fSwgdCk7CiAgICAgICAgICAgICAgICBpID0gSlNPTi5zdHJpbmdpZnkocyksCiAgICAgICAgICAgICAgICAgICAgaSA9IGkucmVwbGFjZSgvXHMqL2csICIiKSwKICAgICAgICAgICAgICAgICAgICBpID0gZW5jb2RlVVJJQ29tcG9uZW50KGkpOwogICAgICAgICAgICAgICAgbGV0IGMgPSBpLnNwbGl0KCIiKSwKICAgICAgICAgICAgICAgICAgICB1ID0gYy5zb3J0KCk7CiAgICAgICAgICAgICAgICBpID0gdS5qb2luKCIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgQSA9IG1kNShiYXNlLmUodGhpcy51dG9iKGkpKSk7CiAgICAgICAgICAgIGxldCBsID0gbWQ1KGEgKyAiOiIgKyBuKTsKICAgICAgICAgICAgcmV0dXJuIG1kNShBICsgbCkudG9VcHBlckNhc2UoKTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBnZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS5kb3dubG9hZFVybCkgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFVybDogaXRlbS5kb3dubG9hZFVybAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGVjdFBhZ2UoKSA9PT0gJ2hvbWUnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGJvZHkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50SUQiOiBpdGVtLmNvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1vbkFjY291bnRJbmZvIjogeyJhY2NvdW50IjogaXRlbS5vd25lciwgImFjY291bnRUeXBlIjogMX0sCiAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYXRpb24iOiAiMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpbmxpbmUiOiAiMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJleHRJbmZvIjogeyJpc1JldHVybkNkbkRvd25sb2FkVXJsIjogIjEifQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWUgPSBuZXcgRGF0ZSgrbmV3IERhdGUoKSArIDggKiAzNjAwICogMTAwMCkudG9KU09OKCkuc3Vic3RyKDAsIDE5KS5yZXBsYWNlKCdUJywgJyAnKTsKICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5nZXRSYW5kb21TdHJpbmcoMTYpOwogICAgICAgICAgICAgICAgICAgIGxldCBzaWduID0gdGhpcy5nZXRTaWduKHVuZGVmaW5lZCwgYm9keSwgdGltZSwga2V5KTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzBdLCBib2R5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogYmFzZS5nZXRDb29raWUoJ2F1dGhvcml6YXRpb24nKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3gtaHVhd2VpLWNoYW5uZWxTcmMnOiAnMTAwMDAwMzQnLAogICAgICAgICAgICAgICAgICAgICAgICAneC1pbm5lci1udHdrJzogJzInLAogICAgICAgICAgICAgICAgICAgICAgICAnbWNsb3VkLWNoYW5uZWwnOiAnMTAwMDEwMScsCiAgICAgICAgICAgICAgICAgICAgICAgICdtY2xvdWQtY2xpZW50JzogJzEwNzAxJywKICAgICAgICAgICAgICAgICAgICAgICAgJ21jbG91ZC1zaWduJzogdGltZSArICIsIiArIGtleSArICIsIiArIHNpZ24sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04IiwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NhbGxlcic6ICd3ZWInLAogICAgICAgICAgICAgICAgICAgICAgICAnQ01TLURFVklDRSc6ICdkZWZhdWx0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3gtRGV2aWNlSW5mbyc6ICd8fDl8Ny4xMi4wfGNocm9tZXwxMTguMC4wLjB8fHdpbmRvd3MgMTB8fHpoLUNOfHx8JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3gtU3ZjVHlwZSc6ICcxJywKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmw6IHJlcy5kYXRhLmRvd25sb2FkVVJMCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmw6ICfojrflj5bkuIvovb3lnLDlnYDlpLHotKXvvIzor7fliLfmlrDph43or5XvvIEnCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0ZWN0UGFnZSgpID09PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHZ1ZURvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5ob21lLXBhZ2UiKS5fX3Z1ZV9fOwoKICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHBhbi5wY3NbMV0sIGBsaW5rSWQ9JHt2dWVEb20ubGlua0lEfSZjb250ZW50SWRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZ1ZURvbS5jdXJyZW50UGF0aC5pZCArICcvJyArIGl0ZW0uY29JRCl9JmNhdGFsb2dJZHM9YCwgewogICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiByZXMuZGF0YS5yZWRyVXJsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmw6ICfojrflj5bkuIvovb3lnLDlnYDlpLHotKXvvIzor7fliLfmlrDph43or5XvvIEnCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM6K+35Yi35paw6YeN6K+V77yBJwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGdldFBDU0xpbmsoKSB7CiAgICAgICAgICAgIHNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwogICAgICAgICAgICBpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjli77pgInopoHkuIvovb3nmoTmlofku7bvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8muivt+aJk+W8gOaWh+S7tuWkueWQjuWLvumAieaWh+S7tu+8gScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZXQgcXVldWUgPSBbXTsKICAgICAgICAgICAgc2VsZWN0TGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgcXVldWUucHVzaCh0aGlzLmdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgpKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWV1ZSk7CiAgICAgICAgICAgIHJlcy5mb3JFYWNoKHZhbCA9PiB7CiAgICAgICAgICAgICAgICBzZWxlY3RMaXN0W3ZhbC5pbmRleF0uZG93bmxvYWRVcmwgPSB2YWwuZG93bmxvYWRVcmw7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgbGV0IGh0bWwgPSB0aGlzLmdlbmVyYXRlRG9tKHNlbGVjdExpc3QpOwogICAgICAgICAgICB0aGlzLnNob3dNYWluRGlhbG9nKHBhblttb2RlXVswXSwgaHRtbCwgcGFuW21vZGVdWzFdKTsKICAgICAgICB9LAoKICAgICAgICBnZW5lcmF0ZURvbShsaXN0KSB7CiAgICAgICAgICAgIGxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CiAgICAgICAgICAgIGxldCBhbGlua0FsbFRleHQgPSAnJzsKICAgICAgICAgICAgbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodi5kaXJFdGFnIHx8IHYuY2FOYW1lKSByZXR1cm47CiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSB2LmNvbnRlbnROYW1lIHx8IHYuY29OYW1lOwogICAgICAgICAgICAgICAgbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5jb250ZW50U2l6ZSB8fCB2LmNvU2l6ZSk7CiAgICAgICAgICAgICAgICBsZXQgZGxpbmsgPSB2LmRvd25sb2FkVXJsOwogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcGknKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcGkiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdhcmlhJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0FyaWEoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmFyaWEyY+mTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstcnBjIHBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1pbmZvIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+PGVtIGNsYXNzPSJpY29uIGljb24tZGV2aWNlIj48L2VtPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4OyI+5o6o6YCB5YiwIFJQQyDkuIvovb3lmag8L3NwYW4+PC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9DdXJsKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYmMnKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQkMoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayIgaHJlZj0iJHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb250ZW50ICs9ICc8L2Rpdj4nOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FyaWEnKQogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYWxsIiBkYXRhLWxpbms9IiR7YWxpbmtBbGxUZXh0fSI+5aSN5Yi25YWo6YOo6ZO+5o6lPC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdycGMnKSB7CiAgICAgICAgICAgICAgICBsZXQgcnBjID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJykgKyAnOicgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JykgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyk7CiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItc2VuZC1ycGMiPuWPkemAgeWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gdGl0bGU9IiR7cnBjfSIgY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4Ij7orr7nva4gUlBDIOWPguaVsO+8iOW9k+WJjeS4uu+8miR7cnBjfe+8iTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1zdWNjZXNzIGxpc3RlbmVyLXJwYy10YXNrIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7ZGlzcGxheTogbm9uZSI+5p+l55yL5LiL6L295Lu75YqhPC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2N1cmwnKQogICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYWxsIiBkYXRhLWxpbms9IiR7YWxpbmtBbGxUZXh0fSI+5aSN5Yi25YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Ij7orr7nva7nu4jnq6/nsbvlnovvvIjlvZPliY3kuLrvvJoke3Rlcm1pbmFsVHlwZVtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKV1977yJPC9idXR0b24+PC9kaXY+YDsKICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgc2VuZExpbmtUb1JQQyhmaWxlbmFtZSwgbGluaykgewogICAgICAgICAgICBsZXQgcnBjID0gewogICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgIHBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKICAgICAgICAgICAgICAgIHBhdGg6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKSwKICAgICAgICAgICAgICAgIHRva2VuOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpLAogICAgICAgICAgICAgICAgZGlyOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGxldCB1cmwgPSBgJHtycGMuZG9tYWlufToke3JwYy5wb3J0fSR7cnBjLnBhdGh9YDsKICAgICAgICAgICAgbGV0IHJwY0RhdGEgPSB7CiAgICAgICAgICAgICAgICBpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICBqc29ucnBjOiAnMi4wJywKICAgICAgICAgICAgICAgIG1ldGhvZDogJ2FyaWEyLmFkZFVyaScsCiAgICAgICAgICAgICAgICBwYXJhbXM6IFtgdG9rZW46JHtycGMudG9rZW59YCwgW2xpbmtdLCB7CiAgICAgICAgICAgICAgICAgICAgZGlyOiBycGMuZGlyLAogICAgICAgICAgICAgICAgICAgIG91dDogZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBbXQogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QodXJsLCBycGNEYXRhLCB7fSwgJycpOwogICAgICAgICAgICAgICAgaWYgKHJlcy5yZXN1bHQpIHJldHVybiAnc3VjY2Vzcyc7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhaWwnOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhaWwnOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2VsZWN0ZWRMaXN0KCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5tYWluX2ZpbGVfbGlzdCIpLl9fdnVlX18uc2VsZWN0TGlzdC5tYXAodmFsID0+IHZhbC5pdGVtKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbGV0IHZ1ZURvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5ob21lLXBhZ2UiKS5fX3Z1ZV9fOwogICAgICAgICAgICAgICAgbGV0IGZpbGVMaXN0ID0gdnVlRG9tLl9jb21wdXRlZFdhdGNoZXJzLmZpbGVMaXN0LnZhbHVlOwogICAgICAgICAgICAgICAgbGV0IGRpckxpc3QgPSB2dWVEb20uX2NvbXB1dGVkV2F0Y2hlcnMuZGlyTGlzdC52YWx1ZTsKICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZEZpbGVJbmRleCA9IHZ1ZURvbS5zZWxlY3RlZEZpbGU7CiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWREaXJJbmRleCA9IHZ1ZURvbS5zZWxlY3RlZERpcjsKICAgICAgICAgICAgICAgIGxldCBzZWxlY3RGaWxlTGlzdCA9IGZpbGVMaXN0LmZpbHRlcigodiwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEZpbGVJbmRleC5pbmNsdWRlcyhpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbGV0IHNlbGVjdERpckxpc3QgPSBkaXJMaXN0LmZpbHRlcigodiwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZERpckluZGV4LmluY2x1ZGVzKGkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gWy4uLnNlbGVjdEZpbGVMaXN0LCAuLi5zZWxlY3REaXJMaXN0XTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRldGVjdFBhZ2UoKSB7CiAgICAgICAgICAgIGxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgICAgIGlmICgvXlwvdy8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKICAgICAgICAgICAgaWYgKC9eXC9saW5rLy50ZXN0KHBhdGgpKSByZXR1cm4gJ3NoYXJlJzsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0sCgogICAgICAgIGlzT25seUZvbGRlcigpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdFtpXS5maWxlRXRhZyB8fCBzZWxlY3RMaXN0W2ldLmNvTmFtZSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIHNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsKICAgICAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlLAogICAgICAgICAgICAgICAgaHRtbCwKICAgICAgICAgICAgICAgIGZvb3RlciwKICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJywKICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICAgICAgcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAogICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3MsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CiAgICAgICAgICAgIGJhc2UuaW5pdERlZmF1bHRDb25maWcoKTsKICAgICAgICAgICAgYmFzZS5hZGRQYW5MaW5rZXJTdHlsZSgpOwogICAgICAgICAgICBwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0CiAgICAgICAgICAgIChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL3lpZG9uZz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKICAgICAgICAgICAgcGFuID0gSlNPTi5wYXJzZShiYXNlLmQocmVzKSk7CiAgICAgICAgICAgIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShwYW4pOwogICAgICAgICAgICBwYW4ubnVtID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScpIHx8CiAgICAgICAgICAgIHBhbi5saWNlbnNlID09PSBiYXNlLmdldFZhbHVlKCdsaWNlbnNlJykgPyB0aGlzLmFkZEJ1dHRvbigpIDogdGhpcy5hZGRJbml0QnV0dG9uKCk7CiAgICAgICAgICAgIGJhc2UuY3JlYXRlVGlwKCk7CiAgICAgICAgICAgIGJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwogICAgICAgIH0KICAgIH07CgogICAgbGV0IG1haW4gPSB7CiAgICAgICAgaW5pdCgpIHsKICAgICAgICAgICAgaWYgKC8ocGFufHl1bikuYmFpZHUuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CiAgICAgICAgICAgICAgICBiYWlkdS5pbml0UGFuTGlua2VyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKC93d3cuKGFsaXl1bmRyaXZlfGFsaXBhbikuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CiAgICAgICAgICAgICAgICBhbGkuaW5pdFBhbkxpbmtlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgvY2xvdWQuMTg5LmNuLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CiAgICAgICAgICAgICAgICB0aWFueWkuaW5pdFBhbkxpbmtlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgvcGFuLnh1bmxlaS5jb20vLnRlc3QobG9jYXRpb24uaG9zdCkpIHsKICAgICAgICAgICAgICAgIHh1bmxlaS5pbml0UGFuTGlua2VyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKC9wYW4ucXVhcmsuY24vLnRlc3QobG9jYXRpb24uaG9zdCkpIHsKICAgICAgICAgICAgICAgIHF1YXJrLmluaXRQYW5MaW5rZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoLyh5dW58Y2FpeXVuKS4xMzkuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CiAgICAgICAgICAgICAgICB5aWRvbmcuaW5pdFBhbkxpbmtlcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBtYWluLmluaXQoKTsKfSkoKTsK
Add Comment
Please, Sign In to add comment