name=bShare·ÖÏí²å¼þ
team=Ö¯Ãιٷ½
time=2011-06-24
email=admin@dedecms.com
url=http://www.dedecms.com
hash=9e7ce30633a50fd14a82080cb5aca73e
indexname=
indexurl=
ismember=0
autosetup=1
autodel=1
lang=gb2312
moduletype=plus
PHA+54mI5p2D5omA5pyJICZjb3B5OzIwMDMtMjAyMe+8jERlZGVDTVMuY29tIOS/neeVmeaJgOacieadg+WIqeOAgjwvcD4NCjxwPuaEn+iwouaCqOmAieaLqee7h+aipuWGheWuueeuoeeQhuezu+e7n++8iOS7peS4i+eugOensERlZGVDTVPvvInvvIxEZWRlQ01T5piv5Lit5bCP5Z6L6Zeo5oi3572R56uZ5bu66K6+6Kej5Yaz5pa55qGI77yM5Z+65LqOIFBIUCArIE15U1FMIOeahOaKgOacr+W8gOWPke+8jOWFqOmDqOa6kOeggeW8gOaUvuOAgjwvcD4NCjxwPkRlZGVDTVPlrpjmlrnnvZHnq5nvvJogd3d3LmRlZGVjbXMuY29tPC9wPg0KPHA+5Li65LqG5L2/5oKo5q2j56Gu5bm25ZCI5rOV5Zyw5L2/55So5pys6L2v5Lu277yM6K+35oKo5Zyo5L2/55So5YmN5Yqh5b+F6ZiF6K+75riF5qWa5LiL6Z2i55qE5Y2P6K6u5p2h5qy+77yaPC9wPg0KPHA+DQo8c3Ryb25nPuS4gOOAgeacrOaOiOadg+WNj+iurumAgueUqOS4lOS7hemAgueUqOS6jiBEZWRlQ01TIDUueC54IOeJiOacrDwvc3Ryb25nPg0KPC9wPg0KPHA+DQo8c3Ryb25nPuS6jOOAgeWNj+iuruiuuOWPr+eahOadg+WIqTwvc3Ryb25nPg0KPGJyLz4xLuaCqOWPr+S7peWcqOWujOWFqOmBteWuiOacrOacgOe7iOeUqOaIt+aOiOadg+S9v+eUqOWNj+iurueahOWfuuehgOS4iu+8jOWwhuacrOi9r+S7tuW6lOeUqOS6jumdnuWVhuS4mueUqOmAlO+8jOiAjOS4jeW/heaUr+S7mOi9r+S7tueJiOadg+aOiOadg+i0ueeUqOOAgg0KPGJyLz4yLuaCqOWPr+S7peWcqOWNj+iuruinhOWumueahOe6puadn+WSjOmZkOWItuiMg+WbtOWGheS/ruaUuSBEZWRlQ01TIOa6kOS7o+eggeaIlueVjOmdoumjjuagvOS7pemAguW6lOaCqOeahOe9keermeimgeaxguOAgg0KPGJyLz4zLuaCqOaLpeacieS9v+eUqOacrOi9r+S7tuaehOW7uueahOe9keermeWFqOmDqOWGheWuueaJgOacieadg++8jOW5tueLrOeri+aJv+aLheS4jui/meS6m+WGheWuueeahOebuOWFs+azleW+i+S5ieWKoeOAgg0KPGJyLz40LuiOt+W+l+WVhuS4muaOiOadg+S5i+WQju+8jOaCqOWPr+S7peWwhuacrOi9r+S7tuW6lOeUqOS6juWVhuS4mueUqOmAlO+8jOWQjOaXtuS+neaNruaJgOi0reS5sOeahOaOiOadg+exu+Wei+S4reehruWumueahOaKgOacr+aUr+aMgeWGheWuue+8jOiHqui0reS5sOaXtuWIu+i1t++8jOWcqOaKgOacr+aUr+aMgeacn+mZkOWGheaLpeaciemAmui/h+aMh+WumueahOaWueW8j+iOt+W+l+aMh+WumuiMg+WbtOWGheeahOaKgOacr+aUr+aMgeacjeWKoeOAguWVhuS4muaOiOadg+eUqOaIt+S6q+acieWPjeaYoOWSjOaPkOWHuuaEj+ingeeahOadg+WKm++8jOebuOWFs+aEj+ingeWwhuiiq+S9nOS4uummluimgeiAg+iZke+8jOS9huayoeacieS4gOWumuiiq+mHh+e6s+eahOaJv+ivuuaIluS/neivgeOAgg0KPC9wPg0KPHA+DQo8c3Ryb25nPuS4ieOAgeWNj+iuruinhOWumueahOe6puadn+WSjOmZkOWItjwvc3Ryb25nPg0KPGJyLz4xLuacquiOt+WVhuS4muaOiOadg+S5i+WJje+8jOS4jeW+l+WwhuacrOi9r+S7tueUqOS6juWVhuS4mueUqOmAlO+8iOWMheaLrOS9huS4jemZkOS6juS8geS4mue9keermeOAgee7j+iQpeaAp+e9keermeOAgeS7peiQpeWIqeS4uuebrueahOaIluWunueOsOebiOWIqeeahOe9keerme+8ieOAgui0reS5sOWVhuS4muaOiOadg+ivt+eZu+W9lXd3dy5kZXNkZXYuY27kuobop6PmnIDmlrDor7TmmI7jgIINCjxici8+Mi7mnKrnu4/lrpjmlrnorrjlj6/vvIzkuI3lvpflr7nmnKzova/ku7bmiJbkuI7kuYvlhbPogZTnmoTllYbkuJrmjojmnYPov5vooYzlh7rnp5/jgIHlh7rllK7jgIHmirXmirzmiJblj5HmlL7lrZDorrjlj6/or4HjgIINCjxici8+My7kuI3nrqHmgqjnmoTnvZHnq5nmmK/lkKbmlbTkvZPkvb/nlKggRGVkZUNNUyDvvIzov5jmmK/pg6jliIbmoI/nm67kvb/nlKggRGVkZUNNU++8jOWcqOaCqOS9v+eUqOS6hiBEZWRlQ01TIOeahOe9keermeS4u+mhteS4iuW/hemhu+WKoOS4iiBEZWRlQ01TIOWumOaWuee9keWdgCh3d3cuZGVkZWNtcy5jb20p55qE6ZO+5o6l5Y+K5L+d55WZ54mI5p2D5L+h5oGv44CCDQo8YnIvPjQu5pyq57uP5a6Y5pa56K645Y+v77yM56aB5q2i5ZyoIERlZGVDTVMg55qE5pW05L2T5oiW5Lu75L2V6YOo5YiG5Z+656GA5LiK5Lul5Y+R5bGV5Lu75L2V5rS+55Sf54mI5pys44CB5L+u5pS554mI5pys5oiW56ys5LiJ5pa554mI5pys55So5LqO6YeN5paw5YiG5Y+R44CCDQo8YnIvPjUu5aaC5p6c5oKo5pyq6IO96YG15a6I5pys5Y2P6K6u55qE5p2h5qy+77yM5oKo55qE5o6I5p2D5bCG6KKr57uI5q2i77yM5omA6KKr6K645Y+v55qE5p2D5Yip5bCG6KKr5pS25Zue77yM5bm25om/5ouF55u45bqU5rOV5b6L6LSj5Lu744CCDQo8L3A+DQo8cD4NCjxzdHJvbmc+5Zub44CB5pyJ6ZmQ5ouF5L+d5ZKM5YWN6LSj5aOw5piOPC9zdHJvbmc+DQo8YnIvPjEu5pys6L2v5Lu25Y+K5omA6ZmE5bim55qE5paH5Lu25piv5L2c5Li65LiN5o+Q5L6b5Lu75L2V5piO56Gu55qE5oiW6ZqQ5ZCr55qE6LWU5YG/5oiW5ouF5L+d55qE5b2i5byP5o+Q5L6b55qE44CCDQo8YnIvPjIu55So5oi35Ye65LqO6Ieq5oS/6ICM5L2/55So5pys6L2v5Lu277yM5oKo5b+F6aG75LqG6Kej5L2/55So5pys6L2v5Lu255qE6aOO6Zmp77yM5Zyo5bCa5pyq6LSt5Lmw5Lqn5ZOB5oqA5pyv5pyN5Yqh5LmL5YmN77yM5oiR5Lus5LiN5om/6K+65a+55YWN6LS555So5oi35o+Q5L6b5Lu75L2V5b2i5byP55qE5oqA5pyv5pSv5oyB44CB5L2/55So5ouF5L+d77yM5Lmf5LiN5om/5ouF5Lu75L2V5Zug5L2/55So5pys6L2v5Lu26ICM5Lqn55Sf6Zeu6aKY55qE55u45YWz6LSj5Lu744CCDQo8YnIvPjMu55S15a2Q5paH5pys5b2i5byP55qE5o6I5p2D5Y2P6K6u5aaC5ZCM5Y+M5pa55Lmm6Z2i562+572y55qE5Y2P6K6u5LiA5qC377yM5YW35pyJ5a6M5YWo55qE5ZKM562J5ZCM55qE5rOV5b6L5pWI5Yqb44CC5oKo5LiA5pem5byA5aeL56Gu6K6k5pys5Y2P6K6u5bm25a6J6KOFRGVkZUNNU++8jOWNs+iiq+inhuS4uuWujOWFqOeQhuino+W5tuaOpeWPl+acrOWNj+iurueahOWQhOmhueadoeasvu+8jOWcqOS6q+acieS4iui/sOadoeasvuaOiOS6iOeahOadg+WKm+eahOWQjOaXtu+8jOWPl+WIsOebuOWFs+eahOe6puadn+WSjOmZkOWItuOAguWNj+iuruiuuOWPr+iMg+WbtOS7peWklueahOihjOS4uu+8jOWwhuebtOaOpei/neWPjeacrOaOiOadg+WNj+iuruW5tuaehOaIkOS+teadg++8jOaIkeS7rOacieadg+maj+aXtue7iOatouaOiOadg++8jOi0o+S7pOWBnOatouaNn+Wus++8jOW5tuS/neeVmei/veeptuebuOWFs+i0o+S7u+eahOadg+WKm+OAgg0KPGJyLz40LuWmguaenOacrOi9r+S7tuW4puacieWFtuWug+i9r+S7tueahOaVtOWQiEFQSeekuuiMg+S+i+WtkOWMhe+8jOi/meS6m+aWh+S7tueJiOadg+S4jeWxnuS6juacrOi9r+S7tuWumOaWue+8jOW5tuS4lOi/meS6m+aWh+S7tuaYr+ayoee7j+i/h+aOiOadg+WPkeW4g+eahO+8jOivt+WPguiAg+ebuOWFs+i9r+S7tueahOS9v+eUqOiuuOWPr+WQiOazleeahOS9v+eUqOOAgg0KPC9wPg0KPHA+5Y2P6K6u5Y+R5biD5pe26Ze077yaMjAwOOW5tDjmnIgyMOaXpSBCeSBEZWRlQ01TLmNvbTwvcD4=
REVMRVRFIEZST00gYCNAX19wbHVzYCB3aGVyZSBwbHVzbmFtZSBsaWtlICdiU2hhcmW31s/tsuW8/ic7DQpJTlNFUlQgSU5UTyBgI0BfX3BsdXNgIChgcGx1c25hbWVgLCBgbWVudXN0cmluZ2AsIGBtYWludXJsYCwgYHdyaXRlcmAsIGBpc3Nob3dgLCBgZmlsZWxpc3RgKSBWQUxVRVMgKCdiU2hhcmW31s/tsuW8/icsICc8bTppdGVtIG5hbWU9JydiU2hhcmW31s/tsuW8/icnIGxpbms9JydwbHVzX2JzaGFyZS5waHAnJyByYW5rPScncGx1c19iU2hhcmW31s/tsuW8/icnIHRhcmdldD0nJ21haW4nJyAvPicsICcnLCAn1q/Dzs3FttMnLCAxLCAnPG06aXRlbSBuYW1lPScnYlNoYXJlt9bP7bLlvP4nJyBsaW5rPScncGx1c19ic2hhcmUucGhwJycgcmFuaz0nJ3BsdXNfYlNoYXJlt9bP7bLlvP4nJyB0YXJnZXQ9JydtYWluJycgLz4nKTs=
REVMRVRFIEZST00gYCNAX19wbHVzYCB3aGVyZSBwbHVzbmFtZSBsaWtlICdiU2hhcmW31s/tsuW8/ic7
../dede/plus_bshare.php
../dede/templets/plus_bshare.htm
../dede/templets/plus_bshare_state.htm
../include/taglib/bshare.lib.php
../dede/css/boxy.css
../dede/images/boxy-ne.png
../dede/images/boxy-nw.png
../dede/images/boxy-se.png
../dede/images/boxy-sw.png
../dede/js/boxy.js
PD9waHANCi8qKg0KICogQnNoYXJlus/X97LlvP4NCiAqDQogKiBAdmVyc2lvbiAgICAgICAgJElkOiBwbHVzX2JzaGFyZS5waHAgNSAxMzoyMyAyMDExLTUtMTkgdGlhbnlhICQNCiAqIEBwYWNrYWdlICAgICAgICBEZWRlQ01TLkFkbWluaXN0cmF0b3INCiAqIEBjb3B5cmlnaHQgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgLSAyMDEwLCBEZXNEZXYsIEluYy4NCiAqIEBsaWNlbnNlICAgICAgICBodHRwOi8vaGVscC5kZWRlY21zLmNvbS91c2Vyc2d1aWRlL2xpY2Vuc2UuaHRtbA0KICogQGxpbmsgICAgICAgICAgIGh0dHA6Ly93d3cuZGVkZWNtcy5jb20NCiAqLw0KcmVxdWlyZV9vbmNlKGRpcm5hbWUoX19GSUxFX18pLiIvY29uZmlnLnBocCIpOw0KcmVxdWlyZV9vbmNlKERFREVJTkMuIi9qc29uLmNsYXNzLnBocCIpOw0KDQovLyDS/cjrQlNoYXJlxeTWw87EvP4NCkBpbmNsdWRlX29uY2UgREVERURBVEEuJy9jYWNoZS9ic2hhcmUuaW5jJzsNCiRic2NvZGVGaWxlID0gREVERURBVEEuJy9jYWNoZS9ic2hhcmUuY29kZS5pbmMnOw0KDQokZG8gPSBpc3NldCgkZG8pPyAkZG8gOiAnJzsNCiRzdGFydHRpbWUgPSBlbXB0eSgkc3RhcnR0aW1lKT8gTXlEYXRlKCdZLW0tZCcsIG1rdGltZSgwLCAwLCAwLCBkYXRlKCJtIiksIGRhdGUoImQiKS0xMCwgZGF0ZSgiWSIpKSkgOiAkc3RhcnR0aW1lOw0KJGVuZHRpbWUgPSBlbXB0eSgkZW5kdGltZSk/IE15RGF0ZSgnWS1tLWQnLCB0aW1lKCkpIDogJGVuZHRpbWU7DQoNCiRqc29uID0gbmV3IFNlcnZpY2VzX0pTT04oU0VSVklDRVNfSlNPTl9MT09TRV9UWVBFKTsNCg0KLyoqDQogKiAg1LazzLvxyKHK/b7duq/K/Q0KICogIMD9yOejukRvd25Ib3N0KCR1cmwsICcnLCAnR0VUJywgTlVMTCwgTlVMTCwgJHVzZXIsICRwYXNzKTsNCiAqDQogKiBAYWNjZXNzICAgIHB1YmxpYw0KICogQHBhcmFtICAgICBzdHJpbmcgICDVvrXjtdjWtw0KICogQHBhcmFtICAgICBzdHJpbmcgICC4vbzTyv2+3Q0KICogQHBhcmFtICAgICBzdHJpbmcgICDH68fzt723qKOsR0VUIFBPU1S3vcq9DQogKiBAcGFyYW0gICAgIHN0cmluZyAgIM/Uyr5hZ2VudA0KICogQHBhcmFtICAgICBpbnQgICAgICC2y7/ausUNCiAqIEBwYXJhbSAgICAgc3RyaW5nICAg08O7p8P7o6yx49PaQXV0aG9yaXphdGlvbjogQmFzaWPH68fzDQogKiBAcGFyYW0gICAgIHN0cmluZyAgIMPcwusNCiAqIEBwYXJhbSAgICAgaW50ICAgICAgs6zP3sqxvOQNCiAqIEByZXR1cm4gICAgYXJyYXkNCiAqLw0KZnVuY3Rpb24gRG93bkhvc3QoJGhvc3QsJGRhdGE9JycsJG1ldGhvZD0nR0VUJywkc2hvd2FnZW50PW51bGwsJHBvcnQ9bnVsbCwkdXNlcj0nJywkcHdkPScnLCR0aW1lb3V0PTMwKQ0Kew0KICAgICRyZXZhbCA9IGFycmF5KCk7DQogICAgJHBhcnNlID0gQHBhcnNlX3VybCgkaG9zdCk7DQogICAgaWYgKGVtcHR5KCRwYXJzZSkpIHJldHVybiBmYWxzZTsNCiAgICBpZiAoKGludCkkcG9ydD4wKSB7DQogICAgICAgICRwYXJzZVsncG9ydCddID0gJHBvcnQ7DQogICAgfSBlbHNlaWYgKCFpc3NldCgkcGFyc2VbJ3BvcnQnXSkpIHsNCiAgICAgICAgJHBhcnNlWydwb3J0J10gPSAnODAnOw0KICAgIH0NCiAgICBpZighZW1wdHkoJHVzZXIpKSAkcGFyc2VbJ3VzZXInXSA9ICR1c2VyOw0KICAgIGlmKCFlbXB0eSgkcHdkKSkgJHBhcnNlWydwYXNzJ10gPSAkcHdkOw0KICAgIA0KICAgICRwYXJzZVsnaG9zdCddID0gc3RyX3JlcGxhY2UoYXJyYXkoJ2h0dHA6Ly8nLCdodHRwczovLycpLGFycmF5KCcnLCdzc2w6Ly8nKSwiJHBhcnNlW3NjaGVtZV06Ly8iKS4kcGFyc2VbJ2hvc3QnXTsNCiAgICBpZiAoISRmcD1AZnNvY2tvcGVuKCRwYXJzZVsnaG9zdCddLCRwYXJzZVsncG9ydCddLCRlcnJudW0sJGVycnN0ciwkdGltZW91dCkpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCiAgICAkbWV0aG9kID0gc3RydG91cHBlcigkbWV0aG9kKTsNCiAgICAkd2xlbmd0aCA9ICR3ZGF0YSA9ICRyZXNwb25zZVRleHQgPSAnJzsNCiAgICAkcGFyc2VbJ3BhdGgnXSA9IHN0cl9yZXBsYWNlKGFycmF5KCdcXCcsJy8vJyksJy8nLCRwYXJzZVsncGF0aCddKS4iPyRwYXJzZVtxdWVyeV0iOw0KICAgIA0KICAgICRoZWFkZXJzID0gJyc7DQogICAgJGFnZW50ID0gJ01vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjIpJzsNCiAgICAkaGVhZGVycyAuPSAiVXNlci1BZ2VudDogIiAuICRhZ2VudCAuICJcclxuIjsNCiAgICANCiAgICAkYWNjZXB0ID0gJ2ltYWdlL2dpZiwgaW1hZ2UveC14Yml0bWFwLCBpbWFnZS9qcGVnLCBpbWFnZS9wanBlZywgKi8qJzsNCiAgICAkaGVhZGVycyAuPSAiQWNjZXB0OiAiIC4gJGFjY2VwdCAuICJcclxuIjsNCiAgICANCg0KICAgIA0KICAgIGlmICghIGVtcHR5KCRwYXJzZVsndXNlciddKSB8fCAhIGVtcHR5KCRwYXJzZVsncGFzcyddKSkNCiAgICAkaGVhZGVycyAuPSAiQXV0aG9yaXphdGlvbjogQmFzaWMgIiAuIGJhc2U2NF9lbmNvZGUoJHBhcnNlWyd1c2VyJ10gLiAiOiIgLiAkcGFyc2VbJ3Bhc3MnXSkgLiAiXHJcbiI7DQogICAgDQogICAgJGNvbnRlbnRfdHlwZSA9ICcnOw0KICAgIGlmKCFlbXB0eSgkY29udGVudF90eXBlKSkNCiAgICB7DQogICAgICAgICRoZWFkZXJzIC49ICJDb250ZW50LXR5cGU6ICRjb250ZW50X3R5cGUiOw0KICAgICAgICBpZiAoJGNvbnRlbnRfdHlwZSA9PSAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpDQogICAgICAgICAgICAkaGVhZGVycyAuPSAiOyBib3VuZGFyeT1kZWRlIiAuIG1kNSh1bmlxaWQobWljcm90aW1lKCkpKTsNCiAgICAgICAgJGhlYWRlcnMgLj0gIlxyXG4iOw0KICAgIH0NCiAgICANCiAgICBpZiAoJG1ldGhvZD09J0dFVCcpIHsNCiAgICAgICAgJHNlcGFyYXRvciA9ICRwYXJzZVsncXVlcnknXSA/ICcmJyA6ICcnOw0KICAgICAgICBzdWJzdHIoJGRhdGEsMCwxKT09JyYnICYmICRkYXRhID0gc3Vic3RyKCRkYXRhLDEpOw0KICAgICAgICAkcGFyc2VbJ3BhdGgnXSAuPSAkc2VwYXJhdG9yLiRkYXRhOw0KICAgIH0gZWxzZWlmICgkbWV0aG9kPT0nUE9TVCcpIHsNCiAgICAgICAgJHdsZW5ndGggPSAiQ29udGVudC1sZW5ndGg6ICIuc3RybGVuKCRkYXRhKS4iXHJcbiI7DQogICAgICAgICR3ZGF0YSA9ICRkYXRhOw0KICAgIH0NCiAgICANCiAgICAkd3JpdGUgPSAiJG1ldGhvZCAkcGFyc2VbcGF0aF0gSFRUUC8xLjBcclxuSG9zdDogJHBhcnNlW2hvc3RdXHJcbnskd2xlbmd0aH17JGhlYWRlcnN9XHJcbiR3ZGF0YSI7DQogICAgLy8gZHVtcCgkd3JpdGUpOw0KICAgIA0KICAgIEBmd3JpdGUoJGZwLCR3cml0ZSxzdHJsZW4oJHdyaXRlKSk7DQogICAgDQogICAgd2hpbGUgKCRjdXJyZW50SGVhZGVyID0gZmdldHMoJGZwLCA0MDk2KSkgew0KICAgICAgICBpZiAoJGN1cnJlbnRIZWFkZXIgPT0gIlxyXG4iKQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIC8vILj5vt23tbvY0MXPosXQts/Kx7fxzPjXqg0KICAgICAgICBpZiAocHJlZ19tYXRjaCgiL14oTG9jYXRpb246fFVSSTopL2kiLCAkY3VycmVudEhlYWRlcikpIHsNCiAgICAgICAgICAgIHByZWdfbWF0Y2goIi9eKExvY2F0aW9uOnxVUkk6KVsgXSsoLiopL2kiLCBjaG9wKCRjdXJyZW50SGVhZGVyKSwgJG1hdGNoZXMpOw0KICAgICAgICAgICAgaWYgKCEgcHJlZ19tYXRjaCgifFw6XC9cL3wiLCAkbWF0Y2hlc1syXSkpIHsNCiAgICAgICAgICAgICAgICAkX3JlZGlyZWN0YWRkciA9ICRwYXJzZVsic2NoZW1lIl0gLiAiOi8vIiAuICRwYXJzZVsnaG9zdCddIC4gIjoiIC4gJHBhcnNlWydwb3J0J107DQogICAgICAgICAgICAgICAgaWYgKCEgcHJlZ19tYXRjaCgifF4vfCIsICRtYXRjaGVzWzJdKSkNCiAgICAgICAgICAgICAgICAgICAgJF9yZWRpcmVjdGFkZHIgLj0gIi8iIC4gJG1hdGNoZXNbMl07DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAkX3JlZGlyZWN0YWRkciAuPSAkbWF0Y2hlc1syXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJF9yZWRpcmVjdGFkZHIgPSAkbWF0Y2hlc1syXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBEb3duSG9zdCgkX3JlZGlyZWN0YWRkciwkZGF0YSwkbWV0aG9kLCRzaG93YWdlbnQsJHBvcnQsJHVzZXIsJHB3ZCwkdGltZW91dCk7DQogICAgICAgIH0NCiAgICAgICAgJHJldmFsWydzdGF0dXMnXSA9ICcnOw0KICAgICAgICBpZiAocHJlZ19tYXRjaCgifF5IVFRQL3wiLCAkY3VycmVudEhlYWRlcikpIHsNCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCJ8XkhUVFAvW15cc10qXHMoLio/KVxzfCIsICRjdXJyZW50SGVhZGVyLCAkc3RhdHVzKSkgDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJHJldmFsWydzdGF0dXMnXSA9ICRzdGF0dXNbMV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgJHJldmFsWydyZXN1bHRzJ10gPSAnJzsNCiAgICBkbyB7DQogICAgICAgICRfZGF0YSA9IGZyZWFkKCRmcCwgNTAwMDAwKTsNCiAgICAgICAgaWYgKHN0cmxlbigkX2RhdGEpID09IDApIHsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgICRyZXZhbFsncmVzdWx0cyddIC49ICRfZGF0YTsNCiAgICB9IHdoaWxlICh0cnVlKTsNCiAgICBAZmNsb3NlKCRmcCk7DQogICAgcmV0dXJuICRyZXZhbDsNCn0NCg0KLyoqDQogKiAgILvxyKHUtrPMvdO/2sr9vt0NCiAqDQogKiBAYWNjZXNzICAgIHB1YmxpYw0KICogQHBhcmFtICAgICBzdHJpbmcNCiAqIEByZXR1cm4gICAgc3RyaW5nDQogKi8NCmZ1bmN0aW9uIEdldEFuYWx5dGljc0RhdGUoJHVybCkNCnsNCiAgICBnbG9iYWwgJGNmZ19ic2hhcmUsJGpzb24sJGNmZ19zb2Z0X2xhbmc7DQogICAgJHVzZXIgPSAkY2ZnX2JzaGFyZVsndXNlciddOw0KICAgICRwYXNzID0gJGNmZ19ic2hhcmVbJ3B3ZCddOw0KICAgICRyZXN1bHRzID0gRG93bkhvc3QoJHVybCwgJycsICdHRVQnLCBOVUxMLCBOVUxMLCAkdXNlciwgJHBhc3MpOw0KDQogICAgdHJ5DQogICAgew0KICAgICAgICAkcmVzdWx0ID0gJGpzb24tPmRlY29kZSgkcmVzdWx0c1sncmVzdWx0cyddKTsNCiAgICB9DQogICAgY2F0Y2ggKCBFeGNlcHRpb24gJGUgKQ0KICAgIHsNCiAgICAgICAgdHJpZ2dlcl9lcnJvcigiU2VydmVyIEVycm9yOiIuJHJlc3VsdCk7DQogICAgfQ0KDQogICAgLy9pZiAoJGNmZ19zb2Z0X2xhbmcgPT0gJ2diMjMxMicpDQogICAgLy97DQogICAgICAgICRyZXN1bHQgPSBBdXRvQ2hhcnNldCgkcmVzdWx0LCAndXRmLTgnLCAnZ2JrJyk7DQogICAgLy99DQogICAgcmV0dXJuICRyZXN1bHQ7DQp9DQoNCmZ1bmN0aW9uIENlaWxUZW4oJG51bSkgDQp7IA0KICAgIHJldHVybiAoY2VpbCgkbnVtIC8gMTApICogMTApOyANCn0NCg0KZnVuY3Rpb24gR2V0QW5hbHl0aWNzUGljVXJsKCR0eXBlPSdjbGljaycsICRzdGFydHRpbWU9JycsICRlbmR0aW1lPScnKQ0Kew0KICAgIGdsb2JhbCAkY2ZnX2JzaGFyZTsNCiAgICAkdXJsID0gImh0dHA6Ly9hcGkuYnNoYXJlLmNuL2FuYWx5dGljcy97JGNmZ19ic2hhcmVbJ3V1aWQnXX0veyR0eXBlfS5qc29uP2RhdGVTdGFydD17JHN0YXJ0dGltZX0mZGF0ZUVuZD17JGVuZHRpbWV9JmxvY2FsZT16aCI7DQogICAgDQogICAgJHJlc3VsdCA9IEdldEFuYWx5dGljc0RhdGUoJHVybCk7DQogICAgJGNoeGwgPSAkY2gxID0gJHQgPSBhcnJheSgpOw0KICAgIGlmIChpc3NldCgkcmVzdWx0WydhbmFseXRpY3MnXSkgJiYgY291bnQoJHJlc3VsdFsnYW5hbHl0aWNzJ10pID4gMSkNCiAgICB7DQogICAgICAgICR0b3RhbCA9IGNvdW50KCRyZXN1bHRbJ2FuYWx5dGljcyddKTsNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICBmb3JlYWNoICgkcmVzdWx0WydhbmFseXRpY3MnXSBhcyAka2V5ID0+ICR2YWx1ZSkgew0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoJGtleSAlIChDZWlsVGVuKCR0b3RhbCkvMTApID09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJGNoeGwgPSBhcnJheV9tZXJnZSgkY2h4bCwgYXJyYXkoc3Vic3RyKCR2YWx1ZVsnbWV0cmljJ10sNSw1KSkpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkY2h4bCA9IGFycmF5X21lcmdlKCRjaHhsLCBhcnJheSgnJykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGNoMSA9IGFycmF5X21lcmdlKCRjaDEsIGFycmF5KCR2YWx1ZVsnY291bnQnXSkpOw0KICAgICAgICAgICAgJHQgPSBhcnJheV9tZXJnZSgkdCwgYXJyYXkoJHZhbHVlWydjb3VudCddKSk7DQogICAgICAgIH0NCiAgICAgICAgJHRTdHIgPSBpbXBsb2RlKCcsJywgJHQpOw0KICAgICAgICAkY2h4bFN0ciA9IGltcGxvZGUoJ3wnLCAkY2h4bCk7DQogICAgICAgICRjaDFTdHIgPSBpbXBsb2RlKCd8JywgJGNoMSk7DQogICAgICAgICRtaW4gPSBtaW4oJHQpOw0KICAgICAgICAkbWF4ID0gbWF4KCR0KTsNCiAgICAgICAgLy8gZWNobyAkbWF4O2V4aXQ7DQogICAgICAgIA0KICAgICAgICAkZ29vZ2xldXJsW10gPSAiaHR0cHM6Ly9jaGFydC5nb29nbGVhcGlzLmNvbS9jaGFydD8iOw0KICAgICAgICAkZ29vZ2xldXJsW10gPSAiY2h4bD0wOnx7JGNoeGxTdHJ9fDI6fHskY2gxU3RyfSYiOw0KICAgICAgICAvLyAkZ29vZ2xldXJsW10gPSAiJmNoZHM9MCx7JG1heH0mIjsNCiAgICAgICAgJGdvb2dsZXVybFtdID0gImNoeHQ9eCx5LHQmIjsNCiAgICAgICAgJGdvb2dsZXVybFtdID0gImNobWE9MCwwLDEwLDAmIjsNCiAgICAgICAgJGdvb2dsZXVybFtdID0gImNoZHM9eyRtaW59LHskbWF4fSx7JG1pbn0seyRtYXh9JiI7DQogICAgICAgICRnb29nbGV1cmxbXSA9ICJjaGxzPTEsMi41JiI7DQogICAgICAgICRnb29nbGV1cmxbXSA9ICJjaHhyPTEseyRtaW59LHskbWF4fSYiOw0KICAgICAgICAkZ29vZ2xldXJsW10gPSAiY2hiaD1hLDEmIjsNCiAgICAgICAgJGdvb2dsZXVybFtdID0gImNocz01NDB4MjAwJiI7DQogICAgICAgICRnb29nbGV1cmxbXSA9ICJjaHQ9YnZzJiI7DQogICAgICAgICRnb29nbGV1cmxbXSA9ICJjaGQ9dDp7JHRTdHJ9IjsNCiAgICAgICAgJHJldmFsID0gaW1wbG9kZSgnJywgJGdvb2dsZXVybCk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgJHJldmFsID0gJ2ltYWdlcy9kZnBpYy5naWYnOw0KICAgIH0NCiAgICANCiAgICByZXR1cm4gJHJldmFsOw0KfQ0KDQpmdW5jdGlvbiBHZXRBbmFseXRpY3NQbGF0Zm9ybSgkc3RhcnR0aW1lPScnLCAkZW5kdGltZT0nJykNCnsNCiAgICBnbG9iYWwgJGNmZ19ic2hhcmU7DQogICAgJHVybCA9ICJodHRwOi8vYXBpLmJzaGFyZS5jbi9hbmFseXRpY3MveyRjZmdfYnNoYXJlWyd1dWlkJ119L3BsYXRmb3JtLmpzb24/ZGF0ZVN0YXJ0PXskc3RhcnR0aW1lfSZkYXRlRW5kPXskZW5kdGltZX0mbG9jYWxlPXpoIjsNCg0KICAgICRyZXN1bHQgPSBHZXRBbmFseXRpY3NEYXRlKCR1cmwpOw0KICAgIA0KICAgIGlmIChpc3NldCgkcmVzdWx0WydhbmFseXRpY3MnXSkgJiYgY291bnQoJHJlc3VsdFsnYW5hbHl0aWNzJ10pID4gMSkNCiAgICB7DQogICAgICAgICR0b3RhbCA9IDA7DQogICAgICAgIGZvcmVhY2ggKCRyZXN1bHRbJ2FuYWx5dGljcyddIGFzICRrZXkgPT4gJHZhbHVlKSB7DQogICAgICAgICAgICAkdG90YWwgKz0gJHZhbHVlWydjb3VudCddOw0KICAgICAgICB9DQogICAgICAgICRjb2xvcnMgPSBhcnJheSgnRkZDNkE1JywgJ0ZGRkY0MicsICdERUYzQkQnLCAnMDBBNUM2JywgJ0RFQkRERScsDQogICAgICAgICAgICAnMTA5NjE4JywnOTkwMDk5JywnMEY0QjkzJywgJ0ZGNjYwMCcsJ0MwRENDMCcNCiAgICAgICAgKTsNCiAgICAgICAgJGNoMSA9ICR0ID0gJGNoY28gPSBhcnJheSgpOw0KDQogICAgICAgIGlmICgkdG90YWwgPiAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3JlYWNoICgkcmVzdWx0WydhbmFseXRpY3MnXSBhcyAka2V5ID0+ICR2YWx1ZSkgDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJHZhclBlcmNlbnQgPSBzcHJpbnRmKCIlZCIsKCR2YWx1ZVsnY291bnQnXS8kdG90YWwpICogMTAwKTsNCiAgICAgICAgICAgICAgICAkdCA9IGFycmF5X21lcmdlKCR0LCBhcnJheSgkdmFyUGVyY2VudCkpOw0KICAgICAgICAgICAgICAgICRjaGNvID0gYXJyYXlfbWVyZ2UoJGNoY28sIGFycmF5KCRjb2xvcnNbJGtleSAlIDEwXSkpOw0KICAgICAgICAgICAgICAgICRtZXRyaWMgPSB1cmxlbmNvZGUoZ2IydXRmOCgkdmFsdWVbJ21ldHJpYyddKSk7DQogICAgICAgICAgICAgICAgJGNoMSA9IGFycmF5X21lcmdlKCRjaDEsIGFycmF5KCJ7JG1ldHJpY30uKCR2YXJQZXJjZW50JSkteyR2YWx1ZVsnY291bnQnXX0iKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJHRTdHIgPSBpbXBsb2RlKCcsJywgJHQpOw0KICAgICAgICAkY2hjb1N0ciA9IGltcGxvZGUoJ3wnLCAkY2hjbyk7DQogICAgICAgICRjaDFTdHIgPSBpbXBsb2RlKCd8JywgJGNoMSk7DQoNCiAgICAgICAgDQogICAgICAgICRnb29nbGV1cmxbXSA9ICJodHRwczovL2NoYXJ0Lmdvb2dsZWFwaXMuY29tL2NoYXJ0PyI7DQogICAgICAgICRnb29nbGV1cmxbXSA9ICJjaHQ9cDMmIjsNCiAgICAgICAgJGdvb2dsZXVybFtdID0gImNocz01NDB4MjAwJiI7DQogICAgICAgICRnb29nbGV1cmxbXSA9ICJjaGQ9dDp7JHRTdHJ9JmNobD17JGNoMVN0cn0mY2hjbz17JGNoY29TdHJ9IjsNCiAgICAgICAgJHJldmFsID0gaW1wbG9kZSgnJywgJGdvb2dsZXVybCk7DQogICAgICAgIHVuc2V0KCRnb29nbGV1cmwpOw0KICAgICAgICB1bnNldCgkcmVzdWx0KTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAkcmV2YWwgPSAnaW1hZ2VzL2RmcGljLmdpZic7DQogICAgfQ0KICAgIHJldHVybiAkcmV2YWw7DQp9DQoNCi8vINC0yOtCU2hhcmW1xLu6tObOxLz+DQpmdW5jdGlvbiBXcml0ZUJzaGFyZUNhY2hlKCRvcGVuPSdmYWxzZScsICR1c2VyPScnLCAkcHdkPScnLCAkdXVpZD0nJykNCnsNCiAgICAkY2FjaGVGaWxlID0gREVERURBVEEuJy9jYWNoZS9ic2hhcmUuaW5jJzsNCiAgICAkY2FjaGVTdHIgPSA8PDxFT1QNCjw/cGhwIGlmKCFkZWZpbmVkKCdERURFSU5DJykpIGV4aXQoIlJlcXVlc3QgRXJyb3IhIik7DQpnbG9iYWwgXCRjZmdfYnNoYXJlOw0KXCRjZmdfYnNoYXJlID0gYXJyYXkoKTsNClwkY2ZnX2JzaGFyZVsnb3BlbiddID0gJG9wZW47DQpcJGNmZ19ic2hhcmVbJ3VzZXInXSA9ICckdXNlcic7DQpcJGNmZ19ic2hhcmVbJ3B3ZCddID0gJyRwd2QnOw0KXCRjZmdfYnNoYXJlWyd1dWlkJ10gPSAnJHV1aWQnOw0KPz4NCkVPVDsNCiAgICByZXR1cm4gZmlsZV9wdXRfY29udGVudHMoJGNhY2hlRmlsZSwgJGNhY2hlU3RyKTsNCn0NCg0KDQppZihlbXB0eSgkZG8pKQ0Kew0KICAgIGlmICghaXNzZXQoJGNmZ19ic2hhcmVbJ29wZW4nXSkgfHwgISRjZmdfYnNoYXJlWydvcGVuJ10pDQogICAgew0KICAgICAgICBpbmNsdWRlIERFREVBRE1JTi4nL3RlbXBsZXRzL3BsdXNfYnNoYXJlLmh0bSc7DQogICAgfSBlbHNlIHsNCiAgICAgICAgJGJzaGFyZUNvZGUgPSBzdHJpcHNsYXNoZXMoZmlsZV9nZXRfY29udGVudHMoJGJzY29kZUZpbGUpKTsNCiAgICAgICAgLy8gt9bO9s2zvMbQxc+iDQogICAgICAgIC8ve3t7DQogICAgICAgICRwbGF0Zm9ybVVybCA9IEdldEFuYWx5dGljc1BsYXRmb3JtKCRzdGFydHRpbWUsICRlbmR0aW1lKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgLy8gu/HIobXju/e6zc2zvMax7dDFz6INCiAgICAgICAgJHNoYXJlVXJsID0gR2V0QW5hbHl0aWNzUGljVXJsKCdzaGFyZScsICRzdGFydHRpbWUsICRlbmR0aW1lKTsNCiAgICAgICAgJGNsaWNrVXJsID0gR2V0QW5hbHl0aWNzUGljVXJsKCdjbGljaycsICRzdGFydHRpbWUsICRlbmR0aW1lKTsNCiAgICANCiAgICAgICAgaW5jbHVkZSBERURFQURNSU4uJy90ZW1wbGV0cy9wbHVzX2JzaGFyZV9zdGF0ZS5odG0nOw0KICAgIH0NCn0gDQovLyC/qs2oQlNoYXJlt/7O8Q0KZWxzZSBpZigkZG8gPT0gJ29wZW4nKSANCnsNCiAgICAkZW1haWwgPSBpc3NldCgkdXNlcik/ICR1c2VyIDogJyc7DQogICAgJHBhc3N3b3JkID0gaXNzZXQoJHB3ZCk/ICRwd2QgOiAnJzsNCiAgICAkc3VibW9kZSA9IGlzc2V0KCRzdWJtb2RlKT8gJHN1Ym1vZGUgOiAwOw0KICAgIGlmIChlbXB0eSgkZW1haWwpIHx8IGVtcHR5KCRwYXNzd29yZCkpDQogICAgew0KICAgICAgICBTaG93TXNnKCfH68rkyOvTys/ktdjWt7rN08O7p8PcwuujoScsICdwbHVzX2JzaGFyZS5waHAnKTsNCiAgICAgICAgZXhpdDsNCiAgICB9DQogICAgJGNmZ19ic2hhcmVbJ29wZW4nXSA9IGlzc2V0KCRjZmdfYnNoYXJlWydvcGVuJ10pPyAkY2ZnX2JzaGFyZVsnb3BlbiddIDogZmFsc2U7DQogICAgDQogICAgaWYgKCEkY2ZnX2JzaGFyZVsnb3BlbiddICYmIGVtcHR5KCRjZmdfYnNoYXJlWyd1dWlkJ10pKQ0KICAgIHsNCiAgICAgICAgJGRvbWFpbiA9ICRfU0VSVkVSWydIVFRQX0hPU1QnXTsNCiAgICAgICAgJG9wZW5VcmwgPSAiaHR0cDovL2FwaS5ic2hhcmUuY24vYW5hbHl0aWNzL3JlZ3V1aWQuanNvbj9lbWFpbD17JGVtYWlsfSZwYXNzd29yZD17JHBhc3N3b3JkfSZkb21haW49eyRkb21haW59JnNvdXJjZT1kZWRlY21zIjsNCiAgICAgICAgJHJlc3VsdHMgPSBEb3duSG9zdCgkb3BlblVybCwgJycsICdHRVQnLCBOVUxMLCBOVUxMKTsNCiAgICAgICAgDQogICAgICAgICRyZXN1bHQgPSAkanNvbi0+ZGVjb2RlKCRyZXN1bHRzWydyZXN1bHRzJ10pOw0KICAgICAgICAkdXVpZCA9ICRyZXN1bHRbJ3V1aWQnXTsNCiAgICAgICAgDQogICAgICAgIGlmIChpc19udWxsKCRyZXN1bHQpKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyC07c7ztKbA7Q0KICAgICAgICAgICAgaWYgKCRyZXN1bHRzWydzdGF0dXMnXSA9PSA0MDAgJiYgJHN1Ym1vZGU9PTApIA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFNob3dNc2coJ8rkyOu1xNPDu6fD+9LRvq205tTao6zH69bY0MLK5MjrJywgJ3BsdXNfYnNoYXJlLnBocCcpOw0KICAgICAgICAgICAgICAgIGV4aXQ7DQogICAgICAgICAgICB9IGVsc2UgaWYgKCRyZXN1bHRzWydzdGF0dXMnXSA9PSA0MDEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgU2hvd01zZygnxPrK5MjrtcRCU2hhcmXD3MLrtO3O86Osx+vW2NDCyuTI68i3saPG5NX9yLcnLCAncGx1c19ic2hhcmUucGhwJyk7DQogICAgICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghaXNzZXQoJHV1aWQpKQ0KICAgICAgICB7DQogICAgICAgICAgICBTaG93TXNnKCfUtrPMu/HIoUJTaGFyZbXEdXVpZLTtzvOjrMT60OjSqtbY0MKzosrUoaMnLCAncGx1c19ic2hhcmUucGhwJyk7DQogICAgICAgICAgICBleGl0Ow0KICAgICAgICB9DQogICAgICAgIC8vILGjtOa7urTmzsS8/g0KICAgICAgICBXcml0ZUJzaGFyZUNhY2hlKCdUUlVFJywgJGVtYWlsLCAkcGFzc3dvcmQsICR1dWlkKTsNCiAgICAgICAgLy8g0LTI68SsyM+0+sLrDQogICAgICAgICRjb2RlT3JkZXIgPSAncXFtYiUyY3NpbmFtaW5pYmxvZyUyY3NvaHViYWklMmNiYWlkdWhpJTJjcmVucmVuJTJjYmdvb2dsZSc7DQogICAgICAgICRyZW1vdGVVcmwgPSAnaHR0cDovL3VwZGF0ZW5ldy5kZWRlY21zLmNvbS9iYXNlLXY1Ny9kZWRlY21zL3BsdXNfYnNoYXJlLnR4dCc7DQogICAgICAgICRyZXN1bHQgPSBEb3duSG9zdCgkcmVtb3RlVXJsKTsNCiAgICAgICAgJGNvZGVPcmRlciA9IGlzc2V0KCRyZXN1bHRbJ3Jlc3VsdHMnXSk/ICRyZXN1bHRbJ3Jlc3VsdHMnXSA6ICRjb2RlT3JkZXI7DQogICAgICAgICR0cGxDb2RlID0gPDw8RU9UDQo8YSBjbGFzcz0iYnNoYXJlRGl2IiBocmVmPSJodHRwOi8vd3d3LmJzaGFyZS5jbi9zaGFyZSI+t9bP7bC0xaU8L2E+PHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly93d3cuYnNoYXJlLmNuL2J1dHRvbi5qcyN1dWlkPSR1dWlkJnN0eWxlPTImdGV4dGNvbG9yPSMwMDAmYmdjb2xvcj1ub25lJmJwPXskY29kZU9yZGVyfSZzc2M9ZmFsc2Umc249dHJ1ZSZ0ZXh0PbfWz+21vSI+PC9zY3JpcHQ+ICAgDQpFT1Q7DQogICAgICAgICRwdXRmaWxlRnVuYyA9IGZ1bmN0aW9uX2V4aXN0cygnUHV0RmlsZScpPyAnUHV0RmlsZScgOiAnZmlsZV9wdXRfY29udGVudHMnOw0KICAgICAgICAkcHV0ZmlsZUZ1bmMoJGJzY29kZUZpbGUsICR0cGxDb2RlKTsNCiAgICAgICAgU2hvd01zZygn0tG+rb+qzahCU2hhcmW3/s7xo6zPwsPmztLDx8C0vfjQ0Mzl0emwyaGjJywgJ3BsdXNfYnNoYXJlLnBocCcpOw0KICAgICAgICBleGl0Ow0KICAgIH0gZWxzZSB7DQogICAgICAgIFNob3dNc2coJ8rHt/HS0b6tv6rG9EJTaGFyZbf+zvGjrMjnufvS0b6tv6rG9M7e0OjW2Li0v6rG9Lf+zvGhoycsICctMScpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgICANCn0NCi8vIMnotqjR+cq9DQplbHNlIGlmICgkZG8gPT0gJ3NldGNvZGUnKQ0Kew0KICAgICRic2NvZGUgPSBpc3NldCgkYnNjb2RlKT8gJGJzY29kZSA6ICcnOw0KICAgIA0KICAgIFB1dEZpbGUoJGJzY29kZUZpbGUsICRic2NvZGUpOw0KICAgIFNob3dNc2coJ7PJuabJ6LaoQlNoYXJltPrC6ycsICdwbHVzX2JzaGFyZS5waHAnKTsNCiAgICBleGl0Ow0KfQ0KDQo=
PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD08P3BocCBlY2hvICRjZmdfc29mdF9sYW5nOyA/PiI+DQo8dGl0bGU+QlNoYXJlt9bP7bLlvP48L3RpdGxlPg0KPD9waHANCmlmKGlzX2ZpbGUoREVERUlOQy4nL2pzL2pxdWVyeS9qcXVlcnkuanMnKSkNCnsNCj8+DQo8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9Ii4uL2luY2x1ZGUvanMvanF1ZXJ5L2pxdWVyeS5qcyI+PC9zY3JpcHQ+DQo8P3BocA0KfSBlbHNlIHsNCj8+DQo8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9Ii4uL2ltYWdlcy9qcy9qLmpzIj48L3NjcmlwdD4NCjw/cGhwDQp9DQo/Pg0KPD9waHANCmlmKGlzX2ZpbGUoZGlybmFtZShfX2ZpbGVfXykuJy8uLi9pbWcvYmFzZS5jc3MnKSkNCnsNCj8+DQo8bGluayBocmVmPSJpbWcvYmFzZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+DQo8P3BocA0KfSBlbHNlIHsNCj8+DQo8bGluayBocmVmPSJjc3MvYmFzZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+DQo8P3BocA0KfQ0KPz4NCjwvaGVhZD4NCjxib2R5IGJhY2tncm91bmQ9ImltYWdlcy9hbGxiZy5naWYiIGxlZnRtYXJnaW49IjgiIHRvcG1hcmdpbj0iOCI+DQo8ZGl2IGNsYXNzPSJib2R5dGl0bGUiPg0KICA8ZGl2IGNsYXNzPSJib2R5dGl0bGVsZWZ0Ij48L2Rpdj4NCiAgPGRpdiBjbGFzcz0iYm9keXRpdGxldHh0IiBzdHlsZT0icGFkZGluZy1sZWZ0OjEwcHg7Ij64qNb6suW8/jwvZGl2Pg0KPC9kaXY+DQo8dGFibGUgd2lkdGg9Ijk4JSIgYm9yZGVyPSIwIiBhbGlnbj0iY2VudGVyIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjEiIGNsYXNzPSJ0YnRpdGxlIiBzdHlsZT0iYmFja2dyb3VuZDojQ0ZDRkNGOyI+DQogIDx0cj4NCiAgICA8dGQgYmdjb2xvcj0iI0VERjlENSIgY29sc3Bhbj0iMiIgYmFja2dyb3VuZD0naW1hZ2VzL3RiZy5naWYnIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTBweDsiPjxzdHJvbmc+YlNoYXJlt9bP7bLlvP48L3N0cm9uZz48L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGJnY29sb3I9IiNGRkZGRkYiIGNvbHNwYW49IjIiPjxwPiBiU2hhcmWyu9a5ysfSu7j2t9bP7bC0xaWho2JTaGFyZcrHyKvH8tbQzsS7pcGqzfjX7se/tPO1xMnnvbu31s/t0v3H5qOhDQogICAgICAgINa70OjSu7j2sLTFpaOsvs3E3M6qxPq1xM341b7Xosjryee9u7uvuabE3KOhIDwvcD4NCiAgICAgIDxwPmJTaGFyZdbHxNy31s/t0v3H5sjDxPq1xNPDu6e/ydLUx+HLybXYvavX7s+yu7a1xMTayN231s/ttb3J5727zfjVvqGizqKyqcnP0+u6w9PRt9bP7aGj08O7p87e0OvA67+qxPq1xM341b6jrL7NxNy/7MvZtdi9+NDQt9bP7aOsvMzQ+OSvwMDE+rXEzfjVvqOhPC9wPjwvdGQ+DQogIDwvdHI+DQogIDxmb3JtIGlkPSJmb3JtMiIgbmFtZT0iZm9ybTIiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI/ZG89b3BlbiIgdGFyZ2V0PSJfc2VsZiIgb25zdWJtaXQ9InJldHVybiBDaGVja1N1Ym1pdCgpOyI+DQogIDxpbnB1dCBuYW1lPSJzdWJtb2RlIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIwIiBpZD0ic3VibW9kZSIvPg0KICAgIDx0cj4NCiAgICAgIDx0ZCBjb2xzcGFuPSIyIiBiZ2NvbG9yPSIjRjlGQ0VGIj4mbmJzcDs8Zm9udCBjb2xvcj0ncmVkJz7E+snQzrS/qs2oYlNoYXJlo6zH68/Iv6rNqGJTaGFyZbf+zvGjujwvZm9udD48L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPg0KICAgICAgPHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCIgYmdjb2xvcj0iI0ZGRkZGRiI+Jm5ic3A7PGI+zfjVvtPyw/ujujwvYj48L3RkPg0KICAgICAgPHRkIHdpZHRoPSI4MCUiIGJnY29sb3I9IiNGRkZGRkYiPiAmbmJzcDsmbmJzcDs8P3BocCBlY2hvICRfU0VSVkVSWydIVFRQX0hPU1QnXTs/PjwvdGQ+DQogICAgPC90cj4NCiAgICA8dHI+DQogICAgICA8dGQgYWxpZ249InJpZ2h0IiBiZ2NvbG9yPSIjRkZGRkZGIj4mbmJzcDs8Yj7Vy7rFwODQzaO6PC9iPjwvdGQ+DQogICAgICA8dGQgYmdjb2xvcj0iI0ZGRkZGRiI+IDxpbnB1dCBuYW1lPSJiaW5kdHlwZSIgdHlwZT0icmFkaW8iIGlkPSJiaW5kdHlwZTAiIHZhbHVlPSIwIiBjaGVja2VkPSJjaGVja2VkIiBjbGFzcz0iYmluZHR5cGUiLz4NCiAgICAgICAg0MLXorLhIA0KICAgICAgICAgIDxpbnB1dCBuYW1lPSJiaW5kdHlwZSIgdHlwZT0icmFkaW8iIHZhbHVlPSIxIiBjbGFzcz0iYmluZHR5cGUiLz4NCtLRvq3T0NXLusU8L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPg0KICAgICAgPHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCIgYmdjb2xvcj0iI0ZGRkZGRiI+Jm5ic3A7PGI+08O7p8P7o7o8L2I+PC90ZD4NCiAgICAgIDx0ZCB3aWR0aD0iODAlIiBiZ2NvbG9yPSIjRkZGRkZGIj4mbmJzcDsNCiAgICAgICAgPGlucHV0IG5hbWU9InVzZXIiIHR5cGU9InRleHQiIGlkPSJ1c2VyIiBzaXplPSIzMCIgY2xhc3M9J2FsbHR4dCcgLz4gDQogICAgICAgIChFLU1haWy12Na3KTwvdGQ+DQogICAgPC90cj4NCiAgICA8dHI+DQogICAgICA8dGQgYWxpZ249InJpZ2h0IiBiZ2NvbG9yPSIjRkZGRkZGIj4mbmJzcDs8Yj7D3CZuYnNwOyZuYnNwO8Lro7o8L2I+PC90ZD4NCiAgICAgIDx0ZCBiZ2NvbG9yPSIjRkZGRkZGIj4mbmJzcDsNCiAgICAgICAgPGlucHV0IG5hbWU9InB3ZCIgdHlwZT0icGFzc3dvcmQiIGlkPSJwd2QiIHNpemU9IjMwIiBjbGFzcz0nYWxsdHh0JyAvPjwvdGQ+DQogICAgPC90cj4NCiAgICA8dHIgaWQ9InJlcHdkU2hvdyI+DQogICAgICA8dGQgYWxpZ249InJpZ2h0IiBiZ2NvbG9yPSIjRkZGRkZGIj4mbmJzcDs8Yj7It8jPw9zC66O6PC9iPjwvdGQ+DQogICAgICA8dGQgYmdjb2xvcj0iI0ZGRkZGRiI+Jm5ic3A7DQogICAgICAgIDxpbnB1dCBuYW1lPSJyZXB3ZCIgdHlwZT0icGFzc3dvcmQiIGlkPSJyZXB3ZCIgc2l6ZT0iMzAiIGNsYXNzPSdhbGx0eHQnIC8+PC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjRkZGRkZGIj48aW5wdXQgbmFtZT0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJucCBjb29sYmciIGlkPSJidXR0b24iIHZhbHVlPSK/qs2oYlNoYXJlt/7O8SIgLz48L3RkPg0KICAgIDwvdHI+DQogIDwvZm9ybT4NCiAgPHRyPg0KICAgIDx0ZCBiZ2NvbG9yPSIjRjlGQ0VGIiBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPg0KICA8L3RyPg0KPC90YWJsZT4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCihmdW5jdGlvbigkKQ0Kew0KCXZhciByZWd1bGFyID0gL14oKChbYS16XXxcZHxbISNcJCUmJ1wqXCtcLVwvPVw/XF5fYHtcfH1+XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkrKFwuKFthLXpdfFxkfFshI1wkJSYnXCpcK1wtXC89XD9cXl9ge1x8fX5dfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSspKil8KChceDIyKSgoKChceDIwfFx4MDkpKihceDBkXHgwYSkpPyhceDIwfFx4MDkpKyk/KChbXHgwMS1ceDA4XHgwYlx4MGNceDBlLVx4MWZceDdmXXxceDIxfFtceDIzLVx4NWJdfFtceDVkLVx4N2VdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoXFwoW1x4MDEtXHgwOVx4MGJceDBjXHgwZC1ceDdmXXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKSkqKCgoXHgyMHxceDA5KSooXHgwZFx4MGEpKT8oXHgyMHxceDA5KSspPyhceDIyKSkpQCgoKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4pKygoW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCgoW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSooW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSlcLj8kL2k7DQoJDQoJZnVuY3Rpb24gY2hlY2tTaG93KGRvYykNCgl7DQoJCSQoIiNzdWJtb2RlIikudmFsKGRvYy52YWwoKSk7DQoJCWlmKGRvYy52YWwoKSA9PTEpDQoJCXsNCgkJCSQoIiNyZXB3ZFNob3ciKS5oaWRlKCk7DQoJCX0gZWxzZSB7DQoJCQkkKCIjcmVwd2RTaG93Iikuc2hvdygpOw0KCQl9DQoJfQ0KCWNoZWNrU2hvdygkKCIuYmluZHR5cGUiKSk7DQoJDQoJJCgiI2Zvcm0yIikuc3VibWl0KGZ1bmN0aW9uKCl7DQoJCWlmKCFyZWd1bGFyLnRlc3QoJCgiI3VzZXIiKS52YWwoKSkpDQoJCXsNCgkJCWFsZXJ0KCfH68rkyOvV/ci3tcTTys/ktdjWt6OhJyk7DQoJCQkkKCIjdXNlciIpLmZvY3VzKCk7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJaWYoJCgiI3B3ZCIpLnZhbCgpID09ICcnKQ0KCQl7DQoJCQlhbGVydCgnx+vK5Mjrw9zC66OhJyk7DQoJCQkkKCIjcHdkIikuZm9jdXMoKTsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlpZigkKCIjc3VibW9kZSIpLnZhbCgpID09IDAgJiYgDQoJCSAgICAkKCIjcHdkIikudmFsKCkgIT0gJCgiI3JlcHdkIikudmFsKCkpDQoJCXsNCgkJCWFsZXJ0KCfD3MLr0OjSqrGjs9bSu9bCo6EnKTsNCgkJCSQoIiNyZXB3ZCIpLmZvY3VzKCk7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkgICAgcmV0dXJuIHRydWU7DQoJfSk7DQoJJCgiaW5wdXQ6cmFkaW8iKS5jaGFuZ2UoZnVuY3Rpb24oKQ0KCXsNCgkJY2hlY2tTaG93KCQodGhpcykpOw0KCX0pOw0KfSkoalF1ZXJ5KTsNCjwvc2NyaXB0Pg0KPC9ib2R5Pg0KPC9odG1sPg0K
PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD08P3BocCBlY2hvICRjZmdfc29mdF9sYW5nOyA/PiI+DQo8dGl0bGU+QlNoYXJlt9bP7bLlvP48L3RpdGxlPg0KPD9waHANCmlmKGlzX2ZpbGUoZGlybmFtZShfX2ZpbGVfXykuJy8uLi9pbWcvYmFzZS5jc3MnKSkNCnsNCj8+DQo8bGluayBocmVmPSJpbWcvYmFzZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+DQo8P3BocA0KfSBlbHNlIHsNCj8+DQo8bGluayBocmVmPSJjc3MvYmFzZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+DQo8P3BocA0KfQ0KPz4NCjxsaW5rIGhyZWY9J2Nzcy9ib3h5LmNzcycgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycgLz4NCjw/cGhwDQppZihpc19maWxlKERFREVJTkMuJy9qcy9qcXVlcnkvanF1ZXJ5LmpzJykpDQp7DQo/Pg0KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSIuLi9pbmNsdWRlL2pzL2pxdWVyeS9qcXVlcnkuanMiPjwvc2NyaXB0Pg0KPD9waHANCn0gZWxzZSB7DQo/Pg0KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSIuLi9pbWFnZXMvanMvai5qcyI+PC9zY3JpcHQ+DQo8P3BocA0KfQ0KPz4NCjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0ianMvbWFpbi5qcyI+PC9zY3JpcHQ+DQo8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9ImpzL2JveHkuanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvY2FsZW5kYXIvY2FsZW5kYXIuanMiPjwvc2NyaXB0Pg0KPC9oZWFkPg0KPGJvZHkgYmFja2dyb3VuZD0iaW1hZ2VzL2FsbGJnLmdpZiIgbGVmdG1hcmdpbj0iOCIgdG9wbWFyZ2luPSI4Ij4NCjxkaXYgY2xhc3M9ImJvZHl0aXRsZSI+DQogIDxkaXYgY2xhc3M9ImJvZHl0aXRsZWxlZnQiPjwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJib2R5dGl0bGV0eHQiIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTBweDsiPrio1vqy5bz+PC9kaXY+DQo8L2Rpdj4NCjx0YWJsZSB3aWR0aD0iOTglIiBib3JkZXI9IjAiIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMSIgY2xhc3M9InRidGl0bGUiIHN0eWxlPSJiYWNrZ3JvdW5kOiNDRkNGQ0Y7Ij4NCiAgPHRyPg0KICAgIDx0ZCBiZ2NvbG9yPSIjRURGOUQ1IiBjb2xzcGFuPSIyIiBiYWNrZ3JvdW5kPSdpbWFnZXMvdGJnLmdpZicgc3R5bGU9InBhZGRpbmctbGVmdDoxMHB4OyI+PHN0cm9uZz5iU2hhcmW31s/tsuW8/jwvc3Ryb25nPjwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY29sc3Bhbj0iMiIgYmdjb2xvcj0iI0Y5RkNFRiI+Jm5ic3A7xPrS0b6tv6rNqGJTaGFyZbf+zvGjujwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0IiBiZ2NvbG9yPSIjRkZGRkZGIj4mbmJzcDs8Yj7Tw7unw/ujujwvYj48L3RkPg0KICAgIDx0ZCB3aWR0aD0iODAlIiBiZ2NvbG9yPSIjRkZGRkZGIj4mbmJzcDsmbmJzcDs8P3BocCBlY2hvIGlzc2V0KCRjZmdfYnNoYXJlWyd1c2VyJ10pPyAkY2ZnX2JzaGFyZVsndXNlciddIDogJyc7Pz48L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGFsaWduPSJyaWdodCIgYmdjb2xvcj0iI0ZGRkZGRiI+Jm5ic3A7PGI+VVVJRKO6PC9iPjwvdGQ+DQogICAgPHRkIGJnY29sb3I9IiNGRkZGRkYiPiZuYnNwOyA8P3BocCBlY2hvIGlzc2V0KCRjZmdfYnNoYXJlWyd1dWlkJ10pPyAkY2ZnX2JzaGFyZVsndXVpZCddIDogJyc7Pz48L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJyaWdodCIgYmdjb2xvcj0iI0ZGRkZGRiI+Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCIgYmdjb2xvcj0iI0Y5RkNFRiI+x7DMqLX308PR+cq9L7T6wuujujwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiIGJnY29sb3I9IiNGRkZGRkYiPg0KICAgIDxmb3JtIGFjdGlvbj0icGx1c19ic2hhcmUucGhwP2RvPXNldGNvZGUiIG1ldGhvZD0icG9zdCIgaWQ9ImZvcm0xIj4NCiAgICA8cD7E2sjd0rPD5tbQ1rG907zTyOs8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj57ZGVkZTpic2hhcmUvfTwvc3Bhbj6jrLvy1d/KudPDOjxiciAvPg0KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4mbHQ7c2NyaXB0IHNyYz0nPD9waHAgZWNobyAkY2ZnX3BocHVybDs/Pi9ic2hhcmUucGhwJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJmd0OyZsdDsvc2NyaXB0Jmd0Ozwvc3Bhbj48YnIgLz4NCiAgICAgILy0v8m199PDt9bP7bLlvP6hozwvcD4NCiAgICAgIDxwPg0KICAgICAgICA8dGV4dGFyZWEgbmFtZT0iYnNjb2RlIiBpZD0iYnNjb2RlIiBjb2xzPSI2MCIgcm93cz0iMyI+PD9waHAgZWNobyAkYnNoYXJlQ29kZTs/Pg0KICAgICAgICA8L3RleHRhcmVhPg0KICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiBuYW1lPSJzZWxlY3RTdHlsZSIgaWQ9InNlbGVjdFN0eWxlIiB2YWx1ZT0i0aHU8dH5yr0iIC8+DQogICAgICAgIDwvYT4gPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYnV0dG9uIiBpZD0iYnV0dG9uIiB2YWx1ZT0iyei2qNH5yr0iIC8+PC9wPg0KICAgICAgICA8L2Zvcm0+DQogICAgICA8ZGl2IGlkPSJic2hhcmVDb2RlIiBzdHlsZT0iZGlzcGxheTpub25lIj4NCiAgICAgICAgPGlmcmFtZSBzcmM9Ijw/cGhwIGVjaG8gJGNmZ19waHB1cmw7Pz4vYnNoYXJlLnBocD9kb3Bvc3Q9Z2V0Y29kZSZ1dWlkPTw/cGhwIGVjaG8gaXNzZXQoJGNmZ19ic2hhcmVbJ3V1aWQnXSk/ICRjZmdfYnNoYXJlWyd1dWlkJ10gOiAnJzs/PiIgbmFtZT0iYnNoYXJlIiB3aWR0aD0iNzgwcHgiIGhlaWdodD0iMzAwcHgiIHNjcm9sbGluZz0ibm8iPg0KICAgICAgICA8L2lmcmFtZT4NCiAgICAgIDwvZGl2PjwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiIGJnY29sb3I9IiNGRkZGRkYiPtH5yr3UpMDAo7o8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0IiBiZ2NvbG9yPSIjRkZGRkZGIj48P3BocCBlY2hvICRic2hhcmVDb2RlOz8+PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBiZ2NvbG9yPSIjRURGOUQ1IiBjb2xzcGFuPSIyIiBiYWNrZ3JvdW5kPSdpbWFnZXMvdGJnLmdpZicgc3R5bGU9InBhZGRpbmctbGVmdDoxMHB4OyI+PHN0cm9uZz7Ns7zG0MXPojwvc3Ryb25nPjwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiIGJnY29sb3I9IiNGOUZDRUYiPtGh1PGy6dGvzPW8/qO6PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCIgYmdjb2xvcj0iI0ZGRkZGRiI+v6rKvKO6DQogICAgICA8Zm9ybSBpZD0iZm9ybTIiIG5hbWU9ImZvcm0xIiBtZXRob2Q9ImdldCIgYWN0aW9uPSIiIHRhcmdldD0iX3NlbGYiPg0KICAgICAgICA8aW5wdXQgbmFtZT0ic3RhcnR0aW1lIiB0eXBlPSJ0ZXh0IiBpZD0ic3RhcnR0aW1lIiBzdHlsZT0id2lkdGg6MTAwcHgiIHZhbHVlPSI8P3BocCBlY2hvICRzdGFydHRpbWU7Pz4iIHNpemU9IjYwIiAvPg0KICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KCQkJCQlDYWxlbmRhci5zZXR1cCh7DQoJCQkJCQlpbnB1dEZpZWxkICAgICA6ICAgICJzdGFydHRpbWUiLA0KCQkJCQkJaWZGb3JtYXQgICAgICAgOiAgICAiJVktJW0tJWQiLA0KCQkJCQkJc2hvd3NUaW1lICAgICAgOiAgICBmYWxzZSwNCgkJCQkJCXRpbWVGb3JtYXQgICAgIDogICAgIjI0Ig0KCQkJCQl9KTsNCjwvc2NyaXB0PrW9IL3hyvgNCiAgICAgICAgPGlucHV0IG5hbWU9ImVuZHRpbWUiIHR5cGU9InRleHQiIGlkPSJlbmR0aW1lIiBzdHlsZT0id2lkdGg6MTAwcHgiIHZhbHVlPSI8P3BocCBlY2hvICRlbmR0aW1lOz8+IiBzaXplPSI2MCIgLz4NCiAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCgkJCQkJQ2FsZW5kYXIuc2V0dXAoew0KCQkJCQkJaW5wdXRGaWVsZCAgICAgOiAgICAiZW5kdGltZSIsDQoJCQkJCQlpZkZvcm1hdCAgICAgICA6ICAgICIlWS0lbS0lZCIsDQoJCQkJCQlzaG93c1RpbWUgICAgICA6ICAgIGZhbHNlLA0KCQkJCQkJdGltZUZvcm1hdCAgICAgOiAgICAiMjQiDQoJCQkJCX0pOw0KPC9zY3JpcHQ+DQogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InNlYXJjaCIgaWQ9InNlYXJjaEJ0biIgdmFsdWU9IrLp0a8iLz4NCiAgICAgIDwvZm9ybT48L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNGRkZGRkYiPjx0YWJsZSB3aWR0aD0iOTglIiBib3JkZXI9IjAiIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgaWQ9ImhlYWQxIj4NCiAgICAgICAgPHRyPg0KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4NCiAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODQiIGFsaWduPSJjZW50ZXIiIGJhY2tncm91bmQ9ImltYWdlcy9pdGVtbm90ZTEuZ2lmIj4mbmJzcDvGvcyozbO8xiZuYnNwOzwvdGQ+DQogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4NCIgYWxpZ249ImNlbnRlciIgYmFja2dyb3VuZD0iaW1hZ2VzL2l0ZW1ub3RlMi5naWYiPjxhIGhyZWY9IiMiIG9uQ2xpY2s9IlNob3dJdGVtMigpIj48dT631s/tzbO8xjwvdT48L2E+PC90ZD4NCiAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgIDwvdGFibGU+PC90ZD4NCiAgICAgICAgPC90cj4NCiAgICAgIDwvdGFibGU+DQogICAgICA8dGFibGUgd2lkdGg9Ijk4JSIgYm9yZGVyPSIwIiBhbGlnbj0iY2VudGVyIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGlkPSJoZWFkMiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+DQogICAgICAgIDx0cj4NCiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPjx0YWJsZSBoZWlnaHQ9IjI0IiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+DQogICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICA8dGQgd2lkdGg9Ijg0IiBhbGlnbj0iY2VudGVyIiBiYWNrZ3JvdW5kPSJpbWFnZXMvaXRlbW5vdGUyLmdpZiI+PGEgaHJlZj0iIyIgb25DbGljaz0iU2hvd0l0ZW0xKCkiPjx1Psa9zKjNs7zGPC91PjwvYT4mbmJzcDs8L3RkPg0KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODQiIGFsaWduPSJjZW50ZXIiIGJhY2tncm91bmQ9ImltYWdlcy9pdGVtbm90ZTEuZ2lmIj631s/tzbO8xjwvdGQ+DQogICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICA8L3RhYmxlPjwvdGQ+DQogICAgICAgIDwvdHI+DQogICAgICA8L3RhYmxlPg0KICAgICAgPHRhYmxlIHdpZHRoPSI5OCUiICBib3JkZXI9IjAiIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiIgaWQ9Im5lZWRzZXQiIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNjZmNmY2Y7YmFja2dyb3VuZDojZmZmZmZmO21hcmdpbi10b3A6LTVweDsiPg0KICAgICAgICA8dHI+DQogICAgICAgICAgPHRkIHdpZHRoPSI0MDAlIiBoZWlnaHQ9IjI0IiBhbGlnbj0ibGVmdCIgY2xhc3M9ImJsaW5lIj48dGFibGUgd2lkdGg9IjQ5OCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxNTIiPiZuYnNwO2JVUkzJ572707DP7MGmt9bO9qO6PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQgd2lkdGg9JzM0Nic+Jm5ic3A7PC90ZD4NCiAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4gy7XD96O6yv2+3bjxyr2hsMa9zKguKLfDzsrVvNPDsNm31rHIKS23w87KtM7K/aGxoaMgPGJyIC8+DQogICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iPD9waHAgZWNobyAkcGxhdGZvcm1Vcmw7Pz4iIGFsdD0iYlVSTMnnvbvTsM/swaa31s72IiBuYW1lPSJwbGF0Zm9ybWltZyIgaWQ9InBsYXRmb3JtaW1nIiAvPjwvdGQ+DQogICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICA8L3RhYmxlPjwvdGQ+DQogICAgICAgIDwvdHI+DQogICAgICA8L3RhYmxlPg0KICAgICAgPHRhYmxlIHdpZHRoPSI5OCUiICBib3JkZXI9IjAiIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiIgaWQ9ImFkc2V0IiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjY2ZjZmNmO2JhY2tncm91bmQ6I2ZmZmZmZjsgbWFyZ2luLXRvcDotNXB4O2Rpc3BsYXk6bm9uZSI+DQogICAgICAgIDx0cj4NCiAgICAgICAgICA8dGQgaGVpZ2h0PSIyNCIgY2xhc3M9ImJsaW5lIiBhbGlnbj0ibGVmdCIgPjx0YWJsZSB3aWR0aD0iNDk4IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQogICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PSIyMiI+PHN0cm9uZz631s/tzbO8xtDFz6Kjujwvc3Ryb25nPjwvdGQ+DQogICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PSIyMiI+PHA+t9bP7cG/zbO8xrHtOjwvcD4NCiAgICAgICAgICAgICAgICAgIDxwPjxpbWcgc3JjPSI8P3BocCBlY2hvICRzaGFyZVVybDs/PiIgYWx0PSJiVVJMyee9u9Owz+zBprfWzvYiIC8+PC9wPg0KICAgICAgICAgICAgICAgICAgPHA+teO7982zvMax7TwvcD4NCiAgICAgICAgICAgICAgICAgIDxwPjxpbWcgc3JjPSI8P3BocCBlY2hvICRjbGlja1VybDs/PiIgYWx0PSJiVVJMyee9u9Owz+zBprfWzvYiIC8+PC9wPjwvdGQ+DQogICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICA8L3RhYmxlPjwvdGQ+DQogICAgICAgIDwvdHI+DQogICAgICA8L3RhYmxlPjwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgYmdjb2xvcj0iI0Y5RkNFRiIgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4NCiAgPC90cj4NCjwvdGFibGU+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQooZnVuY3Rpb24oJCl7DQoJJCgiI3NlbGVjdFN0eWxlIikuY2xpY2soZnVuY3Rpb24oKQ0KCXsNCgkJaWYoJC5icm93c2VyLm1zaWUpDQoJCXsNCgkJCWlmKCROYXYoKT09J0lFJyl7IHZhciBwb3NMZWZ0ID0gd2luZG93LmV2ZW50LmNsaWVudFgtMTAwOyB2YXIgcG9zVG9wID0gd2luZG93LmV2ZW50LmNsaWVudFk7IH0NCgkJCWVsc2V7IHZhciBwb3NMZWZ0ID0gMTAwOyB2YXIgcG9zVG9wID0gMTAwOyB9DQoJCQl3aW5kb3cub3BlbignPD9waHAgZWNobyAkY2ZnX3BocHVybDs/Pi9ic2hhcmUucGhwP2RvcG9zdD1nZXRjb2RlJnV1aWQ9PD9waHAgZWNobyBpc3NldCgkY2ZnX2JzaGFyZVsndXVpZCddKT8gJGNmZ19ic2hhcmVbJ3V1aWQnXSA6ICcnOz8+JywnZ2V0Q29kZScsJ3Njcm9sbGJhcnM9bm8sd2lkdGg9NzgwcHgsaGVpZ2h0PTMwMHB4LHRvcD0nK3Bvc1RvcCsnLGxlZnQ9Jytwb3NMZWZ0KQ0KCQl9ZWxzZSB7DQoJCQluZXcgQm94eSgkKCIjYnNoYXJlQ29kZSIpLHt0aXRsZTonu/HIoWJTaGFyZbT6wusnLGRyYWdnYWJsZTogdHJ1ZSxjbG9zZVRleHQ6J7nYsdUnfSk7DQoJCX0NCgkJLy8gbmV3IEJveHkoJCgiI2JzaGFyZUNvZGUiKSx7dGl0bGU6J7vxyKFiU2hhcmW0+sLrJyxkcmFnZ2FibGU6IHRydWUsY2xvc2VUZXh0Oie52LHVJ30pOw0KCX0pOw0KfSkoalF1ZXJ5KTsNCjwvc2NyaXB0Pg0KPC9ib2R5Pg0KPC9odG1sPg0K
PD9waHAgICBpZighZGVmaW5lZCgnREVERUlOQycpKSBleGl0KCdSZXF1ZXN0IEVycm9yIScpOw0KDQogDQpmdW5jdGlvbiBsaWJfYnNoYXJlKCYkY3RhZywmJHJlZk9iaikNCnsNCiAgICBnbG9iYWwgJGRzcWwsJGVudnM7DQoNCiAgICAkYXR0bGlzdD0ndHlwZXwwJzsNCiAgICBGaWxsQXR0c0RlZmF1bHQoJGN0YWctPkNBdHRyaWJ1dGUtPkl0ZW1zLCRhdHRsaXN0KTsNCiAgICBleHRyYWN0KCRjdGFnLT5DQXR0cmlidXRlLT5JdGVtcywgRVhUUl9TS0lQKTsNCiAgICAkYnNjb2RlRmlsZSA9IERFREVEQVRBLicvY2FjaGUvYnNoYXJlLmNvZGUuaW5jJzsNCiAgICBpZiAoIWZpbGVfZXhpc3RzKCRic2NvZGVGaWxlKSkgIHJldHVybiAnJzsNCiAgICANCiAgICAkcmV2YWwgPSBzdHJpcHNsYXNoZXMoZmlsZV9nZXRfY29udGVudHMoJGJzY29kZUZpbGUpKTsNCiAgICByZXR1cm4gJHJldmFsOw0KfQ==
LmJveHktd3JhcHBlciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfQ0KLmJveHktd3JhcHBlci5maXhlZCB7IHBvc2l0aW9uOiBmaXhlZDsgfQ0KDQogIC8qIE1vZGFsICovDQogIA0KICAuYm94eS1tb2RhbC1ibGFja291dCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IGxlZnQ6IDA7IHRvcDogMDsgfQ0KICANCiAgLyogQm9yZGVyICovDQoNCiAgLmJveHktd3JhcHBlciB7IGVtcHR5LWNlbGxzOiBzaG93OyB9DQoJLmJveHktd3JhcHBlciAudG9wLWxlZnQsDQoJLmJveHktd3JhcHBlciAudG9wLXJpZ2h0LA0KCS5ib3h5LXdyYXBwZXIgLmJvdHRvbS1yaWdodCwNCgkuYm94eS13cmFwcGVyIC5ib3R0b20tbGVmdCB7IHdpZHRoOiAxMHB4OyBoZWlnaHQ6IDEwcHg7IHBhZGRpbmc6IDAgfQ0KCQ0KCS5ib3h5LXdyYXBwZXIgLnRvcC1sZWZ0IHsgYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvYm94eS1udy5wbmcnKTsgfQ0KCS5ib3h5LXdyYXBwZXIgLnRvcC1yaWdodCB7IGJhY2tncm91bmQ6IHVybCgnLi4vaW1hZ2VzL2JveHktbmUucG5nJyk7IH0NCgkuYm94eS13cmFwcGVyIC5ib3R0b20tcmlnaHQgeyBiYWNrZ3JvdW5kOiB1cmwoJy4uL2ltYWdlcy9ib3h5LXNlLnBuZycpOyB9DQoJLmJveHktd3JhcHBlciAuYm90dG9tLWxlZnQgeyBiYWNrZ3JvdW5kOiB1cmwoJy4uL2ltYWdlcy9ib3h5LXN3LnBuZycpOyB9DQoJDQoJLyogSUU2KzcgaGFja3MgZm9yIHRoZSBib3JkZXIuIElFNyBzaG91bGQgc3VwcG9ydCB0aGlzIG5hdGl2ZWx5IGJ1dCBmYWlscyBpbiBjb25qdWN0aW9uIHdpdGggbW9kYWwgYmxhY2tvdXQgYmcuICovDQoJLyogTkI6IHRoZXNlIG11c3QgYmUgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcyB0byB5b3VyIGltYWdlcyAqLw0KCS5ib3h5LXdyYXBwZXIgLnRvcC1sZWZ0IHsgI2JhY2tncm91bmQ6IG5vbmU7ICNmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhSW1hZ2VMb2FkZXIoc3JjPScvaW1hZ2VzL2JveHktbncucG5nJyk7IH0NCgkuYm94eS13cmFwcGVyIC50b3AtcmlnaHQgeyAjYmFja2dyb3VuZDogbm9uZTsgI2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcihzcmM9Jy9pbWFnZXMvYm94eS1uZS5wbmcnKTsgfQ0KCS5ib3h5LXdyYXBwZXIgLmJvdHRvbS1yaWdodCB7ICNiYWNrZ3JvdW5kOiBub25lOyAjZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nL2ltYWdlcy9ib3h5LXNlLnBuZycpOyB9DQoJLmJveHktd3JhcHBlciAuYm90dG9tLWxlZnQgeyAjYmFja2dyb3VuZDogbm9uZTsgI2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcihzcmM9Jy9pbWFnZXMvYm94eS1zdy5wbmcnKTsgfQ0KCQ0KCS5ib3h5LXdyYXBwZXIgLnRvcCwNCgkuYm94eS13cmFwcGVyIC5ib3R0b20geyBoZWlnaHQ6IDEwcHg7IGJhY2tncm91bmQtY29sb3I6ICM2OTM7IG9wYWNpdHk6IDAuNjsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTYwKTsgcGFkZGluZzogMCB9DQoJDQoJLmJveHktd3JhcHBlciAubGVmdCwNCgkuYm94eS13cmFwcGVyIC5yaWdodCB7IHdpZHRoOiAxMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjNjkzOyBvcGFjaXR5OiAwLjY7IGZpbHRlcjogYWxwaGEob3BhY2l0eT02MCk7IHBhZGRpbmc6IDAgfQ0KCQ0KCS8qIFRpdGxlIGJhciAqLw0KCQ0KCS5ib3h5LXdyYXBwZXIgLnRpdGxlLWJhciB7DQoJcGFkZGluZzogNnB4Ow0KCXBvc2l0aW9uOiByZWxhdGl2ZTsNCgliYWNrZ3JvdW5kOiAjNjkzOw0KfQ0KCSAgLmJveHktd3JhcHBlciAudGl0bGUtYmFyLmRyYWdnaW5nIHsgY3Vyc29yOiBtb3ZlOyB9DQoJICAgIC5ib3h5LXdyYXBwZXIgLnRpdGxlLWJhciBoMiB7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6IHdoaXRlOyBsaW5lLWhlaWdodDogMTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBmb250LXdlaWdodDogbm9ybWFsOyB9DQoJICAgIC5ib3h5LXdyYXBwZXIgLnRpdGxlLWJhciAuY2xvc2UgeyBjb2xvcjogd2hpdGU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA2cHg7IHJpZ2h0OiA2cHg7IGZvbnQtc2l6ZTogOTAlOyBsaW5lLWhlaWdodDogMTsgfQ0KCQkNCgkvKiBDb250ZW50IFJlZ2lvbiAqLw0KCQ0KCS5ib3h5LWlubmVyIHsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IHBhZGRpbmc6IDAgfQ0KCS5ib3h5LWNvbnRlbnQgeyBwYWRkaW5nOiAxNXB4OyB9DQoJDQoJLyogUXVlc3Rpb24gQm94ZXMgKi8NCg0KICAgIC5ib3h5LXdyYXBwZXIgLnF1ZXN0aW9uIHsgd2lkdGg6IDM1MHB4OyBtaW4taGVpZ2h0OiA4MHB4OyB9DQogICAgLmJveHktd3JhcHBlciAuYW5zd2VycyB7IHRleHQtYWxpZ246IHJpZ2h0OyB9DQo=
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABzSURBVHjaYkydbjSbAQn8/8fw+vO7X1eeXP14XNtR7D5MnIkBDTAyMYjyibA5qpoLBz64+MEcp0IYYOVg0pTR5HOBKWZhwAOYWRgVpFR5ra/uf/UKr0K4ydr8L5gYiAC8Qmw6RClkZGIQJUohXl+TrRAwADjPGwCguJFAAAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABtSURBVHjaYkybacwAA5f3vlKSVOWx4xdj12JmYRJmQAIsMMbd0++slI0FbTl4WNQYsAAWmCJpTT43Ng5mWQYcgJmNi0VJToffk52LRYkBD2CSVOWxw2UdikJ+MXYtBiIAE7rvcCpkIBJQXyFgAGVVDnD5wf0EAAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABeSURBVHjaYkyZajSXgQjAxEAkGCCFf//8e0uUwo+vfl4jqPDHlz+3nt/+cgivwl8//j5+fvvzYV1nsXss+E36fFjZVOgYAwMDAws2h3989fPa89tfDuk6i92DiQMGAK0XLiqZZn9wAAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABrSURBVHjaYkyZajSXgQjAxEAkoIHCv3/+vSVK4cdXP68RpfD57S+Hfnz5c4ugQl1nsXvPb38+/OvH38cEPaNsKnTs6fVPu/CZzGzsK8XAwMDAICTN+fjG0bfPWdiYGNk4mXmYmBi5kBUCBgDMvicLim3BWQAAAABJRU5ErkJggg==
LyoqCiAqIEJveHkgMC4xLjQgLSBGYWNlYm9vay1zdHlsZSBkaWFsb2csIHdpdGggZnJpbGxzCiAqCiAqIChjKSAyMDA4IEphc29uIEZyYW1lCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTElDRU5TRSkKICovCiAKLyoKICogalF1ZXJ5IHBsdWdpbgogKgogKiBPcHRpb25zOgogKiAgIG1lc3NhZ2U6IGNvbmZpcm1hdGlvbiBtZXNzYWdlIGZvciBmb3JtIHN1Ym1pdCBob29rIChkZWZhdWx0OiAiUGxlYXNlIGNvbmZpcm06IikKICogCiAqIEFueSBvdGhlciBvcHRpb25zIC0gZS5nLiAnY2xvbmUnIC0gd2lsbCBiZSBwYXNzZWQgb250byB0aGUgYm94eSBjb25zdHJ1Y3RvciAob3IKICogQm94eS5sb2FkIGZvciBBSkFYIG9wZXJhdGlvbnMpCiAqLwpqUXVlcnkuZm4uYm94eSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgICAgICAKICAgICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgc2VsZiA9IHRoaXM7CiAgICAgICAgaWYgKG5vZGUgPT0gJ2EnKSB7CiAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5jbGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBhY3RpdmUgPSBCb3h5LmxpbmtlZFRvKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIGhyZWYgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpLAogICAgICAgICAgICAgICAgICAgIGxvY2FsT3B0aW9ucyA9IGpRdWVyeS5leHRlbmQoe2FjdHVhdG9yOiB0aGlzLCB0aXRsZTogdGhpcy50aXRsZX0sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5zaG93KCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhyZWYuaW5kZXhPZignIycpID49IDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGpRdWVyeShocmVmLnN1YnN0cihocmVmLmluZGV4T2YoJyMnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50ID0gY29udGVudC5jbG9uZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICBjb250ZW50LnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIGxvY2FsT3B0aW9ucy51bmxvYWRPbkhpZGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBuZXcgQm94eShuZXdDb250ZW50LCBsb2NhbE9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZmFsbCBiYWNrIHRvIEFKQVg7IGNvdWxkIGRvIHdpdGggYSBzYW1lLW9yaWdpbiBjaGVjawogICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxPcHRpb25zLmNhY2hlKSBsb2NhbE9wdGlvbnMudW5sb2FkT25IaWRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBCb3h5LmxvYWQodGhpcy5ocmVmLCBsb2NhbE9wdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAobm9kZSA9PSAnZm9ybScpIHsKICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLmJpbmQoJ3N1Ym1pdC5ib3h5JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBCb3h5LmNvbmZpcm0ob3B0aW9ucy5tZXNzYWdlIHx8ICdQbGVhc2UgY29uZmlybTonLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkoc2VsZikudW5iaW5kKCdzdWJtaXQuYm94eScpLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0pOwp9OwoKLy8KLy8gQm94eSBDbGFzcwoKZnVuY3Rpb24gQm94eShlbGVtZW50LCBvcHRpb25zKSB7CiAgICAKICAgIHRoaXMuYm94eSA9IGpRdWVyeShCb3h5LldSQVBQRVIpOwogICAgalF1ZXJ5LmRhdGEodGhpcy5ib3h5WzBdLCAnYm94eScsIHRoaXMpOwogICAgCiAgICB0aGlzLnZpc2libGUgPSBmYWxzZTsKICAgIHRoaXMub3B0aW9ucyA9IGpRdWVyeS5leHRlbmQoe30sIEJveHkuREVGQVVMVFMsIG9wdGlvbnMgfHwge30pOwogICAgCiAgICBpZiAodGhpcy5vcHRpb25zLm1vZGFsKSB7CiAgICAgICAgdGhpcy5vcHRpb25zID0galF1ZXJ5LmV4dGVuZCh0aGlzLm9wdGlvbnMsIHtjZW50ZXI6IHRydWUsIGRyYWdnYWJsZTogZmFsc2V9KTsKICAgIH0KICAgIAogICAgLy8gb3B0aW9ucy5hY3R1YXRvciA9PSBET00gZWxlbWVudCB0aGF0IG9wZW5lZCB0aGlzIGJveHkKICAgIC8vIGFzc29jaWF0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBkZWxldGVkIHdoZW4gdGhpcyBib3h5IGlzIHJlbW92ZSgpZAogICAgaWYgKHRoaXMub3B0aW9ucy5hY3R1YXRvcikgewogICAgICAgIGpRdWVyeS5kYXRhKHRoaXMub3B0aW9ucy5hY3R1YXRvciwgJ2FjdGl2ZS5ib3h5JywgdGhpcyk7CiAgICB9CiAgICAKICAgIHRoaXMuc2V0Q29udGVudChlbGVtZW50IHx8ICI8ZGl2PjwvZGl2PiIpOwogICAgdGhpcy5fc2V0dXBUaXRsZUJhcigpOwogICAgCiAgICB0aGlzLmJveHkuY3NzKCdkaXNwbGF5JywgJ25vbmUnKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTsKICAgIHRoaXMudG9Ub3AoKTsKCiAgICBpZiAodGhpcy5vcHRpb25zLmZpeGVkKSB7CiAgICAgICAgaWYgKGpRdWVyeS5icm93c2VyLm1zaWUgJiYgalF1ZXJ5LmJyb3dzZXIudmVyc2lvbiA8IDcpIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZpeGVkID0gZmFsc2U7IC8vIElFNiBkb2Vzbid0IHN1cHBvcnQgZml4ZWQgcG9zaXRpb25pbmcKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmJveHkuYWRkQ2xhc3MoJ2ZpeGVkJyk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBpZiAodGhpcy5vcHRpb25zLmNlbnRlciAmJiBCb3h5Ll91KHRoaXMub3B0aW9ucy54LCB0aGlzLm9wdGlvbnMueSkpIHsKICAgICAgICB0aGlzLmNlbnRlcigpOwogICAgfSBlbHNlIHsKICAgICAgICB0aGlzLm1vdmVUbygKICAgICAgICAgICAgQm94eS5fdSh0aGlzLm9wdGlvbnMueCkgPyB0aGlzLm9wdGlvbnMueCA6IEJveHkuREVGQVVMVF9YLAogICAgICAgICAgICBCb3h5Ll91KHRoaXMub3B0aW9ucy55KSA/IHRoaXMub3B0aW9ucy55IDogQm94eS5ERUZBVUxUX1kKICAgICAgICApOwogICAgfQogICAgCiAgICBpZiAodGhpcy5vcHRpb25zLnNob3cpIHRoaXMuc2hvdygpOwoKfTsKCkJveHkuRUYgPSBmdW5jdGlvbigpIHt9OwoKalF1ZXJ5LmV4dGVuZChCb3h5LCB7CiAgICAKICAgIFdSQVBQRVI6ICAgICI8dGFibGUgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScwJyBib3JkZXI9JzAnIGNsYXNzPSdib3h5LXdyYXBwZXInPiIgKwogICAgICAgICAgICAgICAgIjx0cj48dGQgY2xhc3M9J3RvcC1sZWZ0Jz48L3RkPjx0ZCBjbGFzcz0ndG9wJz48L3RkPjx0ZCBjbGFzcz0ndG9wLXJpZ2h0Jz48L3RkPjwvdHI+IiArCiAgICAgICAgICAgICAgICAiPHRyPjx0ZCBjbGFzcz0nbGVmdCc+PC90ZD48dGQgY2xhc3M9J2JveHktaW5uZXInPjwvdGQ+PHRkIGNsYXNzPSdyaWdodCc+PC90ZD48L3RyPiIgKwogICAgICAgICAgICAgICAgIjx0cj48dGQgY2xhc3M9J2JvdHRvbS1sZWZ0Jz48L3RkPjx0ZCBjbGFzcz0nYm90dG9tJz48L3RkPjx0ZCBjbGFzcz0nYm90dG9tLXJpZ2h0Jz48L3RkPjwvdHI+IiArCiAgICAgICAgICAgICAgICAiPC90YWJsZT4iLAogICAgCiAgICBERUZBVUxUUzogewogICAgICAgIHRpdGxlOiAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAvLyB0aXRsZWJhciB0ZXh0LiB0aXRsZWJhciB3aWxsIG5vdCBiZSB2aXNpYmxlIGlmIG5vdCBzZXQuCiAgICAgICAgY2xvc2VhYmxlOiAgICAgICAgICAgICAgdHJ1ZSwgICAgICAgICAgIC8vIGRpc3BsYXkgY2xvc2UgbGluayBpbiB0aXRsZWJhcj8KICAgICAgICBkcmFnZ2FibGU6ICAgICAgICAgICAgICB0cnVlLCAgICAgICAgICAgLy8gY2FuIHRoaXMgZGlhbG9nIGJlIGRyYWdnZWQ/CiAgICAgICAgY2xvbmU6ICAgICAgICAgICAgICAgICAgZmFsc2UsICAgICAgICAgIC8vIGNsb25lIGNvbnRlbnQgcHJpb3IgdG8gaW5zZXJ0aW9uIGludG8gZGlhbG9nPwogICAgICAgIGFjdHVhdG9yOiAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAvLyBlbGVtZW50IHdoaWNoIG9wZW5lZCB0aGlzIGRpYWxvZwogICAgICAgIGNlbnRlcjogICAgICAgICAgICAgICAgIHRydWUsICAgICAgICAgICAvLyBjZW50ZXIgZGlhbG9nIGluIHZpZXdwb3J0PwogICAgICAgIHNob3c6ICAgICAgICAgICAgICAgICAgIHRydWUsICAgICAgICAgICAvLyBzaG93IGRpYWxvZyBpbW1lZGlhdGVseT8KICAgICAgICBtb2RhbDogICAgICAgICAgICAgICAgICBmYWxzZSwgICAgICAgICAgLy8gbWFrZSBkaWFsb2cgbW9kYWw/CiAgICAgICAgZml4ZWQ6ICAgICAgICAgICAgICAgICAgdHJ1ZSwgICAgICAgICAgIC8vIHVzZSBmaXhlZCBwb3NpdGlvbmluZywgaWYgc3VwcG9ydGVkPyBhYnNvbHV0ZSBwb3NpdGlvbmluZyB1c2VkIG90aGVyd2lzZQogICAgICAgIGNsb3NlVGV4dDogICAgICAgICAgICAgICdbY2xvc2VdJywgICAgICAvLyB0ZXh0IHRvIHVzZSBmb3IgZGVmYXVsdCBjbG9zZSBsaW5rCiAgICAgICAgdW5sb2FkT25IaWRlOiAgICAgICAgICAgZmFsc2UsICAgICAgICAgIC8vIHNob3VsZCB0aGlzIGRpYWxvZyBiZSByZW1vdmVkIGZyb20gdGhlIERPTSBhZnRlciBiZWluZyBoaWRkZW4/CiAgICAgICAgY2xpY2tUb0Zyb250OiAgICAgICAgICAgZmFsc2UsICAgICAgICAgIC8vIGJyaW5nIGRpYWxvZyB0byBmb3JlZ3JvdW5kIG9uIGFueSBjbGljayAobm90IGp1c3QgdGl0bGViYXIpPwogICAgICAgIGJlaGF2aW91cnM6ICAgICAgICAgICAgIEJveHkuRUYsICAgICAgICAvLyBmdW5jdGlvbiB1c2VkIHRvIGFwcGx5IGJlaGF2aW91cnMgdG8gYWxsIGNvbnRlbnQgZW1iZWRkZWQgaW4gZGlhbG9nLgogICAgICAgIGFmdGVyRHJvcDogICAgICAgICAgICAgIEJveHkuRUYsICAgICAgICAvLyBjYWxsYmFjayBmaXJlZCBhZnRlciBkaWFsb2cgaXMgZHJvcHBlZC4gZXhlY3V0ZXMgaW4gY29udGV4dCBvZiBCb3h5IGluc3RhbmNlLgogICAgICAgIGFmdGVyU2hvdzogICAgICAgICAgICAgIEJveHkuRUYsICAgICAgICAvLyBjYWxsYmFjayBmaXJlZCBhZnRlciBkaWFsb2cgYmVjb21lcyB2aXNpYmxlLiBleGVjdXRlcyBpbiBjb250ZXh0IG9mIEJveHkgaW5zdGFuY2UuCiAgICAgICAgYWZ0ZXJIaWRlOiAgICAgICAgICAgICAgQm94eS5FRiwgICAgICAgIC8vIGNhbGxiYWNrIGZpcmVkIGFmdGVyIGRpYWxvZyBpcyBoaWRkZW4uIGV4ZWN1dGVkIGluIGNvbnRleHQgb2YgQm94eSBpbnN0YW5jZS4KICAgICAgICBiZWZvcmVVbmxvYWQ6ICAgICAgICAgICBCb3h5LkVGICAgICAgICAgLy8gY2FsbGJhY2sgZmlyZWQgYWZ0ZXIgZGlhbG9nIGlzIHVubG9hZGVkLiBleGVjdXRlZCBpbiBjb250ZXh0IG9mIEJveHkgaW5zdGFuY2UuCiAgICB9LAogICAgCiAgICBERUZBVUxUX1g6ICAgICAgICAgIDUwLAogICAgREVGQVVMVF9ZOiAgICAgICAgICA1MCwKICAgIHpJbmRleDogICAgICAgICAgICAgMTMzNywKICAgIGRyYWdDb25maWd1cmVkOiAgICAgZmFsc2UsIC8vIG9ubHkgc2V0IHVwIG9uZSBkcmFnIGhhbmRsZXIgZm9yIGFsbCBib3h5cwogICAgcmVzaXplQ29uZmlndXJlZDogICBmYWxzZSwKICAgIGRyYWdnaW5nOiAgICAgICAgICAgbnVsbCwKICAgIAogICAgLy8gbG9hZCBhIFVSTCBhbmQgZGlzcGxheSBpbiBib3h5CiAgICAvLyB1cmwgLSB1cmwgdG8gbG9hZAogICAgLy8gb3B0aW9ucyBrZXlzIChhbnkgbm90IGxpc3RlZCBiZWxvdyBhcmUgcGFzc2VkIHRvIGJveHkgY29uc3RydWN0b3IpCiAgICAvLyAgIHR5cGU6IEhUVFAgbWV0aG9kLCBkZWZhdWx0OiBHRVQKICAgIC8vICAgY2FjaGU6IGNhY2hlIHJldHJpZXZlZCBjb250ZW50PyBkZWZhdWx0OiBmYWxzZQogICAgLy8gICBmaWx0ZXI6IGpRdWVyeSBzZWxlY3RvciB1c2VkIHRvIGZpbHRlciByZW1vdGUgY29udGVudAogICAgbG9hZDogZnVuY3Rpb24odXJsLCBvcHRpb25zKSB7CiAgICAgICAgCiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgCiAgICAgICAgdmFyIGFqYXggPSB7CiAgICAgICAgICAgIHVybDogdXJsLCB0eXBlOiAnR0VUJywgZGF0YVR5cGU6ICdodG1sJywgY2FjaGU6IGZhbHNlLCBzdWNjZXNzOiBmdW5jdGlvbihodG1sKSB7CiAgICAgICAgICAgICAgICBodG1sID0galF1ZXJ5KGh0bWwpOwogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyKSBodG1sID0galF1ZXJ5KG9wdGlvbnMuZmlsdGVyLCBodG1sKTsKICAgICAgICAgICAgICAgIG5ldyBCb3h5KGh0bWwsIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICBqUXVlcnkuZWFjaChbJ3R5cGUnLCAnY2FjaGUnXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzIGluIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGFqYXhbdGhpc10gPSBvcHRpb25zW3RoaXNdOwogICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnNbdGhpc107CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAKICAgICAgICBqUXVlcnkuYWpheChhamF4KTsKICAgICAgICAKICAgIH0sCiAgICAKICAgIC8vIGFsbG93cyB5b3UgdG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBjb250YWluaW5nIGJveHkgaW5zdGFuY2Ugb2YgYW55IGVsZW1lbnQKICAgIC8vIGUuZy4gPGEgaHJlZj0nIycgb25jbGljaz0nYWxlcnQoQm94eS5nZXQodGhpcykpOyc+aW5zcGVjdCE8L2E+LgogICAgLy8gdGhpcyByZXR1cm5zIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGJveHkgJ2NsYXNzJywgbm90IGp1c3QgYSBET00gZWxlbWVudC4KICAgIC8vIEJveHkuZ2V0KHRoaXMpLmhpZGUoKSB3b3VsZCBiZSB2YWxpZCwgZm9yIGluc3RhbmNlLgogICAgZ2V0OiBmdW5jdGlvbihlbGUpIHsKICAgICAgICB2YXIgcCA9IGpRdWVyeShlbGUpLnBhcmVudHMoJy5ib3h5LXdyYXBwZXInKTsKICAgICAgICByZXR1cm4gcC5sZW5ndGggPyBqUXVlcnkuZGF0YShwWzBdLCAnYm94eScpIDogbnVsbDsKICAgIH0sCiAgICAKICAgIC8vIHJldHVybnMgdGhlIGJveHkgaW5zdGFuY2Ugd2hpY2ggaGFzIGJlZW4gbGlua2VkIHRvIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlCiAgICAvLyAnYWN0dWF0b3InIGNvbnN0cnVjdG9yIG9wdGlvbi4KICAgIGxpbmtlZFRvOiBmdW5jdGlvbihlbGUpIHsKICAgICAgICByZXR1cm4galF1ZXJ5LmRhdGEoZWxlLCAnYWN0aXZlLmJveHknKTsKICAgIH0sCiAgICAKICAgIC8vIGRpc3BsYXlzIGFuIGFsZXJ0IGJveCB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSwgY2FsbGluZyBvcHRpb25hbCBjYWxsYmFjawogICAgLy8gYWZ0ZXIgZGlzbWlzc2FsLgogICAgYWxlcnQ6IGZ1bmN0aW9uKG1lc3NhZ2UsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIEJveHkuYXNrKG1lc3NhZ2UsIFsnT0snXSwgY2FsbGJhY2ssIG9wdGlvbnMpOwogICAgfSwKICAgIAogICAgLy8gZGlzcGxheXMgYW4gYWxlcnQgYm94IHdpdGggYSBnaXZlbiBtZXNzYWdlLCBjYWxsaW5nIGFmdGVyIGNhbGxiYWNrIGlmZgogICAgLy8gdXNlciBzZWxlY3RzIE9LLgogICAgY29uZmlybTogZnVuY3Rpb24obWVzc2FnZSwgYWZ0ZXIsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gQm94eS5hc2sobWVzc2FnZSwgWydPSycsICdDYW5jZWwnXSwgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09ICdPSycpIGFmdGVyKCk7CiAgICAgICAgfSwgb3B0aW9ucyk7CiAgICB9LAogICAgCiAgICAvLyBhc2tzIGEgcXVlc3Rpb24gd2l0aCBtdWx0aXBsZSByZXNwb25zZXMgcHJlc2VudGVkIGFzIGJ1dHRvbnMKICAgIC8vIHNlbGVjdGVkIGl0ZW0gaXMgcmV0dXJuZWQgdG8gYSBjYWxsYmFjayBtZXRob2QuCiAgICAvLyBhbnN3ZXJzIG1heSBiZSBlaXRoZXIgYW4gYXJyYXkgb3IgYSBoYXNoLiBpZiBpdCdzIGFuIGFycmF5LCB0aGUKICAgIC8vIHRoZSBjYWxsYmFjayB3aWxsIHJlY2VpdmVkIHRoZSBzZWxlY3RlZCB2YWx1ZS4gaWYgaXQncyBhIGhhc2gsCiAgICAvLyB5b3UnbGwgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIGtleS4KICAgIGFzazogZnVuY3Rpb24ocXVlc3Rpb24sIGFuc3dlcnMsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgCiAgICAgICAgb3B0aW9ucyA9IGpRdWVyeS5leHRlbmQoe21vZGFsOiB0cnVlLCBjbG9zZWFibGU6IGZhbHNlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHx8IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzaG93OiB0cnVlLCB1bmxvYWRPbkhpZGU6IHRydWV9KTsKICAgICAgICAKICAgICAgICB2YXIgYm9keSA9IGpRdWVyeSgnPGRpdj48L2Rpdj4nKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPSJxdWVzdGlvbiI+PC9kaXY+JykuaHRtbChxdWVzdGlvbikpOwogICAgICAgIAogICAgICAgIC8vIGljawogICAgICAgIHZhciBtYXAgPSB7fSwgYW5zd2VyU3RyaW5ncyA9IFtdOwogICAgICAgIGlmIChhbnN3ZXJzIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbnN3ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBtYXBbYW5zd2Vyc1tpXV0gPSBhbnN3ZXJzW2ldOwogICAgICAgICAgICAgICAgYW5zd2VyU3RyaW5ncy5wdXNoKGFuc3dlcnNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhbnN3ZXJzKSB7CiAgICAgICAgICAgICAgICBtYXBbYW5zd2Vyc1trXV0gPSBrOwogICAgICAgICAgICAgICAgYW5zd2VyU3RyaW5ncy5wdXNoKGFuc3dlcnNba10pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBidXR0b25zID0galF1ZXJ5KCc8Zm9ybSBjbGFzcz0iYW5zd2VycyI+PC9mb3JtPicpOwogICAgICAgIGJ1dHRvbnMuaHRtbChqUXVlcnkubWFwKGFuc3dlclN0cmluZ3MsIGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgcmV0dXJuICI8aW5wdXQgdHlwZT0nYnV0dG9uJyB2YWx1ZT0nIiArIHYgKyAiJyAvPiI7CiAgICAgICAgfSkuam9pbignICcpKTsKICAgICAgICAKICAgICAgICBqUXVlcnkoJ2lucHV0W3R5cGU9YnV0dG9uXScsIGJ1dHRvbnMpLmNsaWNrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2xpY2tlZCA9IHRoaXM7CiAgICAgICAgICAgIEJveHkuZ2V0KHRoaXMpLmhpZGUoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKG1hcFtjbGlja2VkLnZhbHVlXSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIGJvZHkuYXBwZW5kKGJ1dHRvbnMpOwogICAgICAgIAogICAgICAgIG5ldyBCb3h5KGJvZHksIG9wdGlvbnMpOwogICAgICAgIAogICAgfSwKICAgIAogICAgLy8gcmV0dXJucyB0cnVlIGlmIGEgbW9kYWwgYm94eSBpcyB2aXNpYmxlLCBmYWxzZSBvdGhlcndpc2UKICAgIGlzTW9kYWxWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4galF1ZXJ5KCcuYm94eS1tb2RhbC1ibGFja291dCcpLmxlbmd0aCA+IDA7CiAgICB9LAogICAgCiAgICBfdTogZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldICE9ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAogICAgCiAgICBfaGFuZGxlUmVzaXplOiBmdW5jdGlvbihldnQpIHsKICAgICAgICB2YXIgZCA9IGpRdWVyeShkb2N1bWVudCk7CiAgICAgICAgalF1ZXJ5KCcuYm94eS1tb2RhbC1ibGFja291dCcpLmNzcygnZGlzcGxheScsICdub25lJykuY3NzKHsKICAgICAgICAgICAgd2lkdGg6IGQud2lkdGgoKSwgaGVpZ2h0OiBkLmhlaWdodCgpCiAgICAgICAgfSkuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7CiAgICB9LAogICAgCiAgICBfaGFuZGxlRHJhZzogZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgdmFyIGQ7CiAgICAgICAgaWYgKGQgPSBCb3h5LmRyYWdnaW5nKSB7CiAgICAgICAgICAgIGRbMF0uYm94eS5jc3Moe2xlZnQ6IGV2dC5wYWdlWCAtIGRbMV0sIHRvcDogZXZ0LnBhZ2VZIC0gZFsyXX0pOwogICAgICAgIH0KICAgIH0sCiAgICAKICAgIF9uZXh0WjogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIEJveHkuekluZGV4Kys7CiAgICB9LAogICAgCiAgICBfdmlld3BvcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBkID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBiID0gZG9jdW1lbnQuYm9keSwgdyA9IHdpbmRvdzsKICAgICAgICByZXR1cm4galF1ZXJ5LmV4dGVuZCgKICAgICAgICAgICAgalF1ZXJ5LmJyb3dzZXIubXNpZSA/CiAgICAgICAgICAgICAgICB7IGxlZnQ6IGIuc2Nyb2xsTGVmdCB8fCBkLnNjcm9sbExlZnQsIHRvcDogYi5zY3JvbGxUb3AgfHwgZC5zY3JvbGxUb3AgfSA6CiAgICAgICAgICAgICAgICB7IGxlZnQ6IHcucGFnZVhPZmZzZXQsIHRvcDogdy5wYWdlWU9mZnNldCB9LAogICAgICAgICAgICAhQm94eS5fdSh3LmlubmVyV2lkdGgpID8KICAgICAgICAgICAgICAgIHsgd2lkdGg6IHcuaW5uZXJXaWR0aCwgaGVpZ2h0OiB3LmlubmVySGVpZ2h0IH0gOgogICAgICAgICAgICAgICAgKCFCb3h5Ll91KGQpICYmICFCb3h5Ll91KGQuY2xpZW50V2lkdGgpICYmIGQuY2xpZW50V2lkdGggIT0gMCA/CiAgICAgICAgICAgICAgICAgICAgeyB3aWR0aDogZC5jbGllbnRXaWR0aCwgaGVpZ2h0OiBkLmNsaWVudEhlaWdodCB9IDoKICAgICAgICAgICAgICAgICAgICB7IHdpZHRoOiBiLmNsaWVudFdpZHRoLCBoZWlnaHQ6IGIuY2xpZW50SGVpZ2h0IH0pICk7CiAgICB9Cgp9KTsKCkJveHkucHJvdG90eXBlID0gewogICAgCiAgICAvLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgYm94eSBpbnN0YW5jZSB3aXRob3V0IGRpc3BsYXlpbmcgaXQuCiAgICAvLyBEbyBub3QgdXNlIHRoaXMgbWV0aG9kIGlmIGJveHkgaXMgYWxyZWFkeSB2aXNpYmxlLCB1c2UgZ2V0U2l6ZSgpIGluc3RlYWQuCiAgICBlc3RpbWF0ZVNpemU6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuYm94eS5jc3Moe3Zpc2liaWxpdHk6ICdoaWRkZW4nLCBkaXNwbGF5OiAnYmxvY2snfSk7CiAgICAgICAgdmFyIGRpbXMgPSB0aGlzLmdldFNpemUoKTsKICAgICAgICB0aGlzLmJveHkuY3NzKCdkaXNwbGF5JywgJ25vbmUnKS5jc3MoJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpOwogICAgICAgIHJldHVybiBkaW1zOwogICAgfSwKICAgICAgICAgICAgICAgIAogICAgLy8gUmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW50aXJlIGJveHkgZGlhbG9nIGFzIFt3aWR0aCxoZWlnaHRdCiAgICBnZXRTaXplOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gW3RoaXMuYm94eS53aWR0aCgpLCB0aGlzLmJveHkuaGVpZ2h0KCldOwogICAgfSwKICAgIAogICAgLy8gUmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgY29udGVudCByZWdpb24gYXMgW3dpZHRoLGhlaWdodF0KICAgIGdldENvbnRlbnRTaXplOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYyA9IHRoaXMuZ2V0Q29udGVudCgpOwogICAgICAgIHJldHVybiBbYy53aWR0aCgpLCBjLmhlaWdodCgpXTsKICAgIH0sCiAgICAKICAgIC8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgZGlhbG9nIGFzIFt4LHldCiAgICBnZXRQb3NpdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGIgPSB0aGlzLmJveHlbMF07CiAgICAgICAgcmV0dXJuIFtiLm9mZnNldExlZnQsIGIub2Zmc2V0VG9wXTsKICAgIH0sCiAgICAKICAgIC8vIFJldHVybnMgdGhlIGNlbnRlciBwb2ludCBvZiB0aGlzIGRpYWxvZyBhcyBbeCx5XQogICAgZ2V0Q2VudGVyOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcCA9IHRoaXMuZ2V0UG9zaXRpb24oKTsKICAgICAgICB2YXIgcyA9IHRoaXMuZ2V0U2l6ZSgpOwogICAgICAgIHJldHVybiBbTWF0aC5mbG9vcihwWzBdICsgc1swXSAvIDIpLCBNYXRoLmZsb29yKHBbMV0gKyBzWzFdIC8gMildOwogICAgfSwKICAgICAgICAgICAgICAgIAogICAgLy8gUmV0dXJucyBhIGpRdWVyeSBvYmplY3Qgd3JhcHBpbmcgdGhlIGlubmVyIGJveHkgcmVnaW9uLgogICAgLy8gTm90IG11Y2ggcmVhc29uIHRvIHVzZSB0aGlzLCB5b3UncmUgcHJvYmFibHkgbW9yZSBpbnRlcmVzdGVkIGluIGdldENvbnRlbnQoKQogICAgZ2V0SW5uZXI6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBqUXVlcnkoJy5ib3h5LWlubmVyJywgdGhpcy5ib3h5KTsKICAgIH0sCiAgICAKICAgIC8vIFJldHVybnMgYSBqUXVlcnkgb2JqZWN0IHdyYXBwaW5nIHRoZSBib3h5IGNvbnRlbnQgcmVnaW9uLgogICAgLy8gVGhpcyBpcyB0aGUgdXNlci1lZGl0YWJsZSBjb250ZW50IGFyZWEgKGkuZS4gZXhjbHVkZXMgdGl0bGViYXIpCiAgICBnZXRDb250ZW50OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4galF1ZXJ5KCcuYm94eS1jb250ZW50JywgdGhpcy5ib3h5KTsKICAgIH0sCiAgICAKICAgIC8vIFJlcGxhY2UgZGlhbG9nIGNvbnRlbnQKICAgIHNldENvbnRlbnQ6IGZ1bmN0aW9uKG5ld0NvbnRlbnQpIHsKICAgICAgICBuZXdDb250ZW50ID0galF1ZXJ5KG5ld0NvbnRlbnQpLmNzcyh7ZGlzcGxheTogJ2Jsb2NrJ30pLmFkZENsYXNzKCdib3h5LWNvbnRlbnQnKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb25lKSBuZXdDb250ZW50ID0gbmV3Q29udGVudC5jbG9uZSh0cnVlKTsKICAgICAgICB0aGlzLmdldENvbnRlbnQoKS5yZW1vdmUoKTsKICAgICAgICB0aGlzLmdldElubmVyKCkuYXBwZW5kKG5ld0NvbnRlbnQpOwogICAgICAgIHRoaXMuX3NldHVwRGVmYXVsdEJlaGF2aW91cnMobmV3Q29udGVudCk7CiAgICAgICAgdGhpcy5vcHRpb25zLmJlaGF2aW91cnMuY2FsbCh0aGlzLCBuZXdDb250ZW50KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAKICAgIC8vIE1vdmUgdGhpcyBkaWFsb2cgdG8gc29tZSBwb3NpdGlvbiwgZnVubmlseSBlbm91Z2gKICAgIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHRoaXMubW92ZVRvWCh4KS5tb3ZlVG9ZKHkpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIAogICAgLy8gTW92ZSB0aGlzIGRpYWxvZyAoeC1jb29yZCBvbmx5KQogICAgbW92ZVRvWDogZnVuY3Rpb24oeCkgewogICAgICAgIGlmICh0eXBlb2YgeCA9PSAnbnVtYmVyJykgdGhpcy5ib3h5LmNzcyh7bGVmdDogeH0pOwogICAgICAgIGVsc2UgdGhpcy5jZW50ZXJYKCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgCiAgICAvLyBNb3ZlIHRoaXMgZGlhbG9nICh5LWNvb3JkIG9ubHkpCiAgICBtb3ZlVG9ZOiBmdW5jdGlvbih5KSB7CiAgICAgICAgaWYgKHR5cGVvZiB5ID09ICdudW1iZXInKSB0aGlzLmJveHkuY3NzKHt0b3A6IHl9KTsKICAgICAgICBlbHNlIHRoaXMuY2VudGVyWSgpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIAogICAgLy8gTW92ZSB0aGlzIGRpYWxvZyBzbyB0aGF0IGl0IGlzIGNlbnRlcmVkIGF0ICh4LHkpCiAgICBjZW50ZXJBdDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHZhciBzID0gdGhpc1t0aGlzLnZpc2libGUgPyAnZ2V0U2l6ZScgOiAnZXN0aW1hdGVTaXplJ10oKTsKICAgICAgICBpZiAodHlwZW9mIHggPT0gJ251bWJlcicpIHRoaXMubW92ZVRvWCh4IC0gc1swXSAvIDIpOwogICAgICAgIGlmICh0eXBlb2YgeSA9PSAnbnVtYmVyJykgdGhpcy5tb3ZlVG9ZKHkgLSBzWzFdIC8gMik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgCiAgICBjZW50ZXJBdFg6IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXJBdCh4LCBudWxsKTsKICAgIH0sCiAgICAKICAgIGNlbnRlckF0WTogZnVuY3Rpb24oeSkgewogICAgICAgIHJldHVybiB0aGlzLmNlbnRlckF0KG51bGwsIHkpOwogICAgfSwKICAgIAogICAgLy8gQ2VudGVyIHRoaXMgZGlhbG9nIGluIHRoZSB2aWV3cG9ydAogICAgLy8gYXhpcyBpcyBvcHRpb25hbCwgY2FuIGJlICd4JywgJ3knLgogICAgY2VudGVyOiBmdW5jdGlvbihheGlzKSB7CiAgICAgICAgdmFyIHYgPSBCb3h5Ll92aWV3cG9ydCgpOwogICAgICAgIHZhciBvID0gdGhpcy5vcHRpb25zLmZpeGVkID8gWzAsIDBdIDogW3YubGVmdCwgdi50b3BdOwogICAgICAgIGlmICghYXhpcyB8fCBheGlzID09ICd4JykgdGhpcy5jZW50ZXJBdChvWzBdICsgdi53aWR0aCAvIDIsIG51bGwpOwogICAgICAgIGlmICghYXhpcyB8fCBheGlzID09ICd5JykgdGhpcy5jZW50ZXJBdChudWxsLCBvWzFdICsgdi5oZWlnaHQgLyAyKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAKICAgIC8vIENlbnRlciB0aGlzIGRpYWxvZyBpbiB0aGUgdmlld3BvcnQgKHgtY29vcmQgb25seSkKICAgIGNlbnRlclg6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmNlbnRlcigneCcpOwogICAgfSwKICAgIAogICAgLy8gQ2VudGVyIHRoaXMgZGlhbG9nIGluIHRoZSB2aWV3cG9ydCAoeS1jb29yZCBvbmx5KQogICAgY2VudGVyWTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2VudGVyKCd5Jyk7CiAgICB9LAogICAgCiAgICAvLyBSZXNpemUgdGhlIGNvbnRlbnQgcmVnaW9uIHRvIGEgc3BlY2lmaWMgc2l6ZQogICAgcmVzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0LCBhZnRlcikgewogICAgICAgIGlmICghdGhpcy52aXNpYmxlKSByZXR1cm47CiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2dldEJvdW5kc0ZvclJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgICB0aGlzLmJveHkuY3NzKHtsZWZ0OiBib3VuZHNbMF0sIHRvcDogYm91bmRzWzFdfSk7CiAgICAgICAgdGhpcy5nZXRDb250ZW50KCkuY3NzKHt3aWR0aDogYm91bmRzWzJdLCBoZWlnaHQ6IGJvdW5kc1szXX0pOwogICAgICAgIGlmIChhZnRlcikgYWZ0ZXIodGhpcyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgCiAgICAvLyBUd2VlbiB0aGUgY29udGVudCByZWdpb24gdG8gYSBzcGVjaWZpYyBzaXplCiAgICB0d2VlbjogZnVuY3Rpb24od2lkdGgsIGhlaWdodCwgYWZ0ZXIpIHsKICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSkgcmV0dXJuOwogICAgICAgIHZhciBib3VuZHMgPSB0aGlzLl9nZXRCb3VuZHNGb3JSZXNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgIHRoaXMuYm94eS5zdG9wKCkuYW5pbWF0ZSh7bGVmdDogYm91bmRzWzBdLCB0b3A6IGJvdW5kc1sxXX0pOwogICAgICAgIHRoaXMuZ2V0Q29udGVudCgpLnN0b3AoKS5hbmltYXRlKHt3aWR0aDogYm91bmRzWzJdLCBoZWlnaHQ6IGJvdW5kc1szXX0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoYWZ0ZXIpIGFmdGVyKHNlbGYpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIAogICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgZGlhbG9nIGlzIHZpc2libGUsIGZhbHNlIG90aGVyd2lzZQogICAgaXNWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlOyAgICAKICAgIH0sCiAgICAKICAgIC8vIE1ha2UgdGhpcyBib3h5IGluc3RhbmNlIHZpc2libGUKICAgIHNob3c6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnZpc2libGUpIHJldHVybjsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1vZGFsKSB7CiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgaWYgKCFCb3h5LnJlc2l6ZUNvbmZpZ3VyZWQpIHsKICAgICAgICAgICAgICAgIEJveHkucmVzaXplQ29uZmlndXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBqUXVlcnkod2luZG93KS5yZXNpemUoZnVuY3Rpb24oKSB7IEJveHkuX2hhbmRsZVJlc2l6ZSgpOyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm1vZGFsQmxhY2tvdXQgPSBqUXVlcnkoJzxkaXYgY2xhc3M9ImJveHktbW9kYWwtYmxhY2tvdXQiPjwvZGl2PicpCiAgICAgICAgICAgICAgICAuY3NzKHt6SW5kZXg6IEJveHkuX25leHRaKCksCiAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjcsCiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogalF1ZXJ5KGRvY3VtZW50KS53aWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBqUXVlcnkoZG9jdW1lbnQpLmhlaWdodCgpfSkKICAgICAgICAgICAgICAgIC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTsKICAgICAgICAgICAgdGhpcy50b1RvcCgpOwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlYWJsZSkgewogICAgICAgICAgICAgICAgalF1ZXJ5KGRvY3VtZW50LmJvZHkpLmJpbmQoJ2tleXByZXNzLmJveHknLCBmdW5jdGlvbihldnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZXZ0LndoaWNoIHx8IGV2dC5rZXlDb2RlOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gMjcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShkb2N1bWVudC5ib2R5KS51bmJpbmQoJ2tleXByZXNzLmJveHknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmJveHkuc3RvcCgpLmNzcyh7b3BhY2l0eTogMX0pLnNob3coKTsKICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlOwogICAgICAgIHRoaXMuX2ZpcmUoJ2FmdGVyU2hvdycpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIAogICAgLy8gSGlkZSB0aGlzIGJveHkgaW5zdGFuY2UKICAgIGhpZGU6IGZ1bmN0aW9uKGFmdGVyKSB7CiAgICAgICAgaWYgKCF0aGlzLnZpc2libGUpIHJldHVybjsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RhbCkgewogICAgICAgICAgICBqUXVlcnkoZG9jdW1lbnQuYm9keSkudW5iaW5kKCdrZXlwcmVzcy5ib3h5Jyk7CiAgICAgICAgICAgIHRoaXMubW9kYWxCbGFja291dC5hbmltYXRlKHtvcGFjaXR5OiAwfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBqUXVlcnkodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0aGlzLmJveHkuc3RvcCgpLmFuaW1hdGUoe29wYWNpdHk6IDB9LCAzMDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZWxmLmJveHkuY3NzKHtkaXNwbGF5OiAnbm9uZSd9KTsKICAgICAgICAgICAgc2VsZi52aXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHNlbGYuX2ZpcmUoJ2FmdGVySGlkZScpOwogICAgICAgICAgICBpZiAoYWZ0ZXIpIGFmdGVyKHNlbGYpOwogICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLnVubG9hZE9uSGlkZSkgc2VsZi51bmxvYWQoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAKICAgIHRvZ2dsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpc1t0aGlzLnZpc2libGUgPyAnaGlkZScgOiAnc2hvdyddKCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgCiAgICBoaWRlQW5kVW5sb2FkOiBmdW5jdGlvbihhZnRlcikgewogICAgICAgIHRoaXMub3B0aW9ucy51bmxvYWRPbkhpZGUgPSB0cnVlOwogICAgICAgIHRoaXMuaGlkZShhZnRlcik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgCiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2ZpcmUoJ2JlZm9yZVVubG9hZCcpOwogICAgICAgIHRoaXMuYm94eS5yZW1vdmUoKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFjdHVhdG9yKSB7CiAgICAgICAgICAgIGpRdWVyeS5kYXRhKHRoaXMub3B0aW9ucy5hY3R1YXRvciwgJ2FjdGl2ZS5ib3h5JywgZmFsc2UpOwogICAgICAgIH0KICAgIH0sCiAgICAKICAgIC8vIE1vdmUgdGhpcyBkaWFsb2cgYm94IGFib3ZlIGFsbCBvdGhlciBib3h5IGluc3RhbmNlcwogICAgdG9Ub3A6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuYm94eS5jc3Moe3pJbmRleDogQm94eS5fbmV4dFooKX0pOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIAogICAgLy8gUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhpcyBkaWFsb2cKICAgIGdldFRpdGxlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4galF1ZXJ5KCc+IC50aXRsZS1iYXIgaDInLCB0aGlzLmdldElubmVyKCkpLmh0bWwoKTsKICAgIH0sCiAgICAKICAgIC8vIFNldHMgdGhlIHRpdGxlIG9mIHRoaXMgZGlhbG9nCiAgICBzZXRUaXRsZTogZnVuY3Rpb24odCkgewogICAgICAgIGpRdWVyeSgnPiAudGl0bGUtYmFyIGgyJywgdGhpcy5nZXRJbm5lcigpKS5odG1sKHQpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIAogICAgLy8KICAgIC8vIERvbid0IHRvdWNoIHRoZXNlIHByaXZhdGVzCiAgICAKICAgIF9nZXRCb3VuZHNGb3JSZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICB2YXIgY3NpemUgPSB0aGlzLmdldENvbnRlbnRTaXplKCk7CiAgICAgICAgdmFyIGRlbHRhID0gW3dpZHRoIC0gY3NpemVbMF0sIGhlaWdodCAtIGNzaXplWzFdXTsKICAgICAgICB2YXIgcCA9IHRoaXMuZ2V0UG9zaXRpb24oKTsKICAgICAgICByZXR1cm4gW01hdGgubWF4KHBbMF0gLSBkZWx0YVswXSAvIDIsIDApLAogICAgICAgICAgICAgICAgTWF0aC5tYXgocFsxXSAtIGRlbHRhWzFdIC8gMiwgMCksIHdpZHRoLCBoZWlnaHRdOwogICAgfSwKICAgIAogICAgX3NldHVwVGl0bGVCYXI6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLm9wdGlvbnMudGl0bGUpIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgdGIgPSBqUXVlcnkoIjxkaXYgY2xhc3M9J3RpdGxlLWJhcic+PC9kaXY+IikuaHRtbCgiPGgyPiIgKyB0aGlzLm9wdGlvbnMudGl0bGUgKyAiPC9oMj4iKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZWFibGUpIHsKICAgICAgICAgICAgICAgIHRiLmFwcGVuZChqUXVlcnkoIjxhIGhyZWY9JyMnIGNsYXNzPSdjbG9zZSc+PC9hPiIpLmh0bWwodGhpcy5vcHRpb25zLmNsb3NlVGV4dCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlKSB7CiAgICAgICAgICAgICAgICB0YlswXS5vbnNlbGVjdHN0YXJ0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgICAgICAgICAgdGJbMF0udW5zZWxlY3RhYmxlID0gJ29uJzsKICAgICAgICAgICAgICAgIHRiWzBdLnN0eWxlLk1velVzZXJTZWxlY3QgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICBpZiAoIUJveHkuZHJhZ0NvbmZpZ3VyZWQpIHsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZG9jdW1lbnQpLm1vdXNlbW92ZShCb3h5Ll9oYW5kbGVEcmFnKTsKICAgICAgICAgICAgICAgICAgICBCb3h5LmRyYWdDb25maWd1cmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRiLm1vdXNlZG93bihmdW5jdGlvbihldnQpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnRvVG9wKCk7CiAgICAgICAgICAgICAgICAgICAgQm94eS5kcmFnZ2luZyA9IFtzZWxmLCBldnQucGFnZVggLSBzZWxmLmJveHlbMF0ub2Zmc2V0TGVmdCwgZXZ0LnBhZ2VZIC0gc2VsZi5ib3h5WzBdLm9mZnNldFRvcF07CiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLmFkZENsYXNzKCdkcmFnZ2luZycpOwogICAgICAgICAgICAgICAgfSkubW91c2V1cChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkodGhpcykucmVtb3ZlQ2xhc3MoJ2RyYWdnaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgQm94eS5kcmFnZ2luZyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlyZSgnYWZ0ZXJEcm9wJyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmdldElubmVyKCkucHJlcGVuZCh0Yik7CiAgICAgICAgICAgIHRoaXMuX3NldHVwRGVmYXVsdEJlaGF2aW91cnModGIpOwogICAgICAgIH0KICAgIH0sCiAgICAKICAgIF9zZXR1cERlZmF1bHRCZWhhdmlvdXJzOiBmdW5jdGlvbihyb290KSB7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xpY2tUb0Zyb250KSB7CiAgICAgICAgICAgIHJvb3QuY2xpY2soZnVuY3Rpb24oKSB7IHNlbGYudG9Ub3AoKTsgfSk7CiAgICAgICAgfQogICAgICAgIGpRdWVyeSgnLmNsb3NlJywgcm9vdCkuY2xpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHNlbGYuaGlkZSgpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSkubW91c2Vkb3duKGZ1bmN0aW9uKGV2dCkgeyBldnQuc3RvcFByb3BhZ2F0aW9uKCk7IH0pOwogICAgfSwKICAgIAogICAgX2ZpcmU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgdGhpcy5vcHRpb25zW2V2ZW50XS5jYWxsKHRoaXMpOwogICAgfQogICAgCn07Cg==