Medicare Pathway
The interactive Medicare tool couldn’t load on this page. Please contact a BKM advisor and we’ll walk through your Medicare options with you.
Unlock your full report
See your complete Medicare plan Enter your contact information to view and download your full personalized report. A BKM advisor may follow up to answer your questions.
This interactive tool needs JavaScript. Please enable it in your browser, or contact a BKM advisor .
CihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwogIGZ1bmN0aW9uIGluaXQoKSB7CiAgICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJia21tcCIpOwogICAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5IikpIHJldHVybjsKICAgIHJvb3Quc2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5IiwgIjEiKTsKICAgIHZhciBCT09LSU5HX1VSTCA9ICJodHRwczovL291dGxvb2sub2ZmaWNlLmNvbS9ib29rL0JLTVdlYWx0aE1hbmFnZW1lbnQxQGJrbXdtLmNvbS9zL0FOSG5hMko4SlVpQjFBcVh6bHdlalEyP2lzbXNhbGpzYXV0aGVuYWJsZWQiOwogICAgdmFyIFdFQlNJVEVfVVJMID0gImh0dHBzOi8vd3d3LmJrbXdtLmNvbSI7CiAgICB2YXIgTU9OVEhTID0gWyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdOwogICAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKTsKICAgIHZhciBOT1cgPSB7IHk6IHRvZGF5LmdldEZ1bGxZZWFyKCksIG06IHRvZGF5LmdldE1vbnRoKCkgKyAxLCBkOiB0b2RheS5nZXREYXRlKCkgfTsKICAgIHZhciBUT0RBWSA9IHsgeTogTk9XLnksIG06IE5PVy5tLCBkOiBOT1cuZCB9OwogICAgLyogLS0tLS0tLS0tLSBkYXRlIGhlbHBlcnMgKG1vbnRocyAxLTEyKSAtLS0tLS0tLS0tICovCiAgICBmdW5jdGlvbiB5bSh5LCBtKSB7IHJldHVybiB7IHk6IHkgKyBNYXRoLmZsb29yKChtIC0gMSkgLyAxMiksIG06ICgoKChtIC0gMSkgJSAxMikgKyAxMikgJSAxMikgKyAxIH07IH0KICAgIGZ1bmN0aW9uIGFkZE1vbnRocyhwLCBkKSB7IHJldHVybiB5bShwLnksIHAubSArIGQpOyB9CiAgICBmdW5jdGlvbiBjbXAoYSwgYikgeyByZXR1cm4gKGEueSAtIGIueSkgfHwgKGEubSAtIGIubSk7IH0KICAgIGZ1bmN0aW9uIG1heFAoYSwgYikgeyByZXR1cm4gY21wKGEsIGIpID49IDAgPyBhIDogYjsgfQogICAgZnVuY3Rpb24gZm10KHApIHsgcmV0dXJuIE1PTlRIU1twLm0gLSAxXSArICIgIiArIHAueTsgfQogICAgZnVuY3Rpb24gc3BhbihhLCBiKSB7IHJldHVybiBjbXAoYSwgYikgPT09IDAgPyBmbXQoYSkgOiBmbXQoYSkgKyAiIFx1MjAxMyAiICsgZm10KGIpOyB9CiAgICBmdW5jdGlvbiBlZmY2NShiLCBmaXJzdCkgeyB2YXIgcCA9IHsgeTogYi55ICsgNjUsIG06IGIubSB9OyByZXR1cm4gZmlyc3QgPyBhZGRNb250aHMocCwgLTEpIDogcDsgfQogICAgZnVuY3Rpb24gZ2VwVGV4dCgpIHsgcmV0dXJuIE5PVy5tIDw9IDMgPyAiSmFudWFyeSAxIFx1MjAxMyBNYXJjaCAzMSwgIiArIE5PVy55ICsgIiAob3BlbiBub3cpIiA6ICJKYW51YXJ5IDEgXHUyMDEzIE1hcmNoIDMxLCAiICsgKE5PVy55ICsgMSk7IH0KICAgIGZ1bmN0aW9uIG9lcFRleHQoKSB7CiAgICAgIHZhciBvcGVuID0gTk9XLm0gPT09IDEwIHx8IE5PVy5tID09PSAxMSB8fCAoTk9XLm0gPT09IDEyICYmIE5PVy5kIDw9IDcpOwogICAgICB2YXIgeSA9IChOT1cubSA9PT0gMTIgJiYgTk9XLmQgPiA3KSA/IE5PVy55ICsgMSA6IE5PVy55OwogICAgICByZXR1cm4gIk9jdG9iZXIgMTUgXHUyMDEzIERlY2VtYmVyIDcsICIgKyB5ICsgKG9wZW4gPyAiIChvcGVuIG5vdykiIDogIiIpOwogICAgfQogICAgLyogLS0tLS0tLS0tLSBwcmVmZXJlbmNlIHF1ZXN0aW9ucyAtLS0tLS0tLS0tICovCiAgICB2YXIgQ0hPSUNFX1FVRVNUSU9OUyA9IFsKICAgICAgeyBpZDogInByb3ZpZGVycyIsIGV5ZWJyb3c6ICJZb3VyIGRvY3RvcnMiLCB0aXRsZTogIkhvdyBpbXBvcnRhbnQgaXMgY2hvb3NpbmcgeW91ciBvd24gZG9jdG9ycz8iLCBvcHRpb25zOiBbCiAgICAgICAgeyB2YWx1ZTogImFueV9kb2N0b3IiLCBsYWJlbDogIlZlcnkgXHUyMDE0IEkgd2FudCBhbnkgZG9jdG9yIG9yIHNwZWNpYWxpc3QsIG5vIG5ldHdvcmtzIG9yIHJlZmVycmFscyIsIHNjb3JlOiB7IG06IDIsIGE6IDAgfSB9LAogICAgICAgIHsgdmFsdWU6ICJuZXR3b3JrX29rIiwgbGFiZWw6ICJJJ20gY29tZm9ydGFibGUgdXNpbmcgYSBwbGFuJ3MgbmV0d29yayBvZiBkb2N0b3JzIiwgc2NvcmU6IHsgbTogMCwgYTogMiB9IH0sCiAgICAgICAgeyB2YWx1ZTogIm5vX3ByZWYiLCBsYWJlbDogIk5vIHN0cm9uZyBwcmVmZXJlbmNlIiwgc2NvcmU6IHsgbTogMCwgYTogMCB9IH0gXSB9LAogICAgICB7IGlkOiAidHJhdmVsIiwgZXllYnJvdzogIldoZXJlIHlvdSBsaXZlIiwgdGl0bGU6ICJIb3cgbXVjaCBkbyB5b3UgdHJhdmVsIG9yIGxpdmUgaW4gbW9yZSB0aGFuIG9uZSBwbGFjZT8iLCBvcHRpb25zOiBbCiAgICAgICAgeyB2YWx1ZTogInNub3diaXJkIiwgbGFiZWw6ICJPZnRlbiBcdTIwMTQgSSBzcGxpdCB0aW1lIGJldHdlZW4gc3RhdGVzIG9yIHRyYXZlbCBhIGxvdCBpbiB0aGUgVS5TLiIsIHNjb3JlOiB7IG06IDIsIGE6IDAgfSB9LAogICAgICAgIHsgdmFsdWU6ICJpbnRlcm5hdGlvbmFsIiwgbGFiZWw6ICJJIHRyYXZlbCBpbnRlcm5hdGlvbmFsbHkgZmFpcmx5IG9mdGVuIiwgc2NvcmU6IHsgbTogMSwgYTogMCB9IH0sCiAgICAgICAgeyB2YWx1ZTogImxvY2FsIiwgbGFiZWw6ICJJIG1vc3RseSBzdGF5IGNsb3NlIHRvIGhvbWUiLCBzY29yZTogeyBtOiAwLCBhOiAxIH0gfSBdIH0sCiAgICAgIHsgaWQ6ICJidWRnZXQiLCBleWVicm93OiAiWW91ciBidWRnZXQiLCB0aXRsZTogIldoaWNoIGNvc3Qgc3R5bGUgZml0cyB5b3UgYmV0dGVyPyIsIG9wdGlvbnM6IFsKICAgICAgICB7IHZhbHVlOiAicHJlZGljdGFibGUiLCBsYWJlbDogIlByZWRpY3RhYmxlIGJpbGxzIFx1MjAxNCBJJ2xsIHBheSBhIGhpZ2hlciBtb250aGx5IHByZW1pdW0gdG8gYXZvaWQgc3VycHJpc2VzIiwgc2NvcmU6IHsgbTogMiwgYTogMCB9IH0sCiAgICAgICAgeyB2YWx1ZTogImxvd2VzdF9wcmVtaXVtIiwgbGFiZWw6ICJMb3dlc3QgbW9udGhseSBwcmVtaXVtIFx1MjAxNCBJIGNhbiBoYW5kbGUgY29wYXlzIGFzIHRoZXkgY29tZSIsIHNjb3JlOiB7IG06IDAsIGE6IDIgfSB9LAogICAgICAgIHsgdmFsdWU6ICJiYWxhbmNlZCIsIGxhYmVsOiAiU29tZXdoZXJlIGluIGJldHdlZW4iLCBzY29yZTogeyBtOiAwLCBhOiAwIH0gfSBdIH0sCiAgICAgIHsgaWQ6ICJoZWFsdGgiLCBleWVicm93OiAiWW91ciBoZWFsdGgiLCB0aXRsZTogIldoYXQgZG9lcyB5b3VyIGNhcmUgbG9vayBsaWtlIHJpZ2h0IG5vdz8iLCBvcHRpb25zOiBbCiAgICAgICAgeyB2YWx1ZTogImNocm9uaWMiLCBsYWJlbDogIkkgbWFuYWdlIGNocm9uaWMgY29uZGl0aW9ucyBvciBleHBlY3Qgc2lnbmlmaWNhbnQgY2FyZSIsIHNjb3JlOiB7IG06IDIsIGE6IDAgfSB9LAogICAgICAgIHsgdmFsdWU6ICJoZWFsdGh5IiwgbGFiZWw6ICJHZW5lcmFsbHkgaGVhbHRoeSB3aXRoIHJvdXRpbmUgbmVlZHMiLCBzY29yZTogeyBtOiAwLCBhOiAxIH0gfSwKICAgICAgICB7IHZhbHVlOiAibWl4ZWQiLCBsYWJlbDogIkEgbWl4IC8gbm90IHN1cmUiLCBzY29yZTogeyBtOiAwLCBhOiAwIH0gfSBdIH0sCiAgICAgIHsgaWQ6ICJkcnVncyIsIGV5ZWJyb3c6ICJQcmVzY3JpcHRpb25zIiwgdGl0bGU6ICJIb3cgd291bGQgeW91IGRlc2NyaWJlIHlvdXIgcHJlc2NyaXB0aW9ucz8iLCBoZWxwOiAiRWl0aGVyIHBhdGggY2FuIGluY2x1ZGUgZHJ1ZyBjb3ZlcmFnZSBcdTIwMTQgdGhpcyBoZWxwcyB1cyBmbGFnIHdoYXQgdG8gY2hlY2suIiwgb3B0aW9uczogWwogICAgICAgIHsgdmFsdWU6ICJoaWdoX3J4IiwgbGFiZWw6ICJTZXZlcmFsLCBvciBvbmUgb3IgbW9yZSBleHBlbnNpdmUgc3BlY2lhbHR5IGRydWdzIiwgc2NvcmU6IHsgbTogMCwgYTogMCB9IH0sCiAgICAgICAgeyB2YWx1ZTogImxvd19yeCIsIGxhYmVsOiAiRmV3IG9yIG5vbmUgcmlnaHQgbm93Iiwgc2NvcmU6IHsgbTogMCwgYTogMCB9IH0gXSB9LAogICAgICB7IGlkOiAiZXh0cmFzIiwgZXllYnJvdzogIkV4dHJhIGJlbmVmaXRzIiwgdGl0bGU6ICJIb3cgbXVjaCBkbyBkZW50YWwsIHZpc2lvbiwgYW5kIGhlYXJpbmcgYmVuZWZpdHMgbWF0dGVyPyIsIG9wdGlvbnM6IFsKICAgICAgICB7IHZhbHVlOiAid2FudHNfZXh0cmFzIiwgbGFiZWw6ICJJbXBvcnRhbnQgXHUyMDE0IEknZCBsaWtlIHRoZW0gaW5jbHVkZWQiLCBzY29yZTogeyBtOiAwLCBhOiAxIH0gfSwKICAgICAgICB7IHZhbHVlOiAiZXh0cmFzX25ldXRyYWwiLCBsYWJlbDogIk5pY2UgdG8gaGF2ZSwgbm90IGEgZGVjaWRpbmcgZmFjdG9yIiwgc2NvcmU6IHsgbTogMCwgYTogMCB9IH0gXSB9CiAgICBdOwogICAgdmFyIENPVkVSQUdFX09QVElPTlMgPSBbCiAgICAgIHsgdjogImVtcGxveWVyX3NlbGYiLCBsOiAiQW4gYWN0aXZlIGVtcGxveWVyIG9yIHVuaW9uIHBsYW4gdGhyb3VnaCBteSBvd24gam9iIiwgczogImFjdGl2ZSBlbXBsb3llciBwbGFuIChvd24gam9iKSIgfSwKICAgICAgeyB2OiAiZW1wbG95ZXJfc3BvdXNlIiwgbDogIk15IHNwb3VzZSdzIG9yIHBhcnRuZXIncyBhY3RpdmUgZW1wbG95ZXIgcGxhbiIsIHM6ICJzcG91c2UncyBhY3RpdmUgZW1wbG95ZXIgcGxhbiIgfSwKICAgICAgeyB2OiAicmV0aXJlZV9jb2JyYSIsIGw6ICJSZXRpcmVlIGNvdmVyYWdlIG9yIENPQlJBIiwgczogInJldGlyZWUgY292ZXJhZ2Ugb3IgQ09CUkEiIH0sCiAgICAgIHsgdjogIm1hcmtldHBsYWNlIiwgbDogIkEgTWFya2V0cGxhY2UgLyBpbmRpdmlkdWFsIHBsYW4iLCBzOiAiTWFya2V0cGxhY2UgcGxhbiIgfSwKICAgICAgeyB2OiAidmEiLCBsOiAiVkEgaGVhbHRoIGNhcmUiLCBzOiAiVkEgaGVhbHRoIGNhcmUiIH0sCiAgICAgIHsgdjogIm5vbmVfb3RoZXIiLCBsOiAiTWVkaWNhaWQsIG5vIGNvdmVyYWdlLCBvciBzb21ldGhpbmcgZWxzZSIsIHM6ICJNZWRpY2FpZCAvIG5vbmUgLyBvdGhlciIgfSwKICAgICAgeyB2OiAiYWxyZWFkeV9tZWRpY2FyZSIsIGw6ICJJJ20gYWxyZWFkeSBlbnJvbGxlZCBpbiBNZWRpY2FyZSBQYXJ0cyBBIGFuZCBCIiwgczogImFscmVhZHkgb24gTWVkaWNhcmUiIH0KICAgIF07CiAgICAvKiAtLS0tLS0tLS0tIHN0YXRlIC0tLS0tLS0tLS0gKi8KICAgIGZ1bmN0aW9uIGJsYW5rSW50YWtlKCkgewogICAgICByZXR1cm4geyBiaXJ0aE06ICIiLCBiaXJ0aFk6ICIiLCBiaXJ0aDFzdDogZmFsc2UsIG1hcnJpZWQ6ICIiLCBzcG91c2VCaXJ0aE06ICIiLCBzcG91c2VCaXJ0aFk6ICIiLCBzcG91c2Uxc3Q6IGZhbHNlLAogICAgICAgIGNvdmVyYWdlVHlwZTogIiIsIGVtcFNpemU6ICIiLCBlbmRNOiAiIiwgZW5kWTogIiIsIGVuZFVua25vd246IGZhbHNlLCBoc2E6ICIiLCBvblNTOiAiIiwKICAgICAgICBzcG91c2VDb3Y6ICIiLCBzcG91c2VFbXBTaXplOiAiIiwgc3BvdXNlRW5kTTogIiIsIHNwb3VzZUVuZFk6ICIiLCBzcG91c2VFbmRVbmtub3duOiBmYWxzZSwgc3BvdXNlSHNhOiAiIiB9OwogICAgfQogICAgdmFyIHN0YXRlID0geyBzY3JlZW46ICJpbnRybyIsIHN0ZXA6IDAsIGludGFrZTogYmxhbmtJbnRha2UoKSwgYW5zd2Vyczoge30sIHVubG9ja2VkOiBmYWxzZSB9OwogICAgdmFyIGxlYWQgPSBudWxsOwogICAgZnVuY3Rpb24gYjY0dXJsKHN0cikgeyByZXR1cm4gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkpLnJlcGxhY2UoL1wrL2csICItIikucmVwbGFjZSgvXC8vZywgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7IH0KICAgIGZ1bmN0aW9uIHVuYjY0dXJsKHMpIHsgcyA9IHMucmVwbGFjZSgvLS9nLCAiKyIpLnJlcGxhY2UoL18vZywgIi8iKTsgd2hpbGUgKHMubGVuZ3RoICUgNCkgcyArPSAiPSI7IHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGF0b2IocykpKTsgfQogICAgZnVuY3Rpb24gcmVwb3J0TGluaygpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2UsIHNsaW0gPSB7fTsKICAgICAgZm9yICh2YXIgayBpbiBpKSB7IGlmIChpW2tdICE9PSAiIiAmJiBpW2tdICE9PSBmYWxzZSkgc2xpbVtrXSA9IGlba107IH0KICAgICAgdmFyIGNvZGUgPSBiNjR1cmwoSlNPTi5zdHJpbmdpZnkoeyB2OiAxLCBkOiBbTk9XLnksIE5PVy5tLCBOT1cuZF0sIGk6IHNsaW0sIGE6IHN0YXRlLmFuc3dlcnMgfSkpOwogICAgICB2YXIgYmFzZSA9IGxvY2F0aW9uLm9yaWdpbiArIGxvY2F0aW9uLnBhdGhuYW1lOwogICAgICBpZiAobG9jYXRpb24ucGF0aG5hbWUgPT09ICIvIiAmJiBsb2NhdGlvbi5zZWFyY2gpIGJhc2UgKz0gbG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoL1s/Jl1wcmV2aWV3W14mXSovZywgIiIpLnJlcGxhY2UoL14mLywgIj8iKTsKICAgICAgcmV0dXJuIGJhc2UgKyAiI2JrbXJlcG9ydD0iICsgY29kZTsKICAgIH0KICAgIGZ1bmN0aW9uIGxvYWRTYXZlZFJlcG9ydCgpIHsKICAgICAgdmFyIG0gPSAobG9jYXRpb24uaGFzaCB8fCAiIikubWF0Y2goL2JrbXJlcG9ydD0oW0EtWmEtejAtOV8tXSspLyk7CiAgICAgIGlmICghbSkgcmV0dXJuIGZhbHNlOwogICAgICB0cnkgewogICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZSh1bmI2NHVybChtWzFdKSk7CiAgICAgICAgaWYgKCFkYXRhIHx8IGRhdGEudiAhPT0gMSB8fCAhZGF0YS5pIHx8ICFkYXRhLmEgfHwgIWRhdGEuZCkgcmV0dXJuIGZhbHNlOwogICAgICAgIHZhciBpbnRha2UgPSBibGFua0ludGFrZSgpOwogICAgICAgIGZvciAodmFyIGsgaW4gZGF0YS5pKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaW50YWtlLCBrKSkgaW50YWtlW2tdID0gZGF0YS5pW2tdOyB9CiAgICAgICAgTk9XID0geyB5OiArZGF0YS5kWzBdLCBtOiArZGF0YS5kWzFdLCBkOiArZGF0YS5kWzJdIH07CiAgICAgICAgc3RhdGUgPSB7IHNjcmVlbjogInJlc3VsdHMiLCBzdGVwOiAwLCBpbnRha2U6IGludGFrZSwgYW5zd2VyczogZGF0YS5hLCB1bmxvY2tlZDogdHJ1ZSwgc2F2ZWQ6IHRydWUgfTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KICAgIH0KICAgIGZ1bmN0aW9uIGV4aXRTYXZlZCgpIHsKICAgICAgaWYgKCFzdGF0ZS5zYXZlZCkgcmV0dXJuOwogICAgICBzdGF0ZS5zYXZlZCA9IGZhbHNlOwogICAgICBOT1cgPSB7IHk6IFRPREFZLnksIG06IFRPREFZLm0sIGQ6IFRPREFZLmQgfTsKICAgICAgdHJ5IHsgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgIiIsIGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGZ1bmN0aW9uIGlzRW1wVHlwZSh0KSB7IHJldHVybiB0ID09PSAiZW1wbG95ZXJfc2VsZiIgfHwgdCA9PT0gImVtcGxveWVyX3Nwb3VzZSI7IH0KICAgIGZ1bmN0aW9uIHN0ZXBzKCkgewogICAgICB2YXIgaSA9IHN0YXRlLmludGFrZSwgcyA9IFsiYWdlcyIsICJjb3ZlcmFnZSJdOwogICAgICBpZiAoaS5tYXJyaWVkID09PSAieWVzIiAmJiBpLmNvdmVyYWdlVHlwZSAhPT0gImVtcGxveWVyX3Nwb3VzZSIpIHMucHVzaCgic3BvdXNlIik7CiAgICAgIENIT0lDRV9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbiAocSkgeyBzLnB1c2gocS5pZCk7IH0pOwogICAgICByZXR1cm4gczsKICAgIH0KICAgIC8qIC0tLS0tLS0tLS0gdmFsaWRhdGlvbiAtLS0tLS0tLS0tICovCiAgICBmdW5jdGlvbiB2YWxpZEFnZXMoKSB7CiAgICAgIHZhciBpID0gc3RhdGUuaW50YWtlOwogICAgICByZXR1cm4gISEoaS5iaXJ0aE0gJiYgaS5iaXJ0aFkgJiYgaS5tYXJyaWVkICYmIChpLm1hcnJpZWQgPT09ICJubyIgfHwgKGkuc3BvdXNlQmlydGhNICYmIGkuc3BvdXNlQmlydGhZKSkpOwogICAgfQogICAgZnVuY3Rpb24gdmFsaWRDb3ZlcmFnZSgpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2U7CiAgICAgIGlmICghaS5jb3ZlcmFnZVR5cGUpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGlzRW1wVHlwZShpLmNvdmVyYWdlVHlwZSkgJiYgIShpLmVtcFNpemUgJiYgKGkuZW5kVW5rbm93biB8fCAoaS5lbmRNICYmIGkuZW5kWSkpICYmIGkuaHNhKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoaS5jb3ZlcmFnZVR5cGUgIT09ICJhbHJlYWR5X21lZGljYXJlIiAmJiAhaS5vblNTKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gdmFsaWRTcG91c2UoKSB7CiAgICAgIHZhciBpID0gc3RhdGUuaW50YWtlOwogICAgICBpZiAoIWkuc3BvdXNlQ292KSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChpLnNwb3VzZUNvdiA9PT0gIm15X2VtcGxveWVyIiAmJiBpLmNvdmVyYWdlVHlwZSAhPT0gImVtcGxveWVyX3NlbGYiKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChpLnNwb3VzZUNvdiA9PT0gIm93bl9lbXBsb3llciIgJiYgIShpLnNwb3VzZUVtcFNpemUgJiYgKGkuc3BvdXNlRW5kVW5rbm93biB8fCAoaS5zcG91c2VFbmRNICYmIGkuc3BvdXNlRW5kWSkpICYmIGkuc3BvdXNlSHNhKSkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0ZXBWYWxpZCgpIHsKICAgICAgdmFyIGlkID0gc3RlcHMoKVtzdGF0ZS5zdGVwXTsKICAgICAgaWYgKGlkID09PSAiYWdlcyIpIHJldHVybiB2YWxpZEFnZXMoKTsKICAgICAgaWYgKGlkID09PSAiY292ZXJhZ2UiKSByZXR1cm4gdmFsaWRDb3ZlcmFnZSgpOwogICAgICBpZiAoaWQgPT09ICJzcG91c2UiKSByZXR1cm4gdmFsaWRTcG91c2UoKTsKICAgICAgcmV0dXJuICEhc3RhdGUuYW5zd2Vyc1tpZF07CiAgICB9CiAgICAvKiAtLS0tLS0tLS0tIHByb2ZpbGUgLS0tLS0tLS0tLSAqLwogICAgZnVuY3Rpb24gcHJvZmlsZSgpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2UsIHAgPSB7fTsKICAgICAgcC5iaXJ0aCA9IChpLmJpcnRoTSAmJiBpLmJpcnRoWSkgPyB7IHk6ICtpLmJpcnRoWSwgbTogK2kuYmlydGhNIH0gOiBudWxsOwogICAgICBwLmU2NSA9IHAuYmlydGggPyBlZmY2NShwLmJpcnRoLCBpLmJpcnRoMXN0KSA6IG51bGw7CiAgICAgIHAubWFycmllZCA9IGkubWFycmllZCA9PT0gInllcyI7CiAgICAgIHAuc3BFNjUgPSAocC5tYXJyaWVkICYmIGkuc3BvdXNlQmlydGhNICYmIGkuc3BvdXNlQmlydGhZKSA/IGVmZjY1KHsgeTogK2kuc3BvdXNlQmlydGhZLCBtOiAraS5zcG91c2VCaXJ0aE0gfSwgaS5zcG91c2Uxc3QpIDogbnVsbDsKICAgICAgcC50eXBlID0gaS5jb3ZlcmFnZVR5cGU7CiAgICAgIHAuZW1wID0gaXNFbXBUeXBlKHAudHlwZSkgPyB7CiAgICAgICAga25vd246ICFpLmVuZFVua25vd24gJiYgISEoaS5lbmRNICYmIGkuZW5kWSksCiAgICAgICAgZW5kOiAoaS5lbmRNICYmIGkuZW5kWSkgPyB7IHk6ICtpLmVuZFksIG06ICtpLmVuZE0gfSA6IG51bGwsCiAgICAgICAgbGFyZ2U6IGkuZW1wU2l6ZSAhPT0gIm5vIiwgdW5zdXJlOiBpLmVtcFNpemUgPT09ICJ1bnN1cmUiIH0gOiBudWxsOwogICAgICBwLmhzYSA9IGlzRW1wVHlwZShwLnR5cGUpICYmIGkuaHNhID09PSAieWVzIjsKICAgICAgcC5vblNTID0gaS5vblNTID09PSAieWVzIjsKICAgICAgcC5zcENvdiA9IG51bGw7IHAuc3BFbXAgPSBudWxsOyBwLnNwSHNhID0gZmFsc2U7CiAgICAgIGlmIChwLm1hcnJpZWQpIHsKICAgICAgICBpZiAocC50eXBlID09PSAiZW1wbG95ZXJfc3BvdXNlIikgeyBwLnNwQ292ID0gIm93bl9lbXBsb3llciI7IHAuc3BFbXAgPSBwLmVtcDsgcC5zcEhzYSA9IHAuaHNhOyB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgc2MgPSBpLnNwb3VzZUNvdjsKICAgICAgICAgIGlmIChzYyA9PT0gIm15X2VtcGxveWVyIiAmJiBwLnR5cGUgIT09ICJlbXBsb3llcl9zZWxmIikgc2MgPSAib3RoZXIiOwogICAgICAgICAgcC5zcENvdiA9IHNjOwogICAgICAgICAgaWYgKHNjID09PSAibXlfZW1wbG95ZXIiKSB7IHAuc3BFbXAgPSBwLmVtcDsgcC5zcEhzYSA9IHAuaHNhOyB9CiAgICAgICAgICBlbHNlIGlmIChzYyA9PT0gIm93bl9lbXBsb3llciIpIHsKICAgICAgICAgICAgcC5zcEVtcCA9IHsga25vd246ICFpLnNwb3VzZUVuZFVua25vd24gJiYgISEoaS5zcG91c2VFbmRNICYmIGkuc3BvdXNlRW5kWSksCiAgICAgICAgICAgICAgZW5kOiAoaS5zcG91c2VFbmRNICYmIGkuc3BvdXNlRW5kWSkgPyB7IHk6ICtpLnNwb3VzZUVuZFksIG06ICtpLnNwb3VzZUVuZE0gfSA6IG51bGwsCiAgICAgICAgICAgICAgbGFyZ2U6IGkuc3BvdXNlRW1wU2l6ZSAhPT0gIm5vIiwgdW5zdXJlOiBpLnNwb3VzZUVtcFNpemUgPT09ICJ1bnN1cmUiIH07CiAgICAgICAgICAgIHAuc3BIc2EgPSBpLnNwb3VzZUhzYSA9PT0gInllcyI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBwOwogICAgfQogICAgLyogLS0tLS0tLS0tLSB0aW1lbGluZSBlbmdpbmUgLS0tLS0tLS0tLSAqLwogICAgZnVuY3Rpb24gbWVkaWdhcEJsb2NrKG91dCwgdiwgc3RhcnQpIHsKICAgICAgdmFyIGVuZCA9IGFkZE1vbnRocyhzdGFydCwgNSk7CiAgICAgIGlmIChjbXAoZW5kLCBOT1cpIDwgMCkgewogICAgICAgIG91dC5wdXNoKHsgdGFnOiAiQ2xvc2VkIiwgaDogdi5wcmUgKyAiTWVkaWdhcCBndWFyYW50ZWVkLWlzc3VlIHdpbmRvdyBjbG9zZWQgIiArIGZtdChlbmQpLAogICAgICAgICAgYjogIlRoYXQgNi1tb250aCB3aW5kb3cgYmVnYW4gd2hlbiBQYXJ0IEIgc3RhcnRlZC4gSW5zdXJlcnMgY2FuIG5vdyB1c3VhbGx5IGFzayBoZWFsdGggcXVlc3Rpb25zIGFuZCBtYXkgZGVjbGluZSBvciBjaGFyZ2UgbW9yZS4gQSBmZXcgc3RhdGVzIChzdWNoIGFzIE5ldyBZb3JrIGFuZCBDb25uZWN0aWN1dCkgb2ZmZXIgYnJvYWRlciBwcm90ZWN0aW9ucy4iIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgb3BlbiA9IGNtcChzdGFydCwgTk9XKSA8PSAwOwogICAgICBvdXQucHVzaCh7IHRhZzogb3BlbiA/ICJBY3Rpb24gbmVlZGVkIiA6ICJLZXkgZGF0ZSIsIGg6IHYucHJlICsgIk1lZGlnYXAgZ3VhcmFudGVlZC1pc3N1ZSB3aW5kb3c6ICIgKyBzcGFuKHN0YXJ0LCBlbmQpICsgKG9wZW4gPyAiIChvcGVuIG5vdykiIDogIiIpLAogICAgICAgIGI6ICJJZiBjaG9vc2luZyBNZWRpZ2FwLCBidXkgZHVyaW5nIHRoZXNlIDYgbW9udGhzLCB3aGljaCBiZWdpbiB0aGUgbW9udGggUGFydCBCIHN0YXJ0cy4gSW5zdXJlcnMgY2FuJ3QgZGVueSBjb3ZlcmFnZSBvciBjaGFyZ2UgbW9yZSBmb3IgaGVhbHRoIGNvbmRpdGlvbnMgZHVyaW5nIHRoaXMgd2luZG93LiBBZnRlciBpdCBjbG9zZXMsIHRoZXkgdXN1YWxseSBjYW4uIiB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGRydWdDbG9zZWRCbG9jayhvdXQsIHYsIGJ5KSB7CiAgICAgIG91dC5wdXNoKHsgdGFnOiAiQ2xvc2VkIiwgaDogdi5wcmUgKyAiVGhlIDItbW9udGggd2luZG93IHRvIGpvaW4gYSBkcnVnIHBsYW4gY2xvc2VkICIgKyBmbXQoYnkpLAogICAgICAgIGI6ICJUaGUgbmV4dCBjaGFuY2UgdG8gam9pbiBhIFBhcnQgRCBvciBNZWRpY2FyZSBBZHZhbnRhZ2UgcGxhbiBpcyBPcGVuIEVucm9sbG1lbnQsICIgKyBvZXBUZXh0KCkgKyAiLCB3aXRoIGNvdmVyYWdlIHN0YXJ0aW5nIEphbnVhcnkgMS4gQSBwZXJtYW5lbnQgUGFydCBEIGxhdGUgcGVuYWx0eSBtYXkgYXBwbHkgZm9yIGFueSBzdHJldGNoIG9mIDYzKyBkYXlzIHdpdGhvdXQgY3JlZGl0YWJsZSBkcnVnIGNvdmVyYWdlLiIgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBoc2FCbG9jayhvdXQsIHYsIGU2NSwgYXBwbHlNb250aCkgewogICAgICB2YXIgYVN0YXJ0ID0gbWF4UChhZGRNb250aHMoYXBwbHlNb250aCwgLTYpLCBlNjUpOwogICAgICB2YXIgbGFzdCA9IGFkZE1vbnRocyhhU3RhcnQsIC0xKTsKICAgICAgaWYgKGNtcChsYXN0LCBOT1cpID49IDApIHsKICAgICAgICBvdXQucHVzaCh7IHRhZzogIkhlYWRzLXVwIiwgaDogdi5wcmUgKyAiTGFzdCBtb250aCBmb3IgSFNBIGNvbnRyaWJ1dGlvbnM6ICIgKyBmbXQobGFzdCksCiAgICAgICAgICBiOiAiV2hlbiBlbnJvbGxpbmcgaW4gTWVkaWNhcmUgYWZ0ZXIgNjUsIFBhcnQgQSBpcyBiYWNrZGF0ZWQgdXAgdG8gNiBtb250aHMgKG5ldmVyIGVhcmxpZXIgdGhhbiAiICsgZm10KGU2NSkgKyAiKS4gQXBwbHlpbmcgaW4gIiArIGZtdChhcHBseU1vbnRoKSArICIgbWVhbnMgUGFydCBBIHdvdWxkIHN0YXJ0ICIgKyBmbXQoYVN0YXJ0KSArICIsIHNvIGNvbnRyaWJ1dGlvbnMgZm9yICIgKyBmbXQoYVN0YXJ0KSArICIgb253YXJkIHdvdWxkIGNvdW50IGFzIGV4Y2VzcyBhbmQgYmUgcGVuYWxpemVkLiBUaGUgSFNBIGNhbiBzdGlsbCBiZSB1c2VkIGZvciBtZWRpY2FsIGNvc3RzLiIgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJBY3Rpb24gbmVlZGVkIiwgaDogdi5wcmUgKyAiU3RvcCBIU0EgY29udHJpYnV0aW9ucyBub3ciLAogICAgICAgICAgYjogIldoZW4gZW5yb2xsaW5nIGluIE1lZGljYXJlIGFmdGVyIDY1LCBQYXJ0IEEgaXMgYmFja2RhdGVkIHVwIHRvIDYgbW9udGhzIChuZXZlciBlYXJsaWVyIHRoYW4gIiArIGZtdChlNjUpICsgIikuIEFwcGx5aW5nIGluICIgKyBmbXQoYXBwbHlNb250aCkgKyAiIG1lYW5zIFBhcnQgQSB3b3VsZCBzdGFydCAiICsgZm10KGFTdGFydCkgKyAiLCB3aGljaCBoYXMgYWxyZWFkeSBwYXNzZWQsIHNvIGNvbnRyaWJ1dGlvbnMgZm9yIHRob3NlIG1vbnRocyBjb3VudCBhcyBleGNlc3MuIEFzayB5b3VyIEJLTSBhZHZpc29yIGFib3V0IHdpdGhkcmF3aW5nIHRoZW0gYmVmb3JlIHRoZSB0YXgtZmlsaW5nIGRlYWRsaW5lLiIgfSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGRlbGF5UGF0aChvdXQsIHYsIGU2NSwgZW1wLCBoc2EsIG9uU1MpIHsKICAgICAgdmFyIGllcFMgPSBhZGRNb250aHMoZTY1LCAtMyk7CiAgICAgIHZhciBlbmRlZCA9IGVtcC5rbm93biAmJiBjbXAoZW1wLmVuZCwgTk9XKSA8IDA7CiAgICAgIGlmIChjbXAoZTY1LCBOT1cpID4gMCkgewogICAgICAgIGlmIChvblNTID09PSB0cnVlKSB7CiAgICAgICAgICBvdXQucHVzaCh7IHRhZzogIkhlYWRzLXVwIiwgaDogdi5wcmUgKyAiTWVkaWNhcmUgY2FyZCBhcnJpdmVzIGFyb3VuZCAiICsgZm10KGllcFMpLAogICAgICAgICAgICBiOiAiU2luY2UgU29jaWFsIFNlY3VyaXR5IGJlbmVmaXRzIGhhdmUgYWxyZWFkeSBzdGFydGVkLCBQYXJ0cyBBIGFuZCBCIGJlZ2luIGF1dG9tYXRpY2FsbHkgaW4gIiArIGZtdChlNjUpICsgIi4gS2VlcCBQYXJ0IEEsIGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB3aXRoIHRoZSBjYXJkIHRvIGRlY2xpbmUgUGFydCBCIHdoaWxlIHRoZSBlbXBsb3llciBwbGFuIGlzIGluIHBsYWNlLiBQYXJ0IEEgY2FuJ3QgYmUgZGVjbGluZWQgd2l0aG91dCByZXBheWluZyBTb2NpYWwgU2VjdXJpdHkgYmVuZWZpdHMuIiArCiAgICAgICAgICAgICAgKGhzYSA/ICIgQmVjYXVzZSBQYXJ0IEEgc3RhcnRzIGF1dG9tYXRpY2FsbHksIEhTQSBjb250cmlidXRpb25zIG11c3Qgc3RvcCBhZnRlciAiICsgZm10KGFkZE1vbnRocyhlNjUsIC0xKSkgKyAiLiIgOiAiIikgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiUGFydCBBIGRlY2lzaW9uIGF0IDY1ICgiICsgZm10KGU2NSkgKyAiKSIsCiAgICAgICAgICAgIGI6ICJQYXJ0IEIgY2FuIHdhaXQgd2hpbGUgdGhpcyBlbXBsb3llciBwbGFuIGlzIGluIHBsYWNlLiBQcmVtaXVtLWZyZWUgUGFydCBBIGlzIG9wdGlvbmFsOyBtYW55IHBlb3BsZSB0YWtlIGl0IGF0IDY1IGJ5IGFwcGx5aW5nICIgKyBzcGFuKG1heFAoaWVwUywgTk9XKSwgYWRkTW9udGhzKGU2NSwgLTEpKSArICIuIiArCiAgICAgICAgICAgICAgKGhzYSA/ICIgV2l0aCBIU0EgY29udHJpYnV0aW9ucywgaXQgdXN1YWxseSBtYWtlcyBzZW5zZSB0byB3YWl0IG9uIFBhcnQgQSBhcyB3ZWxsLCBzaW5jZSBlbnJvbGxpbmcgaW4gYW55IHBhcnQgb2YgTWVkaWNhcmUgZW5kcyBIU0EgZWxpZ2liaWxpdHkuIiA6ICIiKSArCiAgICAgICAgICAgICAgKG9uU1MgPT09IG51bGwgPyAiIElmIFNvY2lhbCBTZWN1cml0eSBiZW5lZml0cyBoYXZlIHN0YXJ0ZWQsIFBhcnQgQSBpcyBhdXRvbWF0aWMgYW5kIGNhbid0IGJlIGRlY2xpbmVkLiIgOiAiIikgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFlbmRlZCkgewogICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiUGFzdCA2NSBhbmQgc3RpbGwgb24gdGhlIGVtcGxveWVyIHBsYW4iLAogICAgICAgICAgYjogIlRoZXJlJ3Mgbm8gUGFydCBCIGRlYWRsaW5lIHdoaWxlIHRoaXMgY292ZXJhZ2UgY29udGludWVzLiBUaGUga2V5IGRhdGVzIGRlcGVuZCBvbiB3aGVuIGl0IGVuZHMuIiB9KTsKICAgICAgICBpZiAob25TUyA9PT0gdHJ1ZSAmJiBoc2EpIHsKICAgICAgICAgIG91dC5wdXNoKHsgdGFnOiAiSGVhZHMtdXAiLCBoOiB2LnByZSArICJIU0EgY29udHJpYnV0aW9ucyIsCiAgICAgICAgICAgIGI6ICJSZWNlaXZpbmcgU29jaWFsIFNlY3VyaXR5IGFmdGVyIDY1IG1lYW5zIFBhcnQgQSBpcyBhbHJlYWR5IGluIGVmZmVjdCwgc28gSFNBIGNvbnRyaWJ1dGlvbnMgYXJlbid0IGFsbG93ZWQuIElmIGFueSB3ZXJlIG1hZGUsIGFzayB5b3VyIEJLTSBhZHZpc29yIGFib3V0IGNvcnJlY3RpbmcgdGhlbS4iIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWVtcC5rbm93bikgewogICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiT25jZSBhIHJldGlyZW1lbnQgZGF0ZSBpcyBzZXQiLAogICAgICAgICAgYjogIkFwcGx5IGZvciBQYXJ0IEIgMVx1MjAxMzIgbW9udGhzIGJlZm9yZSB0aGUgZW1wbG95ZXIgY292ZXJhZ2UgZW5kcywgdXNpbmcgRm9ybSBDTVMtNDBCIHBsdXMgRm9ybSBDTVMtTDU2NCAodGhlIGVtcGxveWVyIGNvbXBsZXRlcyB0aGUgTDU2NCB0byBjb25maXJtIHRoZSBjb3ZlcmFnZSksIGFuZCBhc2sgZm9yIFBhcnQgQiB0byBzdGFydCB0aGUgbW9udGggYWZ0ZXIgY292ZXJhZ2UgZW5kcy4gSm9pbiBhIGRydWcgb3IgTWVkaWNhcmUgQWR2YW50YWdlIHBsYW4gd2l0aGluIDIgbW9udGhzIG9mIHRoZSBjb3ZlcmFnZSBlbmRpbmcuIFJ1biB0aGlzIHRvb2wgYWdhaW4gd2l0aCB0aGUgZGF0ZSB0byBzZWUgZXhhY3QgZGVhZGxpbmVzLiIgfSk7CiAgICAgICAgaWYgKGhzYSAmJiBvblNTICE9PSB0cnVlKSB7CiAgICAgICAgICBvdXQucHVzaCh7IHRhZzogIkhlYWRzLXVwIiwgaDogdi5wcmUgKyAiSFNBIHRpbWluZyIsCiAgICAgICAgICAgIGI6ICJXaGVuIGVucm9sbGluZyBpbiBNZWRpY2FyZSBhZnRlciA2NSwgUGFydCBBIGlzIGJhY2tkYXRlZCB1cCB0byA2IG1vbnRocyAobmV2ZXIgZWFybGllciB0aGFuICIgKyBmbXQoZTY1KSArICIpLiBTdG9wIEhTQSBjb250cmlidXRpb25zIDYgbW9udGhzIGJlZm9yZSBhcHBseWluZyB0byBhdm9pZCBleGNlc3MtY29udHJpYnV0aW9uIHBlbmFsdGllcy4iIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGVuZCA9IGVtcC5lbmQsIGJTdGFydCA9IGFkZE1vbnRocyhlbmQsIDEpLCBzZXBFID0gYWRkTW9udGhzKGVuZCwgOCksIHBkQnkgPSBhZGRNb250aHMoZW5kLCAyKTsKICAgICAgaWYgKCFlbmRlZCkgewogICAgICAgIHZhciBmcm9tID0gbWF4UChhZGRNb250aHMoZW5kLCAtMiksIE5PVyk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJLZXkgZGF0ZSIsIGg6IHYucHJlICsgIkFwcGx5IGZvciBQYXJ0IEIgaW4gIiArIHNwYW4oZnJvbSwgZW5kKSArICIgc28gaXQgc3RhcnRzICIgKyBmbXQoYlN0YXJ0KSwKICAgICAgICAgIGI6ICJUaGUgZW1wbG95ZXIgY292ZXJhZ2UgcnVucyB0aHJvdWdoICIgKyBmbXQoZW5kKSArICIuIEFwcGx5IG9ubGluZSBhdCBzc2EuZ292IG9yIGJ5IHBob25lLCBhbmQgaW5jbHVkZSBGb3JtIENNUy00MEIgcGx1cyBGb3JtIENNUy1MNTY0LCB3aGljaCB0aGUgZW1wbG95ZXIgY29tcGxldGVzIHRvIGNvbmZpcm0gdGhlIGNvdmVyYWdlLiBBc2sgZm9yIFBhcnQgQiB0byBiZWdpbiAiICsgZm10KGJTdGFydCkgKyAiIHNvIHRoZXJlJ3Mgbm8gZ2FwIGFuZCBubyBwYXlpbmcgZm9yIFBhcnQgQiB3aGlsZSBzdGlsbCBvbiB0aGUgZW1wbG95ZXIgcGxhbi4gVGhlIDgtbW9udGggU3BlY2lhbCBFbnJvbGxtZW50IFBlcmlvZCBzdGF5cyBvcGVuIHRocm91Z2ggIiArIGZtdChzZXBFKSArICIsIGJ1dCBhcHBseWluZyBsYXRlIGxlYXZlcyBhIGdhcCBpbiBjb3ZlcmFnZS4iIH0pOwogICAgICAgIG91dC5wdXNoKHsgdGFnOiAiS2V5IGRhdGUiLCBoOiB2LnByZSArICJKb2luIGEgZHJ1ZyBwbGFuIG9yIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIGJ5ICIgKyBmbXQocGRCeSksCiAgICAgICAgICBiOiAiVGhpcyBkZWFkbGluZSBpcyBtdWNoIHNob3J0ZXIgdGhhbiBQYXJ0IEInczogMiBtb250aHMgYWZ0ZXIgdGhlIGVtcGxveWVyIGNvdmVyYWdlIGVuZHMsIG5vdCA4LiBFbnJvbGwgYmVmb3JlICIgKyBmbXQoZW5kKSArICIgZW5kcyBzbyB0aGUgbmV3IHBsYW4gc3RhcnRzICIgKyBmbXQoYlN0YXJ0KSArICIuIEdvaW5nIDYzIGRheXMgb3IgbW9yZSB3aXRob3V0IGNyZWRpdGFibGUgZHJ1ZyBjb3ZlcmFnZSBhZGRzIGEgcGVybWFuZW50IFBhcnQgRCBsYXRlIHBlbmFsdHkuIiB9KTsKICAgICAgICBtZWRpZ2FwQmxvY2sob3V0LCB2LCBiU3RhcnQpOwogICAgICAgIGlmIChoc2EgJiYgb25TUyAhPT0gdHJ1ZSkgaHNhQmxvY2sob3V0LCB2LCBlNjUsIG1heFAoYWRkTW9udGhzKGVuZCwgLTEpLCBOT1cpKTsKICAgICAgfSBlbHNlIGlmIChjbXAoTk9XLCBzZXBFKSA8PSAwKSB7CiAgICAgICAgdmFyIGJzID0gYWRkTW9udGhzKE5PVywgMSk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJBY3Rpb24gbmVlZGVkIiwgaDogdi5wcmUgKyAiQXBwbHkgZm9yIFBhcnQgQiBub3cgXHUyMDE0IHRoZSB3aW5kb3cgY2xvc2VzICIgKyBmbXQoc2VwRSksCiAgICAgICAgICBiOiAiVGhlIGVtcGxveWVyIGNvdmVyYWdlIGVuZGVkICIgKyBmbXQoZW5kKSArICIsIHdoaWNoIG9wZW5lZCBhbiA4LW1vbnRoIFNwZWNpYWwgRW5yb2xsbWVudCBQZXJpb2QgKCIgKyBzcGFuKGJTdGFydCwgc2VwRSkgKyAiKS4gQXBwbHkgdGhpcyBtb250aCB3aXRoIEZvcm1zIENNUy00MEIgYW5kIENNUy1MNTY0OyBQYXJ0IEIgd291bGQgc3RhcnQgIiArIGZtdChicykgKyAiLiBBbHJlYWR5IGVucm9sbGVkPyBTa2lwIHRoaXMgc3RlcC4iIH0pOwogICAgICAgIGlmIChjbXAoTk9XLCBwZEJ5KSA8PSAwKSB7CiAgICAgICAgICBvdXQucHVzaCh7IHRhZzogIkFjdGlvbiBuZWVkZWQiLCBoOiB2LnByZSArICJKb2luIGEgZHJ1ZyBvciBNZWRpY2FyZSBBZHZhbnRhZ2UgcGxhbiBieSAiICsgZm10KHBkQnkpLAogICAgICAgICAgICBiOiAiVGhlIHdpbmRvdyBpcyAyIG1vbnRocyBhZnRlciBlbXBsb3llciBjb3ZlcmFnZSBlbmRzLiBHb2luZyA2MyBkYXlzIG9yIG1vcmUgd2l0aG91dCBjcmVkaXRhYmxlIGRydWcgY292ZXJhZ2UgYWRkcyBhIHBlcm1hbmVudCBQYXJ0IEQgbGF0ZSBwZW5hbHR5LiIgfSk7CiAgICAgICAgfSBlbHNlIHsgZHJ1Z0Nsb3NlZEJsb2NrKG91dCwgdiwgcGRCeSk7IH0KICAgICAgICBtZWRpZ2FwQmxvY2sob3V0LCB2LCBicyk7CiAgICAgICAgaWYgKGhzYSAmJiBvblNTICE9PSB0cnVlKSBoc2FCbG9jayhvdXQsIHYsIGU2NSwgTk9XKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvdXQucHVzaCh7IHRhZzogIkNsb3NlZCIsIGg6IHYucHJlICsgIlNwZWNpYWwgRW5yb2xsbWVudCBQZXJpb2QgY2xvc2VkICIgKyBmbXQoc2VwRSksCiAgICAgICAgICBiOiAiQWxyZWFkeSBlbnJvbGxlZCBpbiBQYXJ0IEI/IFNraXAgdGhpcyBzdGVwLiBJZiBub3QsIHRoZSBuZXh0IGNoYW5jZSBpcyB0aGUgR2VuZXJhbCBFbnJvbGxtZW50IFBlcmlvZCwgIiArIGdlcFRleHQoKSArICIuIFBhcnQgQiBzdGFydHMgdGhlIG1vbnRoIGFmdGVyIHNpZ25pbmcgdXAsIGFuZCBhIGxpZmVsb25nIGxhdGUgcGVuYWx0eSBtYXkgYXBwbHk6IDEwJSBvZiB0aGUgcHJlbWl1bSBmb3IgZWFjaCBmdWxsIDEyIG1vbnRocyB3aXRob3V0IFBhcnQgQiBhZnRlciB0aGUgZW1wbG95ZXIgY292ZXJhZ2UgZW5kZWQuIFJldmlldyB0aGlzIHdpdGggeW91ciBCS00gYWR2aXNvci4iIH0pOwogICAgICAgIGRydWdDbG9zZWRCbG9jayhvdXQsIHYsIHBkQnkpOwogICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiTWVkaWdhcCB0aW1pbmciLAogICAgICAgICAgYjogIlRoZSA2LW1vbnRoIE1lZGlnYXAgZ3VhcmFudGVlZC1pc3N1ZSB3aW5kb3cgc3RhcnRzIHRoZSBtb250aCBQYXJ0IEIgYmVnaW5zLiBJZiBQYXJ0IEIgc3RhcnRlZCBtb3JlIHRoYW4gNiBtb250aHMgYWdvLCBpbnN1cmVycyBjYW4gdXN1YWxseSByZXF1aXJlIG1lZGljYWwgdW5kZXJ3cml0aW5nLiIgfSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGllcFBhdGgob3V0LCB2LCBlNjUsIG9uU1MpIHsKICAgICAgdmFyIGllcFMgPSBhZGRNb250aHMoZTY1LCAtMyksIGllcEUgPSBhZGRNb250aHMoZTY1LCAzKSwgcHJlID0gYWRkTW9udGhzKGU2NSwgLTEpOwogICAgICBpZiAoY21wKE5PVywgaWVwUykgPCAwKSB7CiAgICAgICAgaWYgKG9uU1MgPT09IHRydWUpIHsKICAgICAgICAgIG91dC5wdXNoKHsgdGFnOiAiS2V5IGRhdGUiLCBoOiB2LnByZSArICJBdXRvbWF0aWMgZW5yb2xsbWVudCBpbiAiICsgZm10KGU2NSksCiAgICAgICAgICAgIGI6ICJTaW5jZSBTb2NpYWwgU2VjdXJpdHkgYmVuZWZpdHMgaGF2ZSBhbHJlYWR5IHN0YXJ0ZWQsIFBhcnRzIEEgYW5kIEIgYmVnaW4gYXV0b21hdGljYWxseSBpbiAiICsgZm10KGU2NSkgKyAiLCBhbmQgdGhlIE1lZGljYXJlIGNhcmQgYXJyaXZlcyBhcm91bmQgIiArIGZtdChpZXBTKSArICIuIE5vIGFwcGxpY2F0aW9uIGlzIG5lZWRlZC4iIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdXQucHVzaCh7IHRhZzogIktleSBkYXRlIiwgaDogdi5wcmUgKyAiSW5pdGlhbCBFbnJvbGxtZW50IFBlcmlvZDogIiArIHNwYW4oaWVwUywgaWVwRSksCiAgICAgICAgICAgIGI6ICJBcHBseSBpbiAiICsgc3BhbihpZXBTLCBwcmUpICsgIiBzbyBjb3ZlcmFnZSBzdGFydHMgIiArIGZtdChlNjUpICsgIiB3aXRoIG5vIGdhcC4gQXBwbHlpbmcgbGF0ZXIgaW4gdGhlIHdpbmRvdyBwdXNoZXMgdGhlIHN0YXJ0IGRhdGUgYmFjay4iICsKICAgICAgICAgICAgICAob25TUyA9PT0gbnVsbCA/ICIgSWYgU29jaWFsIFNlY3VyaXR5IGJlbmVmaXRzIGhhdmUgc3RhcnRlZCwgZW5yb2xsbWVudCBpcyBhdXRvbWF0aWMuIiA6ICIiKSB9KTsKICAgICAgICB9CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJLZXkgZGF0ZSIsIGg6IHYucHJlICsgIkNob29zZSBhIGRydWcgcGxhbiBvciBNZWRpY2FyZSBBZHZhbnRhZ2UgcGxhbiBieSAiICsgZm10KHByZSksCiAgICAgICAgICBiOiAiUGljayBhIFBhcnQgRCBwbGFuIChvciBhIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIHdpdGggZHJ1ZyBjb3ZlcmFnZSkgZHVyaW5nIHRoZSBzYW1lIHdpbmRvdyBzbyBpdCBzdGFydHMgIiArIGZtdChlNjUpICsgIi4gU2tpcHBpbmcgaXQgd2l0aG91dCBvdGhlciBjcmVkaXRhYmxlIGRydWcgY292ZXJhZ2UgYWRkcyBhIHBlcm1hbmVudCBQYXJ0IEQgbGF0ZSBwZW5hbHR5LiIgfSk7CiAgICAgICAgbWVkaWdhcEJsb2NrKG91dCwgdiwgZTY1KTsKICAgICAgfSBlbHNlIGlmIChjbXAoTk9XLCBpZXBFKSA8PSAwKSB7CiAgICAgICAgdmFyIGJzID0gY21wKE5PVywgZTY1KSA8IDAgPyBlNjUgOiBhZGRNb250aHMoTk9XLCAxKTsKICAgICAgICBvdXQucHVzaCh7IHRhZzogIkFjdGlvbiBuZWVkZWQiLCBoOiB2LnByZSArICJFbnJvbGxtZW50IHdpbmRvdyBpcyBvcGVuIG5vdyBcdTIwMTQgdGhyb3VnaCAiICsgZm10KGllcEUpLAogICAgICAgICAgYjogb25TUyA9PT0gdHJ1ZSA/ICJQYXJ0cyBBIGFuZCBCIGFyZSBhdXRvbWF0aWMgc2luY2UgU29jaWFsIFNlY3VyaXR5IGJlbmVmaXRzIGhhdmUgc3RhcnRlZDsgd2F0Y2ggZm9yIHRoZSBNZWRpY2FyZSBjYXJkLiIgOiAiQXBwbHkgdGhpcyBtb250aDsgY292ZXJhZ2Ugd291bGQgc3RhcnQgIiArIGZtdChicykgKyAiLiBXYWl0aW5nIHB1c2hlcyB0aGUgc3RhcnQgZGF0ZSBiYWNrLiIgfSk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJBY3Rpb24gbmVlZGVkIiwgaDogdi5wcmUgKyAiQ2hvb3NlIGEgZHJ1ZyBwbGFuIG9yIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIG5vdyIsCiAgICAgICAgICBiOiAiRW5yb2xsIGluIFBhcnQgRCBvciBhIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIGR1cmluZyB0aGlzIHNhbWUgd2luZG93ICh0aHJvdWdoICIgKyBmbXQoaWVwRSkgKyAiKSB0byBhdm9pZCB0aGUgcGVybWFuZW50IFBhcnQgRCBsYXRlIHBlbmFsdHkuIiB9KTsKICAgICAgICBtZWRpZ2FwQmxvY2sob3V0LCB2LCBicyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJDbG9zZWQiLCBoOiB2LnByZSArICJJbml0aWFsIEVucm9sbG1lbnQgUGVyaW9kIGNsb3NlZCAoIiArIHNwYW4oaWVwUywgaWVwRSkgKyAiKSIsCiAgICAgICAgICBiOiAiQWxyZWFkeSBlbnJvbGxlZCBpbiBNZWRpY2FyZT8gU2tpcCB0aGlzIHN0ZXAuIElmIG5vdCwgdGhlIG5leHQgY2hhbmNlIGlzIHRoZSBHZW5lcmFsIEVucm9sbG1lbnQgUGVyaW9kLCAiICsgZ2VwVGV4dCgpICsgIi4gUGFydCBCIHN0YXJ0cyB0aGUgbW9udGggYWZ0ZXIgc2lnbmluZyB1cCwgYW5kIGEgbGlmZWxvbmcgbGF0ZSBwZW5hbHR5IG1heSBhcHBseTogMTAlIG9mIHRoZSBwcmVtaXVtIGZvciBlYWNoIGZ1bGwgMTIgbW9udGhzIHdpdGhvdXQgUGFydCBCICh0aW1lIG9uIHF1YWxpZnlpbmcgZW1wbG95ZXIgY292ZXJhZ2UgZG9lc24ndCBjb3VudCkuIFJldmlldyB0aGlzIHdpdGggeW91ciBCS00gYWR2aXNvci4iIH0pOwogICAgICAgIG91dC5wdXNoKHsgaDogdi5wcmUgKyAiRHJ1ZyBhbmQgTWVkaWdhcCBjb3ZlcmFnZSIsCiAgICAgICAgICBiOiAiQSBkcnVnIG9yIE1lZGljYXJlIEFkdmFudGFnZSBwbGFuIGNhbiBiZSBhZGRlZCBkdXJpbmcgT3BlbiBFbnJvbGxtZW50ICgiICsgb2VwVGV4dCgpICsgIikgb3IgaW4gdGhlIHNwZWNpYWwgd2luZG93IHRoYXQgZm9sbG93cyBhIG5ldyBQYXJ0IEIgZW5yb2xsbWVudC4gVGhlIE1lZGlnYXAgZ3VhcmFudGVlZC1pc3N1ZSB3aW5kb3cgc3RhcnRzIHRoZSBtb250aCBQYXJ0IEIgYmVnaW5zOyBpZiB0aGF0IHdhcyBtb3JlIHRoYW4gNiBtb250aHMgYWdvLCBpbnN1cmVycyBjYW4gdXN1YWxseSByZXF1aXJlIG1lZGljYWwgdW5kZXJ3cml0aW5nLiIgfSk7CiAgICAgIH0KICAgIH0KICAgIHZhciBUWVBFX1dBUk5JTkdTID0gewogICAgICByZXRpcmVlX2NvYnJhOiB7IGg6ICJSZXRpcmVlIGNvdmVyYWdlIGFuZCBDT0JSQSBkb24ndCBsZXQgeW91IGRlbGF5IFBhcnQgQiIsIGI6ICJFbnJvbGwgZHVyaW5nIHRoZSB3aW5kb3cgYWJvdmUuIE9uY2UgeW91J3JlIGVsaWdpYmxlIGZvciBNZWRpY2FyZSwgdGhlc2UgcGxhbnMgdHlwaWNhbGx5IHBheSBzZWNvbmQsIGFuZCBzb21lIHBheSBub3RoaW5nIGZvciBjbGFpbXMgTWVkaWNhcmUgd291bGQgaGF2ZSBjb3ZlcmVkLiIgfSwKICAgICAgbWFya2V0cGxhY2U6IHsgaDogIk1hcmtldHBsYWNlIHBsYW5zIGRvbid0IGxldCB5b3UgZGVsYXkgUGFydCBCIiwgYjogIkVucm9sbCBkdXJpbmcgdGhlIHdpbmRvdyBhYm92ZSwgdGhlbiBjYW5jZWwgdGhlIE1hcmtldHBsYWNlIHBsYW4gZWZmZWN0aXZlIHRoZSBkYXkgTWVkaWNhcmUgc3RhcnRzLiBQcmVtaXVtIHRheCBjcmVkaXRzIGVuZCBvbmNlIHlvdSdyZSBlbGlnaWJsZSBmb3IgcHJlbWl1bS1mcmVlIFBhcnQgQS4iIH0sCiAgICAgIHZhOiB7IGg6ICJWQSBoZWFsdGggY2FyZSBkb2Vzbid0IGxldCB5b3UgZGVsYXkgUGFydCBCIHdpdGhvdXQgYSBwZW5hbHR5IiwgYjogIk1hbnkgdmV0ZXJhbnMgZW5yb2xsIGluIFBhcnQgQiBhbnl3YXkgc28gdGhleSBjYW4gc2VlIG5vbi1WQSBkb2N0b3JzLiBJZiB5b3Ugc2tpcCBQYXJ0IEIgYW5kIHdhbnQgaXQgbGF0ZXIsIHRoZSBsaWZlbG9uZyBsYXRlIHBlbmFsdHkgYXBwbGllcy4iIH0sCiAgICAgIG5vbmVfb3RoZXI6IHsgaDogIklmIHlvdSBoYXZlIE1lZGljYWlkIiwgYjogIllvdSBtYXkgcXVhbGlmeSBmb3IgaGVscCBwYXlpbmcgTWVkaWNhcmUgcHJlbWl1bXMgYW5kIGNvc3RzIHRocm91Z2ggYSBNZWRpY2FyZSBTYXZpbmdzIFByb2dyYW0uIENvbnRhY3QgeW91ciBzdGF0ZSBNZWRpY2FpZCBvZmZpY2UuIiB9CiAgICB9OwogICAgZnVuY3Rpb24gcGxhbkZvcihvdXQsIHYsIGU2NSwgZW1wLCBoc2EsIG9uU1MsIHR5cGUpIHsKICAgICAgdmFyIGNyZWRpdGFibGUgPSBlbXAgJiYgZW1wLmxhcmdlICYmICghZW1wLmtub3duIHx8IGNtcChlbXAuZW5kLCBlNjUpID49IDApOwogICAgICBpZiAoY3JlZGl0YWJsZSkgewogICAgICAgIGRlbGF5UGF0aChvdXQsIHYsIGU2NSwgZW1wLCBoc2EsIG9uU1MpOwogICAgICAgIGlmIChlbXAudW5zdXJlKSB7CiAgICAgICAgICB2YXIgaWVwRSA9IGFkZE1vbnRocyhlNjUsIDMpOwogICAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJIZWFkcy11cCIsIGg6IHYucHJlICsgIkNvbmZpcm0gdGhlIGVtcGxveWVyIGhhcyAyMCBvciBtb3JlIGVtcGxveWVlcyIsCiAgICAgICAgICAgIGI6ICJUaGVzZSBkYXRlcyBhc3N1bWUgaXQgZG9lcy4gV2l0aCBmZXdlciB0aGFuIDIwIGVtcGxveWVlcywgTWVkaWNhcmUgcGF5cyBmaXJzdCBhdCA2NSwgc28gZW5yb2xsbWVudCBpbiBQYXJ0cyBBIGFuZCBCIGJlbG9uZ3MgaW4gdGhlIEluaXRpYWwgRW5yb2xsbWVudCBQZXJpb2QsICIgKyBzcGFuKGFkZE1vbnRocyhlNjUsIC0zKSwgaWVwRSkgKyAiLiIgKyAoY21wKE5PVywgaWVwRSkgPiAwID8gIiBUaGF0IHdpbmRvdyBoYXMgcGFzc2VkOyB0YWxrIHdpdGggeW91ciBCS00gYWR2aXNvci4iIDogIiIpIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGVtcCAmJiBlbXAua25vd24gJiYgY21wKGVtcC5lbmQsIGU2NSkgPCAwICYmIGNtcChlNjUsIE5PVykgPiAwKSB7CiAgICAgICAgdmFyIGVuZGVkQWxyZWFkeSA9IGNtcChlbXAuZW5kLCBOT1cpIDwgMDsKICAgICAgICBvdXQucHVzaCh7IHRhZzogIkhlYWRzLXVwIiwgaDogdi5wcmUgKyAiQnJpZGdlIHRoZSBnYXAgdW50aWwgTWVkaWNhcmUgc3RhcnRzIGluICIgKyBmbXQoZTY1KSwKICAgICAgICAgIGI6ICJUaGUgZW1wbG95ZXIgY292ZXJhZ2UgIiArIChlbmRlZEFscmVhZHkgPyAiZW5kZWQgIiA6ICJlbmRzICIpICsgZm10KGVtcC5lbmQpICsgIiwgYmVmb3JlIGFnZSA2NS4gQXJyYW5nZSBDT0JSQSBvciBhIE1hcmtldHBsYWNlIHBsYW4gdG8gY292ZXIgIiArIHNwYW4oYWRkTW9udGhzKGVtcC5lbmQsIDEpLCBhZGRNb250aHMoZTY1LCAtMSkpICsgIi4gTG9zaW5nIGpvYi1iYXNlZCBjb3ZlcmFnZSBvcGVucyBhIDYwLWRheSB3aW5kb3cgdG8gZW5yb2xsIGluIGEgTWFya2V0cGxhY2UgcGxhbi4iIH0pOwogICAgICB9CiAgICAgIGlmIChlbXAgJiYgIWVtcC5sYXJnZSAmJiAoIWVtcC5rbm93biB8fCBjbXAoZW1wLmVuZCwgZTY1KSA+PSAwKSkgewogICAgICAgIG91dC5wdXNoKHsgdGFnOiAiSGVhZHMtdXAiLCBoOiB2LnByZSArICJTbWFsbCBlbXBsb3llcjogTWVkaWNhcmUgcGF5cyBmaXJzdCBhdCA2NSIsCiAgICAgICAgICBiOiAiV2l0aCBmZXdlciB0aGFuIDIwIGVtcGxveWVlcywgdGhlIGVtcGxveWVyIHBsYW4gcGF5cyBzZWNvbmQgb25jZSBNZWRpY2FyZSBlbGlnaWJpbGl0eSBiZWdpbnMuIEVucm9sbCBpbiBQYXJ0cyBBIGFuZCBCIGR1cmluZyB0aGUgSW5pdGlhbCBFbnJvbGxtZW50IFBlcmlvZCBiZWxvdzsgb3RoZXJ3aXNlIHRoZSBwbGFuIG1heSByZWZ1c2UgdG8gcGF5IGNsYWltcyBNZWRpY2FyZSB3b3VsZCBoYXZlIGNvdmVyZWQuIiB9KTsKICAgICAgfQogICAgICBpZXBQYXRoKG91dCwgdiwgZTY1LCBvblNTKTsKICAgICAgaWYgKHR5cGUgJiYgVFlQRV9XQVJOSU5HU1t0eXBlXSkgb3V0LnB1c2goeyB0YWc6ICJIZWFkcy11cCIsIGg6IFRZUEVfV0FSTklOR1NbdHlwZV0uaCwgYjogVFlQRV9XQVJOSU5HU1t0eXBlXS5iIH0pOwogICAgfQogICAgZnVuY3Rpb24gdGltZWxpbmUocCkgewogICAgICB2YXIgb3V0ID0gW107CiAgICAgIGlmICghcC5lNjUpIHJldHVybiBvdXQ7CiAgICAgIHZhciB5b3UgPSB7IHByZTogIiIgfSwgc3AgPSB7IHByZTogIllvdXIgc3BvdXNlOiAiIH07CiAgICAgIGlmIChwLnR5cGUgPT09ICJhbHJlYWR5X21lZGljYXJlIikgewogICAgICAgIG91dC5wdXNoKHsgaDogIllvdSdyZSBhbHJlYWR5IGVucm9sbGVkIGluIE1lZGljYXJlIiwgYjogIlRoZXJlIGFyZSBubyBlbnJvbGxtZW50IGRlYWRsaW5lcyB0byBtZWV0LiBUaGUgZGVjaXNpb25zIG5vdyBhcmUgd2hpY2ggcGxhbnMgdG8gaG9sZCBhbmQgd2hlbiB5b3UgY2FuIGNoYW5nZSB0aGVtLiIgfSk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJIZWFkcy11cCIsIGg6ICJTd2l0Y2hpbmcgdG8gTWVkaWdhcCBsYXRlciBpc24ndCBndWFyYW50ZWVkIiwgYjogIlRoZSA2LW1vbnRoIE1lZGlnYXAgZ3VhcmFudGVlZC1pc3N1ZSB3aW5kb3cgc3RhcnRlZCB3aGVuIFBhcnQgQiBiZWdhbi4gSWYgdGhhdCB3YXMgbW9yZSB0aGFuIDYgbW9udGhzIGFnbywgaW5zdXJlcnMgY2FuIHVzdWFsbHkgcmVxdWlyZSBtZWRpY2FsIHVuZGVyd3JpdGluZyBhbmQgbWF5IGRlY2xpbmUgeW91LiBBIGZldyBzdGF0ZXMgKHN1Y2ggYXMgTmV3IFlvcmsgYW5kIENvbm5lY3RpY3V0KSBvZmZlciBicm9hZGVyIHByb3RlY3Rpb25zLiIgfSk7CiAgICAgICAgb3V0LnB1c2goeyB0YWc6ICJLZXkgZGF0ZSIsIGg6ICJOZXh0IE9wZW4gRW5yb2xsbWVudDogIiArIG9lcFRleHQoKSwgYjogIlJldmlldyB5b3VyIGRydWcgb3IgQWR2YW50YWdlIHBsYW4gZXZlcnkgZmFsbCB1c2luZyB0aGUgUGxhbiBGaW5kZXIgYXQgTWVkaWNhcmUuZ292LiBQcmVtaXVtcywgZm9ybXVsYXJpZXMsIGFuZCBuZXR3b3JrcyBjaGFuZ2UgZWFjaCBKYW51YXJ5LiBBZHZhbnRhZ2UgbWVtYmVycyBhbHNvIGdldCBhIHNlY29uZCBjaGFuY2UgSmFudWFyeSAxIFx1MjAxMyBNYXJjaCAzMS4iIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIG91dC5wdXNoKHsgaDogIkhvdyB0byBhcHBseSIsIGI6ICJBcHBseSBvbmxpbmUgYXQgc3NhLmdvdi9tZWRpY2FyZSwgYnkgcGhvbmUgYXQgMS04MDAtNzcyLTEyMTMsIG9yIGF0IGEgbG9jYWwgU29jaWFsIFNlY3VyaXR5IG9mZmljZS4gRHJ1ZywgQWR2YW50YWdlLCBhbmQgTWVkaWdhcCBwbGFucyBhcmUgY2hvc2VuIHNlcGFyYXRlbHk7IGNvbXBhcmUgdGhlbSBhdCBNZWRpY2FyZS5nb3YuIiB9KTsKICAgICAgICBwbGFuRm9yKG91dCwgeW91LCBwLmU2NSwgcC5lbXAsIHAuaHNhLCBwLm9uU1MsIHAudHlwZSk7CiAgICAgIH0KICAgICAgaWYgKHAuc3BFNjUpIHsKICAgICAgICBpZiAocC5zcENvdiA9PT0gIm1lZGljYXJlIikgewogICAgICAgICAgb3V0LnB1c2goeyBoOiAiWW91ciBzcG91c2U6IGFscmVhZHkgb24gTWVkaWNhcmUiLCBiOiAiTm8gZW5yb2xsbWVudCBkZWFkbGluZXMuIFJldmlldyB0aGVpciBwbGFucyBlYWNoIGZhbGwgZHVyaW5nIE9wZW4gRW5yb2xsbWVudC4iIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwbGFuRm9yKG91dCwgc3AsIHAuc3BFNjUsIHAuc3BFbXAsIHAuc3BIc2EsIG51bGwsIG51bGwpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocC50eXBlICE9PSAiYWxyZWFkeV9tZWRpY2FyZSIpIG91dC5wdXNoKHsgaDogIkNvbXBhcmUgcGxhbnMgYW5kIHJldmlldyBldmVyeSBmYWxsIiwgYjogIlVzZSB0aGUgUGxhbiBGaW5kZXIgYXQgTWVkaWNhcmUuZ292IHdpdGggeW91ciBleGFjdCBkcnVnIGxpc3QuIEVhY2ggeWVhciwgT3BlbiBFbnJvbGxtZW50IChPY3RvYmVyIDE1IFx1MjAxMyBEZWNlbWJlciA3KSBsZXRzIHlvdSBzd2l0Y2ggZHJ1ZyBvciBBZHZhbnRhZ2UgcGxhbnMsIGFuZCBBZHZhbnRhZ2UgbWVtYmVycyBnZXQgYSBzZWNvbmQgY2hhbmNlIEphbnVhcnkgMSBcdTIwMTMgTWFyY2ggMzEuIiB9KTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIC8qIC0tLS0tLS0tLS0gcmVjb21tZW5kYXRpb24gLS0tLS0tLS0tLSAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVJlc3VsdChhbnN3ZXJzKSB7CiAgICAgIHZhciBtID0gMCwgYSA9IDA7CiAgICAgIENIT0lDRV9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbiAocSkgewogICAgICAgIHZhciB2YWwgPSBhbnN3ZXJzW3EuaWRdOyBpZiAoIXZhbCkgcmV0dXJuOwogICAgICAgIHEub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7IGlmIChvLnZhbHVlID09PSB2YWwpIHsgbSArPSBvLnNjb3JlLm07IGEgKz0gby5zY29yZS5hOyB9IH0pOwogICAgICB9KTsKICAgICAgdmFyIGRpZmYgPSBtIC0gYTsKICAgICAgcmV0dXJuIHsgcGF0aDogZGlmZiA+PSAyID8gIm1lZGlnYXAiIDogZGlmZiA8PSAtMiA/ICJhZHZhbnRhZ2UiIDogImJhbGFuY2VkIiwgbGVhbjogZGlmZiA+IDAgPyAibWVkaWdhcCIgOiBkaWZmIDwgMCA/ICJhZHZhbnRhZ2UiIDogIm5vbmUiIH07CiAgICB9CiAgICAvKiAtLS0tLS0tLS0tIGh0bWwgaGVscGVycyAtLS0tLS0tLS0tICovCiAgICBmdW5jdGlvbiBtb250aE9wdHMoKSB7IHJldHVybiBNT05USFMubWFwKGZ1bmN0aW9uIChuLCBpKSB7IHJldHVybiB7IHZhbHVlOiBTdHJpbmcoaSArIDEpLCBsYWJlbDogbiB9OyB9KTsgfQogICAgZnVuY3Rpb24geWVhck9wdHMoc3RhcnQsIGVuZCwgYXNjKSB7CiAgICAgIHZhciBhcnIgPSBbXTsKICAgICAgZm9yICh2YXIgeSA9IGVuZDsgeSA+PSBzdGFydDsgeS0tKSBhcnIucHVzaCh7IHZhbHVlOiBTdHJpbmcoeSksIGxhYmVsOiBTdHJpbmcoeSkgfSk7CiAgICAgIGlmIChhc2MpIGFyci5yZXZlcnNlKCk7CiAgICAgIHJldHVybiBhcnI7CiAgICB9CiAgICBmdW5jdGlvbiBzZWxlY3RIVE1MKGZpZWxkLCBwaCwgb3B0cywgYXJpYSkgewogICAgICB2YXIgdiA9IFN0cmluZyhzdGF0ZS5pbnRha2VbZmllbGRdKTsKICAgICAgdmFyIGggPSAiPGRpdiBjbGFzcz0nYmttLXNlbGVjdHdyYXAnPjxzZWxlY3QgY2xhc3M9J2JrbS1zZWxlY3QnIGlkPSdia20tZi0iICsgZmllbGQgKyAiJyBkYXRhLWZpZWxkPSciICsgZmllbGQgKyAiJyBhcmlhLWxhYmVsPSciICsgYXJpYSArICInPjxvcHRpb24gdmFsdWU9Jyc+IiArIHBoICsgIjwvb3B0aW9uPiI7CiAgICAgIG9wdHMuZm9yRWFjaChmdW5jdGlvbiAobykgeyBoICs9ICI8b3B0aW9uIHZhbHVlPSciICsgby52YWx1ZSArICInIiArICh2ID09PSBvLnZhbHVlID8gIiBzZWxlY3RlZCIgOiAiIikgKyAiPiIgKyBvLmxhYmVsICsgIjwvb3B0aW9uPiI7IH0pOwogICAgICByZXR1cm4gaCArICI8L3NlbGVjdD48L2Rpdj4iOwogICAgfQogICAgZnVuY3Rpb24gbGFiZWxIVE1MKGZpZWxkLCB0ZXh0KSB7IHJldHVybiAiPHAgY2xhc3M9J2JrbS1sYWJlbCcgaWQ9J2JrbS1sLSIgKyBmaWVsZCArICInPiIgKyB0ZXh0ICsgIjwvcD4iOyB9CiAgICBmdW5jdGlvbiBwaWxsc0hUTUwoZmllbGQsIG9wdHMpIHsKICAgICAgdmFyIHYgPSBzdGF0ZS5pbnRha2VbZmllbGRdOwogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9J2JrbS1waWxscm93JyByb2xlPSdyYWRpb2dyb3VwJyBhcmlhLWxhYmVsbGVkYnk9J2JrbS1sLSIgKyBmaWVsZCArICInPiIgKyBvcHRzLm1hcChmdW5jdGlvbiAobykgewogICAgICAgIHZhciBvbiA9IHYgPT09IG8udjsKICAgICAgICByZXR1cm4gIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLXBpbGwiICsgKG9uID8gIiBpcy1hY3RpdmUiIDogIiIpICsgIicgcm9sZT0ncmFkaW8nIGFyaWEtY2hlY2tlZD0nIiArIG9uICsgIicgZGF0YS1hY3Rpb249J3NldCcgZGF0YS1maWVsZD0nIiArIGZpZWxkICsgIicgZGF0YS12YWw9JyIgKyBvLnYgKyAiJz4iICsgby5sICsgIjwvYnV0dG9uPiI7CiAgICAgIH0pLmpvaW4oIiIpICsgIjwvZGl2PiI7CiAgICB9CiAgICBmdW5jdGlvbiBvcHRzSFRNTChmaWVsZCwgb3B0cywgdGlnaHQpIHsKICAgICAgdmFyIHYgPSBzdGF0ZS5pbnRha2VbZmllbGRdOwogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9J2JrbS1vcHRpb25zIiArICh0aWdodCA/ICIgaXMtdGlnaHQiIDogIiIpICsgIicgcm9sZT0ncmFkaW9ncm91cCcgYXJpYS1sYWJlbGxlZGJ5PSdia20tbC0iICsgZmllbGQgKyAiJz4iICsgb3B0cy5tYXAoZnVuY3Rpb24gKG8pIHsKICAgICAgICB2YXIgb24gPSB2ID09PSBvLnY7CiAgICAgICAgcmV0dXJuICI8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J2JrbS1vcHQiICsgKG9uID8gIiBpcy1zZWxlY3RlZCIgOiAiIikgKyAiJyByb2xlPSdyYWRpbycgYXJpYS1jaGVja2VkPSciICsgb24gKyAiJyBkYXRhLWFjdGlvbj0nc2V0JyBkYXRhLWZpZWxkPSciICsgZmllbGQgKyAiJyBkYXRhLXZhbD0nIiArIG8udiArICInPjxzcGFuIGNsYXNzPSdia20tb3B0LWRvdCc+PC9zcGFuPjxzcGFuIGNsYXNzPSdia20tb3B0LWxhYmVsJz4iICsgby5sICsgIjwvc3Bhbj48L2J1dHRvbj4iOwogICAgICB9KS5qb2luKCIiKSArICI8L2Rpdj4iOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tIVE1MKGZpZWxkLCB0ZXh0KSB7CiAgICAgIHJldHVybiAiPGxhYmVsIGNsYXNzPSdia20tY2hlY2snPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgaWQ9J2JrbS1mLSIgKyBmaWVsZCArICInIGRhdGEtZmllbGQ9JyIgKyBmaWVsZCArICInIiArIChzdGF0ZS5pbnRha2VbZmllbGRdID8gIiBjaGVja2VkIiA6ICIiKSArICI+PHNwYW4+IiArIHRleHQgKyAiPC9zcGFuPjwvbGFiZWw+IjsKICAgIH0KICAgIGZ1bmN0aW9uIG5hdkhUTUwobGFiZWwsIGRpc2FibGVkKSB7CiAgICAgIHJldHVybiAiPGRpdiBjbGFzcz0nYmttLW5hdic+PGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdia20tYnRuLWdob3N0JyBkYXRhLWFjdGlvbj0nYmFjayc+QmFjazwvYnV0dG9uPjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLWJ0bicgZGF0YS1hY3Rpb249J25leHQnIiArIChkaXNhYmxlZCA/ICIgZGlzYWJsZWQiIDogIiIpICsgIj4iICsgbGFiZWwgKyAiPC9idXR0b24+PC9kaXY+IjsKICAgIH0KICAgIGZ1bmN0aW9uIHN0ZXBIZWFkKGV5ZWJyb3csIHRpdGxlLCBoZWxwKSB7CiAgICAgIHZhciBzdCA9IHN0ZXBzKCk7CiAgICAgIHJldHVybiAiPHAgY2xhc3M9J2JrbS1leWVicm93Jz4iICsgZXllYnJvdyArICIgJm1pZGRvdDsgU3RlcCAiICsgKHN0YXRlLnN0ZXAgKyAxKSArICIgb2YgIiArIHN0Lmxlbmd0aCArICI8L3A+PGgyIGNsYXNzPSdia20tcSBia20tZm9jdXMnIHRhYmluZGV4PSctMSc+IiArIHRpdGxlICsgIjwvaDI+IiArIChoZWxwID8gIjxwIGNsYXNzPSdia20taGVscCc+IiArIGhlbHAgKyAiPC9wPiIgOiAiIik7CiAgICB9CiAgICB2YXIgWU4gPSBbeyB2OiAieWVzIiwgbDogIlllcyIgfSwgeyB2OiAibm8iLCBsOiAiTm8iIH1dOwogICAgdmFyIFlOVSA9IFt7IHY6ICJ5ZXMiLCBsOiAiWWVzIiB9LCB7IHY6ICJubyIsIGw6ICJObyIgfSwgeyB2OiAidW5zdXJlIiwgbDogIk5vdCBzdXJlIiB9XTsKICAgIGZ1bmN0aW9uIGVuZERhdGVIVE1MKG1GLCB5RiwgdUYsIGxhYmVsLCBoaW50KSB7CiAgICAgIHZhciBpID0gc3RhdGUuaW50YWtlOwogICAgICByZXR1cm4gIjxkaXYgY2xhc3M9J2JrbS1maWVsZCc+IiArIGxhYmVsSFRNTChtRiwgbGFiZWwpICsKICAgICAgICAiPGRpdiBjbGFzcz0nYmttLWRhdGVyb3ciICsgKGlbdUZdID8gIiBpcy1kaXNhYmxlZCIgOiAiIikgKyAiJz4iICsgc2VsZWN0SFRNTChtRiwgIk1vbnRoIiwgbW9udGhPcHRzKCksICJNb250aCIpICsgc2VsZWN0SFRNTCh5RiwgIlllYXIiLCB5ZWFyT3B0cyhOT1cueSAtIDMsIE5PVy55ICsgMTUsIHRydWUpLCAiWWVhciIpICsgIjwvZGl2PiIgKwogICAgICAgIGNoZWNrSFRNTCh1RiwgIk5vIGVuZCBkYXRlIHBsYW5uZWQgeWV0IikgKyAiPHAgY2xhc3M9J2JrbS1zbWFsbCc+IiArIGhpbnQgKyAiPC9wPjwvZGl2PiI7CiAgICB9CiAgICAvKiAtLS0tLS0tLS0tIHNjcmVlbnMgLS0tLS0tLS0tLSAqLwogICAgZnVuY3Rpb24gaW50cm9IVE1MKCkgewogICAgICByZXR1cm4gIjxzZWN0aW9uIGNsYXNzPSdia20tY2FyZCBia20tZmFkZSc+PHAgY2xhc3M9J2JrbS1leWVicm93Jz5BIGd1aWRlZCBkZWNpc2lvbiB0b29sIGZvciBCS00gY2xpZW50czwvcD4iICsKICAgICAgICAiPGgxIGNsYXNzPSdia20taDEgYmttLWZvY3VzJyB0YWJpbmRleD0nLTEnPkZpbmQgeW91ciBNZWRpY2FyZSA8ZW0+cGF0aHdheTwvZW0+LjwvaDE+IiArCiAgICAgICAgIjxwIGNsYXNzPSdia20tbGVhZCc+QSBmZXcgcXVlc3Rpb25zIGFib3V0IHlvdXIgZGF0ZXMsIHlvdXIgY292ZXJhZ2UsIGFuZCBob3cgeW91IGxpa2UgdG8gbWFuYWdlIGNvc3RzLiBXZSdsbCBwb2ludCB5b3UgdG93YXJkIHRoZSBwYXRoIHRoYXQgdGVuZHMgdG8gZml0IGJlc3QgJm1kYXNoOyBhIE1lZGljYXJlIFN1cHBsZW1lbnQgKE1lZGlnYXApIGFwcHJvYWNoIG9yIGEgTWVkaWNhcmUgQWR2YW50YWdlIGFwcHJvYWNoICZtZGFzaDsgd2l0aCB0aGUgcmlnaHQgYWRkLW9ucyBhbmQgYW4gZW5yb2xsbWVudCB0aW1lbGluZSBidWlsdCBmcm9tIHlvdXIgYWN0dWFsIGRhdGVzLjwvcD4iICsKICAgICAgICAiPHVsIGNsYXNzPSdia20taW50cm9saXN0Jz48bGk+PGI+QWJvdXQgNCBtaW51dGVzLjwvYj4gT25lIHN0ZXAgYXQgYSB0aW1lLjwvbGk+PGxpPjxiPkEgZGF0ZWQgcGxhbi48L2I+IEV4YWN0IGVucm9sbG1lbnQgd2luZG93cyBmb3IgeW91IGFuZCB5b3VyIHNwb3VzZS48L2xpPjxsaT48Yj5Qcml2YXRlLjwvYj4gWW91ciBhbnN3ZXJzIHN0YXkgaW4geW91ciBicm93c2VyIHVubGVzcyB5b3UgY2hvb3NlIHRvIHJlcXVlc3QgeW91ciBmdWxsIHJlcG9ydC48L2xpPjwvdWw+IiArCiAgICAgICAgIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLWJ0biBia20tYnRuLWxnJyBkYXRhLWFjdGlvbj0nYmVnaW4nPkJlZ2luPC9idXR0b24+PC9zZWN0aW9uPiI7CiAgICB9CiAgICBmdW5jdGlvbiBhZ2VzSFRNTCgpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2U7CiAgICAgIHZhciBhZ2UgPSAoaS5iaXJ0aE0gJiYgaS5iaXJ0aFkpID8gTk9XLnkgLSAoK2kuYmlydGhZKSAtIChOT1cubSA8ICtpLmJpcnRoTSA/IDEgOiAwKSA6IG51bGw7CiAgICAgIHZhciBoID0gIjxzZWN0aW9uIGNsYXNzPSdia20tY2FyZCBia20tZmFkZSc+IiArIHN0ZXBIZWFkKCJBYm91dCB5b3UiLCAiRmlyc3QsIHlvdXIgYWdlcyIsICJZb3VyIGJpcnRoIG1vbnRoIHNldHMgeW91ciBNZWRpY2FyZSBlbnJvbGxtZW50IGRhdGVzLiIpOwogICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoImJpcnRoTSIsICJZb3VyIGRhdGUgb2YgYmlydGgiKSArICI8ZGl2IGNsYXNzPSdia20tZGF0ZXJvdyc+IiArIHNlbGVjdEhUTUwoImJpcnRoTSIsICJNb250aCIsIG1vbnRoT3B0cygpLCAiQmlydGggbW9udGgiKSArIHNlbGVjdEhUTUwoImJpcnRoWSIsICJZZWFyIiwgeWVhck9wdHMoMTkzMCwgTk9XLnkgLSA0MCksICJCaXJ0aCB5ZWFyIikgKyAiPC9kaXY+IiArCiAgICAgICAgY2hlY2tIVE1MKCJiaXJ0aDFzdCIsICJJIHdhcyBib3JuIG9uIHRoZSAxc3Qgb2YgdGhlIG1vbnRoIikgKyAoYWdlICE9PSBudWxsID8gIjxwIGNsYXNzPSdia20tbm90ZSc+WW91J3JlIGFib3V0ICIgKyBhZ2UgKyAiIHllYXJzIG9sZCB0b2RheS48L3A+IiA6ICIiKSArICI8L2Rpdj4iOwogICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoIm1hcnJpZWQiLCAiQXJlIHlvdSBtYXJyaWVkIG9yIHBhcnRuZXJlZD8iKSArIHBpbGxzSFRNTCgibWFycmllZCIsIFt7IHY6ICJ5ZXMiLCBsOiAiWWVzIiB9LCB7IHY6ICJubyIsIGw6ICJKdXN0IG1lIiB9XSkgKyAiPC9kaXY+IjsKICAgICAgaWYgKGkubWFycmllZCA9PT0gInllcyIpIHsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoInNwb3VzZUJpcnRoTSIsICJZb3VyIHNwb3VzZSdzIG9yIHBhcnRuZXIncyBkYXRlIG9mIGJpcnRoIikgKyAiPGRpdiBjbGFzcz0nYmttLWRhdGVyb3cnPiIgKyBzZWxlY3RIVE1MKCJzcG91c2VCaXJ0aE0iLCAiTW9udGgiLCBtb250aE9wdHMoKSwgIlNwb3VzZSBiaXJ0aCBtb250aCIpICsgc2VsZWN0SFRNTCgic3BvdXNlQmlydGhZIiwgIlllYXIiLCB5ZWFyT3B0cygxOTMwLCBOT1cueSAtIDMwKSwgIlNwb3VzZSBiaXJ0aCB5ZWFyIikgKyAiPC9kaXY+IiArCiAgICAgICAgICBjaGVja0hUTUwoInNwb3VzZTFzdCIsICJNeSBzcG91c2Ugd2FzIGJvcm4gb24gdGhlIDFzdCBvZiB0aGUgbW9udGgiKSArICI8L2Rpdj4iOwogICAgICB9CiAgICAgIGggKz0gIjxwIGNsYXNzPSdia20tc21hbGwnIHN0eWxlPSdtYXJnaW46LThweCAwIDIwcHgnPldoeSB0aGUgMXN0PyBTb2NpYWwgU2VjdXJpdHkgdHJlYXRzIGFueW9uZSBib3JuIG9uIHRoZSAxc3QgYXMgdHVybmluZyA2NSB0aGUgbW9udGggYmVmb3JlLCBzbyBldmVyeSB3aW5kb3cgc3RhcnRzIG9uZSBtb250aCBlYXJsaWVyLjwvcD4iOwogICAgICByZXR1cm4gaCArIG5hdkhUTUwoIkNvbnRpbnVlIiwgIXZhbGlkQWdlcygpKSArICI8L3NlY3Rpb24+IjsKICAgIH0KICAgIGZ1bmN0aW9uIGNvdmVyYWdlSFRNTCgpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2U7CiAgICAgIHZhciBoID0gIjxzZWN0aW9uIGNsYXNzPSdia20tY2FyZCBia20tZmFkZSc+IiArIHN0ZXBIZWFkKCJZb3VyIGNvdmVyYWdlIiwgIllvdXIgY292ZXJhZ2UgdG9kYXkiLCAiVGhpcyBkZWNpZGVzIHlvdXIgZGVhZGxpbmVzLiBTb21lIGNvdmVyYWdlIGxldHMgeW91IGRlbGF5IFBhcnQgQiwgYW5kIHNvbWUgZG9lc24ndC4iKTsKICAgICAgaCArPSAiPGRpdiBjbGFzcz0nYmttLWZpZWxkJz4iICsgbGFiZWxIVE1MKCJjb3ZlcmFnZVR5cGUiLCAiV2hpY2ggYmVzdCBkZXNjcmliZXMgeW91ciBoZWFsdGggY292ZXJhZ2UgdG9kYXk/IikgKyBvcHRzSFRNTCgiY292ZXJhZ2VUeXBlIiwgQ09WRVJBR0VfT1BUSU9OUywgdHJ1ZSkgKyAiPC9kaXY+IjsKICAgICAgaWYgKGlzRW1wVHlwZShpLmNvdmVyYWdlVHlwZSkpIHsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoImVtcFNpemUiLCAiRG9lcyB0aGF0IGVtcGxveWVyIGhhdmUgMjAgb3IgbW9yZSBlbXBsb3llZXM/IikgKyBwaWxsc0hUTUwoImVtcFNpemUiLCBZTlUpICsgIjwvZGl2PiI7CiAgICAgICAgaCArPSBlbmREYXRlSFRNTCgiZW5kTSIsICJlbmRZIiwgImVuZFVua25vd24iLCAiV2hhdCdzIHRoZSBsYXN0IG1vbnRoIHlvdSBleHBlY3QgdG8gaGF2ZSB0aGF0IGVtcGxveWVyIGNvdmVyYWdlPyIsCiAgICAgICAgICAoaS5jb3ZlcmFnZVR5cGUgPT09ICJlbXBsb3llcl9zcG91c2UiID8gIlVzdWFsbHkgdGhlIG1vbnRoIHlvdXIgc3BvdXNlIHJldGlyZXMuICIgOiAiVXN1YWxseSB0aGUgbW9udGggeW91IHJldGlyZS4gIikgKyAiSWYgaXQgYWxyZWFkeSBlbmRlZCwgY2hvb3NlIHRoZSBtb250aCBpdCBlbmRlZC4iKTsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoImhzYSIsICJEb2VzIGFueW9uZSBpbiB5b3VyIGhvdXNlaG9sZCBjb250cmlidXRlIHRvIGEgSGVhbHRoIFNhdmluZ3MgQWNjb3VudCAoSFNBKT8iKSArIHBpbGxzSFRNTCgiaHNhIiwgWU4pICsgIjwvZGl2PiI7CiAgICAgIH0KICAgICAgaWYgKGkuY292ZXJhZ2VUeXBlICYmIGkuY292ZXJhZ2VUeXBlICE9PSAiYWxyZWFkeV9tZWRpY2FyZSIpIHsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoIm9uU1MiLCAiQXJlIHlvdSBhbHJlYWR5IHJlY2VpdmluZyBTb2NpYWwgU2VjdXJpdHkgYmVuZWZpdHM/IikgKyBwaWxsc0hUTUwoIm9uU1MiLCBZTikgKyAiPC9kaXY+IjsKICAgICAgfQogICAgICByZXR1cm4gaCArIG5hdkhUTUwoIkNvbnRpbnVlIiwgIXZhbGlkQ292ZXJhZ2UoKSkgKyAiPC9zZWN0aW9uPiI7CiAgICB9CiAgICBmdW5jdGlvbiBzcG91c2VIVE1MKCkgewogICAgICB2YXIgaSA9IHN0YXRlLmludGFrZTsKICAgICAgdmFyIG9wdHMgPSBbXTsKICAgICAgaWYgKGkuY292ZXJhZ2VUeXBlID09PSAiZW1wbG95ZXJfc2VsZiIpIG9wdHMucHVzaCh7IHY6ICJteV9lbXBsb3llciIsIGw6ICJDb3ZlcmVkIG9uIG15IGVtcGxveWVyIHBsYW4iIH0pOwogICAgICBvcHRzLnB1c2goeyB2OiAib3duX2VtcGxveWVyIiwgbDogIlRoZWlyIG93biBhY3RpdmUgZW1wbG95ZXIgb3IgdW5pb24gcGxhbiIgfSk7CiAgICAgIG9wdHMucHVzaCh7IHY6ICJtZWRpY2FyZSIsIGw6ICJBbHJlYWR5IGVucm9sbGVkIGluIE1lZGljYXJlIiB9KTsKICAgICAgb3B0cy5wdXNoKHsgdjogIm90aGVyIiwgbDogIlNvbWV0aGluZyBlbHNlIChyZXRpcmVlIHBsYW4sIENPQlJBLCBNYXJrZXRwbGFjZSwgVkEsIG9yIG5vbmUpIiB9KTsKICAgICAgdmFyIGggPSAiPHNlY3Rpb24gY2xhc3M9J2JrbS1jYXJkIGJrbS1mYWRlJz4iICsgc3RlcEhlYWQoIllvdXIgc3BvdXNlIiwgIllvdXIgc3BvdXNlJ3MgY292ZXJhZ2UiLCAiTWVkaWNhcmUgaXMgaW5kaXZpZHVhbCwgc28geW91ciBzcG91c2UgaGFzIHNlcGFyYXRlIGRlYWRsaW5lcy4iKTsKICAgICAgaCArPSAiPGRpdiBjbGFzcz0nYmttLWZpZWxkJz4iICsgbGFiZWxIVE1MKCJzcG91c2VDb3YiLCAiSG93IGlzIHlvdXIgc3BvdXNlIG9yIHBhcnRuZXIgY292ZXJlZCB0b2RheT8iKSArIG9wdHNIVE1MKCJzcG91c2VDb3YiLCBvcHRzLCB0cnVlKSArICI8L2Rpdj4iOwogICAgICBpZiAoaS5zcG91c2VDb3YgPT09ICJvd25fZW1wbG95ZXIiKSB7CiAgICAgICAgaCArPSAiPGRpdiBjbGFzcz0nYmttLWZpZWxkJz4iICsgbGFiZWxIVE1MKCJzcG91c2VFbXBTaXplIiwgIkRvZXMgdGhlaXIgZW1wbG95ZXIgaGF2ZSAyMCBvciBtb3JlIGVtcGxveWVlcz8iKSArIHBpbGxzSFRNTCgic3BvdXNlRW1wU2l6ZSIsIFlOVSkgKyAiPC9kaXY+IjsKICAgICAgICBoICs9IGVuZERhdGVIVE1MKCJzcG91c2VFbmRNIiwgInNwb3VzZUVuZFkiLCAic3BvdXNlRW5kVW5rbm93biIsICJXaGF0J3MgdGhlIGxhc3QgbW9udGggdGhleSBleHBlY3QgdG8gaGF2ZSB0aGF0IGNvdmVyYWdlPyIsICJVc3VhbGx5IHRoZSBtb250aCB0aGV5IHJldGlyZS4gSWYgaXQgYWxyZWFkeSBlbmRlZCwgY2hvb3NlIHRoZSBtb250aCBpdCBlbmRlZC4iKTsKICAgICAgICBoICs9ICI8ZGl2IGNsYXNzPSdia20tZmllbGQnPiIgKyBsYWJlbEhUTUwoInNwb3VzZUhzYSIsICJEb2VzIHlvdXIgc3BvdXNlIGNvbnRyaWJ1dGUgdG8gYW4gSFNBPyIpICsgcGlsbHNIVE1MKCJzcG91c2VIc2EiLCBZTikgKyAiPC9kaXY+IjsKICAgICAgfQogICAgICByZXR1cm4gaCArIG5hdkhUTUwoIkNvbnRpbnVlIiwgIXZhbGlkU3BvdXNlKCkpICsgIjwvc2VjdGlvbj4iOwogICAgfQogICAgZnVuY3Rpb24gY2hvaWNlSFRNTChpZCkgewogICAgICB2YXIgcSA9IG51bGw7CiAgICAgIENIT0lDRV9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbiAoeCkgeyBpZiAoeC5pZCA9PT0gaWQpIHEgPSB4OyB9KTsKICAgICAgdmFyIHNlbCA9IHN0YXRlLmFuc3dlcnNbcS5pZF0sIGxhc3QgPSBzdGF0ZS5zdGVwID09PSBzdGVwcygpLmxlbmd0aCAtIDE7CiAgICAgIHZhciBvcHRzID0gcS5vcHRpb25zLm1hcChmdW5jdGlvbiAobykgewogICAgICAgIHZhciBvbiA9IHNlbCA9PT0gby52YWx1ZTsKICAgICAgICByZXR1cm4gIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLW9wdCIgKyAob24gPyAiIGlzLXNlbGVjdGVkIiA6ICIiKSArICInIHJvbGU9J3JhZGlvJyBhcmlhLWNoZWNrZWQ9JyIgKyBvbiArICInIGRhdGEtYWN0aW9uPSdjaG9pY2UnIGRhdGEtcWlkPSciICsgcS5pZCArICInIGRhdGEtdmFsPSciICsgby52YWx1ZSArICInPjxzcGFuIGNsYXNzPSdia20tb3B0LWRvdCc+PC9zcGFuPjxzcGFuIGNsYXNzPSdia20tb3B0LWxhYmVsJz4iICsgby5sYWJlbCArICI8L3NwYW4+PC9idXR0b24+IjsKICAgICAgfSkuam9pbigiIik7CiAgICAgIHJldHVybiAiPHNlY3Rpb24gY2xhc3M9J2JrbS1jYXJkIGJrbS1mYWRlJz4iICsgc3RlcEhlYWQocS5leWVicm93LCBxLnRpdGxlLCBxLmhlbHApICsgIjxkaXYgY2xhc3M9J2JrbS1vcHRpb25zJyByb2xlPSdyYWRpb2dyb3VwJyBhcmlhLWxhYmVsPSdDaG9pY2VzJz4iICsgb3B0cyArICI8L2Rpdj4iICsgbmF2SFRNTChsYXN0ID8gIlNlZSBteSBwYXRod2F5IiA6ICJDb250aW51ZSIsICFzZWwpICsgIjwvc2VjdGlvbj4iOwogICAgfQogICAgZnVuY3Rpb24gbGlzdChpdGVtcykgeyByZXR1cm4gaXRlbXMubWFwKGZ1bmN0aW9uICh0KSB7IHJldHVybiAiPGxpPiIgKyB0ICsgIjwvbGk+IjsgfSkuam9pbigiIik7IH0KICAgIGZ1bmN0aW9uIGJhc2lzVGV4dChwKSB7CiAgICAgIHZhciBwYXJ0cyA9IFtdOwogICAgICBwYXJ0cy5wdXNoKCJBZ2UgNjU6ICIgKyBmbXQocC5lNjUpKTsKICAgICAgaWYgKHAuc3BFNjUpIHBhcnRzLnB1c2goInNwb3VzZSBhZ2UgNjU6ICIgKyBmbXQocC5zcEU2NSkpOwogICAgICBDT1ZFUkFHRV9PUFRJT05TLmZvckVhY2goZnVuY3Rpb24gKG8pIHsgaWYgKG8udiA9PT0gcC50eXBlKSBwYXJ0cy5wdXNoKG8ucyk7IH0pOwogICAgICBpZiAocC5lbXApIHBhcnRzLnB1c2gocC5lbXAua25vd24gJiYgcC5lbXAuZW5kID8gImVtcGxveWVyIGNvdmVyYWdlIHRocm91Z2ggIiArIGZtdChwLmVtcC5lbmQpIDogIm5vIGVuZCBkYXRlIHNldCIpOwogICAgICBwYXJ0cy5wdXNoKCJjYWxjdWxhdGVkICIgKyBNT05USFNbTk9XLm0gLSAxXSArICIgIiArIE5PVy5kICsgIiwgIiArIE5PVy55KTsKICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oIiAmbWlkZG90OyAiKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc3VsdHNIVE1MKCkgewogICAgICB2YXIgciA9IGNvbXB1dGVSZXN1bHQoc3RhdGUuYW5zd2VycyksIHAgPSBwcm9maWxlKCksIEEgPSBzdGF0ZS5hbnN3ZXJzOwogICAgICB2YXIgaXNNID0gci5wYXRoID09PSAibWVkaWdhcCIsIGlzQSA9IHIucGF0aCA9PT0gImFkdmFudGFnZSIsIGlzQiA9IHIucGF0aCA9PT0gImJhbGFuY2VkIjsKICAgICAgdmFyIGV4dHJhcyA9IEEuZXh0cmFzID09PSAid2FudHNfZXh0cmFzIiwgaW50bCA9IEEudHJhdmVsID09PSAiaW50ZXJuYXRpb25hbCI7CiAgICAgIHZhciBoZWFkbGluZSwgc3VtbWFyeTsKICAgICAgaWYgKGlzTSkgewogICAgICAgIGhlYWRsaW5lID0gIk9yaWdpbmFsIE1lZGljYXJlICsgYSBNZWRpZ2FwIHBvbGljeSArIGEgUGFydCBEIGRydWcgcGxhbiI7CiAgICAgICAgc3VtbWFyeSA9ICJPcmlnaW5hbCBNZWRpY2FyZSAoUGFydHMgQSBhbmQgQikgcGFpcmVkIHdpdGggYSBNZWRpY2FyZSBTdXBwbGVtZW50IChNZWRpZ2FwKSBwb2xpY3ksIHBsdXMgYSBzdGFuZC1hbG9uZSBQYXJ0IEQgcHJlc2NyaXB0aW9uIHBsYW4uIEluIFdpc2NvbnNpbiwgTWVkaWdhcCBjb21lcyBhcyBvbmUgc3RhbmRhcmRpemVkIEJhc2ljIFBsYW4gdGhhdCB5b3UgY3VzdG9taXplIHdpdGggb3B0aW9uYWwgcmlkZXJzLiBIaWdoZXIgbW9udGhseSBwcmVtaXVtLCBidXQgdmVyeSBwcmVkaWN0YWJsZSBiaWxscyBhbmQgYW55LXByb3ZpZGVyIGFjY2VzcyBuYXRpb253aWRlLiI7CiAgICAgIH0gZWxzZSBpZiAoaXNBKSB7CiAgICAgICAgaGVhZGxpbmUgPSAiQSBNZWRpY2FyZSBBZHZhbnRhZ2UgcGxhbiB3aXRoIGJ1aWx0LWluIGRydWcgY292ZXJhZ2UiICsgKGV4dHJhcyA/ICIsIGRlbnRhbCAmYW1wOyB2aXNpb24iIDogIiIpOwogICAgICAgIHN1bW1hcnkgPSAiQSBNZWRpY2FyZSBBZHZhbnRhZ2UgKFBhcnQgQykgcGxhbiBidW5kbGVzIFBhcnRzIEEsIEIsIGFuZCB1c3VhbGx5IEQsIGFuZCBvZnRlbiBhZGRzIGRlbnRhbCwgdmlzaW9uLCBoZWFyaW5nLCBhbmQgZml0bmVzcyBiZW5lZml0cywgZnJlcXVlbnRseSBmb3IgYSBsb3cgb3IgJDAgcGxhbiBwcmVtaXVtICh5b3Ugc3RpbGwgcGF5IHRoZSBQYXJ0IEIgcHJlbWl1bSkuIExvd2VyIGZpeGVkIGNvc3QsIGluIGV4Y2hhbmdlIGZvciB1c2luZyBhIGxvY2FsIG5ldHdvcmsuIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBoZWFkbGluZSA9ICJFaXRoZXIgcGF0aCBjYW4gd29yayAmbWRhc2g7IGhlcmUncyBob3cgdG8gY2hvb3NlIjsKICAgICAgICBzdW1tYXJ5ID0gIllvdXIgYW5zd2VycyBkb24ndCBwb2ludCBzdHJvbmdseSBvbmUgd2F5LiBUaGUgY29yZSB0cmFkZS1vZmY6IE1lZGlnYXAgbWVhbnMgYSBoaWdoZXIgcHJlbWl1bSB3aXRoIHByZWRpY3RhYmxlIGJpbGxzIGFuZCBhbnkgcHJvdmlkZXIgbmF0aW9ud2lkZTsgTWVkaWNhcmUgQWR2YW50YWdlIG1lYW5zIGEgbG93ZXIgcHJlbWl1bSB3aXRoIGxvY2FsIG5ldHdvcmtzIGFuZCBidW5kbGVkIGV4dHJhcy4iICsKICAgICAgICAgIChyLmxlYW4gPT09ICJtZWRpZ2FwIiA/ICIgWW91IGxlYW4gc2xpZ2h0bHkgdG93YXJkIHRoZSBNZWRpZ2FwIHNpZGUuIiA6IHIubGVhbiA9PT0gImFkdmFudGFnZSIgPyAiIFlvdSBsZWFuIHNsaWdodGx5IHRvd2FyZCB0aGUgTWVkaWNhcmUgQWR2YW50YWdlIHNpZGUuIiA6ICIiKTsKICAgICAgfQogICAgICB2YXIgd2h5ID0gW107CiAgICAgIGlmIChpc00pIHsKICAgICAgICBpZiAoQS5oZWFsdGggPT09ICJjaHJvbmljIikgd2h5LnB1c2goIldpdGggb25nb2luZyBjYXJlIG5lZWRzLCBwcmVkaWN0YWJsZSBvdXQtb2YtcG9ja2V0IGNvc3RzIGFuZCBvcGVuIHNwZWNpYWxpc3QgYWNjZXNzIGNhcnJ5IHJlYWwgdmFsdWUuIik7CiAgICAgICAgaWYgKEEucHJvdmlkZXJzID09PSAiYW55X2RvY3RvciIpIHdoeS5wdXNoKCJZb3UgY2FuIHNlZSBhbnkgZG9jdG9yIG9yIHNwZWNpYWxpc3QgbmF0aW9ud2lkZSB0aGF0IGFjY2VwdHMgTWVkaWNhcmUgJm1kYXNoOyBubyBuZXR3b3Jrcywgbm8gcmVmZXJyYWxzLiIpOwogICAgICAgIGlmIChBLnRyYXZlbCA9PT0gInNub3diaXJkIikgd2h5LnB1c2goIllvdXIgY292ZXJhZ2UgdHJhdmVscyB3aXRoIHlvdSBhY3Jvc3MgYWxsIDUwIHN0YXRlcywgd2hpY2ggZml0cyB5b3VyIHRpbWUgaW4gbW9yZSB0aGFuIG9uZSBwbGFjZS4iKTsKICAgICAgICBpZiAoaW50bCkgd2h5LnB1c2goIldpc2NvbnNpbiBNZWRpZ2FwIHBvbGljaWVzIGNhbiBhZGQgYSBmb3JlaWduIHRyYXZlbCBlbWVyZ2VuY3kgcmlkZXIsIHdoaWNoIGhlbHBzIHdpdGggZW1lcmdlbmN5IGNhcmUgYWJyb2FkIHRoYXQgT3JpZ2luYWwgTWVkaWNhcmUgYWxvbmUgZ2VuZXJhbGx5IGRvZXNuJ3QgY292ZXIuIik7CiAgICAgICAgaWYgKEEuYnVkZ2V0ID09PSAicHJlZGljdGFibGUiKSB3aHkucHVzaCgiV2lzY29uc2luJ3MgQmFzaWMgUGxhbiBjb3ZlcnMgdGhlIFBhcnQgQiBjb2luc3VyYW5jZSwgYW5kIGFkZGluZyByaWRlcnMgc3VjaCBhcyB0aGUgUGFydCBBIGRlZHVjdGlibGUgYW5kIFBhcnQgQiBleGNlc3MgY2hhcmdlcyByaWRlcnMgY2xvc2VzIG1vc3QgcmVtYWluaW5nIGdhcHMsIHNvIHRoZXJlIGFyZSB2ZXJ5IGZldyBzdXJwcmlzZSBiaWxscy4iKTsKICAgICAgfQogICAgICBpZiAoaXNBKSB7CiAgICAgICAgaWYgKEEucHJvdmlkZXJzID09PSAibmV0d29ya19vayIpIHdoeS5wdXNoKCJZb3UncmUgY29tZm9ydGFibGUgdXNpbmcgYSBwbGFuJ3MgbG9jYWwgbmV0d29yayBvZiBkb2N0b3JzLiIpOwogICAgICAgIGlmIChBLmJ1ZGdldCA9PT0gImxvd2VzdF9wcmVtaXVtIikgd2h5LnB1c2goIkxvdyBtb250aGx5IHByZW1pdW1zIGZpdCB5b3VyIHByZWZlcmVuY2UgdG8ga2VlcCBmaXhlZCBjb3N0cyBkb3duLiIpOwogICAgICAgIGlmIChBLnRyYXZlbCA9PT0gImxvY2FsIikgd2h5LnB1c2goIllvdSBtb3N0bHkgcmVjZWl2ZSBjYXJlIGNsb3NlIHRvIGhvbWUsIHdoZXJlIEFkdmFudGFnZSBuZXR3b3JrcyB3b3JrIGJlc3QuIik7CiAgICAgICAgaWYgKGV4dHJhcykgd2h5LnB1c2goIk1hbnkgQWR2YW50YWdlIHBsYW5zIGJ1bmRsZSBkZW50YWwsIHZpc2lvbiwgaGVhcmluZywgYW5kIGZpdG5lc3MgYmVuZWZpdHMgYXQgbm8gZXh0cmEgcHJlbWl1bS4iKTsKICAgICAgICBpZiAoQS5oZWFsdGggPT09ICJoZWFsdGh5Iikgd2h5LnB1c2goIldpdGggcm91dGluZSBjYXJlIG5lZWRzLCB0aGUgbG93ZXIgcHJlbWl1bSBhbmQgY29wYXkgc3RydWN0dXJlIGNhbiB3b3JrIHdlbGwuIik7CiAgICAgIH0KICAgICAgdmFyIGRydWcgPSAiPGI+UHJlc2NyaXB0aW9uIGRydWcgY292ZXJhZ2UuPC9iPiAiICsKICAgICAgICAoaXNBID8gIk1vc3QgQWR2YW50YWdlIHBsYW5zIGluY2x1ZGUgaXQ7IGNvbmZpcm0geW91ciBtZWRpY2F0aW9ucyBhcmUgb24gdGhlIHBsYW4ncyBmb3JtdWxhcnkuIiA6IGlzTSA/ICJBZGQgYSBzdGFuZC1hbG9uZSBQYXJ0IEQgcGxhbi4iIDogIldpdGggTWVkaWdhcCwgYWRkIGEgc3RhbmQtYWxvbmUgUGFydCBEIHBsYW47IE1lZGljYXJlIEFkdmFudGFnZSBwbGFucyB1c3VhbGx5IGluY2x1ZGUgZHJ1ZyBjb3ZlcmFnZS4iKSArCiAgICAgICAgIiBJbiAyMDI2LCBjb3ZlcmVkIGRydWcgY29zdHMgYXJlIGNhcHBlZCBhdCA8Yj4kMiwxMDA8L2I+IG91dCBvZiBwb2NrZXQuIiArCiAgICAgICAgKEEuZHJ1Z3MgPT09ICJsb3dfcngiID8gIiBFdmVuIHdpdGggZmV3IHByZXNjcmlwdGlvbnMsIGVucm9sbCBvbiB0aW1lIHRvIGF2b2lkIHRoZSBwZXJtYW5lbnQgbGF0ZS1lbnJvbGxtZW50IHBlbmFsdHksIHVubGVzcyB5b3UgaGF2ZSBjcmVkaXRhYmxlIGRydWcgY292ZXJhZ2UgZnJvbSBhbiBlbXBsb3llci4iIDogIiIpICsKICAgICAgICAoQS5kcnVncyA9PT0gImhpZ2hfcngiID8gIiBXaXRoIGhpZ2hlciBkcnVnIHVzZSwgcnVuIHlvdXIgZXhhY3QgZHJ1ZyBsaXN0IHRocm91Z2ggTWVkaWNhcmUncyBQbGFuIEZpbmRlcjsgdGhlIHJpZ2h0IGZvcm11bGFyeSBjYW4gc2F2ZSB0aG91c2FuZHMgYmVmb3JlIHlvdSByZWFjaCB0aGUgY2FwLiIgOiAiIik7CiAgICAgIHZhciBhZGRvbnMgPSBbZHJ1Z107CiAgICAgIGlmIChleHRyYXMgJiYgaXNNKSBhZGRvbnMucHVzaCgiPGI+RGVudGFsIGFuZCB2aXNpb24uPC9iPiBNZWRpZ2FwIGRvZXNuJ3QgaW5jbHVkZSB0aGVzZSwgc28gYWRkIGEgc3RhbmQtYWxvbmUgZGVudGFsL3Zpc2lvbiAoYW5kIGhlYXJpbmcpIHBsYW4uIik7CiAgICAgIGlmIChleHRyYXMgJiYgaXNCKSBhZGRvbnMucHVzaCgiPGI+RGVudGFsIGFuZCB2aXNpb24uPC9iPiBNZWRpZ2FwIGRvZXNuJ3QgaW5jbHVkZSB0aGVzZSAoYWRkIGEgc3RhbmQtYWxvbmUgcGxhbiksIHdoaWxlIG1hbnkgQWR2YW50YWdlIHBsYW5zIGJ1bmRsZSB0aGVtLiIpOwogICAgICBpZiAoZXh0cmFzICYmIGlzQSkgYWRkb25zLnB1c2goIjxiPkNoZWNrIHRoZSBmaW5lIHByaW50IG9uIGV4dHJhcy48L2I+IERlbnRhbCwgdmlzaW9uLCBhbmQgaGVhcmluZyBsaW1pdHMgdmFyeSB3aWRlbHkgYmV0d2VlbiBBZHZhbnRhZ2UgcGxhbnMsIHNvIGNvbXBhcmUgdGhlIGFubnVhbCBtYXhpbXVtcy4iKTsKICAgICAgaWYgKGludGwpIGFkZG9ucy5wdXNoKCI8Yj5DYXJlIGFicm9hZC48L2I+IE9yaWdpbmFsIE1lZGljYXJlIGdlbmVyYWxseSBkb2Vzbid0IGNvdmVyIGNhcmUgb3V0c2lkZSB0aGUgVS5TLiBJbiBXaXNjb25zaW4sIHlvdSBjYW4gYWRkIGEgZm9yZWlnbiB0cmF2ZWwgZW1lcmdlbmN5IHJpZGVyIHRvIGEgTWVkaWdhcCBwb2xpY3k7IGNoZWNrIGl0cyBkZWR1Y3RpYmxlIGFuZCBsaWZldGltZSBsaW1pdC4gU29tZSBBZHZhbnRhZ2UgcGxhbnMgaW5jbHVkZSBsaW1pdGVkIHdvcmxkd2lkZSBlbWVyZ2VuY3kgY292ZXJhZ2U7IGNoZWNrIGJlZm9yZSB5b3UgdHJhdmVsLiIpOwogICAgICBpZiAoaXNBKSBhZGRvbnMucHVzaCgiPGI+Q29uZmlybSB5b3VyIG5ldHdvcmsuPC9iPiBWZXJpZnkgeW91ciBkb2N0b3JzIGFuZCBwcmVmZXJyZWQgaG9zcGl0YWxzIGFyZSBpbi1uZXR3b3JrIGJlZm9yZSB5b3UgZW5yb2xsLiIpOwogICAgICBpZiAoaXNBIHx8IGlzQikgYWRkb25zLnB1c2goIjxiPlRoaW5rIGFib3V0IHN3aXRjaGluZyBiYWNrLjwvYj4gSWYgeW91IGpvaW4gTWVkaWNhcmUgQWR2YW50YWdlIHdoZW4gZmlyc3QgZWxpZ2libGUsIHlvdSBnZXQgYSAxMi1tb250aCB0cmlhbCByaWdodCB0byByZXR1cm4gdG8gT3JpZ2luYWwgTWVkaWNhcmUgYW5kIGJ1eSBNZWRpZ2FwIHdpdGhvdXQgaGVhbHRoIHF1ZXN0aW9ucy4gQWZ0ZXIgdGhhdCwgbW92aW5nIHRvIE1lZGlnYXAgdXN1YWxseSByZXF1aXJlcyBtZWRpY2FsIHVuZGVyd3JpdGluZywgYW5kIHlvdSBjYW4gYmUgZGVjbGluZWQuIik7CiAgICAgIGlmIChpc00pIGFkZG9ucy5wdXNoKCI8Yj5DaG9vc2UgeW91ciByaWRlcnMsIHRoZW4gY29tcGFyZSBieSBwcmljZS48L2I+IFdpc2NvbnNpbidzIE1lZGlnYXAgQmFzaWMgUGxhbiBpcyBzdGFuZGFyZGl6ZWQgYnkgc3RhdGUgbGF3LCBzbyBpdHMgY29yZSBiZW5lZml0cyBhcmUgdGhlIHNhbWUgYWNyb3NzIGluc3VyZXJzLiBEZWNpZGUgd2hpY2ggb3B0aW9uYWwgcmlkZXJzIHlvdSB3YW50IChjb21tb24gY2hvaWNlcyBpbmNsdWRlIHRoZSBQYXJ0IEEgZGVkdWN0aWJsZSwgUGFydCBCIGV4Y2VzcyBjaGFyZ2VzLCBhbmQgZm9yZWlnbiB0cmF2ZWwgZW1lcmdlbmN5IHJpZGVycyksIHRoZW4gY29tcGFyZSBwcmVtaXVtcywgcmF0ZSBoaXN0b3J5LCBhbmQgc2VydmljZSBmb3IgdGhhdCBzYW1lIGNvbWJpbmF0aW9uLiBXaXNjb25zaW4gYWxzbyBvZmZlcnMgbG93ZXItcHJlbWl1bSA1MCUgYW5kIDI1JSBjb3N0LXNoYXJpbmcgcGxhbnMgYW5kIGEgaGlnaC1kZWR1Y3RpYmxlIHBsYW4uIFRoZSBQYXJ0IEIgZGVkdWN0aWJsZSByaWRlciBpcyBhdmFpbGFibGUgb25seSB0byBwZW9wbGUgZWxpZ2libGUgZm9yIE1lZGljYXJlIGJlZm9yZSAyMDIwLiBPdXRzaWRlIFdpc2NvbnNpbiwgTWlubmVzb3RhLCBhbmQgTWFzc2FjaHVzZXR0cywgTWVkaWdhcCB1c2VzIGxldHRlcmVkIHBsYW5zIChzdWNoIGFzIFBsYW4gRykgaW5zdGVhZC4iKTsKICAgICAgdmFyIGxlYW5NID0gKGlzTSB8fCByLmxlYW4gPT09ICJtZWRpZ2FwIikgPyAiIGlzLWxlYW4iIDogIiIsIGxlYW5BID0gKGlzQSB8fCByLmxlYW4gPT09ICJhZHZhbnRhZ2UiKSA/ICIgaXMtbGVhbiIgOiAiIjsKICAgICAgdmFyIGNvbXBhcmUgPSAiPGRpdiBjbGFzcz0nYmttLWNvbXBhcmUnPjxkaXYgY2xhc3M9J2JrbS1jb2wiICsgbGVhbk0gKyAiJz48aDQ+TWVkaWdhcCBwYXRoPC9oND48dWw+IiArCiAgICAgICAgbGlzdChbIkFueSBwcm92aWRlciB0aGF0IHRha2VzIE1lZGljYXJlLCBuYXRpb253aWRlIiwgIk5vIHJlZmVycmFscyBvciBuZXR3b3JrcyIsICJJbiBXaXNjb25zaW46IG9uZSBCYXNpYyBQbGFuIHBsdXMgb3B0aW9uYWwgcmlkZXJzIiwgIkhpZ2hlciBwcmVtaXVtLCB2ZXJ5IHByZWRpY3RhYmxlIGJpbGxzIiwgIkFkZCBhIHNlcGFyYXRlIFBhcnQgRCBwbGFuIGFuZCBkZW50YWwvdmlzaW9uIiwgIkJ1eSBkdXJpbmcgeW91ciBvbmUtdGltZSA2LW1vbnRoIE1lZGlnYXAgd2luZG93Il0pICsKICAgICAgICAiPC91bD48L2Rpdj48ZGl2IGNsYXNzPSdia20tY29sIiArIGxlYW5BICsgIic+PGg0Pk1lZGljYXJlIEFkdmFudGFnZSBwYXRoPC9oND48dWw+IiArCiAgICAgICAgbGlzdChbIkxvY2FsIHByb3ZpZGVyIG5ldHdvcms7IHJlZmVycmFscyBwb3NzaWJsZSIsICJMb3dlciBvciAkMCBwbGFuIHByZW1pdW0iLCAiQ29wYXlzIGFzIHlvdSBnbywgdXAgdG8gYSB5ZWFybHkgbWF4aW11bSIsICJPZnRlbiBidW5kbGVzIGRydWcsIGRlbnRhbCwgdmlzaW9uLCBoZWFyaW5nIiwgIlN3aXRjaCBwbGFucyB5ZWFybHksIGJ1dCBtb3ZpbmcgdG8gTWVkaWdhcCBsYXRlciBtYXkgcmVxdWlyZSBoZWFsdGggdW5kZXJ3cml0aW5nIl0pICsKICAgICAgICAiPC91bD48L2Rpdj48L2Rpdj4iOwogICAgICB2YXIgYmxvY2tzID0gdGltZWxpbmUocCk7CiAgICAgIHZhciB0bCA9IGJsb2Nrcy5tYXAoZnVuY3Rpb24gKGIsIGlkeCkgewogICAgICAgIHZhciB0YWdDbHMgPSB7ICJBY3Rpb24gbmVlZGVkIjogInQtYWN0aW9uIiwgIktleSBkYXRlIjogInQta2V5IiwgIkNsb3NlZCI6ICJ0LWNsb3NlZCIsICJIZWFkcy11cCI6ICJ0LWhlYWRzIiB9W2IudGFnXTsKICAgICAgICB2YXIgbGlDbHMgPSBiLnRhZyA9PT0gIkFjdGlvbiBuZWVkZWQiID8gIiBjbGFzcz0naXMtdXJnZW50JyIgOiBiLnRhZyA9PT0gIkNsb3NlZCIgPyAiIGNsYXNzPSdpcy1jbG9zZWQnIiA6ICIiOwogICAgICAgIHJldHVybiAiPGxpIiArIGxpQ2xzICsgIj48c3BhbiBjbGFzcz0nYmttLXRsLXN0ZXAnPiIgKyAoaWR4ICsgMSkgKyAiPC9zcGFuPjxkaXY+IiArIChiLnRhZyA/ICI8c3BhbiBjbGFzcz0nYmttLXRhZyAiICsgdGFnQ2xzICsgIic+IiArIGIudGFnICsgIjwvc3Bhbj4iIDogIiIpICsKICAgICAgICAgICI8cCBjbGFzcz0nYmttLXRsLWgnPiIgKyBiLmggKyAiPC9wPjxwIGNsYXNzPSdia20tdGwtYic+IiArIGIuYiArICI8L3A+PC9kaXY+PC9saT4iOwogICAgICB9KS5qb2luKCIiKTsKICAgICAgdmFyIGZpZ3MgPSBbWyIkMjAyLjkwL21vIiwgIlN0YW5kYXJkIFBhcnQgQiBwcmVtaXVtIChtb3JlIGFib3ZlIHRoZSBJUk1BQSBpbmNvbWUgbGltaXRzKSJdLCBbIiQyODMiLCAiUGFydCBCIGFubnVhbCBkZWR1Y3RpYmxlIl0sIFsiJDEsNzM2IiwgIlBhcnQgQSBob3NwaXRhbCBkZWR1Y3RpYmxlLCBwZXIgYmVuZWZpdCBwZXJpb2QiXSwKICAgICAgICBbIiQyLDEwMCIsICJQYXJ0IEQgb3V0LW9mLXBvY2tldCBjYXAiXSwgWyIkNjE1IiwgIk1heGltdW0gUGFydCBEIGRydWcgZGVkdWN0aWJsZSJdLCBbIiQxMDlrIC8gJDIxOGsiLCAiTUFHSSB3aGVyZSBJUk1BQSBzdXJjaGFyZ2VzIGJlZ2luIChzaW5nbGUgLyBqb2ludCkiXV0KICAgICAgICAubWFwKGZ1bmN0aW9uIChmKSB7IHJldHVybiAiPGRpdiBjbGFzcz0nYmttLWZpZyc+PHNwYW4gY2xhc3M9J2JrbS1maWctdic+IiArIGZbMF0gKyAiPC9zcGFuPjxzcGFuIGNsYXNzPSdia20tZmlnLWwnPiIgKyBmWzFdICsgIjwvc3Bhbj48L2Rpdj4iOyB9KS5qb2luKCIiKTsKICAgICAgdmFyIGtleXMgPSBibG9ja3MuZmlsdGVyKGZ1bmN0aW9uIChiKSB7IHJldHVybiBiLnRhZyA9PT0gIkFjdGlvbiBuZWVkZWQiIHx8IGIudGFnID09PSAiS2V5IGRhdGUiOyB9KTsKICAgICAgaWYgKGtleXMubGVuZ3RoIDwgMikga2V5cyA9IGtleXMuY29uY2F0KGJsb2Nrcy5maWx0ZXIoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGIudGFnID09PSAiQ2xvc2VkIiB8fCBiLnRhZyA9PT0gIkhlYWRzLXVwIjsgfSkpOwogICAgICBrZXlzID0ga2V5cy5zbGljZSgwLCAyKTsKICAgICAgdmFyIHRhZ0NsYXNzID0geyAiQWN0aW9uIG5lZWRlZCI6ICJ0LWFjdGlvbiIsICJLZXkgZGF0ZSI6ICJ0LWtleSIsICJDbG9zZWQiOiAidC1jbG9zZWQiLCAiSGVhZHMtdXAiOiAidC1oZWFkcyIgfTsKICAgICAgdmFyIGtleUhUTUwgPSBrZXlzLmxlbmd0aCA/ICI8ZGl2IGNsYXNzPSdia20tcGFuZWwgYmttLWtleWRhdGVzJz48aDMgY2xhc3M9J2JrbS1zdWJoZWFkJz5Zb3VyIGtleSBkYXRlczwvaDM+PG9sIGNsYXNzPSdia20tdGltZWxpbmUnPiIgKyBrZXlzLm1hcChmdW5jdGlvbiAoYiwgaWR4KSB7CiAgICAgICAgcmV0dXJuICI8bGkiICsgKGIudGFnID09PSAiQWN0aW9uIG5lZWRlZCIgPyAiIGNsYXNzPSdpcy11cmdlbnQnIiA6IGIudGFnID09PSAiQ2xvc2VkIiA/ICIgY2xhc3M9J2lzLWNsb3NlZCciIDogIiIpICsgIj48c3BhbiBjbGFzcz0nYmttLXRsLXN0ZXAnPiIgKyAoaWR4ICsgMSkgKyAiPC9zcGFuPjxkaXY+PHNwYW4gY2xhc3M9J2JrbS10YWcgIiArIHRhZ0NsYXNzW2IudGFnXSArICInPiIgKyBiLnRhZyArICI8L3NwYW4+PHAgY2xhc3M9J2JrbS10bC1oJz4iICsgYi5oICsgIjwvcD48L2Rpdj48L2xpPiI7CiAgICAgIH0pLmpvaW4oIiIpICsgIjwvb2w+PC9kaXY+IiA6ICIiOwogICAgICB2YXIgc2F2ZWRIVE1MID0gc3RhdGUuc2F2ZWQgPyAiPGRpdiBjbGFzcz0nYmttLXNhdmVkJz48Yj5TYXZlZCByZXBvcnQuPC9iPiBDYWxjdWxhdGVkICIgKyBNT05USFNbTk9XLm0gLSAxXSArICIgIiArIE5PVy5kICsgIiwgIiArIE5PVy55ICsgIiwgc28gZGF0ZXMgYW5kIG9wZW4vY2xvc2VkIGxhYmVscyByZWZsZWN0IHRoYXQgZGF5LjwvZGl2PiIgOiAiIjsKICAgICAgdmFyIHJlY0hUTUwgPSBzYXZlZEhUTUwgKyAiPGRpdiBjbGFzcz0nYmttLXJlYyc+PHAgY2xhc3M9J2JrbS1leWVicm93Jz5Zb3VyIGJlc3QtZml0IGNvdmVyYWdlPC9wPjxoMiBjbGFzcz0nYmttLXJlYy10aXRsZSBia20tZm9jdXMnIHRhYmluZGV4PSctMSc+IiArIGhlYWRsaW5lICsgIjwvaDI+PHAgY2xhc3M9J2JrbS1yZWMtc3VtbWFyeSc+IiArIHN1bW1hcnkgKyAiPC9wPiIgKwogICAgICAgIChzdGF0ZS51bmxvY2tlZCAmJiB3aHkubGVuZ3RoID8gIjxoMyBjbGFzcz0nYmttLXN1YmhlYWQnPldoeSB0aGlzIGZpdHMgeW91PC9oMz48dWwgY2xhc3M9J2JrbS1jaGVja2xpc3QnPiIgKyBsaXN0KHdoeSkgKyAiPC91bD4iIDogIiIpICsgIjwvZGl2PiI7CiAgICAgIGxlYWQgPSB7CiAgICAgICAgcmVzdWx0OiBwbGFpbihoZWFkbGluZSksCiAgICAgICAgZGF0ZXM6IGtleXMubWFwKGZ1bmN0aW9uIChiKSB7IHJldHVybiBwbGFpbihiLmgpOyB9KS5qb2luKCIgfCAiKSwKICAgICAgICBkZXRhaWxzOiBsZWFkRGV0YWlscyhwLCBibG9ja3MsIGFkZG9ucyksCiAgICAgICAgbGluazogcmVwb3J0TGluaygpCiAgICAgIH07CiAgICAgIGlmICghc3RhdGUudW5sb2NrZWQpIHsKICAgICAgICB2YXIgaW5jID0gWyJZb3VyIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBlbnJvbGxtZW50IHRpbWVsaW5lICgiICsgYmxvY2tzLmxlbmd0aCArICIgc3RlcHMiICsgKHAuc3BFNjUgPyAiLCBpbmNsdWRpbmcgeW91ciBzcG91c2UncyBkYXRlcyIgOiAiIikgKyAiKSJdOwogICAgICAgIGlmICh3aHkubGVuZ3RoKSBpbmMucHVzaCgiV2h5IHRoaXMgY292ZXJhZ2UgZml0cyB5b3VyIGFuc3dlcnMiKTsKICAgICAgICBpbmMgPSBpbmMuY29uY2F0KFsiQWRkLW9ucyB0byBzZXQgdXAgYW5kIHdoYXQgdG8gY2hlY2sgYmVmb3JlIHlvdSBlbnJvbGwiLCAiQSBzaWRlLWJ5LXNpZGUgY29tcGFyaXNvbiBvZiBib3RoIE1lZGljYXJlIHBhdGhzIiwgIjIwMjYgY29zdHMgYW5kIHRoZSBpbmNvbWUgbGltaXRzIHRoYXQgcmFpc2UgcHJlbWl1bXMgKElSTUFBKSIsICJBIFBERiB0byBzYXZlIG9yIGJyaW5nIHRvIGFuIGFkdmlzb3IgbWVldGluZyJdKTsKICAgICAgICByZXR1cm4gIjxzZWN0aW9uIGNsYXNzPSdia20tcmVzdWx0cyBia20tZmFkZSc+IiArIHJlY0hUTUwgKyBrZXlIVE1MICsKICAgICAgICAgICI8ZGl2IGNsYXNzPSdia20tcGFuZWwgYmttLWxvY2tlZCc+PGgzIGNsYXNzPSdia20tc3ViaGVhZCc+WW91ciBmdWxsIHJlcG9ydCBpbmNsdWRlczwvaDM+PHVsIGNsYXNzPSdia20tY2hlY2tsaXN0Jz4iICsgbGlzdChpbmMpICsgIjwvdWw+PC9kaXY+IiArCiAgICAgICAgICAiPGRpdiBjbGFzcz0nYmttLW5hdic+PGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdia20tYnRuLWdob3N0JyBkYXRhLWFjdGlvbj0nYmFjayc+Q2hhbmdlIG15IGFuc3dlcnM8L2J1dHRvbj48YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J2JrbS1idG4tZ2hvc3QnIGRhdGEtYWN0aW9uPSdyZXN0YXJ0Jz5TdGFydCBvdmVyPC9idXR0b24+PC9kaXY+PC9zZWN0aW9uPiI7CiAgICAgIH0KICAgICAgcmV0dXJuICI8c2VjdGlvbiBjbGFzcz0nYmttLXJlc3VsdHMgYmttLWZhZGUnPiIgKyByZWNIVE1MICsga2V5SFRNTCArCiAgICAgICAgIjxkaXYgY2xhc3M9J2JrbS1wYW5lbCc+PGgzIGNsYXNzPSdia20tc3ViaGVhZCc+QWRkLW9ucyBhbmQgdGhpbmdzIHRvIGNoZWNrPC9oMz48dWwgY2xhc3M9J2JrbS1jaGVja2xpc3QnPiIgKyBsaXN0KGFkZG9ucykgKyAiPC91bD48L2Rpdj4iICsKICAgICAgICAiPGRpdiBjbGFzcz0nYmttLXBhbmVsJz48aDMgY2xhc3M9J2JrbS1zdWJoZWFkJz5Zb3VyIGZ1bGwgZW5yb2xsbWVudCB0aW1lbGluZTwvaDM+PHAgY2xhc3M9J2JrbS1iYXNpcyc+IiArIGJhc2lzVGV4dChwKSArICI8L3A+PG9sIGNsYXNzPSdia20tdGltZWxpbmUnPiIgKyB0bCArICI8L29sPjwvZGl2PiIgKwogICAgICAgICI8ZGl2IGNsYXNzPSdia20tcGFuZWwnPjxoMyBjbGFzcz0nYmttLXN1YmhlYWQnPlRoZSB0d28gcGF0aHMgYXQgYSBnbGFuY2U8L2gzPiIgKyBjb21wYXJlICsgIjwvZGl2PiIgKwogICAgICAgICI8ZGl2IGNsYXNzPSdia20tcGFuZWwnPjxoMyBjbGFzcz0nYmttLXN1YmhlYWQnPktleSAyMDI2IG51bWJlcnM8L2gzPjxkaXYgY2xhc3M9J2JrbS1maWdzJz4iICsgZmlncyArICI8L2Rpdj48L2Rpdj4iICsKICAgICAgICAiPGRpdiBjbGFzcz0nYmttLWFkdmlzb3InPjxoMyBjbGFzcz0nYmttLXN1YmhlYWQnPlRhbGsgaXQgdGhyb3VnaCB3aXRoIGEgQktNIGFkdmlzb3I8L2gzPiIgKwogICAgICAgICI8cD5Zb3VyIFBhcnQgQiBhbmQgUGFydCBEIHByZW1pdW1zIHJpc2Ugd2l0aCBpbmNvbWUgKElSTUFBKSwgYmFzZWQgb24geW91ciB0YXggcmV0dXJuIGZyb20gdHdvIHllYXJzIGVhcmxpZXI7IHlvdXIgMjAyNCByZXR1cm4gZHJpdmVzIDIwMjYgcHJlbWl1bXMuIFdlIGNhbiBoZWxwIG1hbmFnZSB5b3VyIG1vZGlmaWVkIGFkanVzdGVkIGdyb3NzIGluY29tZSB0aHJvdWdoIFJvdGgtY29udmVyc2lvbiB0aW1pbmcsIGNhcGl0YWwtZ2FpbnMgcGxhbm5pbmcsIGFuZCB0aGUgb3JkZXIgeW91IGRyYXcgZnJvbSBhY2NvdW50cywgc28gYSBvbmUtdGltZSBpbmNvbWUgc3Bpa2UgZG9lc24ndCBxdWlldGx5IHJhaXNlIHlvdXIgTWVkaWNhcmUgcHJlbWl1bXMuIFdlJ2xsIGFsc28gZml0IHlvdXIgY292ZXJhZ2UgY2hvaWNlIGludG8geW91ciBicm9hZGVyIHJldGlyZW1lbnQtaW5jb21lIGFuZCB0YXggcGxhbi48L3A+IiArCiAgICAgICAgIjxkaXYgY2xhc3M9J2JrbS1idG5yb3cnPjxhIGNsYXNzPSdia20tYm9vaycgaHJlZj0nIiArIEJPT0tJTkdfVVJMICsgIicgdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9vcGVuZXIgbm9yZWZlcnJlcic+Qm9vayBhIHRpbWUgdG8gbWVldCB3aXRoIGEgQktNIGFkdmlzb3IgJnJhcnI7PC9hPiIgKwogICAgICAgICI8YSBjbGFzcz0nYmttLWxlYXJuJyBocmVmPSciICsgV0VCU0lURV9VUkwgKyAiJyB0YXJnZXQ9J19ibGFuaycgcmVsPSdub29wZW5lciBub3JlZmVycmVyJz5MZWFybiBtb3JlIGFib3V0IEJLTSAmcmFycjs8L2E+PC9kaXY+IiArCiAgICAgICAgIjxwIGNsYXNzPSdia20tcHJpbnRvbmx5Jz5UbyBib29rIGEgdGltZSB3aXRoIGEgQktNIGFkdmlzb3IsIHZpc2l0IHd3dy5ia213bS5jb20uPC9wPjwvZGl2PiIgKwogICAgICAgICI8ZGl2IGNsYXNzPSdia20tbmF2Jz48YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J2JrbS1idG4tZ2hvc3QnIGRhdGEtYWN0aW9uPSdiYWNrJz5DaGFuZ2UgbXkgYW5zd2VyczwvYnV0dG9uPjxzcGFuPjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nYmttLWJ0bicgZGF0YS1hY3Rpb249J3ByaW50Jz5Eb3dubG9hZCBQREY8L2J1dHRvbj4gPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdia20tYnRuLWdob3N0JyBkYXRhLWFjdGlvbj0ncmVzdGFydCc+U3RhcnQgb3ZlcjwvYnV0dG9uPjwvc3Bhbj48L2Rpdj4iICsKICAgICAgICAiPHAgY2xhc3M9J2JrbS1wZGZub3RlJz5Eb3dubG9hZCBQREYgb3BlbnMgeW91ciBwcmludCB3aW5kb3cuIENob29zZSAmbGRxdW87U2F2ZSBhcyBQREYmcmRxdW87IGFzIHRoZSBwcmludGVyLjwvcD48L3NlY3Rpb24+IjsKICAgIH0KICAgIGZ1bmN0aW9uIHBsYWluKHMpIHsKICAgICAgdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOwogICAgICB0LmlubmVySFRNTCA9IFN0cmluZyhzKS5yZXBsYWNlKC88W14+XSs+L2csICIiKTsKICAgICAgcmV0dXJuIHQudmFsdWUucmVwbGFjZSgvXHMrL2csICIgIikudHJpbSgpOwogICAgfQogICAgZnVuY3Rpb24gbGVhZERldGFpbHMocCwgYmxvY2tzLCBhZGRvbnMpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5pbnRha2UsIHBhcnRzID0gW107CiAgICAgIHBhcnRzLnB1c2goIklucHV0czogIiArIHBsYWluKGJhc2lzVGV4dChwKSkpOwogICAgICBwYXJ0cy5wdXNoKCJCb3JuIG9uIHRoZSAxc3Q6ICIgKyAoaS5iaXJ0aDFzdCA/ICJ5ZXMiIDogIm5vIikpOwogICAgICBpZiAoaXNFbXBUeXBlKHAudHlwZSkpIHBhcnRzLnB1c2goIkVtcGxveWVyIDIwKyBlbXBsb3llZXM6ICIgKyBpLmVtcFNpemUgKyAiOyBIU0E6ICIgKyBpLmhzYSk7CiAgICAgIGlmIChwLnR5cGUgIT09ICJhbHJlYWR5X21lZGljYXJlIikgcGFydHMucHVzaCgiUmVjZWl2aW5nIFNvY2lhbCBTZWN1cml0eTogIiArIGkub25TUyk7CiAgICAgIGlmIChwLm1hcnJpZWQpIHBhcnRzLnB1c2goIlNwb3VzZSBjb3ZlcmFnZTogIiArIChwLnR5cGUgPT09ICJlbXBsb3llcl9zcG91c2UiID8gIm93bl9lbXBsb3llciIgOiBpLnNwb3VzZUNvdikgKyAoaS5zcG91c2VDb3YgPT09ICJvd25fZW1wbG95ZXIiID8gIiAoMjArIGVtcGxveWVlczogIiArIGkuc3BvdXNlRW1wU2l6ZSArICI7IGVuZHMgIiArIChpLnNwb3VzZUVuZFVua25vd24gPyAidW5rbm93biIgOiBNT05USFNbK2kuc3BvdXNlRW5kTSAtIDFdICsgIiAiICsgaS5zcG91c2VFbmRZKSArICI7IEhTQTogIiArIGkuc3BvdXNlSHNhICsgIikiIDogIiIpKTsKICAgICAgdmFyIHByZWZzID0gW107CiAgICAgIENIT0lDRV9RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbiAocSkgeyBxLm9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobykgeyBpZiAoby52YWx1ZSA9PT0gc3RhdGUuYW5zd2Vyc1txLmlkXSkgcHJlZnMucHVzaChxLmV5ZWJyb3cgKyAiOiAiICsgcGxhaW4oby5sYWJlbCkpOyB9KTsgfSk7CiAgICAgIHBhcnRzLnB1c2goIlByZWZlcmVuY2VzOiAiICsgcHJlZnMuam9pbigiOyAiKSk7CiAgICAgIHBhcnRzLnB1c2goIkFkZC1vbnM6ICIgKyBhZGRvbnMubWFwKHBsYWluKS5qb2luKCIgLyAiKSk7CiAgICAgIHBhcnRzLnB1c2goIlRpbWVsaW5lOiAiICsgYmxvY2tzLm1hcChmdW5jdGlvbiAoYiwgbikgeyByZXR1cm4gKG4gKyAxKSArICIuICIgKyAoYi50YWcgPyAiWyIgKyBiLnRhZyArICJdICIgOiAiIikgKyBwbGFpbihiLmgpICsgIiAoIiArIHBsYWluKGIuYikgKyAiKSI7IH0pLmpvaW4oIiAvICIpKTsKICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oIiB8ICIpOwogICAgfQogICAgLyogLS0tLS0tLS0tLSByZW5kZXIgLS0tLS0tLS0tLSAqLwogICAgdmFyIHN0YWdlID0gcm9vdC5xdWVyeVNlbGVjdG9yKCJbZGF0YS1ia209c3RhZ2VdIik7CiAgICB2YXIgdHJhY2sgPSByb290LnF1ZXJ5U2VsZWN0b3IoIltkYXRhLWJrbT10cmFja10iKTsKICAgIHZhciBmaWxsID0gcm9vdC5xdWVyeVNlbGVjdG9yKCJbZGF0YS1ia209ZmlsbF0iKTsKICAgIHZhciBub2RlcyA9IHJvb3QucXVlcnlTZWxlY3RvcigiW2RhdGEtYmttPW5vZGVzXSIpOwogICAgdmFyIGdhdGUgPSByb290LnF1ZXJ5U2VsZWN0b3IoIltkYXRhLWJrbT1nYXRlXSIpOwogICAgdmFyIHNsb3QgPSByb290LnF1ZXJ5U2VsZWN0b3IoIltkYXRhLWJrbT1mb3Jtc2xvdF0iKTsKICAgIHZhciBsZWFkRm9ybSA9IG51bGwsIHdhdGNoZWQgPSBmYWxzZTsKICAgIHZhciBpbkVkaXRvciA9IC9bPyZdZWxlbWVudG9yLXByZXZpZXc9Ly50ZXN0KGxvY2F0aW9uLnNlYXJjaCkgfHwgKGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keS5jbGFzc05hbWUuaW5kZXhPZigiZWxlbWVudG9yLWVkaXRvci1hY3RpdmUiKSA+IC0xKTsKICAgIGZ1bmN0aW9uIGZpbmRMZWFkRm9ybSgpIHsKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJrbS1sZWFkLWZvcm0iKTsKICAgICAgaWYgKGVsKSByZXR1cm4gZWw7CiAgICAgIHZhciBoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvcm0tZmllbGQtbWVkaWNhcmVfcmVzdWx0IikgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiW25hbWU9J2Zvcm1fZmllbGRzW21lZGljYXJlX3Jlc3VsdF0nXSIpOwogICAgICBpZiAoIWgpIHsKICAgICAgICB2YXIgbmFtZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJmb3JtW25hbWU9J01lZGljYXJlIFBhdGh3YXkgTGVhZCddIik7CiAgICAgICAgaWYgKG5hbWVkKSBoID0gbmFtZWQ7CiAgICAgIH0KICAgICAgaWYgKCFoKSByZXR1cm4gbnVsbDsKICAgICAgZWwgPSBoOwogICAgICB3aGlsZSAoZWwgJiYgZWwgIT09IGRvY3VtZW50LmJvZHkpIHsKICAgICAgICBpZiAoZWwuY2xhc3NOYW1lICYmIHR5cGVvZiBlbC5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsLmNsYXNzTmFtZS5pbmRleE9mKCJlbGVtZW50b3Itd2lkZ2V0LWZvcm0iKSA+IC0xKSByZXR1cm4gZWw7CiAgICAgICAgZWwgPSBlbC5wYXJlbnROb2RlOwogICAgICB9CiAgICAgIGVsID0gaDsKICAgICAgd2hpbGUgKGVsICYmIGVsLnRhZ05hbWUgIT09ICJGT1JNIikgZWwgPSBlbC5wYXJlbnROb2RlOwogICAgICByZXR1cm4gZWwgfHwgbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHVubG9jaygpIHsgaWYgKHN0YXRlLnVubG9ja2VkKSByZXR1cm47IHN0YXRlLnVubG9ja2VkID0gdHJ1ZTsgcmVuZGVyKHRydWUpOyB9CiAgICBmdW5jdGlvbiBhdHRhY2hGb3JtKCkgewogICAgICBpZiAoaW5FZGl0b3IpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGxlYWRGb3JtKSByZXR1cm4gdHJ1ZTsKICAgICAgdmFyIGYgPSBmaW5kTGVhZEZvcm0oKTsKICAgICAgaWYgKCFmKSByZXR1cm4gZmFsc2U7CiAgICAgIGxlYWRGb3JtID0gZjsKICAgICAgbGVhZEZvcm0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICAgIHNsb3QuYXBwZW5kQ2hpbGQobGVhZEZvcm0pOwogICAgICBpZiAoIXdhdGNoZWQpIHsKICAgICAgICB3YXRjaGVkID0gdHJ1ZTsKICAgICAgICBpZiAod2luZG93LmpRdWVyeSkgd2luZG93LmpRdWVyeShsZWFkRm9ybSkub24oInN1Ym1pdF9zdWNjZXNzIiwgdW5sb2NrKTsKICAgICAgICBpZiAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIpIHsKICAgICAgICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHsgaWYgKGxlYWRGb3JtLnF1ZXJ5U2VsZWN0b3IoIi5lbGVtZW50b3ItbWVzc2FnZS1zdWNjZXNzIikpIHVubG9jaygpOyB9KS5vYnNlcnZlKGxlYWRGb3JtLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBoaWRlU3RyYXlGb3JtKCkgewogICAgICBpZiAoaW5FZGl0b3IpIHJldHVybjsKICAgICAgdmFyIGYgPSBmaW5kTGVhZEZvcm0oKTsKICAgICAgaWYgKGYgJiYgIXNsb3QuY29udGFpbnMoZikpIGYuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIH0KICAgIGhpZGVTdHJheUZvcm0oKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgaGlkZVN0cmF5Rm9ybSk7CiAgICBmdW5jdGlvbiBzZXRGaWVsZChpZCwgdmFsKSB7CiAgICAgIGlmICghbGVhZEZvcm0pIHJldHVybjsKICAgICAgdmFyIGVsID0gbGVhZEZvcm0ucXVlcnlTZWxlY3RvcigiI2Zvcm0tZmllbGQtIiArIGlkKSB8fCBsZWFkRm9ybS5xdWVyeVNlbGVjdG9yKCJbbmFtZT0nZm9ybV9maWVsZHNbIiArIGlkICsgIl0nXSIpOwogICAgICBpZiAoZWwpIGVsLnZhbHVlID0gdmFsOwogICAgfQogICAgICAgIGZ1bmN0aW9uIHJlbmRlclRyYWNrKHN0KSB7CiAgICAgIGlmIChzdGF0ZS5zY3JlZW4gPT09ICJpbnRybyIpIHsgdHJhY2suaGlkZGVuID0gdHJ1ZTsgcmV0dXJuOyB9CiAgICAgIHRyYWNrLmhpZGRlbiA9IGZhbHNlOwogICAgICB2YXIgdG90YWwgPSBzdC5sZW5ndGgsIHByb2cgPSBzdGF0ZS5zY3JlZW4gPT09ICJyZXN1bHRzIiA/IHRvdGFsIDogc3RhdGUuc3RlcCwgaCA9ICIiOwogICAgICBmaWxsLnN0eWxlLndpZHRoID0gKHByb2cgLyB0b3RhbCAqIDEwMCkgKyAiJSI7CiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdG90YWw7IGsrKykgaCArPSAiPHNwYW4gY2xhc3M9J2JrbS1ub2RlIiArIChrIDwgcHJvZyA/ICIgaXMtZG9uZSIgOiAiIikgKyAoc3RhdGUuc2NyZWVuID09PSAiZmxvdyIgJiYgayA9PT0gc3RhdGUuc3RlcCA/ICIgaXMtY3VycmVudCIgOiAiIikgKyAiJz48L3NwYW4+IjsKICAgICAgbm9kZXMuaW5uZXJIVE1MID0gaCArICI8c3BhbiBjbGFzcz0nYmttLW5vZGUgYmttLW5vZGUtZW5kIiArIChzdGF0ZS5zY3JlZW4gPT09ICJyZXN1bHRzIiA/ICIgaXMtY3VycmVudCIgOiAiIikgKyAiJz48L3NwYW4+IjsKICAgIH0KICAgIGZ1bmN0aW9uIGZvY3VzS2V5KCkgewogICAgICB2YXIgYSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CiAgICAgIGlmICghYSB8fCAhcm9vdC5jb250YWlucyhhKSB8fCBhID09PSByb290KSByZXR1cm4gbnVsbDsKICAgICAgaWYgKGEuaWQpIHJldHVybiAiIyIgKyBhLmlkOwogICAgICB2YXIgYWN0ID0gYS5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIik7CiAgICAgIGlmICghYWN0KSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHMgPSAiW2RhdGEtYWN0aW9uPSciICsgYWN0ICsgIiddIjsKICAgICAgWyJkYXRhLWZpZWxkIiwgImRhdGEtdmFsIiwgImRhdGEtcWlkIl0uZm9yRWFjaChmdW5jdGlvbiAoaykgeyB2YXIgdiA9IGEuZ2V0QXR0cmlidXRlKGspOyBpZiAodikgcyArPSAiWyIgKyBrICsgIj0nIiArIHYgKyAiJ10iOyB9KTsKICAgICAgcmV0dXJuIHM7CiAgICB9CiAgICBmdW5jdGlvbiBmb2N1c0VsKGVsKSB7IGlmICghZWwpIHJldHVybjsgdHJ5IHsgZWwuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOyB9IGNhdGNoIChlKSB7IGVsLmZvY3VzKCk7IH0gfQogICAgZnVuY3Rpb24gc2Nyb2xsVG9Ub29sKCkgewogICAgICB2YXIgciA9IHJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHZoID0gd2luZG93LmlubmVySGVpZ2h0IHx8IDcwMDsKICAgICAgaWYgKHIudG9wIDwgMCB8fCByLnRvcCA+IHZoICogMC42KSB7IHRyeSB7IHJvb3Quc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogInNtb290aCIsIGJsb2NrOiAic3RhcnQiIH0pOyB9IGNhdGNoIChlKSB7IHJvb3Quc2Nyb2xsSW50b1ZpZXcodHJ1ZSk7IH0gfQogICAgfQogICAgZnVuY3Rpb24gcG9zdEhlaWdodCgpIHsKICAgICAgdHJ5IHsgaWYgKHdpbmRvdy5wYXJlbnQgJiYgd2luZG93LnBhcmVudCAhPT0gd2luZG93KSB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgdHlwZTogImJrbS1yZXNpemUiLCBoZWlnaHQ6IE1hdGguY2VpbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSB9LCAiKiIpOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgZnVuY3Rpb24gcmVuZGVyKG5hdikgewogICAgICB2YXIga2V5ID0gbmF2ID8gbnVsbCA6IGZvY3VzS2V5KCk7CiAgICAgIHZhciBzdCA9IHN0ZXBzKCk7CiAgICAgIGlmIChzdGF0ZS5zdGVwID4gc3QubGVuZ3RoIC0gMSkgc3RhdGUuc3RlcCA9IHN0Lmxlbmd0aCAtIDE7CiAgICAgIHJlbmRlclRyYWNrKHN0KTsKICAgICAgdmFyIGh0bWw7CiAgICAgIGlmIChzdGF0ZS5zY3JlZW4gPT09ICJpbnRybyIpIGh0bWwgPSBpbnRyb0hUTUwoKTsKICAgICAgZWxzZSBpZiAoc3RhdGUuc2NyZWVuID09PSAicmVzdWx0cyIpIGh0bWwgPSByZXN1bHRzSFRNTCgpOwogICAgICBlbHNlIHsKICAgICAgICB2YXIgaWQgPSBzdFtzdGF0ZS5zdGVwXTsKICAgICAgICBodG1sID0gaWQgPT09ICJhZ2VzIiA/IGFnZXNIVE1MKCkgOiBpZCA9PT0gImNvdmVyYWdlIiA/IGNvdmVyYWdlSFRNTCgpIDogaWQgPT09ICJzcG91c2UiID8gc3BvdXNlSFRNTCgpIDogY2hvaWNlSFRNTChpZCk7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLnNjcmVlbiA9PT0gInJlc3VsdHMiICYmICFzdGF0ZS51bmxvY2tlZCAmJiAhYXR0YWNoRm9ybSgpKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSBjb25zb2xlLndhcm4oIkJLTSBNZWRpY2FyZSBQYXRod2F5OiBjb3VsZCBub3QgZmluZCB0aGUgRWxlbWVudG9yIGZvcm0gKENTUyBJRCBia20tbGVhZC1mb3JtIG9yIGhpZGRlbiBmaWVsZCBtZWRpY2FyZV9yZXN1bHQpLCBzbyB0aGUgZnVsbCByZXBvcnQgaXMgc2hvd24gd2l0aG91dCBhIGZvcm0uIik7CiAgICAgICAgc3RhdGUudW5sb2NrZWQgPSB0cnVlOwogICAgICAgIGh0bWwgPSByZXN1bHRzSFRNTCgpOwogICAgICB9CiAgICAgIHN0YWdlLmlubmVySFRNTCA9IGh0bWw7CiAgICAgIHZhciBnYXRlT24gPSBzdGF0ZS5zY3JlZW4gPT09ICJyZXN1bHRzIiAmJiAhc3RhdGUudW5sb2NrZWQgJiYgISFsZWFkRm9ybTsKICAgICAgZ2F0ZS5oaWRkZW4gPSAhZ2F0ZU9uOwogICAgICBpZiAoZ2F0ZU9uICYmIGxlYWQpIHsgc2V0RmllbGQoIm1lZGljYXJlX3Jlc3VsdCIsIGxlYWQucmVzdWx0KTsgc2V0RmllbGQoIm1lZGljYXJlX2RhdGVzIiwgbGVhZC5kYXRlcyk7IHNldEZpZWxkKCJtZWRpY2FyZV9kZXRhaWxzIiwgbGVhZC5kZXRhaWxzKTsgc2V0RmllbGQoIm1lZGljYXJlX3JlcG9ydF9saW5rIiwgbGVhZC5saW5rKTsgfQogICAgICBpZiAobmF2KSB7IGZvY3VzRWwoc3RhZ2UucXVlcnlTZWxlY3RvcigiLmJrbS1mb2N1cyIpKTsgc2Nyb2xsVG9Ub29sKCk7IH0KICAgICAgZWxzZSBpZiAoa2V5KSB7IGZvY3VzRWwocm9vdC5xdWVyeVNlbGVjdG9yKGtleSkpOyB9CiAgICAgIHBvc3RIZWlnaHQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRvUHJpbnQoKSB7CiAgICAgIHZhciBkZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgYm9keSA9IGRvY3VtZW50LmJvZHk7CiAgICAgIHZhciBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCJia20tcHJpbnQtbWFya2VyIik7CiAgICAgIHJvb3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFya2VyLCByb290KTsKICAgICAgYm9keS5hcHBlbmRDaGlsZChyb290KTsKICAgICAgZGUuY2xhc3NOYW1lICs9ICIgYmttLXByaW50aW5nIjsKICAgICAgdmFyIGRvbmUgPSBmYWxzZTsKICAgICAgdmFyIGNsZWFudXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKGRvbmUpIHJldHVybjsgZG9uZSA9IHRydWU7CiAgICAgICAgZGUuY2xhc3NOYW1lID0gZGUuY2xhc3NOYW1lLnJlcGxhY2UoL1xzKmJrbS1wcmludGluZy9nLCAiIik7CiAgICAgICAgaWYgKG1hcmtlci5wYXJlbnROb2RlKSB7IG1hcmtlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyb290LCBtYXJrZXIpOyBtYXJrZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtYXJrZXIpOyB9CiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFmdGVycHJpbnQiLCBjbGVhbnVwKTsKICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIGNsZWFudXAsIHRydWUpOwogICAgICB9OwogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYWZ0ZXJwcmludCIsIGNsZWFudXApOwogICAgICB3aW5kb3cucHJpbnQoKTsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgY2xlYW51cCwgdHJ1ZSk7IH0sIDgwMCk7CiAgICB9CiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyIGVsID0gZS50YXJnZXQ7CiAgICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gcm9vdCAmJiAhKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIikpKSBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICAgIGlmICghZWwgfHwgZWwgPT09IHJvb3QpIHJldHVybjsKICAgICAgdmFyIGEgPSBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aW9uIik7CiAgICAgIGlmIChhID09PSAiYmVnaW4iKSB7IHN0YXRlLnNjcmVlbiA9ICJmbG93Ijsgc3RhdGUuc3RlcCA9IDA7IHJlbmRlcih0cnVlKTsgfQogICAgICBlbHNlIGlmIChhID09PSAibmV4dCIpIHsKICAgICAgICBpZiAoIXN0ZXBWYWxpZCgpKSByZXR1cm47CiAgICAgICAgaWYgKHN0YXRlLnN0ZXAgPCBzdGVwcygpLmxlbmd0aCAtIDEpIHN0YXRlLnN0ZXArKzsgZWxzZSBzdGF0ZS5zY3JlZW4gPSAicmVzdWx0cyI7CiAgICAgICAgcmVuZGVyKHRydWUpOwogICAgICB9IGVsc2UgaWYgKGEgPT09ICJiYWNrIikgewogICAgICAgIGV4aXRTYXZlZCgpOwogICAgICAgIGlmIChzdGF0ZS5zY3JlZW4gPT09ICJyZXN1bHRzIikgeyBzdGF0ZS5zY3JlZW4gPSAiZmxvdyI7IHN0YXRlLnN0ZXAgPSBzdGVwcygpLmxlbmd0aCAtIDE7IH0KICAgICAgICBlbHNlIGlmIChzdGF0ZS5zdGVwID4gMCkgc3RhdGUuc3RlcC0tOyBlbHNlIHN0YXRlLnNjcmVlbiA9ICJpbnRybyI7CiAgICAgICAgcmVuZGVyKHRydWUpOwogICAgICB9IGVsc2UgaWYgKGEgPT09ICJzZXQiKSB7CiAgICAgICAgdmFyIGYgPSBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQiKSwgdiA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS12YWwiKTsKICAgICAgICBzdGF0ZS5pbnRha2VbZl0gPSB2OwogICAgICAgIGlmIChmID09PSAibWFycmllZCIgJiYgdiA9PT0gIm5vIikgeyBzdGF0ZS5pbnRha2Uuc3BvdXNlQmlydGhNID0gIiI7IHN0YXRlLmludGFrZS5zcG91c2VCaXJ0aFkgPSAiIjsgc3RhdGUuaW50YWtlLnNwb3VzZTFzdCA9IGZhbHNlOyBzdGF0ZS5pbnRha2Uuc3BvdXNlQ292ID0gIiI7IH0KICAgICAgICByZW5kZXIoZmFsc2UpOwogICAgICB9IGVsc2UgaWYgKGEgPT09ICJjaG9pY2UiKSB7IHN0YXRlLmFuc3dlcnNbZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXFpZCIpXSA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS12YWwiKTsgcmVuZGVyKGZhbHNlKTsgfQogICAgICBlbHNlIGlmIChhID09PSAicHJpbnQiKSB7IGRvUHJpbnQoKTsgfQogICAgICBlbHNlIGlmIChhID09PSAicmVzdGFydCIpIHsgZXhpdFNhdmVkKCk7IHN0YXRlID0geyBzY3JlZW46ICJpbnRybyIsIHN0ZXA6IDAsIGludGFrZTogYmxhbmtJbnRha2UoKSwgYW5zd2Vyczoge30sIHVubG9ja2VkOiBzdGF0ZS51bmxvY2tlZCB9OyByZW5kZXIodHJ1ZSk7IH0KICAgIH0pOwogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoZSkgewogICAgICB2YXIgZWwgPSBlLnRhcmdldCwgZiA9IGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQiKTsKICAgICAgaWYgKCFmKSByZXR1cm47CiAgICAgIHN0YXRlLmludGFrZVtmXSA9IGVsLnR5cGUgPT09ICJjaGVja2JveCIgPyBlbC5jaGVja2VkIDogZWwudmFsdWU7CiAgICAgIHJlbmRlcihmYWxzZSk7CiAgICB9KTsKICAgIGlmIChsb2FkU2F2ZWRSZXBvcnQoKSkgcmVuZGVyKHRydWUpOyBlbHNlIHJlbmRlcihmYWxzZSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIHBvc3RIZWlnaHQpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIHBvc3RIZWlnaHQpOwogIH0KICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImxvYWRpbmciKSBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgaW5pdCk7IGVsc2UgaW5pdCgpOwp9KSgpOwo=