<?xml version="1.0" encoding="ISO-8859-1"?>
<gallerytpl>
	<name>Lightbox</name>
	<version>2.04-1</version>
	<galleryversion>1.2.1</galleryversion>
	<about>PHA+VGhpcyBHYWxsZXJ5dGVtcGxhdGUgdXNlcyB0aGUgTGlnaHRib3gyIHN5c3RlbSB2ZXJzaW9uIDIuMDQgYnkgTG9rZXNoIERoYWthcjwvcD4NCjxwPkRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8iIHRhcmdldD0iX2JsYW5rIj53d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94MjwvYT48L3A+DQo8cD5GaWxlcyB0aGF0IGNvbWUgd2l0aCBMaWdodGJveCBhcmUgc3RvcmVkIGluIDxlbT5tb2R1bGVzL0dhbGxlcnkvdGVtcGxhdGVzL2xpZ2h0Ym94LzwvZW0+PC9wPg0KPHA+TGljZW5zZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41IExpY2Vuc2U8L2E+PC9wPg0KPGEgaHJlZj0iaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNpbmciPjwvYT4=</about>
	<thumbwidth></thumbwidth>
	<thumbheight></thumbheight>
	<resizemethod></resizemethod>
	<maxnumber></maxnumber>
	<sortitems>n-isdir/s+file</sortitems>
	<tplcode>PGRpdiBjbGFzcz0iZ2FsbGVyeSI+DQp7aWYgIWVtcHR5KCRtb2R1bGVfbWVzc2FnZSl9PGg0PnskbW9kdWxlX21lc3NhZ2V8ZXNjYXBlfTwvaDQ+ey9pZn0NCntpZiAhZW1wdHkoJGdhbGxlcnl0aXRsZSl9PGgzPnskZ2FsbGVyeXRpdGxlfTwvaDM+ey9pZn0NCntpZiAhZW1wdHkoJGdhbGxlcnljb21tZW50KX08ZGl2IGNsYXNzPSJnYWxsZXJ5Y29tbWVudCI+eyRnYWxsZXJ5Y29tbWVudH08L2Rpdj57L2lmfQ0KPHA+eyRpbWFnZWNvdW50fTwvcD4NCjxkaXYgY2xhc3M9InBhZ2VuYXZpZ2F0aW9uIj4NCntpZiAkcGFnZXMgPiAxfQ0KPGRpdiBjbGFzcz0icHJldnBhZ2UiPnskcHJldnBhZ2V9PC9kaXY+DQo8ZGl2IGNsYXNzPSJuZXh0cGFnZSI+eyRuZXh0cGFnZX08L2Rpdj4NCnsvaWZ9DQp7aWYgISRoaWRlcGFyZW50bGluayAmJiAhZW1wdHkoJHBhcmVudGxpbmspfTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPnskcGFyZW50bGlua308L2Rpdj57L2lmfQ0Ke2lmICRwYWdlcyA+IDF9PGRpdiBjbGFzcz0icGFnZWxpbmtzIj57JHBhZ2VsaW5rc308L2Rpdj57L2lmfQ0KPC9kaXY+DQoNCntmb3JlYWNoIGZyb209JGltYWdlcyBpdGVtPWltYWdlfQ0KCTxkaXYgY2xhc3M9ImltZyI+DQoJe2lmICRpbWFnZS0+aXNkaXJ9DQoJCTxhIGhyZWY9InskaW1hZ2UtPmZpbGV9IiB0aXRsZT0ieyRpbWFnZS0+dGl0bGV9Ij48aW1nIHNyYz0ieyRpbWFnZS0+dGh1bWJ9IiBhbHQ9InskaW1hZ2UtPnRpdGxlfSIgLz48L2E+PGJyIC8+DQoJCXskaW1hZ2UtPnRpdGxlfQ0KCXtlbHNlfQ0KICAgPGEgaHJlZj0ieyRpbWFnZS0+ZmlsZX0iIHRpdGxlPSJ7JGltYWdlLT50aXRsZX0iIHJlbD0ibGlnaHRib3hbZ2FsbGVyeV0iPjxpbWcgc3JjPSJ7JGltYWdlLT50aHVtYn0iIGFsdD0ieyRpbWFnZS0+dGl0bGV9IiAvPjwvYT4NCgl7L2lmfQ0KCTwvZGl2Pg0Key9mb3JlYWNofQ0KPGRpdiBjbGFzcz0iZ2FsbGVyeWNsZWFyIj4mbmJzcDs8L2Rpdj4NCjwvZGl2Pg0KDQoNCg==</tplcode>
	<tplcss>LmdhbGxlcnkgLmltZyB7DQoJaGVpZ2h0OiAxMjBweDsNCgkvKndpZHRoOiAxMjBweDsqLw0KCWZsb2F0OiBsZWZ0Ow0KCW1hcmdpbjogMTBweDsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCi5nYWxsZXJ5IC5pbWcgYSB7DQoJZGlzcGxheTogaW5saW5lLWJsb2NrOw0KCWJvcmRlcjogMnB4IHNvbGlkICNkZGQ7DQoJcGFkZGluZzogMXB4Ow0KfQ0KDQouZ2FsbGVyeSAuaW1nIGE6aG92ZXIgew0KCWJvcmRlci1jb2xvcjogIzk5OTsNCn0NCg0KLmdhbGxlcnkgaW1nIHsNCglib3JkZXI6IG5vbmU7DQp9DQoNCi5nYWxsZXJ5IC5wYWdlbmF2aWdhdGlvbiB7DQoJaGVpZ2h0OiA1MHB4Ow0KfQ0KDQouZ2FsbGVyeSAucHJldnBhZ2UgYSwgLmdhbGxlcnkgLnByZXZwYWdlIGVtIHsNCglkaXNwbGF5OiBibG9jazsgDQoJd2lkdGg6IDUwcHg7IA0KCWhlaWdodDogMzlweDsNCglmbG9hdDogbGVmdDsgDQoJbWFyZ2luOiAwOw0KCXRleHQtaW5kZW50OiAtMTAwMHB4Ow0KCWJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvcHJldmlvdXMucG5nKSB0cmFuc3BhcmVudCBuby1yZXBlYXQgMCAwOw0KfQ0KDQouZ2FsbGVyeSAubmV4dHBhZ2UgYSwgLmdhbGxlcnkgLm5leHRwYWdlIGVtIHsNCglkaXNwbGF5OiBibG9jazsgDQoJd2lkdGg6IDUwcHg7IA0KCWhlaWdodDogMzlweDsNCglmbG9hdDogbGVmdDsgDQoJbWFyZ2luOiAwIDZweCAwIDA7DQoJdGV4dC1pbmRlbnQ6IC0xMDAwcHg7DQoJYmFja2dyb3VuZDogdXJsKC4uLy4uL2ltYWdlcy9uZXh0LnBuZykgdHJhbnNwYXJlbnQgbm8tcmVwZWF0IDAgMDsNCn0NCg0KLmdhbGxlcnkgLnBhcmVudGxpbmsgYSB7DQoJZGlzcGxheTogYmxvY2s7IA0KCXdpZHRoOiA1MHB4OyANCgloZWlnaHQ6IDM5cHg7DQoJZmxvYXQ6IGxlZnQ7IA0KCXRleHQtaW5kZW50OiAtMTAwMHB4Ow0KCWJhY2tncm91bmQ6IHVybCguLi8uLi9pbWFnZXMvdXBwYWdlLnBuZykgdHJhbnNwYXJlbnQgbm8tcmVwZWF0IDAgMDsNCn0NCg0KLmdhbGxlcnkgLnBhZ2VuYXZpZ2F0aW9uIGE6aG92ZXIgew0KCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTQwcHg7DQp9DQoNCi5nYWxsZXJ5IC5wcmV2cGFnZSBlbSwgLmdhbGxlcnkgLm5leHRwYWdlIGVtIHsNCgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC04MHB4Ow0KfQ0KDQouZ2FsbGVyeSAucGFnZWxpbmtzIHsNCglmbG9hdDogcmlnaHQ7DQoJYm9yZGVyLXJpZ2h0OiAycHggc29saWQgIzY2NjsNCn0NCg0KLmdhbGxlcnkgLnBhZ2VsaW5rcyBhLCAuZ2FsbGVyeSAucGFnZWxpbmtzIGVtIHsNCgltYXJnaW4tdG9wOiA2cHg7DQoJcGFkZGluZzogMCA2cHg7DQoJYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjNjY2Ow0KCXRleHQtYWxpZ246IGNlbnRlcjsNCglmb250OiBib2xkIDExcHggdmVyZGFuYTsgY29sb3I6ICM2NjY7DQp9DQoNCi5nYWxsZXJ5IC5wYWdlbGlua3MgZW0gew0KCWNvbG9yOiAjMDAwOw0KfQ0KDQouZ2FsbGVyeWNsZWFyIHsNCgljbGVhcjogYm90aDsNCn0NCg0KDQovKiBMSUdIVEJPWCAqLw0KDQojbGlnaHRib3h7CXBvc2l0aW9uOiBhYnNvbHV0ZTsJbGVmdDogMDsgd2lkdGg6IDEwMCU7IHotaW5kZXg6IDEwMDsgdGV4dC1hbGlnbjogY2VudGVyOyBsaW5lLWhlaWdodDogMDt9DQojbGlnaHRib3ggaW1neyB3aWR0aDogYXV0bzsgaGVpZ2h0OiBhdXRvO30NCiNsaWdodGJveCBhIGltZ3sgYm9yZGVyOiBub25lOyB9DQoNCiNvdXRlckltYWdlQ29udGFpbmVyeyBwb3NpdGlvbjogcmVsYXRpdmU7IGJhY2tncm91bmQtY29sb3I6ICNmZmY7IHdpZHRoOiAyNTBweDsgaGVpZ2h0OiAyNTBweDsgbWFyZ2luOiAwIGF1dG87IH0NCiNpbWFnZUNvbnRhaW5lcnsgcGFkZGluZzogMTBweDsgfQ0KDQojbG9hZGluZ3sgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDQwJTsgbGVmdDogMCU7IGhlaWdodDogMjUlOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBsaW5lLWhlaWdodDogMDsgfQ0KI2hvdmVyTmF2eyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgei1pbmRleDogMTA7IH0NCiNpbWFnZUNvbnRhaW5lcj4jaG92ZXJOYXZ7IGxlZnQ6IDA7fQ0KI2hvdmVyTmF2IGF7IG91dGxpbmU6IG5vbmU7fQ0KDQojcHJldkxpbmssICNuZXh0TGlua3sgd2lkdGg6IDQ5JTsgaGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LEFBQUEpOyAvKiBUcmljayBJRSBpbnRvIHNob3dpbmcgaG92ZXIgKi8gZGlzcGxheTogYmxvY2s7IH0NCiNwcmV2TGluayB7IGxlZnQ6IDA7IGZsb2F0OiBsZWZ0O30NCiNuZXh0TGluayB7IHJpZ2h0OiAwOyBmbG9hdDogcmlnaHQ7fQ0KI3ByZXZMaW5rOmhvdmVyLCAjcHJldkxpbms6dmlzaXRlZDpob3ZlciB7IGJhY2tncm91bmQ6IHVybCguLi9saWdodGJveC9pbWFnZXMvcHJldmxhYmVsLmdpZikgbGVmdCAxNSUgbm8tcmVwZWF0OyB9DQojbmV4dExpbms6aG92ZXIsICNuZXh0TGluazp2aXNpdGVkOmhvdmVyIHsgYmFja2dyb3VuZDogdXJsKC4uL2xpZ2h0Ym94L2ltYWdlcy9uZXh0bGFiZWwuZ2lmKSByaWdodCAxNSUgbm8tcmVwZWF0OyB9DQoNCiNpbWFnZURhdGFDb250YWluZXJ7IGZvbnQ6IDEwcHggVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBtYXJnaW46IDAgYXV0bzsgbGluZS1oZWlnaHQ6IDEuNGVtOyBvdmVyZmxvdzogYXV0bzsgd2lkdGg6IDEwMCUJOyB9DQoNCiNpbWFnZURhdGF7CXBhZGRpbmc6MCAxMHB4OyBjb2xvcjogIzY2NjsgfQ0KI2ltYWdlRGF0YSAjaW1hZ2VEZXRhaWxzeyB3aWR0aDogNzAlOyBmbG9hdDogbGVmdDsgdGV4dC1hbGlnbjogbGVmdDsgfQkNCiNpbWFnZURhdGEgI2NhcHRpb257IGZvbnQtd2VpZ2h0OiBib2xkOwl9DQojaW1hZ2VEYXRhICNudW1iZXJEaXNwbGF5eyBkaXNwbGF5OiBibG9jazsgY2xlYXI6IGxlZnQ7IHBhZGRpbmctYm90dG9tOiAxLjBlbTsJfQkJCQ0KI2ltYWdlRGF0YSAjYm90dG9tTmF2Q2xvc2V7IHdpZHRoOiA2NnB4OyBmbG9hdDogcmlnaHQ7ICBwYWRkaW5nLWJvdHRvbTogMC43ZW07IG91dGxpbmU6IG5vbmU7fQkgCQ0KDQojb3ZlcmxheXsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IHotaW5kZXg6IDkwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiA1MDBweDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsgfQ0KDQo=</tplcss>
	<tpljs>PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ibW9kdWxlcy9HYWxsZXJ5L3RlbXBsYXRlcy9saWdodGJveC9qcy9wcm90b3R5cGUuanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ibW9kdWxlcy9HYWxsZXJ5L3RlbXBsYXRlcy9saWdodGJveC9qcy9zY3JpcHRhY3Vsb3VzLmpzP2xvYWQ9ZWZmZWN0cyxidWlsZGVyIj48L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Im1vZHVsZXMvR2FsbGVyeS90ZW1wbGF0ZXMvbGlnaHRib3gvanMvbGlnaHRib3guanMiPjwvc2NyaXB0Pg0K</tpljs>
	<file>
	  <filename>/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/css/lightbox.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I2xpZ2h0Ym94ewlwb3NpdGlvbjogYWJzb2x1dGU7CWxlZnQ6IDA7IHdpZHRoOiAxMDAlOyB6LWluZGV4OiAxMDA7IHRleHQtYWxpZ246IGNlbnRlcjsgbGluZS1oZWlnaHQ6IDA7fQojbGlnaHRib3ggaW1neyB3aWR0aDogYXV0bzsgaGVpZ2h0OiBhdXRvO30KI2xpZ2h0Ym94IGEgaW1neyBib3JkZXI6IG5vbmU7IH0KCiNvdXRlckltYWdlQ29udGFpbmVyeyBwb3NpdGlvbjogcmVsYXRpdmU7IGJhY2tncm91bmQtY29sb3I6ICNmZmY7IHdpZHRoOiAyNTBweDsgaGVpZ2h0OiAyNTBweDsgbWFyZ2luOiAwIGF1dG87IH0KI2ltYWdlQ29udGFpbmVyeyBwYWRkaW5nOiAxMHB4OyB9CgojbG9hZGluZ3sgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDQwJTsgbGVmdDogMCU7IGhlaWdodDogMjUlOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBsaW5lLWhlaWdodDogMDsgfQojaG92ZXJOYXZ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyBoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlOyB6LWluZGV4OiAxMDsgfQojaW1hZ2VDb250YWluZXI+I2hvdmVyTmF2eyBsZWZ0OiAwO30KI2hvdmVyTmF2IGF7IG91dGxpbmU6IG5vbmU7fQoKI3ByZXZMaW5rLCAjbmV4dExpbmt7IHdpZHRoOiA0OSU7IGhlaWdodDogMTAwJTsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxBQUFBKTsgLyogVHJpY2sgSUUgaW50byBzaG93aW5nIGhvdmVyICovIGRpc3BsYXk6IGJsb2NrOyB9CiNwcmV2TGluayB7IGxlZnQ6IDA7IGZsb2F0OiBsZWZ0O30KI25leHRMaW5rIHsgcmlnaHQ6IDA7IGZsb2F0OiByaWdodDt9CiNwcmV2TGluazpob3ZlciwgI3ByZXZMaW5rOnZpc2l0ZWQ6aG92ZXIgeyBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL3ByZXZsYWJlbC5naWYpIGxlZnQgMTUlIG5vLXJlcGVhdDsgfQojbmV4dExpbms6aG92ZXIsICNuZXh0TGluazp2aXNpdGVkOmhvdmVyIHsgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9uZXh0bGFiZWwuZ2lmKSByaWdodCAxNSUgbm8tcmVwZWF0OyB9CgojaW1hZ2VEYXRhQ29udGFpbmVyeyBmb250OiAxMHB4IFZlcmRhbmEsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgbWFyZ2luOiAwIGF1dG87IGxpbmUtaGVpZ2h0OiAxLjRlbTsgb3ZlcmZsb3c6IGF1dG87IHdpZHRoOiAxMDAlCTsgfQoKI2ltYWdlRGF0YXsJcGFkZGluZzowIDEwcHg7IGNvbG9yOiAjNjY2OyB9CiNpbWFnZURhdGEgI2ltYWdlRGV0YWlsc3sgd2lkdGg6IDcwJTsgZmxvYXQ6IGxlZnQ7IHRleHQtYWxpZ246IGxlZnQ7IH0JCiNpbWFnZURhdGEgI2NhcHRpb257IGZvbnQtd2VpZ2h0OiBib2xkOwl9CiNpbWFnZURhdGEgI251bWJlckRpc3BsYXl7IGRpc3BsYXk6IGJsb2NrOyBjbGVhcjogbGVmdDsgcGFkZGluZy1ib3R0b206IDEuMGVtOwl9CQkJCiNpbWFnZURhdGEgI2JvdHRvbU5hdkNsb3NleyB3aWR0aDogNjZweDsgZmxvYXQ6IHJpZ2h0OyAgcGFkZGluZy1ib3R0b206IDAuN2VtOyBvdXRsaW5lOiBub25lO30JIAkKCiNvdmVybGF5eyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgei1pbmRleDogOTA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDUwMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/bullet.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhBgAGAIAAADs7O1paWiH5BAAAAAAALAAAAAAGAAYAAAIIRB6Gy816QAEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/close.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhGgAaALMJAHt7e8jIyJycnPT09JiYmL29vWVlZd7e3lpaWv///wAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAAAaABoAAASLMEl5pr0YH1PzDZxmIEjnJQUZThtJmljqrsnovpl8r8HtwigfbqKbmYq/mDCEHCp9AIKwdApOd8DcVZX1NEmA7kmwHFQxA5tPcLYcANtCO9HaIuTV+k6IzxymAgNwPn1uU3h6LoV0h25qiiyNF39CAXSPJIuRPgYUj5qGRiw2oJNckwaWcxticywWEQA7]]></data>
	</file>
	<file>
	  <filename>/images/closelabel.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhQgAWAOYAAMDAwMHBwZ2dnVlZWdLS0oODg6+vr/X19eTk5FBQULi4uIyMjJSUlFRUVFZWVtzc3FJSUsnJyVFRUVhYWFVVVezs7FNTU/b29v39/erq6vr6+qampldXV6KiokxMTE9PT2ZmZvf3993d3czMzGBgYHt7e6Ghofz8/PDw8N7e3mxsbLW1tfv7+5WVlc3NzcrKynh4eOvr60tLS+Dg4F9fX7m5ud/f37S0tIaGhnBwcGNjY+Xl5ZKSkoiIiKmpqW5ubpeXl29vb9XV1Y6Oju3t7WVlZXZ2dpiYmG1tbXx8fO/v7+fn57GxsbOzs/Hx8Xl5eVpaWmRkZE1NTXNzc2dnZ5aWloeHh+Pj405OTmlpadvb23p6ev////7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAABCABYAAAf/gFyCg4SFhoeIiYqLjI2Oj4xdkpOUlZaXl5BcJ42Ynp+YkZJcLEdCXJZcIwIaqKCvoKJdIUAeUSKuXYIuNB5VF5QVWgiwXQjDlwdaWrqLo00yAxZFWq6qJA0DHj6SBAtb4AsEXQBbzJUABeBbBQCUCusFL1wB6+uDoxlbHwMJVDaCRtCwMAALDhRdImxZEEFLhAIGyJmrZGALAwJaCDDYElGigYwbLtDjGKBkAHz5SiQY0EDFDBfYBkixEgJVgQIHJuWUeE4Sgi0CKgmYOJSSoHoPDhmtUIIfBSTYJiToIbKLli3uLJXrybPSVQVdKirYeXRLUkOVuMRIAmGAAw4D/yAMqSlp6yW7k4paAtqlgrotGxCUbSGgsAKURlEYoTBgQoMOrSbhRTcx75ZLfLscAPDN7EjChhFP4qIkCGOWDHRNIoD1bmVJ8MZRYp1VMseRZwulnTElGwUHcU1gcHXg5k5jOSdbzWyZmOZJQHErHZ1ChQRpWUA4mAChw3BJChk6LLBgM0cA6JlVvJhxI9iw7DdsOVnPgMkARARRB3E9AYwrLziwnQTCueJNPOOUY09W6ayzQG0NgnPYSPZ4Zo0IIEAARQIlZCBIDQJOIEEHJ1ByjHOvnHjJMjlFwsUDOqzkXwyoCLKCBBxwIMMNxfSYijNcOMEABB9s4aFRK1iQQDAOIvjo5CjO6MICD09UkAuUTPyww5VPwiILFxpUdQkGS3DZ5SuyNOOJfmf6mGaPgQAAOw==]]></data>
	</file>
	<file>
	  <filename>/images/download-icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgAWAPfFAGtra1NTU1JSUmtra46Ojo+Pj8nJyZCQkLi4uLS0tJGRkZOTk4yMjFNTU5SUlI+Pj6GhoYSEhD4+PouLi8LCwoSEhMbGxpmZmVJSUpGRkYWFhZOTk8TExK+vr5+fn66urpiYmFNTU4+Pj5GRkUpKSqGhoYyMjHZ2dr29vZCQkKurq6SkpIODg7q6uqCgoIWFhWlpacjIyI2NjZCQkJCQkLCwsLCwsGpqaomJiampqYqKisPDw2tra4mJiZ6enszMzGhoaKurq46OjqysrKWlpaysrJqamqmpqaioqLm5uZmZmZycnJubm6CgoI6Ojo2NjZKSkpSUlL+/v66urr29vZKSkq+vr8rKyqenp5aWlre3t7q6upaWlqenp7i4uIuLi3Z2dr6+vpGRkYyMjJKSkpGRkampqaSkpIeHh6ampp6enru7u5OTk7+/v7a2tr6+vpKSkoyMjIaGhlFRUbW1tZKSkvn5+aioqLi4uJOTk5CQkImJiYeHh8HBwaysrJKSkp2dnaOjo7a2tn19fZqamqGhoZqamo6OjoiIiJeXl5SUlIaGhoqKik9PT5GRkaGhoYeHh46Ojvz8/IuLi5+fn7Ozs5CQkIiIiIGBgaCgoMXFxaqqqoyMjG5uboaGhomJiaqqqqGhoZiYmKOjo5aWlnp6epGRkbGxsby8vGtra2lpaXd3d8fHx5SUlImJiaKiora2tqenp6SkpJWVlcrKyrS0tKurq3R0dI2NjZ2dnaampqenp5mZmVJSUmtra8LCwmtra97e3mxsbFJSUv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAMUALAAAAAAWABYAAAj/AIsJHEiwoMFijYQpXKgQmMOHEB2SABbjhx9btkCZuXNnly4ismSNehUq1BstDmmNisgyYq41woCxCvWrps2bOH8ZwhNTUyZiQIMKHUqMF6yYO9QAtROsqdOnQUXVitknF9GrQUmditmGCVass6zEpGIIqKSnaIMFzeMn5hZeX6/+MRMTT6K4RE3tigmLVKu/ef78MUXYkmERIiJFEiFLYaVWeVYNm0y5MhhcuDhFCqXQRh5Tw0JZqYWHyi8LtDhMGcZp0iROlBRO+WNpGJ0klA38QgXLyjBXjBhNWqLQliURw9pwoLyl1pRdoX67uuTKkEJQiYcZsEDZjy5KvPIMXPN0CRIkUgp3ReI07A0eympEmZr0YtgLT/dbCVNlKhN7G2ZQZokrLAwCxjAVJFiBKcJIoAoulAyTSXiRQIJJKbd0AkwIlghmCifCFCMBEBuGYOKJlYVwg0MKzREQADs=]]></data>
	</file>
	<file>
	  <filename>/images/loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAPcAAP///7Ozs/v7+9bW1uHh4fLy8rq6uoGBgTQ0NAEBARsbG8TExJeXl/39/VRUVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAAACwAAAAAIAAgAAAI+gABCBxIkOCCAwsKKlzIcOCBhwUJFGiocICBgg8PEBzAkSLBAg8DEMw4sADHAR5HPkQpkKTAkwRSDjTwkIFDiAAInJRJkMHDiwBcwuQ5cMABnxMfOsi5c6DOATFfMmCQcGCAnwp1ljwJdeCCqVNZGq3akGvHnmCnRvVodu3GtDZTPnW78CsDlnJ5EgBKtC9RsxxNLjBAuHBfwBwLK+Yr8+QCmAMGL/ZLWSZdipcZzvW4OaXZiQpNcuUJuGBpzHifclyruuvLy6oJdmbq+uVqAE1PgiYqWuzZ2Idv4z47vLbcpsWdIvcsPHlR4szxOneamWEBussrZzVOMSAAIfkEBQoAAAAsAAAAABgAEgAACIAAAQgcSLAggAEGEypkAIAhQQMLFEZUOJDBgQMJGWgs6FDggosYDWrsmBCkgYQLNhLsaAAkxYYMJhIkAFJmxoYEBFps6FIgAQMGEFZUWbBlToEDgAI9SoCB0JdIlUIsADXhT6lVFSY9mVVhgaddw3odQLYs2KpmzYolUHZBWbEBAQAh+QQFCgAAACwBAAAAHQAOAAAIiQABCBxIcOAABgUTKlwoEGHCAQwHEoBIkIFFggEiEjRggGJDAA4BUAzJkKMBAgMthiSpcYDJlApZMlzAceTFAiBFFsSpkIBJnAgRGvg40MCBA0MHDEA5kGYAj00JLjh69KRSpTwLDI14kOpRg1cJMNXo9QBUkVfPLjR6IGNPpWM1MoibUKxGjQEBACH5BAUKAAAALAcAAAAZABEAAAiBAAEIHAiAgAGCCBMqBLDAwAKEDxcWIIDQgEWCDDIuHDCg4sWBGjdyLDDQ4kGQDCImJMCxo0CTAheEXAigJUUAMAkwALCTpkCbOD/OROjyJ8ebBAf0rLk04QCkCpHuDOCTZs+mVSHGzOrTAEmuYMMmPEC27AGVYM2aFQuArAOzCwICACH5BAUKAAAALA4AAAASABgAAAiCAAEsIACgoMGDCAcsQAhgAEGGAhcsNLjAgAGIEScCIGDxIkSJGjsOwAiy4ICOGDMCKNDx4UeJDQMY0CiQAYOUBgoctMmAJkabAICmDBr05tCdRo8edKm0adOkKW9KdXrAIIORTpsaYHrUwIEDAah+/eoT4gAGYw9AxZnWo9IAZAEEBAAh+QQFCgAAACwOAAAAEgAeAAAImQABDCgAoKDBgwgFDkjIsOCAhwcHLFjQ8OFCgxMvJrRoUCLFihALTvzIkCOAkQ0dhswY0YABAgwJaCTg0qXGhgtqGiDZUOfLlB1tAkU4cKhRowySKhUIlAEAp1Cdplya9KjVgwStfjRw1SCDmw0JBDg4lqGBAzAFVm3I4IDbgwacggVAwO0BnkDPvrVql+vRAXav2s161CXDgAAh+QQFCgAAACwPAAEAEQAfAAAIjAABCBwIgEABgggTDhiQsGGBhQ0jLiQQkSCBhQwrCrwIUePGjgM5ehSIcQDFihwxaiyZUSPHkyMJwBxJE6GBmzgXaMTJ00DFngZ01hxKcwADBkI9Hj1ac+nShjpbCjyaVKBPpgN1MhB4oCuAgyQjdj1AEGvCsQO3VkRLk+1UtWcPOFDY0K3HBQeqagwIACH5BAUKAAAALAgADgAYABIAAAh9AAEIHEiwIIABCBMOKGCw4UCFCh06TLggIQGJGDNiHKAxowEDHDsa/EjyosiBBRaQNLBA5AAGJgmsDHnwgIGGDAwO+GgSAIMDB3ISJMCgKMYFQA+YFApgAVOHSW86LNpyZFKCT30aNZi0KsasAq9iPVDQa1mpA3OCPUmzY0AAIfkEBQoAAAAsAgASAB0ADgAACIkAAQgcSLCgQQAEDhIkwEChQQIDBiQ8aODAAQMOCUbcWECjxY8ZNW6MKJDBxwMMBmQkgHHgSJYnWyZcYHCAAQM0B0JUWfFAAII/AWBkQBRAgZsGJj4sqBJAQ6dQAdi8GXLgU4JFBS642bRqVKhXWVINWbQr0asAtrasihatS6UOu2IN6pXt2owBAQAh+QQFCgAAACwAAA8AGQARAAAIgAAXHBhI8ACAgwgTKjxYsODChwkFEnQwEKLFixgxFjCQseOCjg8ZgIQYIGEAAhgHQGTAQOXBlgsJDJiZ0CVHhCxFAjDAE4DMmQUSBlXIEiHPmz9dWmT5cWfPgzMHoHy4oKjRp1BpLk14tKbWhVav3kQ4FWJThAsMnB2p0EDZhAEBACH5BAUKAAAALAEACAARABgAAAh3AAccOGAAgMGDCA8aGDhwQcKHABgOZDAAIsIFEg9YTBhgYMGNHEGKHEmypMmTKDcuYMCgJEuWIF++BLmyJcICHx+ydHhwgQEDFQcINUggIYGfBgoAEFoRItKmTCEOQHow6kOkRQ1aTfizqdahDwl4/ToWpFgAAQEAIfkEBQoAAAAsAAACAA4AHQAACIoAAQgcCGCBAYIIBx44wCAhwoUHBjgcGADiRIULD15cYJFgQ4IQP3qUCIDAgQAEUYokMHHAR5ETFwiUeRFAAY01WzLYyROmwJ49E7rcCYBnzqMISV4cYMCAUoQEmkp1aFDqggJCrQ4kMACrwKhOCQ4Yy1Kg14EFxg4o61At24Rcx9ZUm1NuzgJvAwIAOw==]]></data>
	</file>
	<file>
	  <filename>/images/nextlabel.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhPwAgAPeDAP39/enp6UdHR6mpqY+Pj+bm5tDQ0MLCwuzs7O/v76qqqvHx8fb29vr6+v7+/lxcXPf39+3t7WdnZ2VlZV9fX0lJSc3Nze7u7ltbW/v7+7y8vKampurq6qenp3BwcPDw8FpaWoCAgLGxsWNjY2BgYPn5+ejo6ExMTFRUVE5OTqOjo9LS0mJiYufn52hoaI6OjldXV2FhYVFRUaioqNXV1d/f38HBwfz8/Pj4+JGRkbS0tF1dXd7e3oODg3p6eoGBgfLy8mZmZoKCgs/Pz1JSUllZWaurq4WFhW1tbWRkZOLi4srKylZWVqSkpLW1tbKysre3t0VFRV5eXqKiovPz88vLy8bGxmtra3V1dcjIyJqamlVVVXh4eIiIiEhISHd3d9jY2I2Njbq6upmZmeDg4G5ubktLS9bW1tzc3FNTU6WlpWpqap2dnU9PT66urr6+voyMjE1NTYaGhuTk5OHh4dfX16ysrOvr68PDw0JCQlhYWH5+fnNzc3l5eZubm+Pj42xsbPT09P///zMzMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAIMALAAAAAA/ACAAAAj/AAcNEkSwoMGDCBMqXMgQ4cCGECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKEECsDLDQsEbNkQICuREwYCbHZTQaOKSIAIFeOaoGGDEjYIOOiB4BECgQgweBBvseSDIBAsUE0aM2GGhxRUMZAQ5IHCiigEYIzAQIUHiy4KlOVCkOIJDUIMQUgQFeNAjggkTLZQuiQPHQZYUWhyUKMCBTYUVHDgAWErARZg2OgRl+EFBL4gXCcekeeKhTAKDRgQECMl0TQEuRf4I4qw3BhIFalTYYUAQQh8ZIFYcHCCgAGsCEnDU2SIHgpDOAZJg4OMBSYi3ggD08LKjxvDixyUAwXEw5YSCLiT0PjiSIAICBJMFiSCygYUPIAaJG1eJ/IMgBoA8MEEQnuWAEA96hCAIFBV0kB94/EngnyBDMCGDC3pRgIUGHIpBRwlCwICGXT6gAEZB+rH2wgQTCuJHBQQGMMEJAtSYxwYimLFBQTQU4QF2M0SxH0hUJBCfZgicBkB7FzQZAQML3HGkIAsEkAFBDCBwQ0pcVtTAEAaEKaYBFnjXJUQl2HDAmmwe8MYZZ8Yp55x01mnnnQo9hCdEAu0JUUAAOw==]]></data>
	</file>
	<file>
	  <filename>/images/prevlabel.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhPwAgAPeJANzc3P39/fb29rq6utra2v7+/ltbW8HBwfX19fz8/F5eXk1NTV9fX/r6+uDg4NXV1djY2ICAgGBgYFFRUVRUVEpKSt3d3eLi4tnZ2cDAwOPj4/n5+cLCwsPDw/Dw8PLy8ru7u6CgoN/f34ODg0JCQktLS11dXVpaWnJycmpqar6+vpCQkJSUlMzMzPj4+KSkpFJSUmVlZcbGxsTExGxsbIGBgba2tuXl5WNjY3BwcHZ2dmZmZufn5+vr687OztfX18rKysnJyejo6FxcXFBQUKGhoY2NjZubm3h4eHt7e5iYmN7e3tPT00BAQLi4uEdHR39/f3p6evPz89bW1qenp+bm5k9PT3d3d2RkZEhISHl5eby8vPT09HR0dG9vb62traOjo/v7+66urr+/v25ubmFhYWlpadTU1I6OjrW1tb29vaKiourq6p2dnbm5uVVVVZqamqampvHx8ff396qqqtDQ0IyMjMjIyKioqKurq2JiYoaGhklJSVhYWLOzs+Hh4UFBQXFxcc/Pz8vLy3Nzc+/v71dXV+7u7v///zMzMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAIkALAAAAAA/ACAAAAj/ABEJHEiwoMGDCBMqNJgo0cKHECM+dCixosWLGDNq3Mixo8ePIEOKHEmypMmTKFNubOBjTAYOU1wIJJAhg4oWQgR+6HCg5wEOPAbJKDBwQ5A7IhHUmMCgaRIHiIrAUKCgTIw8iCwYMGTgxAkFddBMADCQgAkjIgVA8SLgQ5oSdhKsMQBgg4UcfX5osLJCBIS/BQ4sCDEQTwUfaSMQSoCowAkdUl4ouCEwDhEOVRZQKeghBQ0EiBBcCUQ0pIAIOTwgsJHFSAAwBrZgUINDgoMLFEaocOOkA2M4FIAgYlIBxEgBI4iYGCIBCQZEL2DEGEIBxQxEAAyYMLMDx4gGiDAszVCCSIkEHsdr7Ogw48ccgUUMAPlSYoBAABNYaBCx5ELpJGQ4gAULjCXWhUEhMNBDAjro8QF2C9BxkAwL7CGBICSdhgJ4BIWgwAWIgFBCG1lNsMIDKJ5xiECF0FBBFAFkqEUKHA50xBsiIMIFEnwE8QcFT5AgZBN+CFTAEYCIUVIAGjhQ2kBsACATIj08IMQGABCgpZYeDCQHBKCpJOZFNxAAwJlonhnjmA+1YMMAcMY5AAhhsPlQAQHkqaeedvbp55+ABiqonxQNulBDAQEAOw==]]></data>
	</file>
	<file>
	  <filename>/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/js/builder.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gc2NyaXB0LmFjdWxvLnVzIGJ1aWxkZXIuanMgdjEuOC4xLCBUaHUgSmFuIDAzIDIyOjA3OjEyIC0wNTAwIDIwMDgKCi8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykKLy8KLy8gc2NyaXB0LmFjdWxvLnVzIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbiBNSVQtc3R5bGUgbGljZW5zZS4KLy8gRm9yIGRldGFpbHMsIHNlZSB0aGUgc2NyaXB0LmFjdWxvLnVzIHdlYiBzaXRlOiBodHRwOi8vc2NyaXB0LmFjdWxvLnVzLwoKdmFyIEJ1aWxkZXIgPSB7CiAgTk9ERU1BUDogewogICAgQVJFQTogJ21hcCcsCiAgICBDQVBUSU9OOiAndGFibGUnLAogICAgQ09MOiAndGFibGUnLAogICAgQ09MR1JPVVA6ICd0YWJsZScsCiAgICBMRUdFTkQ6ICdmaWVsZHNldCcsCiAgICBPUFRHUk9VUDogJ3NlbGVjdCcsCiAgICBPUFRJT046ICdzZWxlY3QnLAogICAgUEFSQU06ICdvYmplY3QnLAogICAgVEJPRFk6ICd0YWJsZScsCiAgICBURDogJ3RhYmxlJywKICAgIFRGT09UOiAndGFibGUnLAogICAgVEg6ICd0YWJsZScsCiAgICBUSEVBRDogJ3RhYmxlJywKICAgIFRSOiAndGFibGUnCiAgfSwKICAvLyBub3RlOiBGb3IgRmlyZWZveCA8IDEuNSwgT1BUSU9OIGFuZCBPUFRHUk9VUCB0YWdzIGFyZSBjdXJyZW50bHkgYnJva2VuLAogIC8vICAgICAgIGR1ZSB0byBhIEZpcmVmb3ggYnVnCiAgbm9kZTogZnVuY3Rpb24oZWxlbWVudE5hbWUpIHsKICAgIGVsZW1lbnROYW1lID0gZWxlbWVudE5hbWUudG9VcHBlckNhc2UoKTsKICAgIAogICAgLy8gdHJ5IGlubmVySFRNTCBhcHByb2FjaAogICAgdmFyIHBhcmVudFRhZyA9IHRoaXMuTk9ERU1BUFtlbGVtZW50TmFtZV0gfHwgJ2Rpdic7CiAgICB2YXIgcGFyZW50RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50VGFnKTsKICAgIHRyeSB7IC8vIHByZXZlbnQgSUUgImZlYXR1cmUiOiBodHRwOi8vZGV2LnJ1YnlvbnJhaWxzLm9yZy90aWNrZXQvMjcwNwogICAgICBwYXJlbnRFbGVtZW50LmlubmVySFRNTCA9ICI8IiArIGVsZW1lbnROYW1lICsgIj48LyIgKyBlbGVtZW50TmFtZSArICI+IjsKICAgIH0gY2F0Y2goZSkge30KICAgIHZhciBlbGVtZW50ID0gcGFyZW50RWxlbWVudC5maXJzdENoaWxkIHx8IG51bGw7CiAgICAgIAogICAgLy8gc2VlIGlmIGJyb3dzZXIgYWRkZWQgd3JhcHBpbmcgdGFncwogICAgaWYoZWxlbWVudCAmJiAoZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT0gZWxlbWVudE5hbWUpKQogICAgICBlbGVtZW50ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShlbGVtZW50TmFtZSlbMF07CiAgICAKICAgIC8vIGZhbGxiYWNrIHRvIGNyZWF0ZUVsZW1lbnQgYXBwcm9hY2gKICAgIGlmKCFlbGVtZW50KSBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50TmFtZSk7CiAgICAKICAgIC8vIGFib3J0IGlmIG5vdGhpbmcgY291bGQgYmUgY3JlYXRlZAogICAgaWYoIWVsZW1lbnQpIHJldHVybjsKCiAgICAvLyBhdHRyaWJ1dGVzIChvciB0ZXh0KQogICAgaWYoYXJndW1lbnRzWzFdKQogICAgICBpZih0aGlzLl9pc1N0cmluZ09yTnVtYmVyKGFyZ3VtZW50c1sxXSkgfHwKICAgICAgICAoYXJndW1lbnRzWzFdIGluc3RhbmNlb2YgQXJyYXkpIHx8CiAgICAgICAgYXJndW1lbnRzWzFdLnRhZ05hbWUpIHsKICAgICAgICAgIHRoaXMuX2NoaWxkcmVuKGVsZW1lbnQsIGFyZ3VtZW50c1sxXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBhdHRycyA9IHRoaXMuX2F0dHJpYnV0ZXMoYXJndW1lbnRzWzFdKTsKICAgICAgICAgIGlmKGF0dHJzLmxlbmd0aCkgewogICAgICAgICAgICB0cnkgeyAvLyBwcmV2ZW50IElFICJmZWF0dXJlIjogaHR0cDovL2Rldi5ydWJ5b25yYWlscy5vcmcvdGlja2V0LzI3MDcKICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmlubmVySFRNTCA9ICI8IiArZWxlbWVudE5hbWUgKyAiICIgKwogICAgICAgICAgICAgICAgYXR0cnMgKyAiPjwvIiArIGVsZW1lbnROYW1lICsgIj4iOwogICAgICAgICAgICB9IGNhdGNoKGUpIHt9CiAgICAgICAgICAgIGVsZW1lbnQgPSBwYXJlbnRFbGVtZW50LmZpcnN0Q2hpbGQgfHwgbnVsbDsKICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCBmaXJlZm94IDEuMC5YIGJ1ZwogICAgICAgICAgICBpZighZWxlbWVudCkgewogICAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW1lbnROYW1lKTsKICAgICAgICAgICAgICBmb3IoYXR0ciBpbiBhcmd1bWVudHNbMV0pIAogICAgICAgICAgICAgICAgZWxlbWVudFthdHRyID09ICdjbGFzcycgPyAnY2xhc3NOYW1lJyA6IGF0dHJdID0gYXJndW1lbnRzWzFdW2F0dHJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9IGVsZW1lbnROYW1lKQogICAgICAgICAgICAgIGVsZW1lbnQgPSBwYXJlbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGVsZW1lbnROYW1lKVswXTsKICAgICAgICAgIH0KICAgICAgICB9IAoKICAgIC8vIHRleHQsIG9yIGFycmF5IG9mIGNoaWxkcmVuCiAgICBpZihhcmd1bWVudHNbMl0pCiAgICAgIHRoaXMuX2NoaWxkcmVuKGVsZW1lbnQsIGFyZ3VtZW50c1syXSk7CgogICAgIHJldHVybiBlbGVtZW50OwogIH0sCiAgX3RleHQ6IGZ1bmN0aW9uKHRleHQpIHsKICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7CiAgfSwKCiAgQVRUUl9NQVA6IHsKICAgICdjbGFzc05hbWUnOiAnY2xhc3MnLAogICAgJ2h0bWxGb3InOiAnZm9yJwogIH0sCgogIF9hdHRyaWJ1dGVzOiBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7CiAgICB2YXIgYXR0cnMgPSBbXTsKICAgIGZvcihhdHRyaWJ1dGUgaW4gYXR0cmlidXRlcykKICAgICAgYXR0cnMucHVzaCgoYXR0cmlidXRlIGluIHRoaXMuQVRUUl9NQVAgPyB0aGlzLkFUVFJfTUFQW2F0dHJpYnV0ZV0gOiBhdHRyaWJ1dGUpICsKICAgICAgICAgICc9IicgKyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV0udG9TdHJpbmcoKS5lc2NhcGVIVE1MKCkuZ3N1YigvIi8sJyZxdW90OycpICsgJyInKTsKICAgIHJldHVybiBhdHRycy5qb2luKCIgIik7CiAgfSwKICBfY2hpbGRyZW46IGZ1bmN0aW9uKGVsZW1lbnQsIGNoaWxkcmVuKSB7CiAgICBpZihjaGlsZHJlbi50YWdOYW1lKSB7CiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRyZW4pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZih0eXBlb2YgY2hpbGRyZW49PSdvYmplY3QnKSB7IC8vIGFycmF5IGNhbiBob2xkIG5vZGVzIGFuZCB0ZXh0CiAgICAgIGNoaWxkcmVuLmZsYXR0ZW4oKS5lYWNoKCBmdW5jdGlvbihlKSB7CiAgICAgICAgaWYodHlwZW9mIGU9PSdvYmplY3QnKQogICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChlKQogICAgICAgIGVsc2UKICAgICAgICAgIGlmKEJ1aWxkZXIuX2lzU3RyaW5nT3JOdW1iZXIoZSkpCiAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoQnVpbGRlci5fdGV4dChlKSk7CiAgICAgIH0pOwogICAgfSBlbHNlCiAgICAgIGlmKEJ1aWxkZXIuX2lzU3RyaW5nT3JOdW1iZXIoY2hpbGRyZW4pKQogICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoQnVpbGRlci5fdGV4dChjaGlsZHJlbikpOwogIH0sCiAgX2lzU3RyaW5nT3JOdW1iZXI6IGZ1bmN0aW9uKHBhcmFtKSB7CiAgICByZXR1cm4odHlwZW9mIHBhcmFtPT0nc3RyaW5nJyB8fCB0eXBlb2YgcGFyYW09PSdudW1iZXInKTsKICB9LAogIGJ1aWxkOiBmdW5jdGlvbihodG1sKSB7CiAgICB2YXIgZWxlbWVudCA9IHRoaXMubm9kZSgnZGl2Jyk7CiAgICAkKGVsZW1lbnQpLnVwZGF0ZShodG1sLnN0cmlwKCkpOwogICAgcmV0dXJuIGVsZW1lbnQuZG93bigpOwogIH0sCiAgZHVtcDogZnVuY3Rpb24oc2NvcGUpIHsgCiAgICBpZih0eXBlb2Ygc2NvcGUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHNjb3BlICE9ICdmdW5jdGlvbicpIHNjb3BlID0gd2luZG93OyAvL2dsb2JhbCBzY29wZSAKICAKICAgIHZhciB0YWdzID0gKCJBIEFCQlIgQUNST05ZTSBBRERSRVNTIEFQUExFVCBBUkVBIEIgQkFTRSBCQVNFRk9OVCBCRE8gQklHIEJMT0NLUVVPVEUgQk9EWSAiICsKICAgICAgIkJSIEJVVFRPTiBDQVBUSU9OIENFTlRFUiBDSVRFIENPREUgQ09MIENPTEdST1VQIEREIERFTCBERk4gRElSIERJViBETCBEVCBFTSBGSUVMRFNFVCAiICsKICAgICAgIkZPTlQgRk9STSBGUkFNRSBGUkFNRVNFVCBIMSBIMiBIMyBINCBINSBINiBIRUFEIEhSIEhUTUwgSSBJRlJBTUUgSU1HIElOUFVUIElOUyBJU0lOREVYICIrCiAgICAgICJLQkQgTEFCRUwgTEVHRU5EIExJIExJTksgTUFQIE1FTlUgTUVUQSBOT0ZSQU1FUyBOT1NDUklQVCBPQkpFQ1QgT0wgT1BUR1JPVVAgT1BUSU9OIFAgIisKICAgICAgIlBBUkFNIFBSRSBRIFMgU0FNUCBTQ1JJUFQgU0VMRUNUIFNNQUxMIFNQQU4gU1RSSUtFIFNUUk9ORyBTVFlMRSBTVUIgU1VQIFRBQkxFIFRCT0RZIFREICIrCiAgICAgICJURVhUQVJFQSBURk9PVCBUSCBUSEVBRCBUSVRMRSBUUiBUVCBVIFVMIFZBUiIpLnNwbGl0KC9ccysvKTsKICAKICAgIHRhZ3MuZWFjaCggZnVuY3Rpb24odGFnKXsgCiAgICAgIHNjb3BlW3RhZ10gPSBmdW5jdGlvbigpIHsgCiAgICAgICAgcmV0dXJuIEJ1aWxkZXIubm9kZS5hcHBseShCdWlsZGVyLCBbdGFnXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOyAgCiAgICAgIH0gCiAgICB9KTsKICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/js/effects.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gc2NyaXB0LmFjdWxvLnVzIGVmZmVjdHMuanMgdjEuOC4xLCBUaHUgSmFuIDAzIDIyOjA3OjEyIC0wNTAwIDIwMDgKCi8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykKLy8gQ29udHJpYnV0b3JzOgovLyAgSnVzdGluIFBhbG1lciAoaHR0cDovL2VuY3l0ZW1lZGlhLmNvbS8pCi8vICBNYXJrIFBpbGdyaW0gKGh0dHA6Ly9kaXZlaW50b21hcmsub3JnLykKLy8gIE1hcnRpbiBCaWFsYXNpbmtpCi8vIAovLyBzY3JpcHQuYWN1bG8udXMgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFuIE1JVC1zdHlsZSBsaWNlbnNlLgovLyBGb3IgZGV0YWlscywgc2VlIHRoZSBzY3JpcHQuYWN1bG8udXMgd2ViIHNpdGU6IGh0dHA6Ly9zY3JpcHQuYWN1bG8udXMvIAoKLy8gY29udmVydHMgcmdiKCkgYW5kICN4eHggdG8gI3h4eHh4eCBmb3JtYXQsICAKLy8gcmV0dXJucyBzZWxmIChvciBmaXJzdCBhcmd1bWVudCkgaWYgbm90IGNvbnZlcnRhYmxlICAKU3RyaW5nLnByb3RvdHlwZS5wYXJzZUNvbG9yID0gZnVuY3Rpb24oKSB7ICAKICB2YXIgY29sb3IgPSAnIyc7CiAgaWYgKHRoaXMuc2xpY2UoMCw0KSA9PSAncmdiKCcpIHsgIAogICAgdmFyIGNvbHMgPSB0aGlzLnNsaWNlKDQsdGhpcy5sZW5ndGgtMSkuc3BsaXQoJywnKTsgIAogICAgdmFyIGk9MDsgZG8geyBjb2xvciArPSBwYXJzZUludChjb2xzW2ldKS50b0NvbG9yUGFydCgpIH0gd2hpbGUgKCsraTwzKTsgIAogIH0gZWxzZSB7ICAKICAgIGlmICh0aGlzLnNsaWNlKDAsMSkgPT0gJyMnKSB7ICAKICAgICAgaWYgKHRoaXMubGVuZ3RoPT00KSBmb3IodmFyIGk9MTtpPDQ7aSsrKSBjb2xvciArPSAodGhpcy5jaGFyQXQoaSkgKyB0aGlzLmNoYXJBdChpKSkudG9Mb3dlckNhc2UoKTsgIAogICAgICBpZiAodGhpcy5sZW5ndGg9PTcpIGNvbG9yID0gdGhpcy50b0xvd2VyQ2FzZSgpOyAgCiAgICB9ICAKICB9ICAKICByZXR1cm4gKGNvbG9yLmxlbmd0aD09NyA/IGNvbG9yIDogKGFyZ3VtZW50c1swXSB8fCB0aGlzKSk7ICAKfTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzID0gZnVuY3Rpb24oZWxlbWVudCkgeyAgCiAgcmV0dXJuICRBKCQoZWxlbWVudCkuY2hpbGROb2RlcykuY29sbGVjdCggZnVuY3Rpb24obm9kZSkgewogICAgcmV0dXJuIChub2RlLm5vZGVUeXBlPT0zID8gbm9kZS5ub2RlVmFsdWUgOiAKICAgICAgKG5vZGUuaGFzQ2hpbGROb2RlcygpID8gRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzKG5vZGUpIDogJycpKTsKICB9KS5mbGF0dGVuKCkuam9pbignJyk7Cn07CgpFbGVtZW50LmNvbGxlY3RUZXh0Tm9kZXNJZ25vcmVDbGFzcyA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeyAgCiAgcmV0dXJuICRBKCQoZWxlbWVudCkuY2hpbGROb2RlcykuY29sbGVjdCggZnVuY3Rpb24obm9kZSkgewogICAgcmV0dXJuIChub2RlLm5vZGVUeXBlPT0zID8gbm9kZS5ub2RlVmFsdWUgOiAKICAgICAgKChub2RlLmhhc0NoaWxkTm9kZXMoKSAmJiAhRWxlbWVudC5oYXNDbGFzc05hbWUobm9kZSxjbGFzc05hbWUpKSA/IAogICAgICAgIEVsZW1lbnQuY29sbGVjdFRleHROb2Rlc0lnbm9yZUNsYXNzKG5vZGUsIGNsYXNzTmFtZSkgOiAnJykpOwogIH0pLmZsYXR0ZW4oKS5qb2luKCcnKTsKfTsKCkVsZW1lbnQuc2V0Q29udGVudFpvb20gPSBmdW5jdGlvbihlbGVtZW50LCBwZXJjZW50KSB7CiAgZWxlbWVudCA9ICQoZWxlbWVudCk7ICAKICBlbGVtZW50LnNldFN0eWxlKHtmb250U2l6ZTogKHBlcmNlbnQvMTAwKSArICdlbSd9KTsgICAKICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB3aW5kb3cuc2Nyb2xsQnkoMCwwKTsKICByZXR1cm4gZWxlbWVudDsKfTsKCkVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQpewogIHJldHVybiAkKGVsZW1lbnQpLnN0eWxlLm9wYWNpdHkgfHwgJyc7Cn07CgpFbGVtZW50LmZvcmNlUmVyZW5kZXJpbmcgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgdHJ5IHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpOwogICAgZWxlbWVudC5hcHBlbmRDaGlsZChuKTsKICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobik7CiAgfSBjYXRjaChlKSB7IH0KfTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdmFyIEVmZmVjdCA9IHsKICBfZWxlbWVudERvZXNOb3RFeGlzdEVycm9yOiB7CiAgICBuYW1lOiAnRWxlbWVudERvZXNOb3RFeGlzdEVycm9yJywKICAgIG1lc3NhZ2U6ICdUaGUgc3BlY2lmaWVkIERPTSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCBidXQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZWZmZWN0IHRvIG9wZXJhdGUnCiAgfSwKICBUcmFuc2l0aW9uczogewogICAgbGluZWFyOiBQcm90b3R5cGUuSywKICAgIHNpbm9pZGFsOiBmdW5jdGlvbihwb3MpIHsKICAgICAgcmV0dXJuICgtTWF0aC5jb3MocG9zKk1hdGguUEkpLzIpICsgMC41OwogICAgfSwKICAgIHJldmVyc2U6IGZ1bmN0aW9uKHBvcykgewogICAgICByZXR1cm4gMS1wb3M7CiAgICB9LAogICAgZmxpY2tlcjogZnVuY3Rpb24ocG9zKSB7CiAgICAgIHZhciBwb3MgPSAoKC1NYXRoLmNvcyhwb3MqTWF0aC5QSSkvNCkgKyAwLjc1KSArIE1hdGgucmFuZG9tKCkvNDsKICAgICAgcmV0dXJuIHBvcyA+IDEgPyAxIDogcG9zOwogICAgfSwKICAgIHdvYmJsZTogZnVuY3Rpb24ocG9zKSB7CiAgICAgIHJldHVybiAoLU1hdGguY29zKHBvcypNYXRoLlBJKig5KnBvcykpLzIpICsgMC41OwogICAgfSwKICAgIHB1bHNlOiBmdW5jdGlvbihwb3MsIHB1bHNlcykgeyAKICAgICAgcHVsc2VzID0gcHVsc2VzIHx8IDU7IAogICAgICByZXR1cm4gKAogICAgICAgICgocG9zICUgKDEvcHVsc2VzKSkgKiBwdWxzZXMpLnJvdW5kKCkgPT0gMCA/IAogICAgICAgICAgICAgICgocG9zICogcHVsc2VzICogMikgLSAocG9zICogcHVsc2VzICogMikuZmxvb3IoKSkgOiAKICAgICAgICAgIDEgLSAoKHBvcyAqIHB1bHNlcyAqIDIpIC0gKHBvcyAqIHB1bHNlcyAqIDIpLmZsb29yKCkpCiAgICAgICAgKTsKICAgIH0sCiAgICBzcHJpbmc6IGZ1bmN0aW9uKHBvcykgeyAKICAgICAgcmV0dXJuIDEgLSAoTWF0aC5jb3MocG9zICogNC41ICogTWF0aC5QSSkgKiBNYXRoLmV4cCgtcG9zICogNikpOyAKICAgIH0sCiAgICBub25lOiBmdW5jdGlvbihwb3MpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZnVsbDogZnVuY3Rpb24ocG9zKSB7CiAgICAgIHJldHVybiAxOwogICAgfQogIH0sCiAgRGVmYXVsdE9wdGlvbnM6IHsKICAgIGR1cmF0aW9uOiAgIDEuMCwgICAvLyBzZWNvbmRzCiAgICBmcHM6ICAgICAgICAxMDAsICAgLy8gMTAwPSBhc3N1bWUgNjZmcHMgbWF4LgogICAgc3luYzogICAgICAgZmFsc2UsIC8vIHRydWUgZm9yIGNvbWJpbmluZwogICAgZnJvbTogICAgICAgMC4wLAogICAgdG86ICAgICAgICAgMS4wLAogICAgZGVsYXk6ICAgICAgMC4wLAogICAgcXVldWU6ICAgICAgJ3BhcmFsbGVsJwogIH0sCiAgdGFnaWZ5VGV4dDogZnVuY3Rpb24oZWxlbWVudCkgewogICAgdmFyIHRhZ2lmeVN0eWxlID0gJ3Bvc2l0aW9uOnJlbGF0aXZlJzsKICAgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSkgdGFnaWZ5U3R5bGUgKz0gJzt6b29tOjEnOwogICAgCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgICRBKGVsZW1lbnQuY2hpbGROb2RlcykuZWFjaCggZnVuY3Rpb24oY2hpbGQpIHsKICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlPT0zKSB7CiAgICAgICAgY2hpbGQubm9kZVZhbHVlLnRvQXJyYXkoKS5lYWNoKCBmdW5jdGlvbihjaGFyYWN0ZXIpIHsKICAgICAgICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKAogICAgICAgICAgICBuZXcgRWxlbWVudCgnc3BhbicsIHtzdHlsZTogdGFnaWZ5U3R5bGV9KS51cGRhdGUoCiAgICAgICAgICAgICAgY2hhcmFjdGVyID09ICcgJyA/IFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSA6IGNoYXJhY3RlciksIAogICAgICAgICAgICAgIGNoaWxkKTsKICAgICAgICB9KTsKICAgICAgICBFbGVtZW50LnJlbW92ZShjaGlsZCk7CiAgICAgIH0KICAgIH0pOwogIH0sCiAgbXVsdGlwbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGVmZmVjdCkgewogICAgdmFyIGVsZW1lbnRzOwogICAgaWYgKCgodHlwZW9mIGVsZW1lbnQgPT0gJ29iamVjdCcpIHx8IAogICAgICAgIE9iamVjdC5pc0Z1bmN0aW9uKGVsZW1lbnQpKSAmJiAKICAgICAgIChlbGVtZW50Lmxlbmd0aCkpCiAgICAgIGVsZW1lbnRzID0gZWxlbWVudDsKICAgIGVsc2UKICAgICAgZWxlbWVudHMgPSAkKGVsZW1lbnQpLmNoaWxkTm9kZXM7CiAgICAgIAogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICAgICAgc3BlZWQ6IDAuMSwKICAgICAgZGVsYXk6IDAuMAogICAgfSwgYXJndW1lbnRzWzJdIHx8IHsgfSk7CiAgICB2YXIgbWFzdGVyRGVsYXkgPSBvcHRpb25zLmRlbGF5OwoKICAgICRBKGVsZW1lbnRzKS5lYWNoKCBmdW5jdGlvbihlbGVtZW50LCBpbmRleCkgewogICAgICBuZXcgZWZmZWN0KGVsZW1lbnQsIE9iamVjdC5leHRlbmQob3B0aW9ucywgeyBkZWxheTogaW5kZXggKiBvcHRpb25zLnNwZWVkICsgbWFzdGVyRGVsYXkgfSkpOwogICAgfSk7CiAgfSwKICBQQUlSUzogewogICAgJ3NsaWRlJzogIFsnU2xpZGVEb3duJywnU2xpZGVVcCddLAogICAgJ2JsaW5kJzogIFsnQmxpbmREb3duJywnQmxpbmRVcCddLAogICAgJ2FwcGVhcic6IFsnQXBwZWFyJywnRmFkZSddCiAgfSwKICB0b2dnbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGVmZmVjdCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBlZmZlY3QgPSAoZWZmZWN0IHx8ICdhcHBlYXInKS50b0xvd2VyQ2FzZSgpOwogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICAgICAgcXVldWU6IHsgcG9zaXRpb246J2VuZCcsIHNjb3BlOihlbGVtZW50LmlkIHx8ICdnbG9iYWwnKSwgbGltaXQ6IDEgfQogICAgfSwgYXJndW1lbnRzWzJdIHx8IHsgfSk7CiAgICBFZmZlY3RbZWxlbWVudC52aXNpYmxlKCkgPyAKICAgICAgRWZmZWN0LlBBSVJTW2VmZmVjdF1bMV0gOiBFZmZlY3QuUEFJUlNbZWZmZWN0XVswXV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgfQp9OwoKRWZmZWN0LkRlZmF1bHRPcHRpb25zLnRyYW5zaXRpb24gPSBFZmZlY3QuVHJhbnNpdGlvbnMuc2lub2lkYWw7CgovKiAtLS0tLS0tLS0tLS0tIGNvcmUgZWZmZWN0cyAtLS0tLS0tLS0tLS0tICovCgpFZmZlY3QuU2NvcGVkUXVldWUgPSBDbGFzcy5jcmVhdGUoRW51bWVyYWJsZSwgewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lZmZlY3RzICA9IFtdOwogICAgdGhpcy5pbnRlcnZhbCA9IG51bGw7ICAgIAogIH0sCiAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CiAgICB0aGlzLmVmZmVjdHMuX2VhY2goaXRlcmF0b3IpOwogIH0sCiAgYWRkOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgIHZhciB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgIAogICAgdmFyIHBvc2l0aW9uID0gT2JqZWN0LmlzU3RyaW5nKGVmZmVjdC5vcHRpb25zLnF1ZXVlKSA/IAogICAgICBlZmZlY3Qub3B0aW9ucy5xdWV1ZSA6IGVmZmVjdC5vcHRpb25zLnF1ZXVlLnBvc2l0aW9uOwogICAgCiAgICBzd2l0Y2gocG9zaXRpb24pIHsKICAgICAgY2FzZSAnZnJvbnQnOgogICAgICAgIC8vIG1vdmUgdW5zdGFydGVkIGVmZmVjdHMgYWZ0ZXIgdGhpcyBlZmZlY3QgIAogICAgICAgIHRoaXMuZWZmZWN0cy5maW5kQWxsKGZ1bmN0aW9uKGUpeyByZXR1cm4gZS5zdGF0ZT09J2lkbGUnIH0pLmVhY2goIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgZS5zdGFydE9uICArPSBlZmZlY3QuZmluaXNoT247CiAgICAgICAgICAgIGUuZmluaXNoT24gKz0gZWZmZWN0LmZpbmlzaE9uOwogICAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3dpdGgtbGFzdCc6CiAgICAgICAgdGltZXN0YW1wID0gdGhpcy5lZmZlY3RzLnBsdWNrKCdzdGFydE9uJykubWF4KCkgfHwgdGltZXN0YW1wOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdlbmQnOgogICAgICAgIC8vIHN0YXJ0IGVmZmVjdCBhZnRlciBsYXN0IHF1ZXVlZCBlZmZlY3QgaGFzIGZpbmlzaGVkCiAgICAgICAgdGltZXN0YW1wID0gdGhpcy5lZmZlY3RzLnBsdWNrKCdmaW5pc2hPbicpLm1heCgpIHx8IHRpbWVzdGFtcDsKICAgICAgICBicmVhazsKICAgIH0KICAgIAogICAgZWZmZWN0LnN0YXJ0T24gICs9IHRpbWVzdGFtcDsKICAgIGVmZmVjdC5maW5pc2hPbiArPSB0aW1lc3RhbXA7CgogICAgaWYgKCFlZmZlY3Qub3B0aW9ucy5xdWV1ZS5saW1pdCB8fCAodGhpcy5lZmZlY3RzLmxlbmd0aCA8IGVmZmVjdC5vcHRpb25zLnF1ZXVlLmxpbWl0KSkKICAgICAgdGhpcy5lZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgIAogICAgaWYgKCF0aGlzLmludGVydmFsKQogICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwodGhpcy5sb29wLmJpbmQodGhpcyksIDE1KTsKICB9LAogIHJlbW92ZTogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICB0aGlzLmVmZmVjdHMgPSB0aGlzLmVmZmVjdHMucmVqZWN0KGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGU9PWVmZmVjdCB9KTsKICAgIGlmICh0aGlzLmVmZmVjdHMubGVuZ3RoID09IDApIHsKICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTsKICAgICAgdGhpcy5pbnRlcnZhbCA9IG51bGw7CiAgICB9CiAgfSwKICBsb29wOiBmdW5jdGlvbigpIHsKICAgIHZhciB0aW1lUG9zID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmb3IodmFyIGk9MCwgbGVuPXRoaXMuZWZmZWN0cy5sZW5ndGg7aTxsZW47aSsrKSAKICAgICAgdGhpcy5lZmZlY3RzW2ldICYmIHRoaXMuZWZmZWN0c1tpXS5sb29wKHRpbWVQb3MpOwogIH0KfSk7CgpFZmZlY3QuUXVldWVzID0gewogIGluc3RhbmNlczogJEgoKSwKICBnZXQ6IGZ1bmN0aW9uKHF1ZXVlTmFtZSkgewogICAgaWYgKCFPYmplY3QuaXNTdHJpbmcocXVldWVOYW1lKSkgcmV0dXJuIHF1ZXVlTmFtZTsKICAgIAogICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzLmdldChxdWV1ZU5hbWUpIHx8CiAgICAgIHRoaXMuaW5zdGFuY2VzLnNldChxdWV1ZU5hbWUsIG5ldyBFZmZlY3QuU2NvcGVkUXVldWUoKSk7CiAgfQp9OwpFZmZlY3QuUXVldWUgPSBFZmZlY3QuUXVldWVzLmdldCgnZ2xvYmFsJyk7CgpFZmZlY3QuQmFzZSA9IENsYXNzLmNyZWF0ZSh7CiAgcG9zaXRpb246IG51bGwsCiAgc3RhcnQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIGZ1bmN0aW9uIGNvZGVGb3JFdmVudChvcHRpb25zLGV2ZW50TmFtZSl7CiAgICAgIHJldHVybiAoCiAgICAgICAgKG9wdGlvbnNbZXZlbnROYW1lKydJbnRlcm5hbCddID8gJ3RoaXMub3B0aW9ucy4nK2V2ZW50TmFtZSsnSW50ZXJuYWwodGhpcyk7JyA6ICcnKSArCiAgICAgICAgKG9wdGlvbnNbZXZlbnROYW1lXSA/ICd0aGlzLm9wdGlvbnMuJytldmVudE5hbWUrJyh0aGlzKTsnIDogJycpCiAgICAgICk7CiAgICB9CiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zaXRpb24gPT09IGZhbHNlKSBvcHRpb25zLnRyYW5zaXRpb24gPSBFZmZlY3QuVHJhbnNpdGlvbnMubGluZWFyOwogICAgdGhpcy5vcHRpb25zICAgICAgPSBPYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoeyB9LEVmZmVjdC5EZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMgfHwgeyB9KTsKICAgIHRoaXMuY3VycmVudEZyYW1lID0gMDsKICAgIHRoaXMuc3RhdGUgICAgICAgID0gJ2lkbGUnOwogICAgdGhpcy5zdGFydE9uICAgICAgPSB0aGlzLm9wdGlvbnMuZGVsYXkqMTAwMDsKICAgIHRoaXMuZmluaXNoT24gICAgID0gdGhpcy5zdGFydE9uKyh0aGlzLm9wdGlvbnMuZHVyYXRpb24qMTAwMCk7CiAgICB0aGlzLmZyb21Ub0RlbHRhICA9IHRoaXMub3B0aW9ucy50by10aGlzLm9wdGlvbnMuZnJvbTsKICAgIHRoaXMudG90YWxUaW1lICAgID0gdGhpcy5maW5pc2hPbi10aGlzLnN0YXJ0T247CiAgICB0aGlzLnRvdGFsRnJhbWVzICA9IHRoaXMub3B0aW9ucy5mcHMqdGhpcy5vcHRpb25zLmR1cmF0aW9uOwogICAgCiAgICBldmFsKCd0aGlzLnJlbmRlciA9IGZ1bmN0aW9uKHBvcyl7ICcrCiAgICAgICdpZiAodGhpcy5zdGF0ZT09ImlkbGUiKXt0aGlzLnN0YXRlPSJydW5uaW5nIjsnKwogICAgICBjb2RlRm9yRXZlbnQodGhpcy5vcHRpb25zLCdiZWZvcmVTZXR1cCcpKwogICAgICAodGhpcy5zZXR1cCA/ICd0aGlzLnNldHVwKCk7JzonJykrIAogICAgICBjb2RlRm9yRXZlbnQodGhpcy5vcHRpb25zLCdhZnRlclNldHVwJykrCiAgICAgICd9O2lmICh0aGlzLnN0YXRlPT0icnVubmluZyIpeycrCiAgICAgICdwb3M9dGhpcy5vcHRpb25zLnRyYW5zaXRpb24ocG9zKSonK3RoaXMuZnJvbVRvRGVsdGErJysnK3RoaXMub3B0aW9ucy5mcm9tKyc7JysKICAgICAgJ3RoaXMucG9zaXRpb249cG9zOycrCiAgICAgIGNvZGVGb3JFdmVudCh0aGlzLm9wdGlvbnMsJ2JlZm9yZVVwZGF0ZScpKwogICAgICAodGhpcy51cGRhdGUgPyAndGhpcy51cGRhdGUocG9zKTsnOicnKSsKICAgICAgY29kZUZvckV2ZW50KHRoaXMub3B0aW9ucywnYWZ0ZXJVcGRhdGUnKSsKICAgICAgJ319Jyk7CiAgICAKICAgIHRoaXMuZXZlbnQoJ2JlZm9yZVN0YXJ0Jyk7CiAgICBpZiAoIXRoaXMub3B0aW9ucy5zeW5jKQogICAgICBFZmZlY3QuUXVldWVzLmdldChPYmplY3QuaXNTdHJpbmcodGhpcy5vcHRpb25zLnF1ZXVlKSA/IAogICAgICAgICdnbG9iYWwnIDogdGhpcy5vcHRpb25zLnF1ZXVlLnNjb3BlKS5hZGQodGhpcyk7CiAgfSwKICBsb29wOiBmdW5jdGlvbih0aW1lUG9zKSB7CiAgICBpZiAodGltZVBvcyA+PSB0aGlzLnN0YXJ0T24pIHsKICAgICAgaWYgKHRpbWVQb3MgPj0gdGhpcy5maW5pc2hPbikgewogICAgICAgIHRoaXMucmVuZGVyKDEuMCk7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLmV2ZW50KCdiZWZvcmVGaW5pc2gnKTsKICAgICAgICBpZiAodGhpcy5maW5pc2gpIHRoaXMuZmluaXNoKCk7IAogICAgICAgIHRoaXMuZXZlbnQoJ2FmdGVyRmluaXNoJyk7CiAgICAgICAgcmV0dXJuOyAgCiAgICAgIH0KICAgICAgdmFyIHBvcyAgID0gKHRpbWVQb3MgLSB0aGlzLnN0YXJ0T24pIC8gdGhpcy50b3RhbFRpbWUsCiAgICAgICAgICBmcmFtZSA9IChwb3MgKiB0aGlzLnRvdGFsRnJhbWVzKS5yb3VuZCgpOwogICAgICBpZiAoZnJhbWUgPiB0aGlzLmN1cnJlbnRGcmFtZSkgewogICAgICAgIHRoaXMucmVuZGVyKHBvcyk7CiAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUgPSBmcmFtZTsKICAgICAgfQogICAgfQogIH0sCiAgY2FuY2VsOiBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5vcHRpb25zLnN5bmMpCiAgICAgIEVmZmVjdC5RdWV1ZXMuZ2V0KE9iamVjdC5pc1N0cmluZyh0aGlzLm9wdGlvbnMucXVldWUpID8gCiAgICAgICAgJ2dsb2JhbCcgOiB0aGlzLm9wdGlvbnMucXVldWUuc2NvcGUpLnJlbW92ZSh0aGlzKTsKICAgIHRoaXMuc3RhdGUgPSAnZmluaXNoZWQnOwogIH0sCiAgZXZlbnQ6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewogICAgaWYgKHRoaXMub3B0aW9uc1tldmVudE5hbWUgKyAnSW50ZXJuYWwnXSkgdGhpcy5vcHRpb25zW2V2ZW50TmFtZSArICdJbnRlcm5hbCddKHRoaXMpOwogICAgaWYgKHRoaXMub3B0aW9uc1tldmVudE5hbWVdKSB0aGlzLm9wdGlvbnNbZXZlbnROYW1lXSh0aGlzKTsKICB9LAogIGluc3BlY3Q6IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGEgPSAkSCgpOwogICAgZm9yKHByb3BlcnR5IGluIHRoaXMpCiAgICAgIGlmICghT2JqZWN0LmlzRnVuY3Rpb24odGhpc1twcm9wZXJ0eV0pKSBkYXRhLnNldChwcm9wZXJ0eSwgdGhpc1twcm9wZXJ0eV0pOwogICAgcmV0dXJuICcjPEVmZmVjdDonICsgZGF0YS5pbnNwZWN0KCkgKyAnLG9wdGlvbnM6JyArICRIKHRoaXMub3B0aW9ucykuaW5zcGVjdCgpICsgJz4nOwogIH0KfSk7CgpFZmZlY3QuUGFyYWxsZWwgPSBDbGFzcy5jcmVhdGUoRWZmZWN0LkJhc2UsIHsKICBpbml0aWFsaXplOiBmdW5jdGlvbihlZmZlY3RzKSB7CiAgICB0aGlzLmVmZmVjdHMgPSBlZmZlY3RzIHx8IFtdOwogICAgdGhpcy5zdGFydChhcmd1bWVudHNbMV0pOwogIH0sCiAgdXBkYXRlOiBmdW5jdGlvbihwb3NpdGlvbikgewogICAgdGhpcy5lZmZlY3RzLmludm9rZSgncmVuZGVyJywgcG9zaXRpb24pOwogIH0sCiAgZmluaXNoOiBmdW5jdGlvbihwb3NpdGlvbikgewogICAgdGhpcy5lZmZlY3RzLmVhY2goIGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICBlZmZlY3QucmVuZGVyKDEuMCk7CiAgICAgIGVmZmVjdC5jYW5jZWwoKTsKICAgICAgZWZmZWN0LmV2ZW50KCdiZWZvcmVGaW5pc2gnKTsKICAgICAgaWYgKGVmZmVjdC5maW5pc2gpIGVmZmVjdC5maW5pc2gocG9zaXRpb24pOwogICAgICBlZmZlY3QuZXZlbnQoJ2FmdGVyRmluaXNoJyk7CiAgICB9KTsKICB9Cn0pOwoKRWZmZWN0LlR3ZWVuID0gQ2xhc3MuY3JlYXRlKEVmZmVjdC5CYXNlLCB7CiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob2JqZWN0LCBmcm9tLCB0bykgewogICAgb2JqZWN0ID0gT2JqZWN0LmlzU3RyaW5nKG9iamVjdCkgPyAkKG9iamVjdCkgOiBvYmplY3Q7CiAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyksIG1ldGhvZCA9IGFyZ3MubGFzdCgpLCAKICAgICAgb3B0aW9ucyA9IGFyZ3MubGVuZ3RoID09IDUgPyBhcmdzWzNdIDogbnVsbDsKICAgIHRoaXMubWV0aG9kID0gT2JqZWN0LmlzRnVuY3Rpb24obWV0aG9kKSA/IG1ldGhvZC5iaW5kKG9iamVjdCkgOgogICAgICBPYmplY3QuaXNGdW5jdGlvbihvYmplY3RbbWV0aG9kXSkgPyBvYmplY3RbbWV0aG9kXS5iaW5kKG9iamVjdCkgOiAKICAgICAgZnVuY3Rpb24odmFsdWUpIHsgb2JqZWN0W21ldGhvZF0gPSB2YWx1ZSB9OwogICAgdGhpcy5zdGFydChPYmplY3QuZXh0ZW5kKHsgZnJvbTogZnJvbSwgdG86IHRvIH0sIG9wdGlvbnMgfHwgeyB9KSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CiAgICB0aGlzLm1ldGhvZChwb3NpdGlvbik7CiAgfQp9KTsKCkVmZmVjdC5FdmVudCA9IENsYXNzLmNyZWF0ZShFZmZlY3QuQmFzZSwgewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zdGFydChPYmplY3QuZXh0ZW5kKHsgZHVyYXRpb246IDAgfSwgYXJndW1lbnRzWzBdIHx8IHsgfSkpOwogIH0sCiAgdXBkYXRlOiBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbgp9KTsKCkVmZmVjdC5PcGFjaXR5ID0gQ2xhc3MuY3JlYXRlKEVmZmVjdC5CYXNlLCB7CiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGlmICghdGhpcy5lbGVtZW50KSB0aHJvdyhFZmZlY3QuX2VsZW1lbnREb2VzTm90RXhpc3RFcnJvcik7CiAgICAvLyBtYWtlIHRoaXMgd29yayBvbiBJRSBvbiBlbGVtZW50cyB3aXRob3V0ICdsYXlvdXQnCiAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUgJiYgKCF0aGlzLmVsZW1lbnQuY3VycmVudFN0eWxlLmhhc0xheW91dCkpCiAgICAgIHRoaXMuZWxlbWVudC5zZXRTdHlsZSh7em9vbTogMX0pOwogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICAgICAgZnJvbTogdGhpcy5lbGVtZW50LmdldE9wYWNpdHkoKSB8fCAwLjAsCiAgICAgIHRvOiAgIDEuMAogICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7CiAgICB0aGlzLnN0YXJ0KG9wdGlvbnMpOwogIH0sCiAgdXBkYXRlOiBmdW5jdGlvbihwb3NpdGlvbikgewogICAgdGhpcy5lbGVtZW50LnNldE9wYWNpdHkocG9zaXRpb24pOwogIH0KfSk7CgpFZmZlY3QuTW92ZSA9IENsYXNzLmNyZWF0ZShFZmZlY3QuQmFzZSwgewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBpZiAoIXRoaXMuZWxlbWVudCkgdGhyb3coRWZmZWN0Ll9lbGVtZW50RG9lc05vdEV4aXN0RXJyb3IpOwogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICAgICAgeDogICAgMCwKICAgICAgeTogICAgMCwKICAgICAgbW9kZTogJ3JlbGF0aXZlJwogICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7CiAgICB0aGlzLnN0YXJ0KG9wdGlvbnMpOwogIH0sCiAgc2V0dXA6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbGVtZW50Lm1ha2VQb3NpdGlvbmVkKCk7CiAgICB0aGlzLm9yaWdpbmFsTGVmdCA9IHBhcnNlRmxvYXQodGhpcy5lbGVtZW50LmdldFN0eWxlKCdsZWZ0JykgfHwgJzAnKTsKICAgIHRoaXMub3JpZ2luYWxUb3AgID0gcGFyc2VGbG9hdCh0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ3RvcCcpICB8fCAnMCcpOwogICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlID09ICdhYnNvbHV0ZScpIHsKICAgICAgdGhpcy5vcHRpb25zLnggPSB0aGlzLm9wdGlvbnMueCAtIHRoaXMub3JpZ2luYWxMZWZ0OwogICAgICB0aGlzLm9wdGlvbnMueSA9IHRoaXMub3B0aW9ucy55IC0gdGhpcy5vcmlnaW5hbFRvcDsKICAgIH0KICB9LAogIHVwZGF0ZTogZnVuY3Rpb24ocG9zaXRpb24pIHsKICAgIHRoaXMuZWxlbWVudC5zZXRTdHlsZSh7CiAgICAgIGxlZnQ6ICh0aGlzLm9wdGlvbnMueCAgKiBwb3NpdGlvbiArIHRoaXMub3JpZ2luYWxMZWZ0KS5yb3VuZCgpICsgJ3B4JywKICAgICAgdG9wOiAgKHRoaXMub3B0aW9ucy55ICAqIHBvc2l0aW9uICsgdGhpcy5vcmlnaW5hbFRvcCkucm91bmQoKSAgKyAncHgnCiAgICB9KTsKICB9Cn0pOwoKLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CkVmZmVjdC5Nb3ZlQnkgPSBmdW5jdGlvbihlbGVtZW50LCB0b1RvcCwgdG9MZWZ0KSB7CiAgcmV0dXJuIG5ldyBFZmZlY3QuTW92ZShlbGVtZW50LCAKICAgIE9iamVjdC5leHRlbmQoeyB4OiB0b0xlZnQsIHk6IHRvVG9wIH0sIGFyZ3VtZW50c1szXSB8fCB7IH0pKTsKfTsKCkVmZmVjdC5TY2FsZSA9IENsYXNzLmNyZWF0ZShFZmZlY3QuQmFzZSwgewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIHBlcmNlbnQpIHsKICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBpZiAoIXRoaXMuZWxlbWVudCkgdGhyb3coRWZmZWN0Ll9lbGVtZW50RG9lc05vdEV4aXN0RXJyb3IpOwogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICAgICAgc2NhbGVYOiB0cnVlLAogICAgICBzY2FsZVk6IHRydWUsCiAgICAgIHNjYWxlQ29udGVudDogdHJ1ZSwKICAgICAgc2NhbGVGcm9tQ2VudGVyOiBmYWxzZSwKICAgICAgc2NhbGVNb2RlOiAnYm94JywgICAgICAgIC8vICdib3gnIG9yICdjb250ZW50cycgb3IgeyB9IHdpdGggcHJvdmlkZWQgdmFsdWVzCiAgICAgIHNjYWxlRnJvbTogMTAwLjAsCiAgICAgIHNjYWxlVG86ICAgcGVyY2VudAogICAgfSwgYXJndW1lbnRzWzJdIHx8IHsgfSk7CiAgICB0aGlzLnN0YXJ0KG9wdGlvbnMpOwogIH0sCiAgc2V0dXA6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZXN0b3JlQWZ0ZXJGaW5pc2ggPSB0aGlzLm9wdGlvbnMucmVzdG9yZUFmdGVyRmluaXNoIHx8IGZhbHNlOwogICAgdGhpcy5lbGVtZW50UG9zaXRpb25pbmcgPSB0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJyk7CiAgICAKICAgIHRoaXMub3JpZ2luYWxTdHlsZSA9IHsgfTsKICAgIFsndG9wJywnbGVmdCcsJ3dpZHRoJywnaGVpZ2h0JywnZm9udFNpemUnXS5lYWNoKCBmdW5jdGlvbihrKSB7CiAgICAgIHRoaXMub3JpZ2luYWxTdHlsZVtrXSA9IHRoaXMuZWxlbWVudC5zdHlsZVtrXTsKICAgIH0uYmluZCh0aGlzKSk7CiAgICAgIAogICAgdGhpcy5vcmlnaW5hbFRvcCAgPSB0aGlzLmVsZW1lbnQub2Zmc2V0VG9wOwogICAgdGhpcy5vcmlnaW5hbExlZnQgPSB0aGlzLmVsZW1lbnQub2Zmc2V0TGVmdDsKICAgIAogICAgdmFyIGZvbnRTaXplID0gdGhpcy5lbGVtZW50LmdldFN0eWxlKCdmb250LXNpemUnKSB8fCAnMTAwJSc7CiAgICBbJ2VtJywncHgnLCclJywncHQnXS5lYWNoKCBmdW5jdGlvbihmb250U2l6ZVR5cGUpIHsKICAgICAgaWYgKGZvbnRTaXplLmluZGV4T2YoZm9udFNpemVUeXBlKT4wKSB7CiAgICAgICAgdGhpcy5mb250U2l6ZSAgICAgPSBwYXJzZUZsb2F0KGZvbnRTaXplKTsKICAgICAgICB0aGlzLmZvbnRTaXplVHlwZSA9IGZvbnRTaXplVHlwZTsKICAgICAgfQogICAgfS5iaW5kKHRoaXMpKTsKICAgIAogICAgdGhpcy5mYWN0b3IgPSAodGhpcy5vcHRpb25zLnNjYWxlVG8gLSB0aGlzLm9wdGlvbnMuc2NhbGVGcm9tKS8xMDA7CiAgICAKICAgIHRoaXMuZGltcyA9IG51bGw7CiAgICBpZiAodGhpcy5vcHRpb25zLnNjYWxlTW9kZT09J2JveCcpCiAgICAgIHRoaXMuZGltcyA9IFt0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0LCB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGhdOwogICAgaWYgKC9eY29udGVudC8udGVzdCh0aGlzLm9wdGlvbnMuc2NhbGVNb2RlKSkKICAgICAgdGhpcy5kaW1zID0gW3RoaXMuZWxlbWVudC5zY3JvbGxIZWlnaHQsIHRoaXMuZWxlbWVudC5zY3JvbGxXaWR0aF07CiAgICBpZiAoIXRoaXMuZGltcykKICAgICAgdGhpcy5kaW1zID0gW3RoaXMub3B0aW9ucy5zY2FsZU1vZGUub3JpZ2luYWxIZWlnaHQsCiAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2NhbGVNb2RlLm9yaWdpbmFsV2lkdGhdOwogIH0sCiAgdXBkYXRlOiBmdW5jdGlvbihwb3NpdGlvbikgewogICAgdmFyIGN1cnJlbnRTY2FsZSA9ICh0aGlzLm9wdGlvbnMuc2NhbGVGcm9tLzEwMC4wKSArICh0aGlzLmZhY3RvciAqIHBvc2l0aW9uKTsKICAgIGlmICh0aGlzLm9wdGlvbnMuc2NhbGVDb250ZW50ICYmIHRoaXMuZm9udFNpemUpCiAgICAgIHRoaXMuZWxlbWVudC5zZXRTdHlsZSh7Zm9udFNpemU6IHRoaXMuZm9udFNpemUgKiBjdXJyZW50U2NhbGUgKyB0aGlzLmZvbnRTaXplVHlwZSB9KTsKICAgIHRoaXMuc2V0RGltZW5zaW9ucyh0aGlzLmRpbXNbMF0gKiBjdXJyZW50U2NhbGUsIHRoaXMuZGltc1sxXSAqIGN1cnJlbnRTY2FsZSk7CiAgfSwKICBmaW5pc2g6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CiAgICBpZiAodGhpcy5yZXN0b3JlQWZ0ZXJGaW5pc2gpIHRoaXMuZWxlbWVudC5zZXRTdHlsZSh0aGlzLm9yaWdpbmFsU3R5bGUpOwogIH0sCiAgc2V0RGltZW5zaW9uczogZnVuY3Rpb24oaGVpZ2h0LCB3aWR0aCkgewogICAgdmFyIGQgPSB7IH07CiAgICBpZiAodGhpcy5vcHRpb25zLnNjYWxlWCkgZC53aWR0aCA9IHdpZHRoLnJvdW5kKCkgKyAncHgnOwogICAgaWYgKHRoaXMub3B0aW9ucy5zY2FsZVkpIGQuaGVpZ2h0ID0gaGVpZ2h0LnJvdW5kKCkgKyAncHgnOwogICAgaWYgKHRoaXMub3B0aW9ucy5zY2FsZUZyb21DZW50ZXIpIHsKICAgICAgdmFyIHRvcGQgID0gKGhlaWdodCAtIHRoaXMuZGltc1swXSkvMjsKICAgICAgdmFyIGxlZnRkID0gKHdpZHRoICAtIHRoaXMuZGltc1sxXSkvMjsKICAgICAgaWYgKHRoaXMuZWxlbWVudFBvc2l0aW9uaW5nID09ICdhYnNvbHV0ZScpIHsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNjYWxlWSkgZC50b3AgPSB0aGlzLm9yaWdpbmFsVG9wLXRvcGQgKyAncHgnOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2NhbGVYKSBkLmxlZnQgPSB0aGlzLm9yaWdpbmFsTGVmdC1sZWZ0ZCArICdweCc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zY2FsZVkpIGQudG9wID0gLXRvcGQgKyAncHgnOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2NhbGVYKSBkLmxlZnQgPSAtbGVmdGQgKyAncHgnOwogICAgICB9CiAgICB9CiAgICB0aGlzLmVsZW1lbnQuc2V0U3R5bGUoZCk7CiAgfQp9KTsKCkVmZmVjdC5IaWdobGlnaHQgPSBDbGFzcy5jcmVhdGUoRWZmZWN0LkJhc2UsIHsKICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgaWYgKCF0aGlzLmVsZW1lbnQpIHRocm93KEVmZmVjdC5fZWxlbWVudERvZXNOb3RFeGlzdEVycm9yKTsKICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7IHN0YXJ0Y29sb3I6ICcjZmZmZjk5JyB9LCBhcmd1bWVudHNbMV0gfHwgeyB9KTsKICAgIHRoaXMuc3RhcnQob3B0aW9ucyk7CiAgfSwKICBzZXR1cDogZnVuY3Rpb24oKSB7CiAgICAvLyBQcmV2ZW50IGV4ZWN1dGluZyBvbiBlbGVtZW50cyBub3QgaW4gdGhlIGxheW91dCBmbG93CiAgICBpZiAodGhpcy5lbGVtZW50LmdldFN0eWxlKCdkaXNwbGF5Jyk9PSdub25lJykgeyB0aGlzLmNhbmNlbCgpOyByZXR1cm47IH0KICAgIC8vIERpc2FibGUgYmFja2dyb3VuZCBpbWFnZSBkdXJpbmcgdGhlIGVmZmVjdAogICAgdGhpcy5vbGRTdHlsZSA9IHsgfTsKICAgIGlmICghdGhpcy5vcHRpb25zLmtlZXBCYWNrZ3JvdW5kSW1hZ2UpIHsKICAgICAgdGhpcy5vbGRTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSB0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ2JhY2tncm91bmQtaW1hZ2UnKTsKICAgICAgdGhpcy5lbGVtZW50LnNldFN0eWxlKHtiYWNrZ3JvdW5kSW1hZ2U6ICdub25lJ30pOwogICAgfQogICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5kY29sb3IpCiAgICAgIHRoaXMub3B0aW9ucy5lbmRjb2xvciA9IHRoaXMuZWxlbWVudC5nZXRTdHlsZSgnYmFja2dyb3VuZC1jb2xvcicpLnBhcnNlQ29sb3IoJyNmZmZmZmYnKTsKICAgIGlmICghdGhpcy5vcHRpb25zLnJlc3RvcmVjb2xvcikKICAgICAgdGhpcy5vcHRpb25zLnJlc3RvcmVjb2xvciA9IHRoaXMuZWxlbWVudC5nZXRTdHlsZSgnYmFja2dyb3VuZC1jb2xvcicpOwogICAgLy8gaW5pdCBjb2xvciBjYWxjdWxhdGlvbnMKICAgIHRoaXMuX2Jhc2UgID0gJFIoMCwyKS5tYXAoZnVuY3Rpb24oaSl7IHJldHVybiBwYXJzZUludCh0aGlzLm9wdGlvbnMuc3RhcnRjb2xvci5zbGljZShpKjIrMSxpKjIrMyksMTYpIH0uYmluZCh0aGlzKSk7CiAgICB0aGlzLl9kZWx0YSA9ICRSKDAsMikubWFwKGZ1bmN0aW9uKGkpeyByZXR1cm4gcGFyc2VJbnQodGhpcy5vcHRpb25zLmVuZGNvbG9yLnNsaWNlKGkqMisxLGkqMiszKSwxNiktdGhpcy5fYmFzZVtpXSB9LmJpbmQodGhpcykpOwogIH0sCiAgdXBkYXRlOiBmdW5jdGlvbihwb3NpdGlvbikgewogICAgdGhpcy5lbGVtZW50LnNldFN0eWxlKHtiYWNrZ3JvdW5kQ29sb3I6ICRSKDAsMikuaW5qZWN0KCcjJyxmdW5jdGlvbihtLHYsaSl7CiAgICAgIHJldHVybiBtKygodGhpcy5fYmFzZVtpXSsodGhpcy5fZGVsdGFbaV0qcG9zaXRpb24pKS5yb3VuZCgpLnRvQ29sb3JQYXJ0KCkpOyB9LmJpbmQodGhpcykpIH0pOwogIH0sCiAgZmluaXNoOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWxlbWVudC5zZXRTdHlsZShPYmplY3QuZXh0ZW5kKHRoaXMub2xkU3R5bGUsIHsKICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLm9wdGlvbnMucmVzdG9yZWNvbG9yCiAgICB9KSk7CiAgfQp9KTsKCkVmZmVjdC5TY3JvbGxUbyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1sxXSB8fCB7IH0sCiAgICBzY3JvbGxPZmZzZXRzID0gZG9jdW1lbnQudmlld3BvcnQuZ2V0U2Nyb2xsT2Zmc2V0cygpLAogICAgZWxlbWVudE9mZnNldHMgPSAkKGVsZW1lbnQpLmN1bXVsYXRpdmVPZmZzZXQoKSwKICAgIG1heCA9ICh3aW5kb3cuaGVpZ2h0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSAtIGRvY3VtZW50LnZpZXdwb3J0LmdldEhlaWdodCgpOyAgCgogIGlmIChvcHRpb25zLm9mZnNldCkgZWxlbWVudE9mZnNldHNbMV0gKz0gb3B0aW9ucy5vZmZzZXQ7CgogIHJldHVybiBuZXcgRWZmZWN0LlR3ZWVuKG51bGwsCiAgICBzY3JvbGxPZmZzZXRzLnRvcCwKICAgIGVsZW1lbnRPZmZzZXRzWzFdID4gbWF4ID8gbWF4IDogZWxlbWVudE9mZnNldHNbMV0sCiAgICBvcHRpb25zLAogICAgZnVuY3Rpb24ocCl7IHNjcm9sbFRvKHNjcm9sbE9mZnNldHMubGVmdCwgcC5yb3VuZCgpKSB9CiAgKTsKfTsKCi8qIC0tLS0tLS0tLS0tLS0gY29tYmluYXRpb24gZWZmZWN0cyAtLS0tLS0tLS0tLS0tICovCgpFZmZlY3QuRmFkZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICBlbGVtZW50ID0gJChlbGVtZW50KTsKICB2YXIgb2xkT3BhY2l0eSA9IGVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eSgpOwogIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CiAgICBmcm9tOiBlbGVtZW50LmdldE9wYWNpdHkoKSB8fCAxLjAsCiAgICB0bzogICAwLjAsCiAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgCiAgICAgIGlmIChlZmZlY3Qub3B0aW9ucy50byE9MCkgcmV0dXJuOwogICAgICBlZmZlY3QuZWxlbWVudC5oaWRlKCkuc2V0U3R5bGUoe29wYWNpdHk6IG9sZE9wYWNpdHl9KTsgCiAgICB9CiAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7CiAgcmV0dXJuIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LG9wdGlvbnMpOwp9OwoKRWZmZWN0LkFwcGVhciA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICBlbGVtZW50ID0gJChlbGVtZW50KTsKICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewogIGZyb206IChlbGVtZW50LmdldFN0eWxlKCdkaXNwbGF5JykgPT0gJ25vbmUnID8gMC4wIDogZWxlbWVudC5nZXRPcGFjaXR5KCkgfHwgMC4wKSwKICB0bzogICAxLjAsCiAgLy8gZm9yY2UgU2FmYXJpIHRvIHJlbmRlciBmbG9hdGVkIGVsZW1lbnRzIHByb3Blcmx5CiAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICBlZmZlY3QuZWxlbWVudC5mb3JjZVJlcmVuZGVyaW5nKCk7CiAgfSwKICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICBlZmZlY3QuZWxlbWVudC5zZXRPcGFjaXR5KGVmZmVjdC5vcHRpb25zLmZyb20pLnNob3coKTsgCiAgfX0sIGFyZ3VtZW50c1sxXSB8fCB7IH0pOwogIHJldHVybiBuZXcgRWZmZWN0Lk9wYWNpdHkoZWxlbWVudCxvcHRpb25zKTsKfTsKCkVmZmVjdC5QdWZmID0gZnVuY3Rpb24oZWxlbWVudCkgewogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogIHZhciBvbGRTdHlsZSA9IHsgCiAgICBvcGFjaXR5OiBlbGVtZW50LmdldElubGluZU9wYWNpdHkoKSwgCiAgICBwb3NpdGlvbjogZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24nKSwKICAgIHRvcDogIGVsZW1lbnQuc3R5bGUudG9wLAogICAgbGVmdDogZWxlbWVudC5zdHlsZS5sZWZ0LAogICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsCiAgICBoZWlnaHQ6IGVsZW1lbnQuc3R5bGUuaGVpZ2h0CiAgfTsKICByZXR1cm4gbmV3IEVmZmVjdC5QYXJhbGxlbCgKICAgWyBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIDIwMCwgCiAgICAgIHsgc3luYzogdHJ1ZSwgc2NhbGVGcm9tQ2VudGVyOiB0cnVlLCBzY2FsZUNvbnRlbnQ6IHRydWUsIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZSB9KSwgCiAgICAgbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsIHsgc3luYzogdHJ1ZSwgdG86IDAuMCB9ICkgXSwgCiAgICAgT2JqZWN0LmV4dGVuZCh7IGR1cmF0aW9uOiAxLjAsIAogICAgICBiZWZvcmVTZXR1cEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgICAgICBQb3NpdGlvbi5hYnNvbHV0aXplKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQpCiAgICAgIH0sCiAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LmhpZGUoKS5zZXRTdHlsZShvbGRTdHlsZSk7IH0KICAgICB9LCBhcmd1bWVudHNbMV0gfHwgeyB9KQogICApOwp9OwoKRWZmZWN0LkJsaW5kVXAgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgZWxlbWVudC5tYWtlQ2xpcHBpbmcoKTsKICByZXR1cm4gbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCAwLAogICAgT2JqZWN0LmV4dGVuZCh7IHNjYWxlQ29udGVudDogZmFsc2UsIAogICAgICBzY2FsZVg6IGZhbHNlLCAKICAgICAgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLAogICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgICAgICBlZmZlY3QuZWxlbWVudC5oaWRlKCkudW5kb0NsaXBwaW5nKCk7CiAgICAgIH0gCiAgICB9LCBhcmd1bWVudHNbMV0gfHwgeyB9KQogICk7Cn07CgpFZmZlY3QuQmxpbmREb3duID0gZnVuY3Rpb24oZWxlbWVudCkgewogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogIHZhciBlbGVtZW50RGltZW5zaW9ucyA9IGVsZW1lbnQuZ2V0RGltZW5zaW9ucygpOwogIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIDEwMCwgT2JqZWN0LmV4dGVuZCh7IAogICAgc2NhbGVDb250ZW50OiBmYWxzZSwgCiAgICBzY2FsZVg6IGZhbHNlLAogICAgc2NhbGVGcm9tOiAwLAogICAgc2NhbGVNb2RlOiB7b3JpZ2luYWxIZWlnaHQ6IGVsZW1lbnREaW1lbnNpb25zLmhlaWdodCwgb3JpZ2luYWxXaWR0aDogZWxlbWVudERpbWVuc2lvbnMud2lkdGh9LAogICAgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLAogICAgYWZ0ZXJTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICAgIGVmZmVjdC5lbGVtZW50Lm1ha2VDbGlwcGluZygpLnNldFN0eWxlKHtoZWlnaHQ6ICcwcHgnfSkuc2hvdygpOyAKICAgIH0sICAKICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICBlZmZlY3QuZWxlbWVudC51bmRvQ2xpcHBpbmcoKTsKICAgIH0KICB9LCBhcmd1bWVudHNbMV0gfHwgeyB9KSk7Cn07CgpFZmZlY3QuU3dpdGNoT2ZmID0gZnVuY3Rpb24oZWxlbWVudCkgewogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogIHZhciBvbGRPcGFjaXR5ID0gZWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KCk7CiAgcmV0dXJuIG5ldyBFZmZlY3QuQXBwZWFyKGVsZW1lbnQsIE9iamVjdC5leHRlbmQoewogICAgZHVyYXRpb246IDAuNCwKICAgIGZyb206IDAsCiAgICB0cmFuc2l0aW9uOiBFZmZlY3QuVHJhbnNpdGlvbnMuZmxpY2tlciwKICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICBuZXcgRWZmZWN0LlNjYWxlKGVmZmVjdC5lbGVtZW50LCAxLCB7IAogICAgICAgIGR1cmF0aW9uOiAwLjMsIHNjYWxlRnJvbUNlbnRlcjogdHJ1ZSwKICAgICAgICBzY2FsZVg6IGZhbHNlLCBzY2FsZUNvbnRlbnQ6IGZhbHNlLCByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsCiAgICAgICAgYmVmb3JlU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgeyAKICAgICAgICAgIGVmZmVjdC5lbGVtZW50Lm1ha2VQb3NpdGlvbmVkKCkubWFrZUNsaXBwaW5nKCk7CiAgICAgICAgfSwKICAgICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgICAgICAgIGVmZmVjdC5lbGVtZW50LmhpZGUoKS51bmRvQ2xpcHBpbmcoKS51bmRvUG9zaXRpb25lZCgpLnNldFN0eWxlKHtvcGFjaXR5OiBvbGRPcGFjaXR5fSk7CiAgICAgICAgfQogICAgICB9KQogICAgfQogIH0sIGFyZ3VtZW50c1sxXSB8fCB7IH0pKTsKfTsKCkVmZmVjdC5Ecm9wT3V0ID0gZnVuY3Rpb24oZWxlbWVudCkgewogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogIHZhciBvbGRTdHlsZSA9IHsKICAgIHRvcDogZWxlbWVudC5nZXRTdHlsZSgndG9wJyksCiAgICBsZWZ0OiBlbGVtZW50LmdldFN0eWxlKCdsZWZ0JyksCiAgICBvcGFjaXR5OiBlbGVtZW50LmdldElubGluZU9wYWNpdHkoKSB9OwogIHJldHVybiBuZXcgRWZmZWN0LlBhcmFsbGVsKAogICAgWyBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwge3g6IDAsIHk6IDEwMCwgc3luYzogdHJ1ZSB9KSwgCiAgICAgIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCB7IHN5bmM6IHRydWUsIHRvOiAwLjAgfSkgXSwKICAgIE9iamVjdC5leHRlbmQoCiAgICAgIHsgZHVyYXRpb246IDAuNSwKICAgICAgICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50Lm1ha2VQb3NpdGlvbmVkKCk7IAogICAgICAgIH0sCiAgICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LmhpZGUoKS51bmRvUG9zaXRpb25lZCgpLnNldFN0eWxlKG9sZFN0eWxlKTsKICAgICAgICB9IAogICAgICB9LCBhcmd1bWVudHNbMV0gfHwgeyB9KSk7Cn07CgpFZmZlY3QuU2hha2UgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICAgIGRpc3RhbmNlOiAyMCwKICAgIGR1cmF0aW9uOiAwLjUKICB9LCBhcmd1bWVudHNbMV0gfHwge30pOwogIHZhciBkaXN0YW5jZSA9IHBhcnNlRmxvYXQob3B0aW9ucy5kaXN0YW5jZSk7CiAgdmFyIHNwbGl0ID0gcGFyc2VGbG9hdChvcHRpb25zLmR1cmF0aW9uKSAvIDEwLjA7CiAgdmFyIG9sZFN0eWxlID0gewogICAgdG9wOiBlbGVtZW50LmdldFN0eWxlKCd0b3AnKSwKICAgIGxlZnQ6IGVsZW1lbnQuZ2V0U3R5bGUoJ2xlZnQnKSB9OwogICAgcmV0dXJuIG5ldyBFZmZlY3QuTW92ZShlbGVtZW50LAogICAgICB7IHg6ICBkaXN0YW5jZSwgeTogMCwgZHVyYXRpb246IHNwbGl0LCBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxlbWVudCwKICAgICAgeyB4OiAtZGlzdGFuY2UqMiwgeTogMCwgZHVyYXRpb246IHNwbGl0KjIsICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxlbWVudCwKICAgICAgeyB4OiAgZGlzdGFuY2UqMiwgeTogMCwgZHVyYXRpb246IHNwbGl0KjIsICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxlbWVudCwKICAgICAgeyB4OiAtZGlzdGFuY2UqMiwgeTogMCwgZHVyYXRpb246IHNwbGl0KjIsICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxlbWVudCwKICAgICAgeyB4OiAgZGlzdGFuY2UqMiwgeTogMCwgZHVyYXRpb246IHNwbGl0KjIsICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxlbWVudCwKICAgICAgeyB4OiAtZGlzdGFuY2UsIHk6IDAsIGR1cmF0aW9uOiBzcGxpdCwgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICAgICAgZWZmZWN0LmVsZW1lbnQudW5kb1Bvc2l0aW9uZWQoKS5zZXRTdHlsZShvbGRTdHlsZSk7CiAgfX0pIH19KSB9fSkgfX0pIH19KSB9fSk7Cn07CgpFZmZlY3QuU2xpZGVEb3duID0gZnVuY3Rpb24oZWxlbWVudCkgewogIGVsZW1lbnQgPSAkKGVsZW1lbnQpLmNsZWFuV2hpdGVzcGFjZSgpOwogIC8vIFNsaWRlRG93biBuZWVkIHRvIGhhdmUgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciBlbGVtZW50IHdpdGggZml4ZWQgaGVpZ2h0IQogIHZhciBvbGRJbm5lckJvdHRvbSA9IGVsZW1lbnQuZG93bigpLmdldFN0eWxlKCdib3R0b20nKTsKICB2YXIgZWxlbWVudERpbWVuc2lvbnMgPSBlbGVtZW50LmdldERpbWVuc2lvbnMoKTsKICByZXR1cm4gbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCAxMDAsIE9iamVjdC5leHRlbmQoeyAKICAgIHNjYWxlQ29udGVudDogZmFsc2UsIAogICAgc2NhbGVYOiBmYWxzZSwgCiAgICBzY2FsZUZyb206IHdpbmRvdy5vcGVyYSA/IDAgOiAxLAogICAgc2NhbGVNb2RlOiB7b3JpZ2luYWxIZWlnaHQ6IGVsZW1lbnREaW1lbnNpb25zLmhlaWdodCwgb3JpZ2luYWxXaWR0aDogZWxlbWVudERpbWVuc2lvbnMud2lkdGh9LAogICAgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLAogICAgYWZ0ZXJTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICAgIGVmZmVjdC5lbGVtZW50Lm1ha2VQb3NpdGlvbmVkKCk7CiAgICAgIGVmZmVjdC5lbGVtZW50LmRvd24oKS5tYWtlUG9zaXRpb25lZCgpOwogICAgICBpZiAod2luZG93Lm9wZXJhKSBlZmZlY3QuZWxlbWVudC5zZXRTdHlsZSh7dG9wOiAnJ30pOwogICAgICBlZmZlY3QuZWxlbWVudC5tYWtlQ2xpcHBpbmcoKS5zZXRTdHlsZSh7aGVpZ2h0OiAnMHB4J30pLnNob3coKTsgCiAgICB9LAogICAgYWZ0ZXJVcGRhdGVJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICAgIGVmZmVjdC5lbGVtZW50LmRvd24oKS5zZXRTdHlsZSh7Ym90dG9tOgogICAgICAgIChlZmZlY3QuZGltc1swXSAtIGVmZmVjdC5lbGVtZW50LmNsaWVudEhlaWdodCkgKyAncHgnIH0pOyAKICAgIH0sCiAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgICAgZWZmZWN0LmVsZW1lbnQudW5kb0NsaXBwaW5nKCkudW5kb1Bvc2l0aW9uZWQoKTsKICAgICAgZWZmZWN0LmVsZW1lbnQuZG93bigpLnVuZG9Qb3NpdGlvbmVkKCkuc2V0U3R5bGUoe2JvdHRvbTogb2xkSW5uZXJCb3R0b219KTsgfQogICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSkKICApOwp9OwoKRWZmZWN0LlNsaWRlVXAgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgZWxlbWVudCA9ICQoZWxlbWVudCkuY2xlYW5XaGl0ZXNwYWNlKCk7CiAgdmFyIG9sZElubmVyQm90dG9tID0gZWxlbWVudC5kb3duKCkuZ2V0U3R5bGUoJ2JvdHRvbScpOwogIHZhciBlbGVtZW50RGltZW5zaW9ucyA9IGVsZW1lbnQuZ2V0RGltZW5zaW9ucygpOwogIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIHdpbmRvdy5vcGVyYSA/IDAgOiAxLAogICBPYmplY3QuZXh0ZW5kKHsgc2NhbGVDb250ZW50OiBmYWxzZSwgCiAgICBzY2FsZVg6IGZhbHNlLCAKICAgIHNjYWxlTW9kZTogJ2JveCcsCiAgICBzY2FsZUZyb206IDEwMCwKICAgIHNjYWxlTW9kZToge29yaWdpbmFsSGVpZ2h0OiBlbGVtZW50RGltZW5zaW9ucy5oZWlnaHQsIG9yaWdpbmFsV2lkdGg6IGVsZW1lbnREaW1lbnNpb25zLndpZHRofSwKICAgIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZSwKICAgIGFmdGVyU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICBlZmZlY3QuZWxlbWVudC5tYWtlUG9zaXRpb25lZCgpOwogICAgICBlZmZlY3QuZWxlbWVudC5kb3duKCkubWFrZVBvc2l0aW9uZWQoKTsKICAgICAgaWYgKHdpbmRvdy5vcGVyYSkgZWZmZWN0LmVsZW1lbnQuc2V0U3R5bGUoe3RvcDogJyd9KTsKICAgICAgZWZmZWN0LmVsZW1lbnQubWFrZUNsaXBwaW5nKCkuc2hvdygpOwogICAgfSwgIAogICAgYWZ0ZXJVcGRhdGVJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICAgIGVmZmVjdC5lbGVtZW50LmRvd24oKS5zZXRTdHlsZSh7Ym90dG9tOgogICAgICAgIChlZmZlY3QuZGltc1swXSAtIGVmZmVjdC5lbGVtZW50LmNsaWVudEhlaWdodCkgKyAncHgnIH0pOwogICAgfSwKICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICBlZmZlY3QuZWxlbWVudC5oaWRlKCkudW5kb0NsaXBwaW5nKCkudW5kb1Bvc2l0aW9uZWQoKTsKICAgICAgZWZmZWN0LmVsZW1lbnQuZG93bigpLnVuZG9Qb3NpdGlvbmVkKCkuc2V0U3R5bGUoe2JvdHRvbTogb2xkSW5uZXJCb3R0b219KTsKICAgIH0KICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSkKICApOwp9OwoKLy8gQnVnIGluIG9wZXJhIG1ha2VzIHRoZSBURCBjb250YWluaW5nIHRoaXMgZWxlbWVudCBleHBhbmQgZm9yIGEgaW5zdGFuY2UgYWZ0ZXIgZmluaXNoIApFZmZlY3QuU3F1aXNoID0gZnVuY3Rpb24oZWxlbWVudCkgewogIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIHdpbmRvdy5vcGVyYSA/IDEgOiAwLCB7IAogICAgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLAogICAgYmVmb3JlU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICBlZmZlY3QuZWxlbWVudC5tYWtlQ2xpcHBpbmcoKTsgCiAgICB9LCAgCiAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgICAgZWZmZWN0LmVsZW1lbnQuaGlkZSgpLnVuZG9DbGlwcGluZygpOyAKICAgIH0KICB9KTsKfTsKCkVmZmVjdC5Hcm93ID0gZnVuY3Rpb24oZWxlbWVudCkgewogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CiAgICBkaXJlY3Rpb246ICdjZW50ZXInLAogICAgbW92ZVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCwKICAgIHNjYWxlVHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsLAogICAgb3BhY2l0eVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5mdWxsCiAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7CiAgdmFyIG9sZFN0eWxlID0gewogICAgdG9wOiBlbGVtZW50LnN0eWxlLnRvcCwKICAgIGxlZnQ6IGVsZW1lbnQuc3R5bGUubGVmdCwKICAgIGhlaWdodDogZWxlbWVudC5zdHlsZS5oZWlnaHQsCiAgICB3aWR0aDogZWxlbWVudC5zdHlsZS53aWR0aCwKICAgIG9wYWNpdHk6IGVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eSgpIH07CgogIHZhciBkaW1zID0gZWxlbWVudC5nZXREaW1lbnNpb25zKCk7ICAgIAogIHZhciBpbml0aWFsTW92ZVgsIGluaXRpYWxNb3ZlWTsKICB2YXIgbW92ZVgsIG1vdmVZOwogIAogIHN3aXRjaCAob3B0aW9ucy5kaXJlY3Rpb24pIHsKICAgIGNhc2UgJ3RvcC1sZWZ0JzoKICAgICAgaW5pdGlhbE1vdmVYID0gaW5pdGlhbE1vdmVZID0gbW92ZVggPSBtb3ZlWSA9IDA7IAogICAgICBicmVhazsKICAgIGNhc2UgJ3RvcC1yaWdodCc6CiAgICAgIGluaXRpYWxNb3ZlWCA9IGRpbXMud2lkdGg7CiAgICAgIGluaXRpYWxNb3ZlWSA9IG1vdmVZID0gMDsKICAgICAgbW92ZVggPSAtZGltcy53aWR0aDsKICAgICAgYnJlYWs7CiAgICBjYXNlICdib3R0b20tbGVmdCc6CiAgICAgIGluaXRpYWxNb3ZlWCA9IG1vdmVYID0gMDsKICAgICAgaW5pdGlhbE1vdmVZID0gZGltcy5oZWlnaHQ7CiAgICAgIG1vdmVZID0gLWRpbXMuaGVpZ2h0OwogICAgICBicmVhazsKICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6CiAgICAgIGluaXRpYWxNb3ZlWCA9IGRpbXMud2lkdGg7CiAgICAgIGluaXRpYWxNb3ZlWSA9IGRpbXMuaGVpZ2h0OwogICAgICBtb3ZlWCA9IC1kaW1zLndpZHRoOwogICAgICBtb3ZlWSA9IC1kaW1zLmhlaWdodDsKICAgICAgYnJlYWs7CiAgICBjYXNlICdjZW50ZXInOgogICAgICBpbml0aWFsTW92ZVggPSBkaW1zLndpZHRoIC8gMjsKICAgICAgaW5pdGlhbE1vdmVZID0gZGltcy5oZWlnaHQgLyAyOwogICAgICBtb3ZlWCA9IC1kaW1zLndpZHRoIC8gMjsKICAgICAgbW92ZVkgPSAtZGltcy5oZWlnaHQgLyAyOwogICAgICBicmVhazsKICB9CiAgCiAgcmV0dXJuIG5ldyBFZmZlY3QuTW92ZShlbGVtZW50LCB7CiAgICB4OiBpbml0aWFsTW92ZVgsCiAgICB5OiBpbml0aWFsTW92ZVksCiAgICBkdXJhdGlvbjogMC4wMSwgCiAgICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICAgIGVmZmVjdC5lbGVtZW50LmhpZGUoKS5tYWtlQ2xpcHBpbmcoKS5tYWtlUG9zaXRpb25lZCgpOwogICAgfSwKICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICBuZXcgRWZmZWN0LlBhcmFsbGVsKAogICAgICAgIFsgbmV3IEVmZmVjdC5PcGFjaXR5KGVmZmVjdC5lbGVtZW50LCB7IHN5bmM6IHRydWUsIHRvOiAxLjAsIGZyb206IDAuMCwgdHJhbnNpdGlvbjogb3B0aW9ucy5vcGFjaXR5VHJhbnNpdGlvbiB9KSwKICAgICAgICAgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxlbWVudCwgeyB4OiBtb3ZlWCwgeTogbW92ZVksIHN5bmM6IHRydWUsIHRyYW5zaXRpb246IG9wdGlvbnMubW92ZVRyYW5zaXRpb24gfSksCiAgICAgICAgICBuZXcgRWZmZWN0LlNjYWxlKGVmZmVjdC5lbGVtZW50LCAxMDAsIHsKICAgICAgICAgICAgc2NhbGVNb2RlOiB7IG9yaWdpbmFsSGVpZ2h0OiBkaW1zLmhlaWdodCwgb3JpZ2luYWxXaWR0aDogZGltcy53aWR0aCB9LCAKICAgICAgICAgICAgc3luYzogdHJ1ZSwgc2NhbGVGcm9tOiB3aW5kb3cub3BlcmEgPyAxIDogMCwgdHJhbnNpdGlvbjogb3B0aW9ucy5zY2FsZVRyYW5zaXRpb24sIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZX0pCiAgICAgICAgXSwgT2JqZWN0LmV4dGVuZCh7CiAgICAgICAgICAgICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICAgICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQuc2V0U3R5bGUoe2hlaWdodDogJzBweCd9KS5zaG93KCk7IAogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICAgICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LnVuZG9DbGlwcGluZygpLnVuZG9Qb3NpdGlvbmVkKCkuc2V0U3R5bGUob2xkU3R5bGUpOyAKICAgICAgICAgICAgIH0KICAgICAgICAgICB9LCBvcHRpb25zKQogICAgICApCiAgICB9CiAgfSk7Cn07CgpFZmZlY3QuU2hyaW5rID0gZnVuY3Rpb24oZWxlbWVudCkgewogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CiAgICBkaXJlY3Rpb246ICdjZW50ZXInLAogICAgbW92ZVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCwKICAgIHNjYWxlVHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsLAogICAgb3BhY2l0eVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5ub25lCiAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7CiAgdmFyIG9sZFN0eWxlID0gewogICAgdG9wOiBlbGVtZW50LnN0eWxlLnRvcCwKICAgIGxlZnQ6IGVsZW1lbnQuc3R5bGUubGVmdCwKICAgIGhlaWdodDogZWxlbWVudC5zdHlsZS5oZWlnaHQsCiAgICB3aWR0aDogZWxlbWVudC5zdHlsZS53aWR0aCwKICAgIG9wYWNpdHk6IGVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eSgpIH07CgogIHZhciBkaW1zID0gZWxlbWVudC5nZXREaW1lbnNpb25zKCk7CiAgdmFyIG1vdmVYLCBtb3ZlWTsKICAKICBzd2l0Y2ggKG9wdGlvbnMuZGlyZWN0aW9uKSB7CiAgICBjYXNlICd0b3AtbGVmdCc6CiAgICAgIG1vdmVYID0gbW92ZVkgPSAwOwogICAgICBicmVhazsKICAgIGNhc2UgJ3RvcC1yaWdodCc6CiAgICAgIG1vdmVYID0gZGltcy53aWR0aDsKICAgICAgbW92ZVkgPSAwOwogICAgICBicmVhazsKICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzoKICAgICAgbW92ZVggPSAwOwogICAgICBtb3ZlWSA9IGRpbXMuaGVpZ2h0OwogICAgICBicmVhazsKICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6CiAgICAgIG1vdmVYID0gZGltcy53aWR0aDsKICAgICAgbW92ZVkgPSBkaW1zLmhlaWdodDsKICAgICAgYnJlYWs7CiAgICBjYXNlICdjZW50ZXInOiAgCiAgICAgIG1vdmVYID0gZGltcy53aWR0aCAvIDI7CiAgICAgIG1vdmVZID0gZGltcy5oZWlnaHQgLyAyOwogICAgICBicmVhazsKICB9CiAgCiAgcmV0dXJuIG5ldyBFZmZlY3QuUGFyYWxsZWwoCiAgICBbIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCB7IHN5bmM6IHRydWUsIHRvOiAwLjAsIGZyb206IDEuMCwgdHJhbnNpdGlvbjogb3B0aW9ucy5vcGFjaXR5VHJhbnNpdGlvbiB9KSwKICAgICAgbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCB3aW5kb3cub3BlcmEgPyAxIDogMCwgeyBzeW5jOiB0cnVlLCB0cmFuc2l0aW9uOiBvcHRpb25zLnNjYWxlVHJhbnNpdGlvbiwgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlfSksCiAgICAgIG5ldyBFZmZlY3QuTW92ZShlbGVtZW50LCB7IHg6IG1vdmVYLCB5OiBtb3ZlWSwgc3luYzogdHJ1ZSwgdHJhbnNpdGlvbjogb3B0aW9ucy5tb3ZlVHJhbnNpdGlvbiB9KQogICAgXSwgT2JqZWN0LmV4dGVuZCh7ICAgICAgICAgICAgCiAgICAgICAgIGJlZm9yZVN0YXJ0SW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQubWFrZVBvc2l0aW9uZWQoKS5tYWtlQ2xpcHBpbmcoKTsgCiAgICAgICAgIH0sCiAgICAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQuaGlkZSgpLnVuZG9DbGlwcGluZygpLnVuZG9Qb3NpdGlvbmVkKCkuc2V0U3R5bGUob2xkU3R5bGUpOyB9CiAgICAgICB9LCBvcHRpb25zKQogICk7Cn07CgpFZmZlY3QuUHVsc2F0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICBlbGVtZW50ID0gJChlbGVtZW50KTsKICB2YXIgb3B0aW9ucyAgICA9IGFyZ3VtZW50c1sxXSB8fCB7IH07CiAgdmFyIG9sZE9wYWNpdHkgPSBlbGVtZW50LmdldElubGluZU9wYWNpdHkoKTsKICB2YXIgdHJhbnNpdGlvbiA9IG9wdGlvbnMudHJhbnNpdGlvbiB8fCBFZmZlY3QuVHJhbnNpdGlvbnMuc2lub2lkYWw7CiAgdmFyIHJldmVyc2VyICAgPSBmdW5jdGlvbihwb3MpeyByZXR1cm4gdHJhbnNpdGlvbigxLUVmZmVjdC5UcmFuc2l0aW9ucy5wdWxzZShwb3MsIG9wdGlvbnMucHVsc2VzKSkgfTsKICByZXZlcnNlci5iaW5kKHRyYW5zaXRpb24pOwogIHJldHVybiBuZXcgRWZmZWN0Lk9wYWNpdHkoZWxlbWVudCwgCiAgICBPYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoeyAgZHVyYXRpb246IDIuMCwgZnJvbTogMCwKICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7IGVmZmVjdC5lbGVtZW50LnNldFN0eWxlKHtvcGFjaXR5OiBvbGRPcGFjaXR5fSk7IH0KICAgIH0sIG9wdGlvbnMpLCB7dHJhbnNpdGlvbjogcmV2ZXJzZXJ9KSk7Cn07CgpFZmZlY3QuRm9sZCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICBlbGVtZW50ID0gJChlbGVtZW50KTsKICB2YXIgb2xkU3R5bGUgPSB7CiAgICB0b3A6IGVsZW1lbnQuc3R5bGUudG9wLAogICAgbGVmdDogZWxlbWVudC5zdHlsZS5sZWZ0LAogICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsCiAgICBoZWlnaHQ6IGVsZW1lbnQuc3R5bGUuaGVpZ2h0IH07CiAgZWxlbWVudC5tYWtlQ2xpcHBpbmcoKTsKICByZXR1cm4gbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCA1LCBPYmplY3QuZXh0ZW5kKHsgICAKICAgIHNjYWxlQ29udGVudDogZmFsc2UsCiAgICBzY2FsZVg6IGZhbHNlLAogICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIDEsIHsgCiAgICAgIHNjYWxlQ29udGVudDogZmFsc2UsIAogICAgICBzY2FsZVk6IGZhbHNlLAogICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsKICAgICAgICBlZmZlY3QuZWxlbWVudC5oaWRlKCkudW5kb0NsaXBwaW5nKCkuc2V0U3R5bGUob2xkU3R5bGUpOwogICAgICB9IH0pOwogIH19LCBhcmd1bWVudHNbMV0gfHwgeyB9KSk7Cn07CgpFZmZlY3QuTW9ycGggPSBDbGFzcy5jcmVhdGUoRWZmZWN0LkJhc2UsIHsKICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgaWYgKCF0aGlzLmVsZW1lbnQpIHRocm93KEVmZmVjdC5fZWxlbWVudERvZXNOb3RFeGlzdEVycm9yKTsKICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CiAgICAgIHN0eWxlOiB7IH0KICAgIH0sIGFyZ3VtZW50c1sxXSB8fCB7IH0pOwogICAgCiAgICBpZiAoIU9iamVjdC5pc1N0cmluZyhvcHRpb25zLnN0eWxlKSkgdGhpcy5zdHlsZSA9ICRIKG9wdGlvbnMuc3R5bGUpOwogICAgZWxzZSB7CiAgICAgIGlmIChvcHRpb25zLnN0eWxlLmluY2x1ZGUoJzonKSkKICAgICAgICB0aGlzLnN0eWxlID0gb3B0aW9ucy5zdHlsZS5wYXJzZVN0eWxlKCk7CiAgICAgIGVsc2UgewogICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzc05hbWUob3B0aW9ucy5zdHlsZSk7CiAgICAgICAgdGhpcy5zdHlsZSA9ICRIKHRoaXMuZWxlbWVudC5nZXRTdHlsZXMoKSk7CiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzTmFtZShvcHRpb25zLnN0eWxlKTsKICAgICAgICB2YXIgY3NzID0gdGhpcy5lbGVtZW50LmdldFN0eWxlcygpOwogICAgICAgIHRoaXMuc3R5bGUgPSB0aGlzLnN0eWxlLnJlamVjdChmdW5jdGlvbihzdHlsZSkgewogICAgICAgICAgcmV0dXJuIHN0eWxlLnZhbHVlID09IGNzc1tzdHlsZS5rZXldOwogICAgICAgIH0pOwogICAgICAgIG9wdGlvbnMuYWZ0ZXJGaW5pc2hJbnRlcm5hbCA9IGZ1bmN0aW9uKGVmZmVjdCkgewogICAgICAgICAgZWZmZWN0LmVsZW1lbnQuYWRkQ2xhc3NOYW1lKGVmZmVjdC5vcHRpb25zLnN0eWxlKTsKICAgICAgICAgIGVmZmVjdC50cmFuc2Zvcm1zLmVhY2goZnVuY3Rpb24odHJhbnNmb3JtKSB7CiAgICAgICAgICAgIGVmZmVjdC5lbGVtZW50LnN0eWxlW3RyYW5zZm9ybS5zdHlsZV0gPSAnJzsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5zdGFydChvcHRpb25zKTsKICB9LAogIAogIHNldHVwOiBmdW5jdGlvbigpewogICAgZnVuY3Rpb24gcGFyc2VDb2xvcihjb2xvcil7CiAgICAgIGlmICghY29sb3IgfHwgWydyZ2JhKDAsIDAsIDAsIDApJywndHJhbnNwYXJlbnQnXS5pbmNsdWRlKGNvbG9yKSkgY29sb3IgPSAnI2ZmZmZmZic7CiAgICAgIGNvbG9yID0gY29sb3IucGFyc2VDb2xvcigpOwogICAgICByZXR1cm4gJFIoMCwyKS5tYXAoZnVuY3Rpb24oaSl7CiAgICAgICAgcmV0dXJuIHBhcnNlSW50KCBjb2xvci5zbGljZShpKjIrMSxpKjIrMyksIDE2ICkgCiAgICAgIH0pOwogICAgfQogICAgdGhpcy50cmFuc2Zvcm1zID0gdGhpcy5zdHlsZS5tYXAoZnVuY3Rpb24ocGFpcil7CiAgICAgIHZhciBwcm9wZXJ0eSA9IHBhaXJbMF0sIHZhbHVlID0gcGFpclsxXSwgdW5pdCA9IG51bGw7CgogICAgICBpZiAodmFsdWUucGFyc2VDb2xvcignI3p6enp6eicpICE9ICcjenp6enp6JykgewogICAgICAgIHZhbHVlID0gdmFsdWUucGFyc2VDb2xvcigpOwogICAgICAgIHVuaXQgID0gJ2NvbG9yJzsKICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSAnb3BhY2l0eScpIHsKICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpOwogICAgICAgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSAmJiAoIXRoaXMuZWxlbWVudC5jdXJyZW50U3R5bGUuaGFzTGF5b3V0KSkKICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRTdHlsZSh7em9vbTogMX0pOwogICAgICB9IGVsc2UgaWYgKEVsZW1lbnQuQ1NTX0xFTkdUSC50ZXN0KHZhbHVlKSkgewogICAgICAgICAgdmFyIGNvbXBvbmVudHMgPSB2YWx1ZS5tYXRjaCgvXihbXCtcLV0/WzAtOVwuXSspKC4qKSQvKTsKICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdChjb21wb25lbnRzWzFdKTsKICAgICAgICAgIHVuaXQgPSAoY29tcG9uZW50cy5sZW5ndGggPT0gMykgPyBjb21wb25lbnRzWzJdIDogbnVsbDsKICAgICAgfQoKICAgICAgdmFyIG9yaWdpbmFsVmFsdWUgPSB0aGlzLmVsZW1lbnQuZ2V0U3R5bGUocHJvcGVydHkpOwogICAgICByZXR1cm4geyAKICAgICAgICBzdHlsZTogcHJvcGVydHkuY2FtZWxpemUoKSwgCiAgICAgICAgb3JpZ2luYWxWYWx1ZTogdW5pdD09J2NvbG9yJyA/IHBhcnNlQ29sb3Iob3JpZ2luYWxWYWx1ZSkgOiBwYXJzZUZsb2F0KG9yaWdpbmFsVmFsdWUgfHwgMCksIAogICAgICAgIHRhcmdldFZhbHVlOiB1bml0PT0nY29sb3InID8gcGFyc2VDb2xvcih2YWx1ZSkgOiB2YWx1ZSwKICAgICAgICB1bml0OiB1bml0CiAgICAgIH07CiAgICB9LmJpbmQodGhpcykpLnJlamVjdChmdW5jdGlvbih0cmFuc2Zvcm0pewogICAgICByZXR1cm4gKAogICAgICAgICh0cmFuc2Zvcm0ub3JpZ2luYWxWYWx1ZSA9PSB0cmFuc2Zvcm0udGFyZ2V0VmFsdWUpIHx8CiAgICAgICAgKAogICAgICAgICAgdHJhbnNmb3JtLnVuaXQgIT0gJ2NvbG9yJyAmJgogICAgICAgICAgKGlzTmFOKHRyYW5zZm9ybS5vcmlnaW5hbFZhbHVlKSB8fCBpc05hTih0cmFuc2Zvcm0udGFyZ2V0VmFsdWUpKQogICAgICAgICkKICAgICAgKQogICAgfSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CiAgICB2YXIgc3R5bGUgPSB7IH0sIHRyYW5zZm9ybSwgaSA9IHRoaXMudHJhbnNmb3Jtcy5sZW5ndGg7CiAgICB3aGlsZShpLS0pCiAgICAgIHN0eWxlWyh0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybXNbaV0pLnN0eWxlXSA9IAogICAgICAgIHRyYW5zZm9ybS51bml0PT0nY29sb3InID8gJyMnKwogICAgICAgICAgKE1hdGgucm91bmQodHJhbnNmb3JtLm9yaWdpbmFsVmFsdWVbMF0rCiAgICAgICAgICAgICh0cmFuc2Zvcm0udGFyZ2V0VmFsdWVbMF0tdHJhbnNmb3JtLm9yaWdpbmFsVmFsdWVbMF0pKnBvc2l0aW9uKSkudG9Db2xvclBhcnQoKSArCiAgICAgICAgICAoTWF0aC5yb3VuZCh0cmFuc2Zvcm0ub3JpZ2luYWxWYWx1ZVsxXSsKICAgICAgICAgICAgKHRyYW5zZm9ybS50YXJnZXRWYWx1ZVsxXS10cmFuc2Zvcm0ub3JpZ2luYWxWYWx1ZVsxXSkqcG9zaXRpb24pKS50b0NvbG9yUGFydCgpICsKICAgICAgICAgIChNYXRoLnJvdW5kKHRyYW5zZm9ybS5vcmlnaW5hbFZhbHVlWzJdKwogICAgICAgICAgICAodHJhbnNmb3JtLnRhcmdldFZhbHVlWzJdLXRyYW5zZm9ybS5vcmlnaW5hbFZhbHVlWzJdKSpwb3NpdGlvbikpLnRvQ29sb3JQYXJ0KCkgOgogICAgICAgICh0cmFuc2Zvcm0ub3JpZ2luYWxWYWx1ZSArCiAgICAgICAgICAodHJhbnNmb3JtLnRhcmdldFZhbHVlIC0gdHJhbnNmb3JtLm9yaWdpbmFsVmFsdWUpICogcG9zaXRpb24pLnRvRml4ZWQoMykgKyAKICAgICAgICAgICAgKHRyYW5zZm9ybS51bml0ID09PSBudWxsID8gJycgOiB0cmFuc2Zvcm0udW5pdCk7CiAgICB0aGlzLmVsZW1lbnQuc2V0U3R5bGUoc3R5bGUsIHRydWUpOwogIH0KfSk7CgpFZmZlY3QuVHJhbnNmb3JtID0gQ2xhc3MuY3JlYXRlKHsKICBpbml0aWFsaXplOiBmdW5jdGlvbih0cmFja3MpewogICAgdGhpcy50cmFja3MgID0gW107CiAgICB0aGlzLm9wdGlvbnMgPSBhcmd1bWVudHNbMV0gfHwgeyB9OwogICAgdGhpcy5hZGRUcmFja3ModHJhY2tzKTsKICB9LAogIGFkZFRyYWNrczogZnVuY3Rpb24odHJhY2tzKXsKICAgIHRyYWNrcy5lYWNoKGZ1bmN0aW9uKHRyYWNrKXsKICAgICAgdHJhY2sgPSAkSCh0cmFjayk7CiAgICAgIHZhciBkYXRhID0gdHJhY2sudmFsdWVzKCkuZmlyc3QoKTsKICAgICAgdGhpcy50cmFja3MucHVzaCgkSCh7CiAgICAgICAgaWRzOiAgICAgdHJhY2sua2V5cygpLmZpcnN0KCksCiAgICAgICAgZWZmZWN0OiAgRWZmZWN0Lk1vcnBoLAogICAgICAgIG9wdGlvbnM6IHsgc3R5bGU6IGRhdGEgfQogICAgICB9KSk7CiAgICB9LmJpbmQodGhpcykpOwogICAgcmV0dXJuIHRoaXM7CiAgfSwKICBwbGF5OiBmdW5jdGlvbigpewogICAgcmV0dXJuIG5ldyBFZmZlY3QuUGFyYWxsZWwoCiAgICAgIHRoaXMudHJhY2tzLm1hcChmdW5jdGlvbih0cmFjayl7CiAgICAgICAgdmFyIGlkcyA9IHRyYWNrLmdldCgnaWRzJyksIGVmZmVjdCA9IHRyYWNrLmdldCgnZWZmZWN0JyksIG9wdGlvbnMgPSB0cmFjay5nZXQoJ29wdGlvbnMnKTsKICAgICAgICB2YXIgZWxlbWVudHMgPSBbJChpZHMpIHx8ICQkKGlkcyldLmZsYXR0ZW4oKTsKICAgICAgICByZXR1cm4gZWxlbWVudHMubWFwKGZ1bmN0aW9uKGUpeyByZXR1cm4gbmV3IGVmZmVjdChlLCBPYmplY3QuZXh0ZW5kKHsgc3luYzp0cnVlIH0sIG9wdGlvbnMpKSB9KTsKICAgICAgfSkuZmxhdHRlbigpLAogICAgICB0aGlzLm9wdGlvbnMKICAgICk7CiAgfQp9KTsKCkVsZW1lbnQuQ1NTX1BST1BFUlRJRVMgPSAkdygKICAnYmFja2dyb3VuZENvbG9yIGJhY2tncm91bmRQb3NpdGlvbiBib3JkZXJCb3R0b21Db2xvciBib3JkZXJCb3R0b21TdHlsZSAnICsgCiAgJ2JvcmRlckJvdHRvbVdpZHRoIGJvcmRlckxlZnRDb2xvciBib3JkZXJMZWZ0U3R5bGUgYm9yZGVyTGVmdFdpZHRoICcgKwogICdib3JkZXJSaWdodENvbG9yIGJvcmRlclJpZ2h0U3R5bGUgYm9yZGVyUmlnaHRXaWR0aCBib3JkZXJTcGFjaW5nICcgKwogICdib3JkZXJUb3BDb2xvciBib3JkZXJUb3BTdHlsZSBib3JkZXJUb3BXaWR0aCBib3R0b20gY2xpcCBjb2xvciAnICsKICAnZm9udFNpemUgZm9udFdlaWdodCBoZWlnaHQgbGVmdCBsZXR0ZXJTcGFjaW5nIGxpbmVIZWlnaHQgJyArCiAgJ21hcmdpbkJvdHRvbSBtYXJnaW5MZWZ0IG1hcmdpblJpZ2h0IG1hcmdpblRvcCBtYXJrZXJPZmZzZXQgbWF4SGVpZ2h0ICcrCiAgJ21heFdpZHRoIG1pbkhlaWdodCBtaW5XaWR0aCBvcGFjaXR5IG91dGxpbmVDb2xvciBvdXRsaW5lT2Zmc2V0ICcgKwogICdvdXRsaW5lV2lkdGggcGFkZGluZ0JvdHRvbSBwYWRkaW5nTGVmdCBwYWRkaW5nUmlnaHQgcGFkZGluZ1RvcCAnICsKICAncmlnaHQgdGV4dEluZGVudCB0b3Agd2lkdGggd29yZFNwYWNpbmcgekluZGV4Jyk7CiAgCkVsZW1lbnQuQ1NTX0xFTkdUSCA9IC9eKChbXCtcLV0/WzAtOVwuXSspKGVtfGV4fHB4fGlufGNtfG1tfHB0fHBjfFwlKSl8MCQvOwoKU3RyaW5nLl9fcGFyc2VTdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKU3RyaW5nLnByb3RvdHlwZS5wYXJzZVN0eWxlID0gZnVuY3Rpb24oKXsKICB2YXIgc3R5bGUsIHN0eWxlUnVsZXMgPSAkSCgpOwogIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpCiAgICBzdHlsZSA9IG5ldyBFbGVtZW50KCdkaXYnLHtzdHlsZTp0aGlzfSkuc3R5bGU7CiAgZWxzZSB7CiAgICBTdHJpbmcuX19wYXJzZVN0eWxlRWxlbWVudC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT0iJyArIHRoaXMgKyAnIj48L2Rpdj4nOwogICAgc3R5bGUgPSBTdHJpbmcuX19wYXJzZVN0eWxlRWxlbWVudC5jaGlsZE5vZGVzWzBdLnN0eWxlOwogIH0KICAKICBFbGVtZW50LkNTU19QUk9QRVJUSUVTLmVhY2goZnVuY3Rpb24ocHJvcGVydHkpewogICAgaWYgKHN0eWxlW3Byb3BlcnR5XSkgc3R5bGVSdWxlcy5zZXQocHJvcGVydHksIHN0eWxlW3Byb3BlcnR5XSk7IAogIH0pOwogIAogIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSAmJiB0aGlzLmluY2x1ZGUoJ29wYWNpdHknKSkKICAgIHN0eWxlUnVsZXMuc2V0KCdvcGFjaXR5JywgdGhpcy5tYXRjaCgvb3BhY2l0eTpccyooKD86MHwxKT8oPzpcLlxkKik/KS8pWzFdKTsKCiAgcmV0dXJuIHN0eWxlUnVsZXM7Cn07CgppZiAoZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSkgewogIEVsZW1lbnQuZ2V0U3R5bGVzID0gZnVuY3Rpb24oZWxlbWVudCkgewogICAgdmFyIGNzcyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoJChlbGVtZW50KSwgbnVsbCk7CiAgICByZXR1cm4gRWxlbWVudC5DU1NfUFJPUEVSVElFUy5pbmplY3QoeyB9LCBmdW5jdGlvbihzdHlsZXMsIHByb3BlcnR5KSB7CiAgICAgIHN0eWxlc1twcm9wZXJ0eV0gPSBjc3NbcHJvcGVydHldOwogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSk7CiAgfTsKfSBlbHNlIHsKICBFbGVtZW50LmdldFN0eWxlcyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdmFyIGNzcyA9IGVsZW1lbnQuY3VycmVudFN0eWxlLCBzdHlsZXM7CiAgICBzdHlsZXMgPSBFbGVtZW50LkNTU19QUk9QRVJUSUVTLmluamVjdCh7IH0sIGZ1bmN0aW9uKHJlc3VsdHMsIHByb3BlcnR5KSB7CiAgICAgIHJlc3VsdHNbcHJvcGVydHldID0gY3NzW3Byb3BlcnR5XTsKICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KTsKICAgIGlmICghc3R5bGVzLm9wYWNpdHkpIHN0eWxlcy5vcGFjaXR5ID0gZWxlbWVudC5nZXRPcGFjaXR5KCk7CiAgICByZXR1cm4gc3R5bGVzOwogIH07Cn07CgpFZmZlY3QuTWV0aG9kcyA9IHsKICBtb3JwaDogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgbmV3IEVmZmVjdC5Nb3JwaChlbGVtZW50LCBPYmplY3QuZXh0ZW5kKHsgc3R5bGU6IHN0eWxlIH0sIGFyZ3VtZW50c1syXSB8fCB7IH0pKTsKICAgIHJldHVybiBlbGVtZW50OwogIH0sCiAgdmlzdWFsRWZmZWN0OiBmdW5jdGlvbihlbGVtZW50LCBlZmZlY3QsIG9wdGlvbnMpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpCiAgICB2YXIgcyA9IGVmZmVjdC5kYXNoZXJpemUoKS5jYW1lbGl6ZSgpLCBrbGFzcyA9IHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnN1YnN0cmluZygxKTsKICAgIG5ldyBFZmZlY3Rba2xhc3NdKGVsZW1lbnQsIG9wdGlvbnMpOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfSwKICBoaWdobGlnaHQ6IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgbmV3IEVmZmVjdC5IaWdobGlnaHQoZWxlbWVudCwgb3B0aW9ucyk7CiAgICByZXR1cm4gZWxlbWVudDsKICB9Cn07CgokdygnZmFkZSBhcHBlYXIgZ3JvdyBzaHJpbmsgZm9sZCBibGluZFVwIGJsaW5kRG93biBzbGlkZVVwIHNsaWRlRG93biAnKwogICdwdWxzYXRlIHNoYWtlIHB1ZmYgc3F1aXNoIHN3aXRjaE9mZiBkcm9wT3V0JykuZWFjaCgKICBmdW5jdGlvbihlZmZlY3QpIHsgCiAgICBFZmZlY3QuTWV0aG9kc1tlZmZlY3RdID0gZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucyl7CiAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgICBFZmZlY3RbZWZmZWN0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZWZmZWN0LnN1YnN0cmluZygxKV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgICAgIHJldHVybiBlbGVtZW50OwogICAgfQogIH0KKTsKCiR3KCdnZXRJbmxpbmVPcGFjaXR5IGZvcmNlUmVyZW5kZXJpbmcgc2V0Q29udGVudFpvb20gY29sbGVjdFRleHROb2RlcyBjb2xsZWN0VGV4dE5vZGVzSWdub3JlQ2xhc3MgZ2V0U3R5bGVzJykuZWFjaCggCiAgZnVuY3Rpb24oZikgeyBFZmZlY3QuTWV0aG9kc1tmXSA9IEVsZW1lbnRbZl07IH0KKTsKCkVsZW1lbnQuYWRkTWV0aG9kcyhFZmZlY3QuTWV0aG9kcyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/js/lightbox.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLwlMaWdodGJveCB2Mi4wNA0KLy8JYnkgTG9rZXNoIERoYWthciAtIGh0dHA6Ly93d3cubG9rZXNoZGhha2FyLmNvbQ0KLy8JTGFzdCBNb2RpZmljYXRpb246IDIvOS8wOA0KLy8NCi8vCUZvciBtb3JlIGluZm9ybWF0aW9uLCB2aXNpdDoNCi8vCWh0dHA6Ly9sb2tlc2hkaGFrYXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8NCi8vDQovLwlMaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjUgTGljZW5zZSAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8NCi8vICAJLSBGcmVlIGZvciB1c2UgaW4gYm90aCBwZXJzb25hbCBhbmQgY29tbWVyY2lhbCBwcm9qZWN0cw0KLy8JCS0gQXR0cmlidXRpb24gcmVxdWlyZXMgbGVhdmluZyBhdXRob3IgbmFtZSwgYXV0aG9yIGxpbmssIGFuZCB0aGUgbGljZW5zZSBpbmZvIGludGFjdC4NCi8vCQ0KLy8gIFRoYW5rczogU2NvdHQgVXB0b24odXB0b25pYy5jb20pLCBQZXRlci1QYXVsIEtvY2gocXVpcmtzbW9kZS5jb20pLCBhbmQgVGhvbWFzIEZ1Y2hzKG1pci5hY3Vsby51cykgZm9yIGlkZWFzLCBsaWJzLCBhbmQgc25pcHBldHMuDQovLyAgCQlBcnRlbXkgVHJlZ3ViZW5rbyAoYXJ0eS5uYW1lKSBmb3IgY2xlYW51cCBhbmQgaGVscCBpbiB1cGRhdGluZyB0byBsYXRlc3QgdmVyIG9mIHByb3RvLWFjdWxvdXMuDQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8qDQoNCiAgICBUYWJsZSBvZiBDb250ZW50cw0KICAgIC0tLS0tLS0tLS0tLS0tLS0tDQogICAgQ29uZmlndXJhdGlvbg0KDQogICAgTGlnaHRib3ggQ2xhc3MgRGVjbGFyYXRpb24NCiAgICAtIGluaXRpYWxpemUoKQ0KICAgIC0gdXBkYXRlSW1hZ2VMaXN0KCkNCiAgICAtIHN0YXJ0KCkNCiAgICAtIGNoYW5nZUltYWdlKCkNCiAgICAtIHJlc2l6ZUltYWdlQ29udGFpbmVyKCkNCiAgICAtIHNob3dJbWFnZSgpDQogICAgLSB1cGRhdGVEZXRhaWxzKCkNCiAgICAtIHVwZGF0ZU5hdigpDQogICAgLSBlbmFibGVLZXlib2FyZE5hdigpDQogICAgLSBkaXNhYmxlS2V5Ym9hcmROYXYoKQ0KICAgIC0ga2V5Ym9hcmRBY3Rpb24oKQ0KICAgIC0gcHJlbG9hZE5laWdoYm9ySW1hZ2VzKCkNCiAgICAtIGVuZCgpDQogICAgDQogICAgRnVuY3Rpb24gQ2FsbHMNCiAgICAtIGRvY3VtZW50Lm9ic2VydmUoKQ0KICAgDQoqLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLy8NCi8vICBDb25maWd1cmF0aW9ubA0KLy8NCkxpZ2h0Ym94T3B0aW9ucyA9IE9iamVjdC5leHRlbmQoew0KICAgIGZpbGVMb2FkaW5nSW1hZ2U6ICAgICAgICAnbW9kdWxlcy9HYWxsZXJ5L3RlbXBsYXRlcy9saWdodGJveC9pbWFnZXMvbG9hZGluZy5naWYnLCAgICAgDQogICAgZmlsZUJvdHRvbU5hdkNsb3NlSW1hZ2U6ICdtb2R1bGVzL0dhbGxlcnkvdGVtcGxhdGVzL2xpZ2h0Ym94L2ltYWdlcy9jbG9zZWxhYmVsLmdpZicsDQoNCiAgICBvdmVybGF5T3BhY2l0eTogMC44LCAgIC8vIGNvbnRyb2xzIHRyYW5zcGFyZW5jeSBvZiBzaGFkb3cgb3ZlcmxheQ0KDQogICAgYW5pbWF0ZTogdHJ1ZSwgICAgICAgICAvLyB0b2dnbGVzIHJlc2l6aW5nIGFuaW1hdGlvbnMNCiAgICByZXNpemVTcGVlZDogNywgICAgICAgIC8vIGNvbnRyb2xzIHRoZSBzcGVlZCBvZiB0aGUgaW1hZ2UgcmVzaXppbmcgYW5pbWF0aW9ucyAoMT1zbG93ZXN0IGFuZCAxMD1mYXN0ZXN0KQ0KDQogICAgYm9yZGVyU2l6ZTogMTAsICAgICAgICAgLy9pZiB5b3UgYWRqdXN0IHRoZSBwYWRkaW5nIGluIHRoZSBDU1MsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUNCg0KCS8vIFdoZW4gZ3JvdXBpbmcgaW1hZ2VzIHRoaXMgaXMgdXNlZCB0byB3cml0ZTogSW1hZ2UgIyBvZiAjLg0KCS8vIENoYW5nZSBpdCBmb3Igbm9uLWVuZ2xpc2ggbG9jYWxpemF0aW9uDQoJbGFiZWxJbWFnZTogIkltYWdlIiwNCglsYWJlbE9mOiAib2YiDQp9LCB3aW5kb3cuTGlnaHRib3hPcHRpb25zIHx8IHt9KTsNCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KdmFyIExpZ2h0Ym94ID0gQ2xhc3MuY3JlYXRlKCk7DQoNCkxpZ2h0Ym94LnByb3RvdHlwZSA9IHsNCiAgICBpbWFnZUFycmF5OiBbXSwNCiAgICBhY3RpdmVJbWFnZTogdW5kZWZpbmVkLA0KICAgIA0KICAgIC8vIGluaXRpYWxpemUoKQ0KICAgIC8vIENvbnN0cnVjdG9yIHJ1bnMgb24gY29tcGxldGlvbiBvZiB0aGUgRE9NIGxvYWRpbmcuIENhbGxzIHVwZGF0ZUltYWdlTGlzdCBhbmQgdGhlbg0KICAgIC8vIHRoZSBmdW5jdGlvbiBpbnNlcnRzIGh0bWwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSB3aGljaCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHNoYWRvdyANCiAgICAvLyBvdmVybGF5IGFuZCB0aGUgaW1hZ2UgY29udGFpbmVyLg0KICAgIC8vDQogICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7ICAgIA0KICAgICAgICANCiAgICAgICAgdGhpcy51cGRhdGVJbWFnZUxpc3QoKTsNCiAgICAgICAgDQogICAgICAgIHRoaXMua2V5Ym9hcmRBY3Rpb24gPSB0aGlzLmtleWJvYXJkQWN0aW9uLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7DQoNCiAgICAgICAgaWYgKExpZ2h0Ym94T3B0aW9ucy5yZXNpemVTcGVlZCA+IDEwKSBMaWdodGJveE9wdGlvbnMucmVzaXplU3BlZWQgPSAxMDsNCiAgICAgICAgaWYgKExpZ2h0Ym94T3B0aW9ucy5yZXNpemVTcGVlZCA8IDEpICBMaWdodGJveE9wdGlvbnMucmVzaXplU3BlZWQgPSAxOw0KDQoJICAgIHRoaXMucmVzaXplRHVyYXRpb24gPSBMaWdodGJveE9wdGlvbnMuYW5pbWF0ZSA/ICgoMTEgLSBMaWdodGJveE9wdGlvbnMucmVzaXplU3BlZWQpICogMC4xNSkgOiAwOw0KCSAgICB0aGlzLm92ZXJsYXlEdXJhdGlvbiA9IExpZ2h0Ym94T3B0aW9ucy5hbmltYXRlID8gMC4yIDogMDsgIC8vIHNoYWRvdyBmYWRlIGluL291dCBkdXJhdGlvbg0KDQogICAgICAgIC8vIFdoZW4gTGlnaHRib3ggc3RhcnRzIGl0IHdpbGwgcmVzaXplIGl0c2VsZiBmcm9tIDI1MCBieSAyNTAgdG8gdGhlIGN1cnJlbnQgaW1hZ2UgZGltZW5zaW9uLg0KICAgICAgICAvLyBJZiBhbmltYXRpb25zIGFyZSB0dXJuZWQgb2ZmLCBpdCB3aWxsIGJlIGhpZGRlbiBhcyB0byBwcmV2ZW50IGEgZmxpY2tlciBvZiBhDQogICAgICAgIC8vIHdoaXRlIDI1MCBieSAyNTAgYm94Lg0KICAgICAgICB2YXIgc2l6ZSA9IChMaWdodGJveE9wdGlvbnMuYW5pbWF0ZSA/IDI1MCA6IDEpICsgJ3B4JzsNCiAgICAgICAgDQoNCiAgICAgICAgLy8gQ29kZSBpbnNlcnRzIGh0bWwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSB0aGF0IGxvb2tzIHNpbWlsYXIgdG8gdGhpczoNCiAgICAgICAgLy8NCiAgICAgICAgLy8gIDxkaXYgaWQ9Im92ZXJsYXkiPjwvZGl2Pg0KICAgICAgICAvLyAgPGRpdiBpZD0ibGlnaHRib3giPg0KICAgICAgICAvLyAgICAgIDxkaXYgaWQ9Im91dGVySW1hZ2VDb250YWluZXIiPg0KICAgICAgICAvLyAgICAgICAgICA8ZGl2IGlkPSJpbWFnZUNvbnRhaW5lciI+DQogICAgICAgIC8vICAgICAgICAgICAgICA8aW1nIGlkPSJsaWdodGJveEltYWdlIj4NCiAgICAgICAgLy8gICAgICAgICAgICAgIDxkaXYgc3R5bGU9IiIgaWQ9ImhvdmVyTmF2Ij4NCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0icHJldkxpbmsiPjwvYT4NCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0ibmV4dExpbmsiPjwvYT4NCiAgICAgICAgLy8gICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAvLyAgICAgICAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+DQogICAgICAgIC8vICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9ImxvYWRpbmdMaW5rIj4NCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9ImltYWdlcy9sb2FkaW5nLmdpZiI+DQogICAgICAgIC8vICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAvLyAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIC8vICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAvLyAgICAgIDwvZGl2Pg0KICAgICAgICAvLyAgICAgIDxkaXYgaWQ9ImltYWdlRGF0YUNvbnRhaW5lciI+DQogICAgICAgIC8vICAgICAgICAgIDxkaXYgaWQ9ImltYWdlRGF0YSI+DQogICAgICAgIC8vICAgICAgICAgICAgICA8ZGl2IGlkPSJpbWFnZURldGFpbHMiPg0KICAgICAgICAvLyAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJjYXB0aW9uIj48L3NwYW4+DQogICAgICAgIC8vICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9Im51bWJlckRpc3BsYXkiPjwvc3Bhbj4NCiAgICAgICAgLy8gICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAvLyAgICAgICAgICAgICAgPGRpdiBpZD0iYm90dG9tTmF2Ij4NCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iYm90dG9tTmF2Q2xvc2UiPg0KICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iaW1hZ2VzL2Nsb3NlLmdpZiI+DQogICAgICAgIC8vICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAvLyAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIC8vICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAvLyAgICAgIDwvZGl2Pg0KICAgICAgICAvLyAgPC9kaXY+DQoNCg0KICAgICAgICB2YXIgb2JqQm9keSA9ICQkKCdib2R5JylbMF07DQoNCgkJb2JqQm9keS5hcHBlbmRDaGlsZChCdWlsZGVyLm5vZGUoJ2Rpdicse2lkOidvdmVybGF5J30pKTsNCgkNCiAgICAgICAgb2JqQm9keS5hcHBlbmRDaGlsZChCdWlsZGVyLm5vZGUoJ2Rpdicse2lkOidsaWdodGJveCd9LCBbDQogICAgICAgICAgICBCdWlsZGVyLm5vZGUoJ2Rpdicse2lkOidvdXRlckltYWdlQ29udGFpbmVyJ30sIA0KICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnZGl2Jyx7aWQ6J2ltYWdlQ29udGFpbmVyJ30sIFsNCiAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5ub2RlKCdpbWcnLHtpZDonbGlnaHRib3hJbWFnZSd9KSwgDQogICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnZGl2Jyx7aWQ6J2hvdmVyTmF2J30sIFsNCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnYScse2lkOidwcmV2TGluaycsIGhyZWY6ICcjJyB9KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnYScse2lkOiduZXh0TGluaycsIGhyZWY6ICcjJyB9KQ0KICAgICAgICAgICAgICAgICAgICBdKSwNCiAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5ub2RlKCdkaXYnLHtpZDonbG9hZGluZyd9LCANCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnYScse2lkOidsb2FkaW5nTGluaycsIGhyZWY6ICcjJyB9LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLm5vZGUoJ2ltZycsIHtzcmM6IExpZ2h0Ym94T3B0aW9ucy5maWxlTG9hZGluZ0ltYWdlfSkNCiAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIF0pDQogICAgICAgICAgICApLA0KICAgICAgICAgICAgQnVpbGRlci5ub2RlKCdkaXYnLCB7aWQ6J2ltYWdlRGF0YUNvbnRhaW5lcid9LA0KICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnZGl2Jyx7aWQ6J2ltYWdlRGF0YSd9LCBbDQogICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnZGl2Jyx7aWQ6J2ltYWdlRGV0YWlscyd9LCBbDQogICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLm5vZGUoJ3NwYW4nLHtpZDonY2FwdGlvbid9KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnc3Bhbicse2lkOidudW1iZXJEaXNwbGF5J30pDQogICAgICAgICAgICAgICAgICAgIF0pLA0KICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLm5vZGUoJ2Rpdicse2lkOidib3R0b21OYXYnfSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnYScse2lkOidib3R0b21OYXZDbG9zZScsIGhyZWY6ICcjJyB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIubm9kZSgnaW1nJywgeyBzcmM6IExpZ2h0Ym94T3B0aW9ucy5maWxlQm90dG9tTmF2Q2xvc2VJbWFnZSB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgXSkNCiAgICAgICAgICAgICkNCiAgICAgICAgXSkpOw0KDQoNCgkJJCgnb3ZlcmxheScpLmhpZGUoKS5vYnNlcnZlKCdjbGljaycsIChmdW5jdGlvbigpIHsgdGhpcy5lbmQoKTsgfSkuYmluZCh0aGlzKSk7DQoJCSQoJ2xpZ2h0Ym94JykuaGlkZSgpLm9ic2VydmUoJ2NsaWNrJywgKGZ1bmN0aW9uKGV2ZW50KSB7IGlmIChldmVudC5lbGVtZW50KCkuaWQgPT0gJ2xpZ2h0Ym94JykgdGhpcy5lbmQoKTsgfSkuYmluZCh0aGlzKSk7DQoJCSQoJ291dGVySW1hZ2VDb250YWluZXInKS5zZXRTdHlsZSh7IHdpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemUgfSk7DQoJCSQoJ3ByZXZMaW5rJykub2JzZXJ2ZSgnY2xpY2snLCAoZnVuY3Rpb24oZXZlbnQpIHsgZXZlbnQuc3RvcCgpOyB0aGlzLmNoYW5nZUltYWdlKHRoaXMuYWN0aXZlSW1hZ2UgLSAxKTsgfSkuYmluZEFzRXZlbnRMaXN0ZW5lcih0aGlzKSk7DQoJCSQoJ25leHRMaW5rJykub2JzZXJ2ZSgnY2xpY2snLCAoZnVuY3Rpb24oZXZlbnQpIHsgZXZlbnQuc3RvcCgpOyB0aGlzLmNoYW5nZUltYWdlKHRoaXMuYWN0aXZlSW1hZ2UgKyAxKTsgfSkuYmluZEFzRXZlbnRMaXN0ZW5lcih0aGlzKSk7DQoJCSQoJ2xvYWRpbmdMaW5rJykub2JzZXJ2ZSgnY2xpY2snLCAoZnVuY3Rpb24oZXZlbnQpIHsgZXZlbnQuc3RvcCgpOyB0aGlzLmVuZCgpOyB9KS5iaW5kKHRoaXMpKTsNCgkJJCgnYm90dG9tTmF2Q2xvc2UnKS5vYnNlcnZlKCdjbGljaycsIChmdW5jdGlvbihldmVudCkgeyBldmVudC5zdG9wKCk7IHRoaXMuZW5kKCk7IH0pLmJpbmQodGhpcykpOw0KDQogICAgICAgIHZhciB0aCA9IHRoaXM7DQogICAgICAgIChmdW5jdGlvbigpew0KICAgICAgICAgICAgdmFyIGlkcyA9IA0KICAgICAgICAgICAgICAgICdvdmVybGF5IGxpZ2h0Ym94IG91dGVySW1hZ2VDb250YWluZXIgaW1hZ2VDb250YWluZXIgbGlnaHRib3hJbWFnZSBob3Zlck5hdiBwcmV2TGluayBuZXh0TGluayBsb2FkaW5nIGxvYWRpbmdMaW5rICcgKyANCiAgICAgICAgICAgICAgICAnaW1hZ2VEYXRhQ29udGFpbmVyIGltYWdlRGF0YSBpbWFnZURldGFpbHMgY2FwdGlvbiBudW1iZXJEaXNwbGF5IGJvdHRvbU5hdiBib3R0b21OYXZDbG9zZSc7ICAgDQogICAgICAgICAgICAkdyhpZHMpLmVhY2goZnVuY3Rpb24oaWQpeyB0aFtpZF0gPSAkKGlkKTsgfSk7DQogICAgICAgIH0pLmRlZmVyKCk7DQogICAgfSwNCg0KICAgIC8vDQogICAgLy8gdXBkYXRlSW1hZ2VMaXN0KCkNCiAgICAvLyBMb29wcyB0aHJvdWdoIGFuY2hvciB0YWdzIGxvb2tpbmcgZm9yICdsaWdodGJveCcgcmVmZXJlbmNlcyBhbmQgYXBwbGllcyBvbmNsaWNrDQogICAgLy8gZXZlbnRzIHRvIGFwcHJvcHJpYXRlIGxpbmtzLiBZb3UgY2FuIHJlcnVuIGFmdGVyIGR5bmFtaWNhbGx5IGFkZGluZyBpbWFnZXMgdy9hamF4Lg0KICAgIC8vDQogICAgdXBkYXRlSW1hZ2VMaXN0OiBmdW5jdGlvbigpIHsgICANCiAgICAgICAgdGhpcy51cGRhdGVJbWFnZUxpc3QgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsNCg0KICAgICAgICBkb2N1bWVudC5vYnNlcnZlKCdjbGljaycsIChmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQuZmluZEVsZW1lbnQoJ2FbcmVsXj1saWdodGJveF0nKSB8fCBldmVudC5maW5kRWxlbWVudCgnYXJlYVtyZWxePWxpZ2h0Ym94XScpOw0KICAgICAgICAgICAgaWYgKHRhcmdldCkgew0KICAgICAgICAgICAgICAgIGV2ZW50LnN0b3AoKTsNCiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0KHRhcmdldCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pLmJpbmQodGhpcykpOw0KICAgIH0sDQogICAgDQogICAgLy8NCiAgICAvLyAgc3RhcnQoKQ0KICAgIC8vICBEaXNwbGF5IG92ZXJsYXkgYW5kIGxpZ2h0Ym94LiBJZiBpbWFnZSBpcyBwYXJ0IG9mIGEgc2V0LCBhZGQgc2libGluZ3MgdG8gaW1hZ2VBcnJheS4NCiAgICAvLw0KICAgIHN0YXJ0OiBmdW5jdGlvbihpbWFnZUxpbmspIHsgICAgDQoNCiAgICAgICAgJCQoJ3NlbGVjdCcsICdvYmplY3QnLCAnZW1iZWQnKS5lYWNoKGZ1bmN0aW9uKG5vZGUpeyBub2RlLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJyB9KTsNCg0KICAgICAgICAvLyBzdHJldGNoIG92ZXJsYXkgdG8gZmlsbCBwYWdlIGFuZCBmYWRlIGluDQogICAgICAgIHZhciBhcnJheVBhZ2VTaXplID0gdGhpcy5nZXRQYWdlU2l6ZSgpOw0KICAgICAgICAkKCdvdmVybGF5Jykuc2V0U3R5bGUoeyB3aWR0aDogYXJyYXlQYWdlU2l6ZVswXSArICdweCcsIGhlaWdodDogYXJyYXlQYWdlU2l6ZVsxXSArICdweCcgfSk7DQoNCiAgICAgICAgbmV3IEVmZmVjdC5BcHBlYXIodGhpcy5vdmVybGF5LCB7IGR1cmF0aW9uOiB0aGlzLm92ZXJsYXlEdXJhdGlvbiwgZnJvbTogMC4wLCB0bzogTGlnaHRib3hPcHRpb25zLm92ZXJsYXlPcGFjaXR5IH0pOw0KDQogICAgICAgIHRoaXMuaW1hZ2VBcnJheSA9IFtdOw0KICAgICAgICB2YXIgaW1hZ2VOdW0gPSAwOyAgICAgICANCg0KICAgICAgICBpZiAoKGltYWdlTGluay5yZWwgPT0gJ2xpZ2h0Ym94Jykpew0KICAgICAgICAgICAgLy8gaWYgaW1hZ2UgaXMgTk9UIHBhcnQgb2YgYSBzZXQsIGFkZCBzaW5nbGUgaW1hZ2UgdG8gaW1hZ2VBcnJheQ0KICAgICAgICAgICAgdGhpcy5pbWFnZUFycmF5LnB1c2goW2ltYWdlTGluay5ocmVmLCBpbWFnZUxpbmsudGl0bGVdKTsgICAgICAgICANCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vIGlmIGltYWdlIGlzIHBhcnQgb2YgYSBzZXQuLg0KICAgICAgICAgICAgdGhpcy5pbWFnZUFycmF5ID0gDQogICAgICAgICAgICAgICAgJCQoaW1hZ2VMaW5rLnRhZ05hbWUgKyAnW2hyZWZdW3JlbD0iJyArIGltYWdlTGluay5yZWwgKyAnIl0nKS4NCiAgICAgICAgICAgICAgICBjb2xsZWN0KGZ1bmN0aW9uKGFuY2hvcil7IHJldHVybiBbYW5jaG9yLmhyZWYsIGFuY2hvci50aXRsZV07IH0pLg0KICAgICAgICAgICAgICAgIHVuaXEoKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgd2hpbGUgKHRoaXMuaW1hZ2VBcnJheVtpbWFnZU51bV1bMF0gIT0gaW1hZ2VMaW5rLmhyZWYpIHsgaW1hZ2VOdW0rKzsgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gY2FsY3VsYXRlIHRvcCBhbmQgbGVmdCBvZmZzZXQgZm9yIHRoZSBsaWdodGJveCANCiAgICAgICAgdmFyIGFycmF5UGFnZVNjcm9sbCA9IGRvY3VtZW50LnZpZXdwb3J0LmdldFNjcm9sbE9mZnNldHMoKTsNCiAgICAgICAgdmFyIGxpZ2h0Ym94VG9wID0gYXJyYXlQYWdlU2Nyb2xsWzFdICsgKGRvY3VtZW50LnZpZXdwb3J0LmdldEhlaWdodCgpIC8gMTApOw0KICAgICAgICB2YXIgbGlnaHRib3hMZWZ0ID0gYXJyYXlQYWdlU2Nyb2xsWzBdOw0KICAgICAgICB0aGlzLmxpZ2h0Ym94LnNldFN0eWxlKHsgdG9wOiBsaWdodGJveFRvcCArICdweCcsIGxlZnQ6IGxpZ2h0Ym94TGVmdCArICdweCcgfSkuc2hvdygpOw0KICAgICAgICANCiAgICAgICAgdGhpcy5jaGFuZ2VJbWFnZShpbWFnZU51bSk7DQogICAgfSwNCg0KICAgIC8vDQogICAgLy8gIGNoYW5nZUltYWdlKCkNCiAgICAvLyAgSGlkZSBtb3N0IGVsZW1lbnRzIGFuZCBwcmVsb2FkIGltYWdlIGluIHByZXBhcmF0aW9uIGZvciByZXNpemluZyBpbWFnZSBjb250YWluZXIuDQogICAgLy8NCiAgICBjaGFuZ2VJbWFnZTogZnVuY3Rpb24oaW1hZ2VOdW0pIHsgICANCiAgICAgICAgDQogICAgICAgIHRoaXMuYWN0aXZlSW1hZ2UgPSBpbWFnZU51bTsgLy8gdXBkYXRlIGdsb2JhbCB2YXINCg0KICAgICAgICAvLyBoaWRlIGVsZW1lbnRzIGR1cmluZyB0cmFuc2l0aW9uDQogICAgICAgIGlmIChMaWdodGJveE9wdGlvbnMuYW5pbWF0ZSkgdGhpcy5sb2FkaW5nLnNob3coKTsNCiAgICAgICAgdGhpcy5saWdodGJveEltYWdlLmhpZGUoKTsNCiAgICAgICAgdGhpcy5ob3Zlck5hdi5oaWRlKCk7DQogICAgICAgIHRoaXMucHJldkxpbmsuaGlkZSgpOw0KICAgICAgICB0aGlzLm5leHRMaW5rLmhpZGUoKTsNCgkJLy8gSEFDSzogT3BlcmE5IGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IHNjcmlwdGFjdWxvdXMgb3BhY2l0eSBhbmQgYXBwZWFyIGZ4DQogICAgICAgIHRoaXMuaW1hZ2VEYXRhQ29udGFpbmVyLnNldFN0eWxlKHtvcGFjaXR5OiAuMDAwMX0pOw0KICAgICAgICB0aGlzLm51bWJlckRpc3BsYXkuaGlkZSgpOyAgICAgIA0KICAgICAgICANCiAgICAgICAgdmFyIGltZ1ByZWxvYWRlciA9IG5ldyBJbWFnZSgpOw0KICAgICAgICANCiAgICAgICAgLy8gb25jZSBpbWFnZSBpcyBwcmVsb2FkZWQsIHJlc2l6ZSBpbWFnZSBjb250YWluZXINCg0KDQogICAgICAgIGltZ1ByZWxvYWRlci5vbmxvYWQgPSAoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHRoaXMubGlnaHRib3hJbWFnZS5zcmMgPSB0aGlzLmltYWdlQXJyYXlbdGhpcy5hY3RpdmVJbWFnZV1bMF07DQogICAgICAgICAgICB0aGlzLnJlc2l6ZUltYWdlQ29udGFpbmVyKGltZ1ByZWxvYWRlci53aWR0aCwgaW1nUHJlbG9hZGVyLmhlaWdodCk7DQogICAgICAgIH0pLmJpbmQodGhpcyk7DQogICAgICAgIGltZ1ByZWxvYWRlci5zcmMgPSB0aGlzLmltYWdlQXJyYXlbdGhpcy5hY3RpdmVJbWFnZV1bMF07DQogICAgfSwNCg0KICAgIC8vDQogICAgLy8gIHJlc2l6ZUltYWdlQ29udGFpbmVyKCkNCiAgICAvLw0KICAgIHJlc2l6ZUltYWdlQ29udGFpbmVyOiBmdW5jdGlvbihpbWdXaWR0aCwgaW1nSGVpZ2h0KSB7DQoNCiAgICAgICAgLy8gZ2V0IGN1cnJlbnQgd2lkdGggYW5kIGhlaWdodA0KICAgICAgICB2YXIgd2lkdGhDdXJyZW50ICA9IHRoaXMub3V0ZXJJbWFnZUNvbnRhaW5lci5nZXRXaWR0aCgpOw0KICAgICAgICB2YXIgaGVpZ2h0Q3VycmVudCA9IHRoaXMub3V0ZXJJbWFnZUNvbnRhaW5lci5nZXRIZWlnaHQoKTsNCg0KICAgICAgICAvLyBnZXQgbmV3IHdpZHRoIGFuZCBoZWlnaHQNCiAgICAgICAgdmFyIHdpZHRoTmV3ICA9IChpbWdXaWR0aCAgKyBMaWdodGJveE9wdGlvbnMuYm9yZGVyU2l6ZSAqIDIpOw0KICAgICAgICB2YXIgaGVpZ2h0TmV3ID0gKGltZ0hlaWdodCArIExpZ2h0Ym94T3B0aW9ucy5ib3JkZXJTaXplICogMik7DQoNCiAgICAgICAgLy8gc2NhbGFycyBiYXNlZCBvbiBjaGFuZ2UgZnJvbSBvbGQgdG8gbmV3DQogICAgICAgIHZhciB4U2NhbGUgPSAod2lkdGhOZXcgIC8gd2lkdGhDdXJyZW50KSAgKiAxMDA7DQogICAgICAgIHZhciB5U2NhbGUgPSAoaGVpZ2h0TmV3IC8gaGVpZ2h0Q3VycmVudCkgKiAxMDA7DQoNCiAgICAgICAgLy8gY2FsY3VsYXRlIHNpemUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5ldyBhbmQgb2xkIGltYWdlLCBhbmQgcmVzaXplIGlmIG5lY2Vzc2FyeQ0KICAgICAgICB2YXIgd0RpZmYgPSB3aWR0aEN1cnJlbnQgLSB3aWR0aE5ldzsNCiAgICAgICAgdmFyIGhEaWZmID0gaGVpZ2h0Q3VycmVudCAtIGhlaWdodE5ldzsNCg0KICAgICAgICBpZiAoaERpZmYgIT0gMCkgbmV3IEVmZmVjdC5TY2FsZSh0aGlzLm91dGVySW1hZ2VDb250YWluZXIsIHlTY2FsZSwge3NjYWxlWDogZmFsc2UsIGR1cmF0aW9uOiB0aGlzLnJlc2l6ZUR1cmF0aW9uLCBxdWV1ZTogJ2Zyb250J30pOyANCiAgICAgICAgaWYgKHdEaWZmICE9IDApIG5ldyBFZmZlY3QuU2NhbGUodGhpcy5vdXRlckltYWdlQ29udGFpbmVyLCB4U2NhbGUsIHtzY2FsZVk6IGZhbHNlLCBkdXJhdGlvbjogdGhpcy5yZXNpemVEdXJhdGlvbiwgZGVsYXk6IHRoaXMucmVzaXplRHVyYXRpb259KTsgDQoNCiAgICAgICAgLy8gaWYgbmV3IGFuZCBvbGQgaW1hZ2UgYXJlIHNhbWUgc2l6ZSBhbmQgbm8gc2NhbGluZyB0cmFuc2l0aW9uIGlzIG5lY2Vzc2FyeSwgDQogICAgICAgIC8vIGRvIGEgcXVpY2sgcGF1c2UgdG8gcHJldmVudCBpbWFnZSBmbGlja2VyLg0KICAgICAgICB2YXIgdGltZW91dCA9IDA7DQogICAgICAgIGlmICgoaERpZmYgPT0gMCkgJiYgKHdEaWZmID09IDApKXsNCiAgICAgICAgICAgIHRpbWVvdXQgPSAxMDA7DQogICAgICAgICAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHRpbWVvdXQgPSAyNTA7ICAgDQogICAgICAgIH0NCg0KICAgICAgICAoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHRoaXMucHJldkxpbmsuc2V0U3R5bGUoeyBoZWlnaHQ6IGltZ0hlaWdodCArICdweCcgfSk7DQogICAgICAgICAgICB0aGlzLm5leHRMaW5rLnNldFN0eWxlKHsgaGVpZ2h0OiBpbWdIZWlnaHQgKyAncHgnIH0pOw0KICAgICAgICAgICAgdGhpcy5pbWFnZURhdGFDb250YWluZXIuc2V0U3R5bGUoeyB3aWR0aDogd2lkdGhOZXcgKyAncHgnIH0pOw0KDQogICAgICAgICAgICB0aGlzLnNob3dJbWFnZSgpOw0KICAgICAgICB9KS5iaW5kKHRoaXMpLmRlbGF5KHRpbWVvdXQgLyAxMDAwKTsNCiAgICB9LA0KICAgIA0KICAgIC8vDQogICAgLy8gIHNob3dJbWFnZSgpDQogICAgLy8gIERpc3BsYXkgaW1hZ2UgYW5kIGJlZ2luIHByZWxvYWRpbmcgbmVpZ2hib3JzLg0KICAgIC8vDQogICAgc2hvd0ltYWdlOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmxvYWRpbmcuaGlkZSgpOw0KICAgICAgICBuZXcgRWZmZWN0LkFwcGVhcih0aGlzLmxpZ2h0Ym94SW1hZ2UsIHsgDQogICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5yZXNpemVEdXJhdGlvbiwgDQogICAgICAgICAgICBxdWV1ZTogJ2VuZCcsIA0KICAgICAgICAgICAgYWZ0ZXJGaW5pc2g6IChmdW5jdGlvbigpeyB0aGlzLnVwZGF0ZURldGFpbHMoKTsgfSkuYmluZCh0aGlzKSANCiAgICAgICAgfSk7DQogICAgICAgIHRoaXMucHJlbG9hZE5laWdoYm9ySW1hZ2VzKCk7DQogICAgfSwNCg0KICAgIC8vDQogICAgLy8gIHVwZGF0ZURldGFpbHMoKQ0KICAgIC8vICBEaXNwbGF5IGNhcHRpb24sIGltYWdlIG51bWJlciwgYW5kIGJvdHRvbSBuYXYuDQogICAgLy8NCiAgICB1cGRhdGVEZXRhaWxzOiBmdW5jdGlvbigpIHsNCiAgICANCiAgICAgICAgLy8gaWYgY2FwdGlvbiBpcyBub3QgbnVsbA0KICAgICAgICBpZiAodGhpcy5pbWFnZUFycmF5W3RoaXMuYWN0aXZlSW1hZ2VdWzFdICE9ICIiKXsNCiAgICAgICAgICAgIHRoaXMuY2FwdGlvbi51cGRhdGUodGhpcy5pbWFnZUFycmF5W3RoaXMuYWN0aXZlSW1hZ2VdWzFdKS5zaG93KCk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIGlmIGltYWdlIGlzIHBhcnQgb2Ygc2V0IGRpc3BsYXkgJ0ltYWdlIHggb2YgeCcgDQogICAgICAgIGlmICh0aGlzLmltYWdlQXJyYXkubGVuZ3RoID4gMSl7DQogICAgICAgICAgICB0aGlzLm51bWJlckRpc3BsYXkudXBkYXRlKCBMaWdodGJveE9wdGlvbnMubGFiZWxJbWFnZSArICcgJyArICh0aGlzLmFjdGl2ZUltYWdlICsgMSkgKyAnICcgKyBMaWdodGJveE9wdGlvbnMubGFiZWxPZiArICcgICcgKyB0aGlzLmltYWdlQXJyYXkubGVuZ3RoKS5zaG93KCk7DQogICAgICAgIH0NCg0KICAgICAgICBuZXcgRWZmZWN0LlBhcmFsbGVsKA0KICAgICAgICAgICAgWyANCiAgICAgICAgICAgICAgICBuZXcgRWZmZWN0LlNsaWRlRG93bih0aGlzLmltYWdlRGF0YUNvbnRhaW5lciwgeyBzeW5jOiB0cnVlLCBkdXJhdGlvbjogdGhpcy5yZXNpemVEdXJhdGlvbiwgZnJvbTogMC4wLCB0bzogMS4wIH0pLCANCiAgICAgICAgICAgICAgICBuZXcgRWZmZWN0LkFwcGVhcih0aGlzLmltYWdlRGF0YUNvbnRhaW5lciwgeyBzeW5jOiB0cnVlLCBkdXJhdGlvbjogdGhpcy5yZXNpemVEdXJhdGlvbiB9KSANCiAgICAgICAgICAgIF0sIA0KICAgICAgICAgICAgeyANCiAgICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5yZXNpemVEdXJhdGlvbiwgDQogICAgICAgICAgICAgICAgYWZ0ZXJGaW5pc2g6IChmdW5jdGlvbigpIHsNCgkgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG92ZXJsYXkgc2l6ZSBhbmQgdXBkYXRlIG5hdg0KCSAgICAgICAgICAgICAgICB2YXIgYXJyYXlQYWdlU2l6ZSA9IHRoaXMuZ2V0UGFnZVNpemUoKTsNCgkgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LnNldFN0eWxlKHsgaGVpZ2h0OiBhcnJheVBhZ2VTaXplWzFdICsgJ3B4JyB9KTsNCgkgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOYXYoKTsNCiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpDQogICAgICAgICAgICB9IA0KICAgICAgICApOw0KICAgIH0sDQoNCiAgICAvLw0KICAgIC8vICB1cGRhdGVOYXYoKQ0KICAgIC8vICBEaXNwbGF5IGFwcHJvcHJpYXRlIHByZXZpb3VzIGFuZCBuZXh0IGhvdmVyIG5hdmlnYXRpb24uDQogICAgLy8NCiAgICB1cGRhdGVOYXY6IGZ1bmN0aW9uKCkgew0KDQogICAgICAgIHRoaXMuaG92ZXJOYXYuc2hvdygpOyAgICAgICAgICAgICAgIA0KDQogICAgICAgIC8vIGlmIG5vdCBmaXJzdCBpbWFnZSBpbiBzZXQsIGRpc3BsYXkgcHJldiBpbWFnZSBidXR0b24NCiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW1hZ2UgPiAwKSB0aGlzLnByZXZMaW5rLnNob3coKTsNCg0KICAgICAgICAvLyBpZiBub3QgbGFzdCBpbWFnZSBpbiBzZXQsIGRpc3BsYXkgbmV4dCBpbWFnZSBidXR0b24NCiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW1hZ2UgPCAodGhpcy5pbWFnZUFycmF5Lmxlbmd0aCAtIDEpKSB0aGlzLm5leHRMaW5rLnNob3coKTsNCiAgICAgICAgDQogICAgICAgIHRoaXMuZW5hYmxlS2V5Ym9hcmROYXYoKTsNCiAgICB9LA0KDQogICAgLy8NCiAgICAvLyAgZW5hYmxlS2V5Ym9hcmROYXYoKQ0KICAgIC8vDQogICAgZW5hYmxlS2V5Ym9hcmROYXY6IGZ1bmN0aW9uKCkgew0KICAgICAgICBkb2N1bWVudC5vYnNlcnZlKCdrZXlkb3duJywgdGhpcy5rZXlib2FyZEFjdGlvbik7IA0KICAgIH0sDQoNCiAgICAvLw0KICAgIC8vICBkaXNhYmxlS2V5Ym9hcmROYXYoKQ0KICAgIC8vDQogICAgZGlzYWJsZUtleWJvYXJkTmF2OiBmdW5jdGlvbigpIHsNCiAgICAgICAgZG9jdW1lbnQuc3RvcE9ic2VydmluZygna2V5ZG93bicsIHRoaXMua2V5Ym9hcmRBY3Rpb24pOyANCiAgICB9LA0KDQogICAgLy8NCiAgICAvLyAga2V5Ym9hcmRBY3Rpb24oKQ0KICAgIC8vDQogICAga2V5Ym9hcmRBY3Rpb246IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgICAgIHZhciBrZXljb2RlID0gZXZlbnQua2V5Q29kZTsNCg0KICAgICAgICB2YXIgZXNjYXBlS2V5Ow0KICAgICAgICBpZiAoZXZlbnQuRE9NX1ZLX0VTQ0FQRSkgeyAgLy8gbW96aWxsYQ0KICAgICAgICAgICAgZXNjYXBlS2V5ID0gZXZlbnQuRE9NX1ZLX0VTQ0FQRTsNCiAgICAgICAgfSBlbHNlIHsgLy8gaWUNCiAgICAgICAgICAgIGVzY2FwZUtleSA9IDI3Ow0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5Y29kZSkudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgDQogICAgICAgIGlmIChrZXkubWF0Y2goL3h8b3xjLykgfHwgKGtleWNvZGUgPT0gZXNjYXBlS2V5KSl7IC8vIGNsb3NlIGxpZ2h0Ym94DQogICAgICAgICAgICB0aGlzLmVuZCgpOw0KICAgICAgICB9IGVsc2UgaWYgKChrZXkgPT0gJ3AnKSB8fCAoa2V5Y29kZSA9PSAzNykpeyAvLyBkaXNwbGF5IHByZXZpb3VzIGltYWdlDQogICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVJbWFnZSAhPSAwKXsNCiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVLZXlib2FyZE5hdigpOw0KICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlSW1hZ2UodGhpcy5hY3RpdmVJbWFnZSAtIDEpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKChrZXkgPT0gJ24nKSB8fCAoa2V5Y29kZSA9PSAzOSkpeyAvLyBkaXNwbGF5IG5leHQgaW1hZ2UNCiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUltYWdlICE9ICh0aGlzLmltYWdlQXJyYXkubGVuZ3RoIC0gMSkpew0KICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUtleWJvYXJkTmF2KCk7DQogICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VJbWFnZSh0aGlzLmFjdGl2ZUltYWdlICsgMSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgLy8NCiAgICAvLyAgcHJlbG9hZE5laWdoYm9ySW1hZ2VzKCkNCiAgICAvLyAgUHJlbG9hZCBwcmV2aW91cyBhbmQgbmV4dCBpbWFnZXMuDQogICAgLy8NCiAgICBwcmVsb2FkTmVpZ2hib3JJbWFnZXM6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBwcmVsb2FkTmV4dEltYWdlLCBwcmVsb2FkUHJldkltYWdlOw0KICAgICAgICBpZiAodGhpcy5pbWFnZUFycmF5Lmxlbmd0aCA+IHRoaXMuYWN0aXZlSW1hZ2UgKyAxKXsNCiAgICAgICAgICAgIHByZWxvYWROZXh0SW1hZ2UgPSBuZXcgSW1hZ2UoKTsNCiAgICAgICAgICAgIHByZWxvYWROZXh0SW1hZ2Uuc3JjID0gdGhpcy5pbWFnZUFycmF5W3RoaXMuYWN0aXZlSW1hZ2UgKyAxXVswXTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGhpcy5hY3RpdmVJbWFnZSA+IDApew0KICAgICAgICAgICAgcHJlbG9hZFByZXZJbWFnZSA9IG5ldyBJbWFnZSgpOw0KICAgICAgICAgICAgcHJlbG9hZFByZXZJbWFnZS5zcmMgPSB0aGlzLmltYWdlQXJyYXlbdGhpcy5hY3RpdmVJbWFnZSAtIDFdWzBdOw0KICAgICAgICB9DQogICAgDQogICAgfSwNCg0KICAgIC8vDQogICAgLy8gIGVuZCgpDQogICAgLy8NCiAgICBlbmQ6IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLmRpc2FibGVLZXlib2FyZE5hdigpOw0KICAgICAgICB0aGlzLmxpZ2h0Ym94LmhpZGUoKTsNCiAgICAgICAgbmV3IEVmZmVjdC5GYWRlKHRoaXMub3ZlcmxheSwgeyBkdXJhdGlvbjogdGhpcy5vdmVybGF5RHVyYXRpb24gfSk7DQogICAgICAgICQkKCdzZWxlY3QnLCAnb2JqZWN0JywgJ2VtYmVkJykuZWFjaChmdW5jdGlvbihub2RlKXsgbm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnIH0pOw0KICAgIH0sDQoNCiAgICAvLw0KICAgIC8vICBnZXRQYWdlU2l6ZSgpDQogICAgLy8NCiAgICBnZXRQYWdlU2l6ZTogZnVuY3Rpb24oKSB7DQoJICAgICAgICANCgkgICAgIHZhciB4U2Nyb2xsLCB5U2Nyb2xsOw0KCQkNCgkJaWYgKHdpbmRvdy5pbm5lckhlaWdodCAmJiB3aW5kb3cuc2Nyb2xsTWF4WSkgewkNCgkJCXhTY3JvbGwgPSB3aW5kb3cuaW5uZXJXaWR0aCArIHdpbmRvdy5zY3JvbGxNYXhYOw0KCQkJeVNjcm9sbCA9IHdpbmRvdy5pbm5lckhlaWdodCArIHdpbmRvdy5zY3JvbGxNYXhZOw0KCQl9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpeyAvLyBhbGwgYnV0IEV4cGxvcmVyIE1hYw0KCQkJeFNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGg7DQoJCQl5U2Nyb2xsID0gZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ7DQoJCX0gZWxzZSB7IC8vIEV4cGxvcmVyIE1hYy4uLndvdWxkIGFsc28gd29yayBpbiBFeHBsb3JlciA2IFN0cmljdCwgTW96aWxsYSBhbmQgU2FmYXJpDQoJCQl4U2Nyb2xsID0gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDsNCgkJCXlTY3JvbGwgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsNCgkJfQ0KCQkNCgkJdmFyIHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQ7DQoJCQ0KCQlpZiAoc2VsZi5pbm5lckhlaWdodCkgewkvLyBhbGwgZXhjZXB0IEV4cGxvcmVyDQoJCQlpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpew0KCQkJCXdpbmRvd1dpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOyANCgkJCX0gZWxzZSB7DQoJCQkJd2luZG93V2lkdGggPSBzZWxmLmlubmVyV2lkdGg7DQoJCQl9DQoJCQl3aW5kb3dIZWlnaHQgPSBzZWxmLmlubmVySGVpZ2h0Ow0KCQl9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7IC8vIEV4cGxvcmVyIDYgU3RyaWN0IE1vZGUNCgkJCXdpbmRvd1dpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOw0KCQkJd2luZG93SGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsNCgkJfSBlbHNlIGlmIChkb2N1bWVudC5ib2R5KSB7IC8vIG90aGVyIEV4cGxvcmVycw0KCQkJd2luZG93V2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoOw0KCQkJd2luZG93SGVpZ2h0ID0gZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7DQoJCX0JDQoJCQ0KCQkvLyBmb3Igc21hbGwgcGFnZXMgd2l0aCB0b3RhbCBoZWlnaHQgbGVzcyB0aGVuIGhlaWdodCBvZiB0aGUgdmlld3BvcnQNCgkJaWYoeVNjcm9sbCA8IHdpbmRvd0hlaWdodCl7DQoJCQlwYWdlSGVpZ2h0ID0gd2luZG93SGVpZ2h0Ow0KCQl9IGVsc2UgeyANCgkJCXBhZ2VIZWlnaHQgPSB5U2Nyb2xsOw0KCQl9DQoJDQoJCS8vIGZvciBzbWFsbCBwYWdlcyB3aXRoIHRvdGFsIHdpZHRoIGxlc3MgdGhlbiB3aWR0aCBvZiB0aGUgdmlld3BvcnQNCgkJaWYoeFNjcm9sbCA8IHdpbmRvd1dpZHRoKXsJDQoJCQlwYWdlV2lkdGggPSB4U2Nyb2xsOwkJDQoJCX0gZWxzZSB7DQoJCQlwYWdlV2lkdGggPSB3aW5kb3dXaWR0aDsNCgkJfQ0KDQoJCXJldHVybiBbcGFnZVdpZHRoLHBhZ2VIZWlnaHRdOw0KCX0NCn0NCg0KZG9jdW1lbnQub2JzZXJ2ZSgnZG9tOmxvYWRlZCcsIGZ1bmN0aW9uICgpIHsgbmV3IExpZ2h0Ym94KCk7IH0pOw==]]></data>
	</file>
	<file>
	  <filename>/js/prototype.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogIFByb3RvdHlwZSBKYXZhU2NyaXB0IGZyYW1ld29yaywgdmVyc2lvbiAxLjYuMC4yCiAqICAoYykgMjAwNS0yMDA4IFNhbSBTdGVwaGVuc29uCiAqCiAqICBQcm90b3R5cGUgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFuIE1JVC1zdHlsZSBsaWNlbnNlLgogKiAgRm9yIGRldGFpbHMsIHNlZSB0aGUgUHJvdG90eXBlIHdlYiBzaXRlOiBodHRwOi8vd3d3LnByb3RvdHlwZWpzLm9yZy8KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgUHJvdG90eXBlID0gewogIFZlcnNpb246ICcxLjYuMC4yJywKCiAgQnJvd3NlcjogewogICAgSUU6ICAgICAhISh3aW5kb3cuYXR0YWNoRXZlbnQgJiYgIXdpbmRvdy5vcGVyYSksCiAgICBPcGVyYTogICEhd2luZG93Lm9wZXJhLAogICAgV2ViS2l0OiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FwcGxlV2ViS2l0LycpID4gLTEsCiAgICBHZWNrbzogIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignR2Vja28nKSA+IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignS0hUTUwnKSA9PSAtMSwKICAgIE1vYmlsZVNhZmFyaTogISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZS4qTW9iaWxlLipTYWZhcmkvKQogIH0sCgogIEJyb3dzZXJGZWF0dXJlczogewogICAgWFBhdGg6ICEhZG9jdW1lbnQuZXZhbHVhdGUsCiAgICBFbGVtZW50RXh0ZW5zaW9uczogISF3aW5kb3cuSFRNTEVsZW1lbnQsCiAgICBTcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zOgogICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5fX3Byb3RvX18gJiYKICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykuX19wcm90b19fICE9PQogICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKS5fX3Byb3RvX18KICB9LAoKICBTY3JpcHRGcmFnbWVudDogJzxzY3JpcHRbXj5dKj4oW1xcU1xcc10qPyk8XC9zY3JpcHQ+JywKICBKU09ORmlsdGVyOiAvXlwvXCotc2VjdXJlLShbXHNcU10qKVwqXC9ccyokLywKCiAgZW1wdHlGdW5jdGlvbjogZnVuY3Rpb24oKSB7IH0sCiAgSzogZnVuY3Rpb24oeCkgeyByZXR1cm4geCB9Cn07CgppZiAoUHJvdG90eXBlLkJyb3dzZXIuTW9iaWxlU2FmYXJpKQogIFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuU3BlY2lmaWNFbGVtZW50RXh0ZW5zaW9ucyA9IGZhbHNlOwoKCi8qIEJhc2VkIG9uIEFsZXggQXJuZWxsJ3MgaW5oZXJpdGFuY2UgaW1wbGVtZW50YXRpb24uICovCnZhciBDbGFzcyA9IHsKICBjcmVhdGU6IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmVudCA9IG51bGwsIHByb3BlcnRpZXMgPSAkQShhcmd1bWVudHMpOwogICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHByb3BlcnRpZXNbMF0pKQogICAgICBwYXJlbnQgPSBwcm9wZXJ0aWVzLnNoaWZ0KCk7CgogICAgZnVuY3Rpb24ga2xhc3MoKSB7CiAgICAgIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQoKICAgIE9iamVjdC5leHRlbmQoa2xhc3MsIENsYXNzLk1ldGhvZHMpOwogICAga2xhc3Muc3VwZXJjbGFzcyA9IHBhcmVudDsKICAgIGtsYXNzLnN1YmNsYXNzZXMgPSBbXTsKCiAgICBpZiAocGFyZW50KSB7CiAgICAgIHZhciBzdWJjbGFzcyA9IGZ1bmN0aW9uKCkgeyB9OwogICAgICBzdWJjbGFzcy5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOwogICAgICBrbGFzcy5wcm90b3R5cGUgPSBuZXcgc3ViY2xhc3M7CiAgICAgIHBhcmVudC5zdWJjbGFzc2VzLnB1c2goa2xhc3MpOwogICAgfQoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykKICAgICAga2xhc3MuYWRkTWV0aG9kcyhwcm9wZXJ0aWVzW2ldKTsKCiAgICBpZiAoIWtsYXNzLnByb3RvdHlwZS5pbml0aWFsaXplKQogICAgICBrbGFzcy5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOwoKICAgIGtsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGtsYXNzOwoKICAgIHJldHVybiBrbGFzczsKICB9Cn07CgpDbGFzcy5NZXRob2RzID0gewogIGFkZE1ldGhvZHM6IGZ1bmN0aW9uKHNvdXJjZSkgewogICAgdmFyIGFuY2VzdG9yICAgPSB0aGlzLnN1cGVyY2xhc3MgJiYgdGhpcy5zdXBlcmNsYXNzLnByb3RvdHlwZTsKICAgIHZhciBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc291cmNlKTsKCiAgICBpZiAoIU9iamVjdC5rZXlzKHsgdG9TdHJpbmc6IHRydWUgfSkubGVuZ3RoKQogICAgICBwcm9wZXJ0aWVzLnB1c2goInRvU3RyaW5nIiwgInZhbHVlT2YiKTsKCiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldLCB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eV07CiAgICAgIGlmIChhbmNlc3RvciAmJiBPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkgJiYKICAgICAgICAgIHZhbHVlLmFyZ3VtZW50TmFtZXMoKS5maXJzdCgpID09ICIkc3VwZXIiKSB7CiAgICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlLCB2YWx1ZSA9IE9iamVjdC5leHRlbmQoKGZ1bmN0aW9uKG0pIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGFuY2VzdG9yW21dLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfTsKICAgICAgICB9KShwcm9wZXJ0eSkud3JhcChtZXRob2QpLCB7CiAgICAgICAgICB2YWx1ZU9mOiAgZnVuY3Rpb24oKSB7IHJldHVybiBtZXRob2QgfSwKICAgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ldGhvZC50b1N0cmluZygpIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLnByb3RvdHlwZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9Cn07Cgp2YXIgQWJzdHJhY3QgPSB7IH07CgpPYmplY3QuZXh0ZW5kID0gZnVuY3Rpb24oZGVzdGluYXRpb24sIHNvdXJjZSkgewogIGZvciAodmFyIHByb3BlcnR5IGluIHNvdXJjZSkKICAgIGRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0eV07CiAgcmV0dXJuIGRlc3RpbmF0aW9uOwp9OwoKT2JqZWN0LmV4dGVuZChPYmplY3QsIHsKICBpbnNwZWN0OiBmdW5jdGlvbihvYmplY3QpIHsKICAgIHRyeSB7CiAgICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQob2JqZWN0KSkgcmV0dXJuICd1bmRlZmluZWQnOwogICAgICBpZiAob2JqZWN0ID09PSBudWxsKSByZXR1cm4gJ251bGwnOwogICAgICByZXR1cm4gb2JqZWN0Lmluc3BlY3QgPyBvYmplY3QuaW5zcGVjdCgpIDogU3RyaW5nKG9iamVjdCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikgcmV0dXJuICcuLi4nOwogICAgICB0aHJvdyBlOwogICAgfQogIH0sCgogIHRvSlNPTjogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICB2YXIgdHlwZSA9IHR5cGVvZiBvYmplY3Q7CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSAndW5kZWZpbmVkJzoKICAgICAgY2FzZSAnZnVuY3Rpb24nOgogICAgICBjYXNlICd1bmtub3duJzogcmV0dXJuOwogICAgICBjYXNlICdib29sZWFuJzogcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwogICAgfQoKICAgIGlmIChvYmplY3QgPT09IG51bGwpIHJldHVybiAnbnVsbCc7CiAgICBpZiAob2JqZWN0LnRvSlNPTikgcmV0dXJuIG9iamVjdC50b0pTT04oKTsKICAgIGlmIChPYmplY3QuaXNFbGVtZW50KG9iamVjdCkpIHJldHVybjsKCiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KSB7CiAgICAgIHZhciB2YWx1ZSA9IE9iamVjdC50b0pTT04ob2JqZWN0W3Byb3BlcnR5XSk7CiAgICAgIGlmICghT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkKICAgICAgICByZXN1bHRzLnB1c2gocHJvcGVydHkudG9KU09OKCkgKyAnOiAnICsgdmFsdWUpOwogICAgfQoKICAgIHJldHVybiAneycgKyByZXN1bHRzLmpvaW4oJywgJykgKyAnfSc7CiAgfSwKCiAgdG9RdWVyeVN0cmluZzogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICByZXR1cm4gJEgob2JqZWN0KS50b1F1ZXJ5U3RyaW5nKCk7CiAgfSwKCiAgdG9IVE1MOiBmdW5jdGlvbihvYmplY3QpIHsKICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRvSFRNTCA/IG9iamVjdC50b0hUTUwoKSA6IFN0cmluZy5pbnRlcnByZXQob2JqZWN0KTsKICB9LAoKICBrZXlzOiBmdW5jdGlvbihvYmplY3QpIHsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpCiAgICAgIGtleXMucHVzaChwcm9wZXJ0eSk7CiAgICByZXR1cm4ga2V5czsKICB9LAoKICB2YWx1ZXM6IGZ1bmN0aW9uKG9iamVjdCkgewogICAgdmFyIHZhbHVlcyA9IFtdOwogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KQogICAgICB2YWx1ZXMucHVzaChvYmplY3RbcHJvcGVydHldKTsKICAgIHJldHVybiB2YWx1ZXM7CiAgfSwKCiAgY2xvbmU6IGZ1bmN0aW9uKG9iamVjdCkgewogICAgcmV0dXJuIE9iamVjdC5leHRlbmQoeyB9LCBvYmplY3QpOwogIH0sCgogIGlzRWxlbWVudDogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5ub2RlVHlwZSA9PSAxOwogIH0sCgogIGlzQXJyYXk6IGZ1bmN0aW9uKG9iamVjdCkgewogICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT0gIm9iamVjdCIgJiYKICAgICAgJ3NwbGljZScgaW4gb2JqZWN0ICYmICdqb2luJyBpbiBvYmplY3Q7CiAgfSwKCiAgaXNIYXNoOiBmdW5jdGlvbihvYmplY3QpIHsKICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBIYXNoOwogIH0sCgogIGlzRnVuY3Rpb246IGZ1bmN0aW9uKG9iamVjdCkgewogICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gImZ1bmN0aW9uIjsKICB9LAoKICBpc1N0cmluZzogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAic3RyaW5nIjsKICB9LAoKICBpc051bWJlcjogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAibnVtYmVyIjsKICB9LAoKICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAidW5kZWZpbmVkIjsKICB9Cn0pOwoKT2JqZWN0LmV4dGVuZChGdW5jdGlvbi5wcm90b3R5cGUsIHsKICBhcmd1bWVudE5hbWVzOiBmdW5jdGlvbigpIHsKICAgIHZhciBuYW1lcyA9IHRoaXMudG9TdHJpbmcoKS5tYXRjaCgvXltcc1woXSpmdW5jdGlvblteKF0qXCgoLio/KVwpLylbMV0uc3BsaXQoIiwiKS5pbnZva2UoInN0cmlwIik7CiAgICByZXR1cm4gbmFtZXMubGVuZ3RoID09IDEgJiYgIW5hbWVzWzBdID8gW10gOiBuYW1lczsKICB9LAoKICBiaW5kOiBmdW5jdGlvbigpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMiAmJiBPYmplY3QuaXNVbmRlZmluZWQoYXJndW1lbnRzWzBdKSkgcmV0dXJuIHRoaXM7CiAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdzID0gJEEoYXJndW1lbnRzKSwgb2JqZWN0ID0gYXJncy5zaGlmdCgpOwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkob2JqZWN0LCBhcmdzLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7CiAgICB9CiAgfSwKCiAgYmluZEFzRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7CiAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdzID0gJEEoYXJndW1lbnRzKSwgb2JqZWN0ID0gYXJncy5zaGlmdCgpOwogICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseShvYmplY3QsIFtldmVudCB8fCB3aW5kb3cuZXZlbnRdLmNvbmNhdChhcmdzKSk7CiAgICB9CiAgfSwKCiAgY3Vycnk6IGZ1bmN0aW9uKCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpczsKICAgIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMpOwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkodGhpcywgYXJncy5jb25jYXQoJEEoYXJndW1lbnRzKSkpOwogICAgfQogIH0sCgogIGRlbGF5OiBmdW5jdGlvbigpIHsKICAgIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMpLCB0aW1lb3V0ID0gYXJncy5zaGlmdCgpICogMTAwMDsKICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KF9fbWV0aG9kLCBhcmdzKTsKICAgIH0sIHRpbWVvdXQpOwogIH0sCgogIHdyYXA6IGZ1bmN0aW9uKHdyYXBwZXIpIHsKICAgIHZhciBfX21ldGhvZCA9IHRoaXM7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB3cmFwcGVyLmFwcGx5KHRoaXMsIFtfX21ldGhvZC5iaW5kKHRoaXMpXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOwogICAgfQogIH0sCgogIG1ldGhvZGl6ZTogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5fbWV0aG9kaXplZCkgcmV0dXJuIHRoaXMuX21ldGhvZGl6ZWQ7CiAgICB2YXIgX19tZXRob2QgPSB0aGlzOwogICAgcmV0dXJuIHRoaXMuX21ldGhvZGl6ZWQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOwogICAgfTsKICB9Cn0pOwoKRnVuY3Rpb24ucHJvdG90eXBlLmRlZmVyID0gRnVuY3Rpb24ucHJvdG90eXBlLmRlbGF5LmN1cnJ5KDAuMDEpOwoKRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuICciJyArIHRoaXMuZ2V0VVRDRnVsbFllYXIoKSArICctJyArCiAgICAodGhpcy5nZXRVVENNb250aCgpICsgMSkudG9QYWRkZWRTdHJpbmcoMikgKyAnLScgKwogICAgdGhpcy5nZXRVVENEYXRlKCkudG9QYWRkZWRTdHJpbmcoMikgKyAnVCcgKwogICAgdGhpcy5nZXRVVENIb3VycygpLnRvUGFkZGVkU3RyaW5nKDIpICsgJzonICsKICAgIHRoaXMuZ2V0VVRDTWludXRlcygpLnRvUGFkZGVkU3RyaW5nKDIpICsgJzonICsKICAgIHRoaXMuZ2V0VVRDU2Vjb25kcygpLnRvUGFkZGVkU3RyaW5nKDIpICsgJ1oiJzsKfTsKCnZhciBUcnkgPSB7CiAgdGhlc2U6IGZ1bmN0aW9uKCkgewogICAgdmFyIHJldHVyblZhbHVlOwoKICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGxhbWJkYSA9IGFyZ3VtZW50c1tpXTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm5WYWx1ZSA9IGxhbWJkYSgpOwogICAgICAgIGJyZWFrOwogICAgICB9IGNhdGNoIChlKSB7IH0KICAgIH0KCiAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgfQp9OwoKUmVnRXhwLnByb3RvdHlwZS5tYXRjaCA9IFJlZ0V4cC5wcm90b3R5cGUudGVzdDsKClJlZ0V4cC5lc2NhcGUgPSBmdW5jdGlvbihzdHIpIHsKICByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXVwvXFxdKS9nLCAnXFwkMScpOwp9OwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgUGVyaW9kaWNhbEV4ZWN1dGVyID0gQ2xhc3MuY3JlYXRlKHsKICBpbml0aWFsaXplOiBmdW5jdGlvbihjYWxsYmFjaywgZnJlcXVlbmN5KSB7CiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICB0aGlzLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7CgogICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKCk7CiAgfSwKCiAgcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKSwgdGhpcy5mcmVxdWVuY3kgKiAxMDAwKTsKICB9LAoKICBleGVjdXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2FsbGJhY2sodGhpcyk7CiAgfSwKCiAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICBpZiAoIXRoaXMudGltZXIpIHJldHVybjsKICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7CiAgICB0aGlzLnRpbWVyID0gbnVsbDsKICB9LAoKICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmN1cnJlbnRseUV4ZWN1dGluZykgewogICAgICB0cnkgewogICAgICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLmV4ZWN1dGUoKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgfQp9KTsKT2JqZWN0LmV4dGVuZChTdHJpbmcsIHsKICBpbnRlcnByZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTsKICB9LAogIHNwZWNpYWxDaGFyOiB7CiAgICAnXGInOiAnXFxiJywKICAgICdcdCc6ICdcXHQnLAogICAgJ1xuJzogJ1xcbicsCiAgICAnXGYnOiAnXFxmJywKICAgICdccic6ICdcXHInLAogICAgJ1xcJzogJ1xcXFwnCiAgfQp9KTsKCk9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwgewogIGdzdWI6IGZ1bmN0aW9uKHBhdHRlcm4sIHJlcGxhY2VtZW50KSB7CiAgICB2YXIgcmVzdWx0ID0gJycsIHNvdXJjZSA9IHRoaXMsIG1hdGNoOwogICAgcmVwbGFjZW1lbnQgPSBhcmd1bWVudHMuY2FsbGVlLnByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7CgogICAgd2hpbGUgKHNvdXJjZS5sZW5ndGggPiAwKSB7CiAgICAgIGlmIChtYXRjaCA9IHNvdXJjZS5tYXRjaChwYXR0ZXJuKSkgewogICAgICAgIHJlc3VsdCArPSBzb3VyY2Uuc2xpY2UoMCwgbWF0Y2guaW5kZXgpOwogICAgICAgIHJlc3VsdCArPSBTdHJpbmcuaW50ZXJwcmV0KHJlcGxhY2VtZW50KG1hdGNoKSk7CiAgICAgICAgc291cmNlICA9IHNvdXJjZS5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ICs9IHNvdXJjZSwgc291cmNlID0gJyc7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfSwKCiAgc3ViOiBmdW5jdGlvbihwYXR0ZXJuLCByZXBsYWNlbWVudCwgY291bnQpIHsKICAgIHJlcGxhY2VtZW50ID0gdGhpcy5nc3ViLnByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7CiAgICBjb3VudCA9IE9iamVjdC5pc1VuZGVmaW5lZChjb3VudCkgPyAxIDogY291bnQ7CgogICAgcmV0dXJuIHRoaXMuZ3N1YihwYXR0ZXJuLCBmdW5jdGlvbihtYXRjaCkgewogICAgICBpZiAoLS1jb3VudCA8IDApIHJldHVybiBtYXRjaFswXTsKICAgICAgcmV0dXJuIHJlcGxhY2VtZW50KG1hdGNoKTsKICAgIH0pOwogIH0sCgogIHNjYW46IGZ1bmN0aW9uKHBhdHRlcm4sIGl0ZXJhdG9yKSB7CiAgICB0aGlzLmdzdWIocGF0dGVybiwgaXRlcmF0b3IpOwogICAgcmV0dXJuIFN0cmluZyh0aGlzKTsKICB9LAoKICB0cnVuY2F0ZTogZnVuY3Rpb24obGVuZ3RoLCB0cnVuY2F0aW9uKSB7CiAgICBsZW5ndGggPSBsZW5ndGggfHwgMzA7CiAgICB0cnVuY2F0aW9uID0gT2JqZWN0LmlzVW5kZWZpbmVkKHRydW5jYXRpb24pID8gJy4uLicgOiB0cnVuY2F0aW9uOwogICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gbGVuZ3RoID8KICAgICAgdGhpcy5zbGljZSgwLCBsZW5ndGggLSB0cnVuY2F0aW9uLmxlbmd0aCkgKyB0cnVuY2F0aW9uIDogU3RyaW5nKHRoaXMpOwogIH0sCgogIHN0cmlwOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL15ccysvLCAnJykucmVwbGFjZSgvXHMrJC8sICcnKTsKICB9LAoKICBzdHJpcFRhZ3M6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvPFwvP1tePl0rPi9naSwgJycpOwogIH0sCgogIHN0cmlwU2NyaXB0czogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKG5ldyBSZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW1nJyksICcnKTsKICB9LAoKICBleHRyYWN0U2NyaXB0czogZnVuY3Rpb24oKSB7CiAgICB2YXIgbWF0Y2hBbGwgPSBuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltZycpOwogICAgdmFyIG1hdGNoT25lID0gbmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbScpOwogICAgcmV0dXJuICh0aGlzLm1hdGNoKG1hdGNoQWxsKSB8fCBbXSkubWFwKGZ1bmN0aW9uKHNjcmlwdFRhZykgewogICAgICByZXR1cm4gKHNjcmlwdFRhZy5tYXRjaChtYXRjaE9uZSkgfHwgWycnLCAnJ10pWzFdOwogICAgfSk7CiAgfSwKCiAgZXZhbFNjcmlwdHM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZXh0cmFjdFNjcmlwdHMoKS5tYXAoZnVuY3Rpb24oc2NyaXB0KSB7IHJldHVybiBldmFsKHNjcmlwdCkgfSk7CiAgfSwKCiAgZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VsZiA9IGFyZ3VtZW50cy5jYWxsZWU7CiAgICBzZWxmLnRleHQuZGF0YSA9IHRoaXM7CiAgICByZXR1cm4gc2VsZi5kaXYuaW5uZXJIVE1MOwogIH0sCgogIHVuZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZGl2ID0gbmV3IEVsZW1lbnQoJ2RpdicpOwogICAgZGl2LmlubmVySFRNTCA9IHRoaXMuc3RyaXBUYWdzKCk7CiAgICByZXR1cm4gZGl2LmNoaWxkTm9kZXNbMF0gPyAoZGl2LmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/CiAgICAgICRBKGRpdi5jaGlsZE5vZGVzKS5pbmplY3QoJycsIGZ1bmN0aW9uKG1lbW8sIG5vZGUpIHsgcmV0dXJuIG1lbW8rbm9kZS5ub2RlVmFsdWUgfSkgOgogICAgICBkaXYuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUpIDogJyc7CiAgfSwKCiAgdG9RdWVyeVBhcmFtczogZnVuY3Rpb24oc2VwYXJhdG9yKSB7CiAgICB2YXIgbWF0Y2ggPSB0aGlzLnN0cmlwKCkubWF0Y2goLyhbXj8jXSopKCMuKik/JC8pOwogICAgaWYgKCFtYXRjaCkgcmV0dXJuIHsgfTsKCiAgICByZXR1cm4gbWF0Y2hbMV0uc3BsaXQoc2VwYXJhdG9yIHx8ICcmJykuaW5qZWN0KHsgfSwgZnVuY3Rpb24oaGFzaCwgcGFpcikgewogICAgICBpZiAoKHBhaXIgPSBwYWlyLnNwbGl0KCc9JykpWzBdKSB7CiAgICAgICAgdmFyIGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyLnNoaWZ0KCkpOwogICAgICAgIHZhciB2YWx1ZSA9IHBhaXIubGVuZ3RoID4gMSA/IHBhaXIuam9pbignPScpIDogcGFpclswXTsKICAgICAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CgogICAgICAgIGlmIChrZXkgaW4gaGFzaCkgewogICAgICAgICAgaWYgKCFPYmplY3QuaXNBcnJheShoYXNoW2tleV0pKSBoYXNoW2tleV0gPSBbaGFzaFtrZXldXTsKICAgICAgICAgIGhhc2hba2V5XS5wdXNoKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBoYXNoW2tleV0gPSB2YWx1ZTsKICAgICAgfQogICAgICByZXR1cm4gaGFzaDsKICAgIH0pOwogIH0sCgogIHRvQXJyYXk6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuc3BsaXQoJycpOwogIH0sCgogIHN1Y2M6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgdGhpcy5sZW5ndGggLSAxKSArCiAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5jaGFyQ29kZUF0KHRoaXMubGVuZ3RoIC0gMSkgKyAxKTsKICB9LAoKICB0aW1lczogZnVuY3Rpb24oY291bnQpIHsKICAgIHJldHVybiBjb3VudCA8IDEgPyAnJyA6IG5ldyBBcnJheShjb3VudCArIDEpLmpvaW4odGhpcyk7CiAgfSwKCiAgY2FtZWxpemU6IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcnRzID0gdGhpcy5zcGxpdCgnLScpLCBsZW4gPSBwYXJ0cy5sZW5ndGg7CiAgICBpZiAobGVuID09IDEpIHJldHVybiBwYXJ0c1swXTsKCiAgICB2YXIgY2FtZWxpemVkID0gdGhpcy5jaGFyQXQoMCkgPT0gJy0nCiAgICAgID8gcGFydHNbMF0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0c1swXS5zdWJzdHJpbmcoMSkKICAgICAgOiBwYXJ0c1swXTsKCiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKQogICAgICBjYW1lbGl6ZWQgKz0gcGFydHNbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0c1tpXS5zdWJzdHJpbmcoMSk7CgogICAgcmV0dXJuIGNhbWVsaXplZDsKICB9LAoKICBjYXBpdGFsaXplOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKTsKICB9LAoKICB1bmRlcnNjb3JlOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmdzdWIoLzo6LywgJy8nKS5nc3ViKC8oW0EtWl0rKShbQS1aXVthLXpdKS8sJyN7MX1fI3syfScpLmdzdWIoLyhbYS16XGRdKShbQS1aXSkvLCcjezF9XyN7Mn0nKS5nc3ViKC8tLywnXycpLnRvTG93ZXJDYXNlKCk7CiAgfSwKCiAgZGFzaGVyaXplOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmdzdWIoL18vLCctJyk7CiAgfSwKCiAgaW5zcGVjdDogZnVuY3Rpb24odXNlRG91YmxlUXVvdGVzKSB7CiAgICB2YXIgZXNjYXBlZFN0cmluZyA9IHRoaXMuZ3N1YigvW1x4MDAtXHgxZlxcXS8sIGZ1bmN0aW9uKG1hdGNoKSB7CiAgICAgIHZhciBjaGFyYWN0ZXIgPSBTdHJpbmcuc3BlY2lhbENoYXJbbWF0Y2hbMF1dOwogICAgICByZXR1cm4gY2hhcmFjdGVyID8gY2hhcmFjdGVyIDogJ1xcdTAwJyArIG1hdGNoWzBdLmNoYXJDb2RlQXQoKS50b1BhZGRlZFN0cmluZygyLCAxNik7CiAgICB9KTsKICAgIGlmICh1c2VEb3VibGVRdW90ZXMpIHJldHVybiAnIicgKyBlc2NhcGVkU3RyaW5nLnJlcGxhY2UoLyIvZywgJ1xcIicpICsgJyInOwogICAgcmV0dXJuICInIiArIGVzY2FwZWRTdHJpbmcucmVwbGFjZSgvJy9nLCAnXFxcJycpICsgIiciOwogIH0sCgogIHRvSlNPTjogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5pbnNwZWN0KHRydWUpOwogIH0sCgogIHVuZmlsdGVySlNPTjogZnVuY3Rpb24oZmlsdGVyKSB7CiAgICByZXR1cm4gdGhpcy5zdWIoZmlsdGVyIHx8IFByb3RvdHlwZS5KU09ORmlsdGVyLCAnI3sxfScpOwogIH0sCgogIGlzSlNPTjogZnVuY3Rpb24oKSB7CiAgICB2YXIgc3RyID0gdGhpczsKICAgIGlmIChzdHIuYmxhbmsoKSkgcmV0dXJuIGZhbHNlOwogICAgc3RyID0gdGhpcy5yZXBsYWNlKC9cXC4vZywgJ0AnKS5yZXBsYWNlKC8iW14iXFxcblxyXSoiL2csICcnKTsKICAgIHJldHVybiAoL15bLDp7fVxbXF0wLTkuXC0rRWFlZmxuci11IFxuXHJcdF0qJC8pLnRlc3Qoc3RyKTsKICB9LAoKICBldmFsSlNPTjogZnVuY3Rpb24oc2FuaXRpemUpIHsKICAgIHZhciBqc29uID0gdGhpcy51bmZpbHRlckpTT04oKTsKICAgIHRyeSB7CiAgICAgIGlmICghc2FuaXRpemUgfHwganNvbi5pc0pTT04oKSkgcmV0dXJuIGV2YWwoJygnICsganNvbiArICcpJyk7CiAgICB9IGNhdGNoIChlKSB7IH0KICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignQmFkbHkgZm9ybWVkIEpTT04gc3RyaW5nOiAnICsgdGhpcy5pbnNwZWN0KCkpOwogIH0sCgogIGluY2x1ZGU6IGZ1bmN0aW9uKHBhdHRlcm4pIHsKICAgIHJldHVybiB0aGlzLmluZGV4T2YocGF0dGVybikgPiAtMTsKICB9LAoKICBzdGFydHNXaXRoOiBmdW5jdGlvbihwYXR0ZXJuKSB7CiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHBhdHRlcm4pID09PSAwOwogIH0sCgogIGVuZHNXaXRoOiBmdW5jdGlvbihwYXR0ZXJuKSB7CiAgICB2YXIgZCA9IHRoaXMubGVuZ3RoIC0gcGF0dGVybi5sZW5ndGg7CiAgICByZXR1cm4gZCA+PSAwICYmIHRoaXMubGFzdEluZGV4T2YocGF0dGVybikgPT09IGQ7CiAgfSwKCiAgZW1wdHk6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMgPT0gJyc7CiAgfSwKCiAgYmxhbms6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIC9eXHMqJC8udGVzdCh0aGlzKTsKICB9LAoKICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24ob2JqZWN0LCBwYXR0ZXJuKSB7CiAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHRoaXMsIHBhdHRlcm4pLmV2YWx1YXRlKG9iamVjdCk7CiAgfQp9KTsKCmlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQgfHwgUHJvdG90eXBlLkJyb3dzZXIuSUUpIE9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwgewogIGVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLzwvZywnJmx0OycpLnJlcGxhY2UoLz4vZywnJmd0OycpOwogIH0sCiAgdW5lc2NhcGVIVE1MOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnJlcGxhY2UoLyZhbXA7L2csJyYnKS5yZXBsYWNlKC8mbHQ7L2csJzwnKS5yZXBsYWNlKC8mZ3Q7L2csJz4nKTsKICB9Cn0pOwoKU3RyaW5nLnByb3RvdHlwZS5nc3ViLnByZXBhcmVSZXBsYWNlbWVudCA9IGZ1bmN0aW9uKHJlcGxhY2VtZW50KSB7CiAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHJlcGxhY2VtZW50KSkgcmV0dXJuIHJlcGxhY2VtZW50OwogIHZhciB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShyZXBsYWNlbWVudCk7CiAgcmV0dXJuIGZ1bmN0aW9uKG1hdGNoKSB7IHJldHVybiB0ZW1wbGF0ZS5ldmFsdWF0ZShtYXRjaCkgfTsKfTsKClN0cmluZy5wcm90b3R5cGUucGFyc2VRdWVyeSA9IFN0cmluZy5wcm90b3R5cGUudG9RdWVyeVBhcmFtczsKCk9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZS5lc2NhcGVIVE1MLCB7CiAgZGl2OiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksCiAgdGV4dDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpCn0pOwoKd2l0aCAoU3RyaW5nLnByb3RvdHlwZS5lc2NhcGVIVE1MKSBkaXYuYXBwZW5kQ2hpbGQodGV4dCk7Cgp2YXIgVGVtcGxhdGUgPSBDbGFzcy5jcmVhdGUoewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKHRlbXBsYXRlLCBwYXR0ZXJuKSB7CiAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGUudG9TdHJpbmcoKTsKICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm4gfHwgVGVtcGxhdGUuUGF0dGVybjsKICB9LAoKICBldmFsdWF0ZTogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24ob2JqZWN0LnRvVGVtcGxhdGVSZXBsYWNlbWVudHMpKQogICAgICBvYmplY3QgPSBvYmplY3QudG9UZW1wbGF0ZVJlcGxhY2VtZW50cygpOwoKICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmdzdWIodGhpcy5wYXR0ZXJuLCBmdW5jdGlvbihtYXRjaCkgewogICAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiAnJzsKCiAgICAgIHZhciBiZWZvcmUgPSBtYXRjaFsxXSB8fCAnJzsKICAgICAgaWYgKGJlZm9yZSA9PSAnXFwnKSByZXR1cm4gbWF0Y2hbMl07CgogICAgICB2YXIgY3R4ID0gb2JqZWN0LCBleHByID0gbWF0Y2hbM107CiAgICAgIHZhciBwYXR0ZXJuID0gL14oW14uW10rfFxbKCg/Oi4qP1teXFxdKT8pXF0pKFwufFxbfCQpLzsKICAgICAgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoZXhwcik7CiAgICAgIGlmIChtYXRjaCA9PSBudWxsKSByZXR1cm4gYmVmb3JlOwoKICAgICAgd2hpbGUgKG1hdGNoICE9IG51bGwpIHsKICAgICAgICB2YXIgY29tcCA9IG1hdGNoWzFdLnN0YXJ0c1dpdGgoJ1snKSA/IG1hdGNoWzJdLmdzdWIoJ1xcXFxdJywgJ10nKSA6IG1hdGNoWzFdOwogICAgICAgIGN0eCA9IGN0eFtjb21wXTsKICAgICAgICBpZiAobnVsbCA9PSBjdHggfHwgJycgPT0gbWF0Y2hbM10pIGJyZWFrOwogICAgICAgIGV4cHIgPSBleHByLnN1YnN0cmluZygnWycgPT0gbWF0Y2hbM10gPyBtYXRjaFsxXS5sZW5ndGggOiBtYXRjaFswXS5sZW5ndGgpOwogICAgICAgIG1hdGNoID0gcGF0dGVybi5leGVjKGV4cHIpOwogICAgICB9CgogICAgICByZXR1cm4gYmVmb3JlICsgU3RyaW5nLmludGVycHJldChjdHgpOwogICAgfSk7CiAgfQp9KTsKVGVtcGxhdGUuUGF0dGVybiA9IC8oXnwufFxyfFxuKSgjXHsoLio/KVx9KS87Cgp2YXIgJGJyZWFrID0geyB9OwoKdmFyIEVudW1lcmFibGUgPSB7CiAgZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKICAgIHZhciBpbmRleCA9IDA7CiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yLmJpbmQoY29udGV4dCk7CiAgICB0cnkgewogICAgICB0aGlzLl9lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaXRlcmF0b3IodmFsdWUsIGluZGV4KyspOwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaWYgKGUgIT0gJGJyZWFrKSB0aHJvdyBlOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgZWFjaFNsaWNlOiBmdW5jdGlvbihudW1iZXIsIGl0ZXJhdG9yLCBjb250ZXh0KSB7CiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yID8gaXRlcmF0b3IuYmluZChjb250ZXh0KSA6IFByb3RvdHlwZS5LOwogICAgdmFyIGluZGV4ID0gLW51bWJlciwgc2xpY2VzID0gW10sIGFycmF5ID0gdGhpcy50b0FycmF5KCk7CiAgICB3aGlsZSAoKGluZGV4ICs9IG51bWJlcikgPCBhcnJheS5sZW5ndGgpCiAgICAgIHNsaWNlcy5wdXNoKGFycmF5LnNsaWNlKGluZGV4LCBpbmRleCtudW1iZXIpKTsKICAgIHJldHVybiBzbGljZXMuY29sbGVjdChpdGVyYXRvciwgY29udGV4dCk7CiAgfSwKCiAgYWxsOiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgewogICAgaXRlcmF0b3IgPSBpdGVyYXRvciA/IGl0ZXJhdG9yLmJpbmQoY29udGV4dCkgOiBQcm90b3R5cGUuSzsKICAgIHZhciByZXN1bHQgPSB0cnVlOwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICByZXN1bHQgPSByZXN1bHQgJiYgISFpdGVyYXRvcih2YWx1ZSwgaW5kZXgpOwogICAgICBpZiAoIXJlc3VsdCkgdGhyb3cgJGJyZWFrOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIGFueTogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgPyBpdGVyYXRvci5iaW5kKGNvbnRleHQpIDogUHJvdG90eXBlLks7CiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7CiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CiAgICAgIGlmIChyZXN1bHQgPSAhIWl0ZXJhdG9yKHZhbHVlLCBpbmRleCkpCiAgICAgICAgdGhyb3cgJGJyZWFrOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIGNvbGxlY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yID8gaXRlcmF0b3IuYmluZChjb250ZXh0KSA6IFByb3RvdHlwZS5LOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhdG9yKHZhbHVlLCBpbmRleCkpOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0czsKICB9LAoKICBkZXRlY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yLmJpbmQoY29udGV4dCk7CiAgICB2YXIgcmVzdWx0OwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICBpZiAoaXRlcmF0b3IodmFsdWUsIGluZGV4KSkgewogICAgICAgIHJlc3VsdCA9IHZhbHVlOwogICAgICAgIHRocm93ICRicmVhazsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIGZpbmRBbGw6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yLmJpbmQoY29udGV4dCk7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICBpZiAoaXRlcmF0b3IodmFsdWUsIGluZGV4KSkKICAgICAgICByZXN1bHRzLnB1c2godmFsdWUpOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0czsKICB9LAoKICBncmVwOiBmdW5jdGlvbihmaWx0ZXIsIGl0ZXJhdG9yLCBjb250ZXh0KSB7CiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yID8gaXRlcmF0b3IuYmluZChjb250ZXh0KSA6IFByb3RvdHlwZS5LOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKCiAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKGZpbHRlcikpCiAgICAgIGZpbHRlciA9IG5ldyBSZWdFeHAoZmlsdGVyKTsKCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CiAgICAgIGlmIChmaWx0ZXIubWF0Y2godmFsdWUpKQogICAgICAgIHJlc3VsdHMucHVzaChpdGVyYXRvcih2YWx1ZSwgaW5kZXgpKTsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdHM7CiAgfSwKCiAgaW5jbHVkZTogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24odGhpcy5pbmRleE9mKSkKICAgICAgaWYgKHRoaXMuaW5kZXhPZihvYmplY3QpICE9IC0xKSByZXR1cm4gdHJ1ZTsKCiAgICB2YXIgZm91bmQgPSBmYWxzZTsKICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT0gb2JqZWN0KSB7CiAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgIHRocm93ICRicmVhazsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gZm91bmQ7CiAgfSwKCiAgaW5Hcm91cHNPZjogZnVuY3Rpb24obnVtYmVyLCBmaWxsV2l0aCkgewogICAgZmlsbFdpdGggPSBPYmplY3QuaXNVbmRlZmluZWQoZmlsbFdpdGgpID8gbnVsbCA6IGZpbGxXaXRoOwogICAgcmV0dXJuIHRoaXMuZWFjaFNsaWNlKG51bWJlciwgZnVuY3Rpb24oc2xpY2UpIHsKICAgICAgd2hpbGUoc2xpY2UubGVuZ3RoIDwgbnVtYmVyKSBzbGljZS5wdXNoKGZpbGxXaXRoKTsKICAgICAgcmV0dXJuIHNsaWNlOwogICAgfSk7CiAgfSwKCiAgaW5qZWN0OiBmdW5jdGlvbihtZW1vLCBpdGVyYXRvciwgY29udGV4dCkgewogICAgaXRlcmF0b3IgPSBpdGVyYXRvci5iaW5kKGNvbnRleHQpOwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICBtZW1vID0gaXRlcmF0b3IobWVtbywgdmFsdWUsIGluZGV4KTsKICAgIH0pOwogICAgcmV0dXJuIG1lbW87CiAgfSwKCiAgaW52b2tlOiBmdW5jdGlvbihtZXRob2QpIHsKICAgIHZhciBhcmdzID0gJEEoYXJndW1lbnRzKS5zbGljZSgxKTsKICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWVbbWV0aG9kXS5hcHBseSh2YWx1ZSwgYXJncyk7CiAgICB9KTsKICB9LAoKICBtYXg6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yID8gaXRlcmF0b3IuYmluZChjb250ZXh0KSA6IFByb3RvdHlwZS5LOwogICAgdmFyIHJlc3VsdDsKICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKICAgICAgdmFsdWUgPSBpdGVyYXRvcih2YWx1ZSwgaW5kZXgpOwogICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgdmFsdWUgPj0gcmVzdWx0KQogICAgICAgIHJlc3VsdCA9IHZhbHVlOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIG1pbjogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgPyBpdGVyYXRvci5iaW5kKGNvbnRleHQpIDogUHJvdG90eXBlLks7CiAgICB2YXIgcmVzdWx0OwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICB2YWx1ZSA9IGl0ZXJhdG9yKHZhbHVlLCBpbmRleCk7CiAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCB2YWx1ZSA8IHJlc3VsdCkKICAgICAgICByZXN1bHQgPSB2YWx1ZTsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9LAoKICBwYXJ0aXRpb246IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yID8gaXRlcmF0b3IuYmluZChjb250ZXh0KSA6IFByb3RvdHlwZS5LOwogICAgdmFyIHRydWVzID0gW10sIGZhbHNlcyA9IFtdOwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICAoaXRlcmF0b3IodmFsdWUsIGluZGV4KSA/CiAgICAgICAgdHJ1ZXMgOiBmYWxzZXMpLnB1c2godmFsdWUpOwogICAgfSk7CiAgICByZXR1cm4gW3RydWVzLCBmYWxzZXNdOwogIH0sCgogIHBsdWNrOiBmdW5jdGlvbihwcm9wZXJ0eSkgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXN1bHRzLnB1c2godmFsdWVbcHJvcGVydHldKTsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdHM7CiAgfSwKCiAgcmVqZWN0OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgewogICAgaXRlcmF0b3IgPSBpdGVyYXRvci5iaW5kKGNvbnRleHQpOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKICAgICAgaWYgKCFpdGVyYXRvcih2YWx1ZSwgaW5kZXgpKQogICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7CiAgICB9KTsKICAgIHJldHVybiByZXN1bHRzOwogIH0sCgogIHNvcnRCeTogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IuYmluZChjb250ZXh0KTsKICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKICAgICAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGNyaXRlcmlhOiBpdGVyYXRvcih2YWx1ZSwgaW5kZXgpfTsKICAgIH0pLnNvcnQoZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CiAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKICAgIH0pLnBsdWNrKCd2YWx1ZScpOwogIH0sCgogIHRvQXJyYXk6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubWFwKCk7CiAgfSwKCiAgemlwOiBmdW5jdGlvbigpIHsKICAgIHZhciBpdGVyYXRvciA9IFByb3RvdHlwZS5LLCBhcmdzID0gJEEoYXJndW1lbnRzKTsKICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihhcmdzLmxhc3QoKSkpCiAgICAgIGl0ZXJhdG9yID0gYXJncy5wb3AoKTsKCiAgICB2YXIgY29sbGVjdGlvbnMgPSBbdGhpc10uY29uY2F0KGFyZ3MpLm1hcCgkQSk7CiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CiAgICAgIHJldHVybiBpdGVyYXRvcihjb2xsZWN0aW9ucy5wbHVjayhpbmRleCkpOwogICAgfSk7CiAgfSwKCiAgc2l6ZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50b0FycmF5KCkubGVuZ3RoOwogIH0sCgogIGluc3BlY3Q6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICcjPEVudW1lcmFibGU6JyArIHRoaXMudG9BcnJheSgpLmluc3BlY3QoKSArICc+JzsKICB9Cn07CgpPYmplY3QuZXh0ZW5kKEVudW1lcmFibGUsIHsKICBtYXA6ICAgICBFbnVtZXJhYmxlLmNvbGxlY3QsCiAgZmluZDogICAgRW51bWVyYWJsZS5kZXRlY3QsCiAgc2VsZWN0OiAgRW51bWVyYWJsZS5maW5kQWxsLAogIGZpbHRlcjogIEVudW1lcmFibGUuZmluZEFsbCwKICBtZW1iZXI6ICBFbnVtZXJhYmxlLmluY2x1ZGUsCiAgZW50cmllczogRW51bWVyYWJsZS50b0FycmF5LAogIGV2ZXJ5OiAgIEVudW1lcmFibGUuYWxsLAogIHNvbWU6ICAgIEVudW1lcmFibGUuYW55Cn0pOwpmdW5jdGlvbiAkQShpdGVyYWJsZSkgewogIGlmICghaXRlcmFibGUpIHJldHVybiBbXTsKICBpZiAoaXRlcmFibGUudG9BcnJheSkgcmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsKICB2YXIgbGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoIHx8IDAsIHJlc3VsdHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICB3aGlsZSAobGVuZ3RoLS0pIHJlc3VsdHNbbGVuZ3RoXSA9IGl0ZXJhYmxlW2xlbmd0aF07CiAgcmV0dXJuIHJlc3VsdHM7Cn0KCmlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsKICAkQSA9IGZ1bmN0aW9uKGl0ZXJhYmxlKSB7CiAgICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gW107CiAgICBpZiAoIShPYmplY3QuaXNGdW5jdGlvbihpdGVyYWJsZSkgJiYgaXRlcmFibGUgPT0gJ1tvYmplY3QgTm9kZUxpc3RdJykgJiYKICAgICAgICBpdGVyYWJsZS50b0FycmF5KSByZXR1cm4gaXRlcmFibGUudG9BcnJheSgpOwogICAgdmFyIGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aCB8fCAwLCByZXN1bHRzID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICB3aGlsZSAobGVuZ3RoLS0pIHJlc3VsdHNbbGVuZ3RoXSA9IGl0ZXJhYmxlW2xlbmd0aF07CiAgICByZXR1cm4gcmVzdWx0czsKICB9Owp9CgpBcnJheS5mcm9tID0gJEE7CgpPYmplY3QuZXh0ZW5kKEFycmF5LnByb3RvdHlwZSwgRW51bWVyYWJsZSk7CgppZiAoIUFycmF5LnByb3RvdHlwZS5fcmV2ZXJzZSkgQXJyYXkucHJvdG90eXBlLl9yZXZlcnNlID0gQXJyYXkucHJvdG90eXBlLnJldmVyc2U7CgpPYmplY3QuZXh0ZW5kKEFycmF5LnByb3RvdHlwZSwgewogIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgewogICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCiAgICAgIGl0ZXJhdG9yKHRoaXNbaV0pOwogIH0sCgogIGNsZWFyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMubGVuZ3RoID0gMDsKICAgIHJldHVybiB0aGlzOwogIH0sCgogIGZpcnN0OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzWzBdOwogIH0sCgogIGxhc3Q6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXNbdGhpcy5sZW5ndGggLSAxXTsKICB9LAoKICBjb21wYWN0OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbDsKICAgIH0pOwogIH0sCgogIGZsYXR0ZW46IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGFycmF5LmNvbmNhdChPYmplY3QuaXNBcnJheSh2YWx1ZSkgPwogICAgICAgIHZhbHVlLmZsYXR0ZW4oKSA6IFt2YWx1ZV0pOwogICAgfSk7CiAgfSwKCiAgd2l0aG91dDogZnVuY3Rpb24oKSB7CiAgICB2YXIgdmFsdWVzID0gJEEoYXJndW1lbnRzKTsKICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gIXZhbHVlcy5pbmNsdWRlKHZhbHVlKTsKICAgIH0pOwogIH0sCgogIHJldmVyc2U6IGZ1bmN0aW9uKGlubGluZSkgewogICAgcmV0dXJuIChpbmxpbmUgIT09IGZhbHNlID8gdGhpcyA6IHRoaXMudG9BcnJheSgpKS5fcmV2ZXJzZSgpOwogIH0sCgogIHJlZHVjZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5sZW5ndGggPiAxID8gdGhpcyA6IHRoaXNbMF07CiAgfSwKCiAgdW5pcTogZnVuY3Rpb24oc29ydGVkKSB7CiAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSwgaW5kZXgpIHsKICAgICAgaWYgKDAgPT0gaW5kZXggfHwgKHNvcnRlZCA/IGFycmF5Lmxhc3QoKSAhPSB2YWx1ZSA6ICFhcnJheS5pbmNsdWRlKHZhbHVlKSkpCiAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0pOwogIH0sCgogIGludGVyc2VjdDogZnVuY3Rpb24oYXJyYXkpIHsKICAgIHJldHVybiB0aGlzLnVuaXEoKS5maW5kQWxsKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgcmV0dXJuIGFycmF5LmRldGVjdChmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gaXRlbSA9PT0gdmFsdWUgfSk7CiAgICB9KTsKICB9LAoKICBjbG9uZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gW10uY29uY2F0KHRoaXMpOwogIH0sCgogIHNpemU6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubGVuZ3RoOwogIH0sCgogIGluc3BlY3Q6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICdbJyArIHRoaXMubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCcsICcpICsgJ10nOwogIH0sCgogIHRvSlNPTjogZnVuY3Rpb24oKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKG9iamVjdCkgewogICAgICB2YXIgdmFsdWUgPSBPYmplY3QudG9KU09OKG9iamVjdCk7CiAgICAgIGlmICghT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgcmVzdWx0cy5wdXNoKHZhbHVlKTsKICAgIH0pOwogICAgcmV0dXJuICdbJyArIHJlc3VsdHMuam9pbignLCAnKSArICddJzsKICB9Cn0pOwoKLy8gdXNlIG5hdGl2ZSBicm93c2VyIEpTIDEuNiBpbXBsZW1lbnRhdGlvbiBpZiBhdmFpbGFibGUKaWYgKE9iamVjdC5pc0Z1bmN0aW9uKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSkKICBBcnJheS5wcm90b3R5cGUuX2VhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaDsKCmlmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIEFycmF5LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24oaXRlbSwgaSkgewogIGkgfHwgKGkgPSAwKTsKICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgaWYgKGkgPCAwKSBpID0gbGVuZ3RoICsgaTsKICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKQogICAgaWYgKHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpOwogIHJldHVybiAtMTsKfTsKCmlmICghQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKSBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbihpdGVtLCBpKSB7CiAgaSA9IGlzTmFOKGkpID8gdGhpcy5sZW5ndGggOiAoaSA8IDAgPyB0aGlzLmxlbmd0aCArIGkgOiBpKSArIDE7CiAgdmFyIG4gPSB0aGlzLnNsaWNlKDAsIGkpLnJldmVyc2UoKS5pbmRleE9mKGl0ZW0pOwogIHJldHVybiAobiA8IDApID8gbiA6IGkgLSBuIC0gMTsKfTsKCkFycmF5LnByb3RvdHlwZS50b0FycmF5ID0gQXJyYXkucHJvdG90eXBlLmNsb25lOwoKZnVuY3Rpb24gJHcoc3RyaW5nKSB7CiAgaWYgKCFPYmplY3QuaXNTdHJpbmcoc3RyaW5nKSkgcmV0dXJuIFtdOwogIHN0cmluZyA9IHN0cmluZy5zdHJpcCgpOwogIHJldHVybiBzdHJpbmcgPyBzdHJpbmcuc3BsaXQoL1xzKy8pIDogW107Cn0KCmlmIChQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSl7CiAgQXJyYXkucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGFycmF5ID0gW107CiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgYXJyYXkucHVzaCh0aGlzW2ldKTsKICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKE9iamVjdC5pc0FycmF5KGFyZ3VtZW50c1tpXSkpIHsKICAgICAgICBmb3IgKHZhciBqID0gMCwgYXJyYXlMZW5ndGggPSBhcmd1bWVudHNbaV0ubGVuZ3RoOyBqIDwgYXJyYXlMZW5ndGg7IGorKykKICAgICAgICAgIGFycmF5LnB1c2goYXJndW1lbnRzW2ldW2pdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcnJheS5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhcnJheTsKICB9Owp9Ck9iamVjdC5leHRlbmQoTnVtYmVyLnByb3RvdHlwZSwgewogIHRvQ29sb3JQYXJ0OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsKICB9LAoKICBzdWNjOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzICsgMTsKICB9LAoKICB0aW1lczogZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgICRSKDAsIHRoaXMsIHRydWUpLmVhY2goaXRlcmF0b3IpOwogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgdG9QYWRkZWRTdHJpbmc6IGZ1bmN0aW9uKGxlbmd0aCwgcmFkaXgpIHsKICAgIHZhciBzdHJpbmcgPSB0aGlzLnRvU3RyaW5nKHJhZGl4IHx8IDEwKTsKICAgIHJldHVybiAnMCcudGltZXMobGVuZ3RoIC0gc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7CiAgfSwKCiAgdG9KU09OOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBpc0Zpbml0ZSh0aGlzKSA/IHRoaXMudG9TdHJpbmcoKSA6ICdudWxsJzsKICB9Cn0pOwoKJHcoJ2FicyByb3VuZCBjZWlsIGZsb29yJykuZWFjaChmdW5jdGlvbihtZXRob2QpewogIE51bWJlci5wcm90b3R5cGVbbWV0aG9kXSA9IE1hdGhbbWV0aG9kXS5tZXRob2RpemUoKTsKfSk7CmZ1bmN0aW9uICRIKG9iamVjdCkgewogIHJldHVybiBuZXcgSGFzaChvYmplY3QpOwp9OwoKdmFyIEhhc2ggPSBDbGFzcy5jcmVhdGUoRW51bWVyYWJsZSwgKGZ1bmN0aW9uKCkgewoKICBmdW5jdGlvbiB0b1F1ZXJ5UGFpcihrZXksIHZhbHVlKSB7CiAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIGtleTsKICAgIHJldHVybiBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nLmludGVycHJldCh2YWx1ZSkpOwogIH0KCiAgcmV0dXJuIHsKICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICB0aGlzLl9vYmplY3QgPSBPYmplY3QuaXNIYXNoKG9iamVjdCkgPyBvYmplY3QudG9PYmplY3QoKSA6IE9iamVjdC5jbG9uZShvYmplY3QpOwogICAgfSwKCiAgICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuX29iamVjdCkgewogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX29iamVjdFtrZXldLCBwYWlyID0gW2tleSwgdmFsdWVdOwogICAgICAgIHBhaXIua2V5ID0ga2V5OwogICAgICAgIHBhaXIudmFsdWUgPSB2YWx1ZTsKICAgICAgICBpdGVyYXRvcihwYWlyKTsKICAgICAgfQogICAgfSwKCiAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIHRoaXMuX29iamVjdFtrZXldID0gdmFsdWU7CiAgICB9LAoKICAgIGdldDogZnVuY3Rpb24oa2V5KSB7CiAgICAgIHJldHVybiB0aGlzLl9vYmplY3Rba2V5XTsKICAgIH0sCgogICAgdW5zZXQ6IGZ1bmN0aW9uKGtleSkgewogICAgICB2YXIgdmFsdWUgPSB0aGlzLl9vYmplY3Rba2V5XTsKICAgICAgZGVsZXRlIHRoaXMuX29iamVjdFtrZXldOwogICAgICByZXR1cm4gdmFsdWU7CiAgICB9LAoKICAgIHRvT2JqZWN0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIE9iamVjdC5jbG9uZSh0aGlzLl9vYmplY3QpOwogICAgfSwKCiAgICBrZXlzOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMucGx1Y2soJ2tleScpOwogICAgfSwKCiAgICB2YWx1ZXM6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5wbHVjaygndmFsdWUnKTsKICAgIH0sCgogICAgaW5kZXg6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBtYXRjaCA9IHRoaXMuZGV0ZWN0KGZ1bmN0aW9uKHBhaXIpIHsKICAgICAgICByZXR1cm4gcGFpci52YWx1ZSA9PT0gdmFsdWU7CiAgICAgIH0pOwogICAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2gua2V5OwogICAgfSwKCiAgICBtZXJnZTogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgIHJldHVybiB0aGlzLmNsb25lKCkudXBkYXRlKG9iamVjdCk7CiAgICB9LAoKICAgIHVwZGF0ZTogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgIHJldHVybiBuZXcgSGFzaChvYmplY3QpLmluamVjdCh0aGlzLCBmdW5jdGlvbihyZXN1bHQsIHBhaXIpIHsKICAgICAgICByZXN1bHQuc2V0KHBhaXIua2V5LCBwYWlyLnZhbHVlKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9KTsKICAgIH0sCgogICAgdG9RdWVyeVN0cmluZzogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbihwYWlyKSB7CiAgICAgICAgdmFyIGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChwYWlyLmtleSksIHZhbHVlcyA9IHBhaXIudmFsdWU7CgogICAgICAgIGlmICh2YWx1ZXMgJiYgdHlwZW9mIHZhbHVlcyA9PSAnb2JqZWN0JykgewogICAgICAgICAgaWYgKE9iamVjdC5pc0FycmF5KHZhbHVlcykpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZXMubWFwKHRvUXVlcnlQYWlyLmN1cnJ5KGtleSkpLmpvaW4oJyYnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRvUXVlcnlQYWlyKGtleSwgdmFsdWVzKTsKICAgICAgfSkuam9pbignJicpOwogICAgfSwKCiAgICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICcjPEhhc2g6eycgKyB0aGlzLm1hcChmdW5jdGlvbihwYWlyKSB7CiAgICAgICAgcmV0dXJuIHBhaXIubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCc6ICcpOwogICAgICB9KS5qb2luKCcsICcpICsgJ30+JzsKICAgIH0sCgogICAgdG9KU09OOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIE9iamVjdC50b0pTT04odGhpcy50b09iamVjdCgpKTsKICAgIH0sCgogICAgY2xvbmU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbmV3IEhhc2godGhpcyk7CiAgICB9CiAgfQp9KSgpKTsKCkhhc2gucHJvdG90eXBlLnRvVGVtcGxhdGVSZXBsYWNlbWVudHMgPSBIYXNoLnByb3RvdHlwZS50b09iamVjdDsKSGFzaC5mcm9tID0gJEg7CnZhciBPYmplY3RSYW5nZSA9IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCB7CiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oc3RhcnQsIGVuZCwgZXhjbHVzaXZlKSB7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CiAgICB0aGlzLmVuZCA9IGVuZDsKICAgIHRoaXMuZXhjbHVzaXZlID0gZXhjbHVzaXZlOwogIH0sCgogIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgewogICAgdmFyIHZhbHVlID0gdGhpcy5zdGFydDsKICAgIHdoaWxlICh0aGlzLmluY2x1ZGUodmFsdWUpKSB7CiAgICAgIGl0ZXJhdG9yKHZhbHVlKTsKICAgICAgdmFsdWUgPSB2YWx1ZS5zdWNjKCk7CiAgICB9CiAgfSwKCiAgaW5jbHVkZTogZnVuY3Rpb24odmFsdWUpIHsKICAgIGlmICh2YWx1ZSA8IHRoaXMuc3RhcnQpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmICh0aGlzLmV4Y2x1c2l2ZSkKICAgICAgcmV0dXJuIHZhbHVlIDwgdGhpcy5lbmQ7CiAgICByZXR1cm4gdmFsdWUgPD0gdGhpcy5lbmQ7CiAgfQp9KTsKCnZhciAkUiA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSkgewogIHJldHVybiBuZXcgT2JqZWN0UmFuZ2Uoc3RhcnQsIGVuZCwgZXhjbHVzaXZlKTsKfTsKCnZhciBBamF4ID0gewogIGdldFRyYW5zcG9ydDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gVHJ5LnRoZXNlKAogICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCl9LAogICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyl9LAogICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyl9CiAgICApIHx8IGZhbHNlOwogIH0sCgogIGFjdGl2ZVJlcXVlc3RDb3VudDogMAp9OwoKQWpheC5SZXNwb25kZXJzID0gewogIHJlc3BvbmRlcnM6IFtdLAoKICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgIHRoaXMucmVzcG9uZGVycy5fZWFjaChpdGVyYXRvcik7CiAgfSwKCiAgcmVnaXN0ZXI6IGZ1bmN0aW9uKHJlc3BvbmRlcikgewogICAgaWYgKCF0aGlzLmluY2x1ZGUocmVzcG9uZGVyKSkKICAgICAgdGhpcy5yZXNwb25kZXJzLnB1c2gocmVzcG9uZGVyKTsKICB9LAoKICB1bnJlZ2lzdGVyOiBmdW5jdGlvbihyZXNwb25kZXIpIHsKICAgIHRoaXMucmVzcG9uZGVycyA9IHRoaXMucmVzcG9uZGVycy53aXRob3V0KHJlc3BvbmRlcik7CiAgfSwKCiAgZGlzcGF0Y2g6IGZ1bmN0aW9uKGNhbGxiYWNrLCByZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb24pIHsKICAgIHRoaXMuZWFjaChmdW5jdGlvbihyZXNwb25kZXIpIHsKICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHJlc3BvbmRlcltjYWxsYmFja10pKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3BvbmRlcltjYWxsYmFja10uYXBwbHkocmVzcG9uZGVyLCBbcmVxdWVzdCwgdHJhbnNwb3J0LCBqc29uXSk7CiAgICAgICAgfSBjYXRjaCAoZSkgeyB9CiAgICAgIH0KICAgIH0pOwogIH0KfTsKCk9iamVjdC5leHRlbmQoQWpheC5SZXNwb25kZXJzLCBFbnVtZXJhYmxlKTsKCkFqYXguUmVzcG9uZGVycy5yZWdpc3Rlcih7CiAgb25DcmVhdGU6ICAgZnVuY3Rpb24oKSB7IEFqYXguYWN0aXZlUmVxdWVzdENvdW50KysgfSwKICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHsgQWpheC5hY3RpdmVSZXF1ZXN0Q291bnQtLSB9Cn0pOwoKQWpheC5CYXNlID0gQ2xhc3MuY3JlYXRlKHsKICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7CiAgICB0aGlzLm9wdGlvbnMgPSB7CiAgICAgIG1ldGhvZDogICAgICAgJ3Bvc3QnLAogICAgICBhc3luY2hyb25vdXM6IHRydWUsCiAgICAgIGNvbnRlbnRUeXBlOiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsCiAgICAgIGVuY29kaW5nOiAgICAgJ1VURi04JywKICAgICAgcGFyYW1ldGVyczogICAnJywKICAgICAgZXZhbEpTT046ICAgICB0cnVlLAogICAgICBldmFsSlM6ICAgICAgIHRydWUKICAgIH07CiAgICBPYmplY3QuZXh0ZW5kKHRoaXMub3B0aW9ucywgb3B0aW9ucyB8fCB7IH0pOwoKICAgIHRoaXMub3B0aW9ucy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kLnRvTG93ZXJDYXNlKCk7CgogICAgaWYgKE9iamVjdC5pc1N0cmluZyh0aGlzLm9wdGlvbnMucGFyYW1ldGVycykpCiAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMudG9RdWVyeVBhcmFtcygpOwogICAgZWxzZSBpZiAoT2JqZWN0LmlzSGFzaCh0aGlzLm9wdGlvbnMucGFyYW1ldGVycykpCiAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMudG9PYmplY3QoKTsKICB9Cn0pOwoKQWpheC5SZXF1ZXN0ID0gQ2xhc3MuY3JlYXRlKEFqYXguQmFzZSwgewogIF9jb21wbGV0ZTogZmFsc2UsCgogIGluaXRpYWxpemU6IGZ1bmN0aW9uKCRzdXBlciwgdXJsLCBvcHRpb25zKSB7CiAgICAkc3VwZXIob3B0aW9ucyk7CiAgICB0aGlzLnRyYW5zcG9ydCA9IEFqYXguZ2V0VHJhbnNwb3J0KCk7CiAgICB0aGlzLnJlcXVlc3QodXJsKTsKICB9LAoKICByZXF1ZXN0OiBmdW5jdGlvbih1cmwpIHsKICAgIHRoaXMudXJsID0gdXJsOwogICAgdGhpcy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kOwogICAgdmFyIHBhcmFtcyA9IE9iamVjdC5jbG9uZSh0aGlzLm9wdGlvbnMucGFyYW1ldGVycyk7CgogICAgaWYgKCFbJ2dldCcsICdwb3N0J10uaW5jbHVkZSh0aGlzLm1ldGhvZCkpIHsKICAgICAgLy8gc2ltdWxhdGUgb3RoZXIgdmVyYnMgb3ZlciBwb3N0CiAgICAgIHBhcmFtc1snX21ldGhvZCddID0gdGhpcy5tZXRob2Q7CiAgICAgIHRoaXMubWV0aG9kID0gJ3Bvc3QnOwogICAgfQoKICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtczsKCiAgICBpZiAocGFyYW1zID0gT2JqZWN0LnRvUXVlcnlTdHJpbmcocGFyYW1zKSkgewogICAgICAvLyB3aGVuIEdFVCwgYXBwZW5kIHBhcmFtZXRlcnMgdG8gVVJMCiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSAnZ2V0JykKICAgICAgICB0aGlzLnVybCArPSAodGhpcy51cmwuaW5jbHVkZSgnPycpID8gJyYnIDogJz8nKSArIHBhcmFtczsKICAgICAgZWxzZSBpZiAoL0tvbnF1ZXJvcnxTYWZhcml8S0hUTUwvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpCiAgICAgICAgcGFyYW1zICs9ICcmXz0nOwogICAgfQoKICAgIHRyeSB7CiAgICAgIHZhciByZXNwb25zZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRoaXMpOwogICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JlYXRlKSB0aGlzLm9wdGlvbnMub25DcmVhdGUocmVzcG9uc2UpOwogICAgICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uQ3JlYXRlJywgdGhpcywgcmVzcG9uc2UpOwoKICAgICAgdGhpcy50cmFuc3BvcnQub3Blbih0aGlzLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB0aGlzLnVybCwKICAgICAgICB0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKTsKCiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKSB0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUuYmluZCh0aGlzKS5kZWZlcigxKTsKCiAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOwogICAgICB0aGlzLnNldFJlcXVlc3RIZWFkZXJzKCk7CgogICAgICB0aGlzLmJvZHkgPSB0aGlzLm1ldGhvZCA9PSAncG9zdCcgPyAodGhpcy5vcHRpb25zLnBvc3RCb2R5IHx8IHBhcmFtcykgOiBudWxsOwogICAgICB0aGlzLnRyYW5zcG9ydC5zZW5kKHRoaXMuYm9keSk7CgogICAgICAvKiBGb3JjZSBGaXJlZm94IHRvIGhhbmRsZSByZWFkeSBzdGF0ZSA0IGZvciBzeW5jaHJvbm91cyByZXF1ZXN0cyAqLwogICAgICBpZiAoIXRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMgJiYgdGhpcy50cmFuc3BvcnQub3ZlcnJpZGVNaW1lVHlwZSkKICAgICAgICB0aGlzLm9uU3RhdGVDaGFuZ2UoKTsKCiAgICB9CiAgICBjYXRjaCAoZSkgewogICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOwogICAgfQogIH0sCgogIG9uU3RhdGVDaGFuZ2U6IGZ1bmN0aW9uKCkgewogICAgdmFyIHJlYWR5U3RhdGUgPSB0aGlzLnRyYW5zcG9ydC5yZWFkeVN0YXRlOwogICAgaWYgKHJlYWR5U3RhdGUgPiAxICYmICEoKHJlYWR5U3RhdGUgPT0gNCkgJiYgdGhpcy5fY29tcGxldGUpKQogICAgICB0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUodGhpcy50cmFuc3BvcnQucmVhZHlTdGF0ZSk7CiAgfSwKCiAgc2V0UmVxdWVzdEhlYWRlcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGhlYWRlcnMgPSB7CiAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JywKICAgICAgJ1gtUHJvdG90eXBlLVZlcnNpb24nOiBQcm90b3R5cGUuVmVyc2lvbiwKICAgICAgJ0FjY2VwdCc6ICd0ZXh0L2phdmFzY3JpcHQsIHRleHQvaHRtbCwgYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgKi8qJwogICAgfTsKCiAgICBpZiAodGhpcy5tZXRob2QgPT0gJ3Bvc3QnKSB7CiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSddID0gdGhpcy5vcHRpb25zLmNvbnRlbnRUeXBlICsKICAgICAgICAodGhpcy5vcHRpb25zLmVuY29kaW5nID8gJzsgY2hhcnNldD0nICsgdGhpcy5vcHRpb25zLmVuY29kaW5nIDogJycpOwoKICAgICAgLyogRm9yY2UgIkNvbm5lY3Rpb246IGNsb3NlIiBmb3Igb2xkZXIgTW96aWxsYSBicm93c2VycyB0byB3b3JrCiAgICAgICAqIGFyb3VuZCBhIGJ1ZyB3aGVyZSBYTUxIdHRwUmVxdWVzdCBzZW5kcyBhbiBpbmNvcnJlY3QKICAgICAgICogQ29udGVudC1sZW5ndGggaGVhZGVyLiBTZWUgTW96aWxsYSBCdWd6aWxsYSAjMjQ2NjUxLgogICAgICAgKi8KICAgICAgaWYgKHRoaXMudHJhbnNwb3J0Lm92ZXJyaWRlTWltZVR5cGUgJiYKICAgICAgICAgIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9HZWNrb1wvKFxkezR9KS8pIHx8IFswLDIwMDVdKVsxXSA8IDIwMDUpCiAgICAgICAgICAgIGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdjbG9zZSc7CiAgICB9CgogICAgLy8gdXNlci1kZWZpbmVkIGhlYWRlcnMKICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnJlcXVlc3RIZWFkZXJzID09ICdvYmplY3QnKSB7CiAgICAgIHZhciBleHRyYXMgPSB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnM7CgogICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24oZXh0cmFzLnB1c2gpKQogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBleHRyYXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDIpCiAgICAgICAgICBoZWFkZXJzW2V4dHJhc1tpXV0gPSBleHRyYXNbaSsxXTsKICAgICAgZWxzZQogICAgICAgICRIKGV4dHJhcykuZWFjaChmdW5jdGlvbihwYWlyKSB7IGhlYWRlcnNbcGFpci5rZXldID0gcGFpci52YWx1ZSB9KTsKICAgIH0KCiAgICBmb3IgKHZhciBuYW1lIGluIGhlYWRlcnMpCiAgICAgIHRoaXMudHJhbnNwb3J0LnNldFJlcXVlc3RIZWFkZXIobmFtZSwgaGVhZGVyc1tuYW1lXSk7CiAgfSwKCiAgc3VjY2VzczogZnVuY3Rpb24oKSB7CiAgICB2YXIgc3RhdHVzID0gdGhpcy5nZXRTdGF0dXMoKTsKICAgIHJldHVybiAhc3RhdHVzIHx8IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCk7CiAgfSwKCiAgZ2V0U3RhdHVzOiBmdW5jdGlvbigpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5zdGF0dXMgfHwgMDsKICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIDAgfQogIH0sCgogIHJlc3BvbmRUb1JlYWR5U3RhdGU6IGZ1bmN0aW9uKHJlYWR5U3RhdGUpIHsKICAgIHZhciBzdGF0ZSA9IEFqYXguUmVxdWVzdC5FdmVudHNbcmVhZHlTdGF0ZV0sIHJlc3BvbnNlID0gbmV3IEFqYXguUmVzcG9uc2UodGhpcyk7CgogICAgaWYgKHN0YXRlID09ICdDb21wbGV0ZScpIHsKICAgICAgdHJ5IHsKICAgICAgICB0aGlzLl9jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgKHRoaXMub3B0aW9uc1snb24nICsgcmVzcG9uc2Uuc3RhdHVzXQogICAgICAgICB8fCB0aGlzLm9wdGlvbnNbJ29uJyArICh0aGlzLnN1Y2Nlc3MoKSA/ICdTdWNjZXNzJyA6ICdGYWlsdXJlJyldCiAgICAgICAgIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKShyZXNwb25zZSwgcmVzcG9uc2UuaGVhZGVySlNPTik7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOwogICAgICB9CgogICAgICB2YXIgY29udGVudFR5cGUgPSByZXNwb25zZS5nZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScpOwogICAgICBpZiAodGhpcy5vcHRpb25zLmV2YWxKUyA9PSAnZm9yY2UnCiAgICAgICAgICB8fCAodGhpcy5vcHRpb25zLmV2YWxKUyAmJiB0aGlzLmlzU2FtZU9yaWdpbigpICYmIGNvbnRlbnRUeXBlCiAgICAgICAgICAmJiBjb250ZW50VHlwZS5tYXRjaCgvXlxzKih0ZXh0fGFwcGxpY2F0aW9uKVwvKHgtKT8oamF2YXxlY21hKXNjcmlwdCg7LiopP1xzKiQvaSkpKQogICAgICAgIHRoaXMuZXZhbFJlc3BvbnNlKCk7CiAgICB9CgogICAgdHJ5IHsKICAgICAgKHRoaXMub3B0aW9uc1snb24nICsgc3RhdGVdIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKShyZXNwb25zZSwgcmVzcG9uc2UuaGVhZGVySlNPTik7CiAgICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb24nICsgc3RhdGUsIHRoaXMsIHJlc3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09OKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKICAgIH0KCiAgICBpZiAoc3RhdGUgPT0gJ0NvbXBsZXRlJykgewogICAgICAvLyBhdm9pZCBtZW1vcnkgbGVhayBpbiBNU0lFOiBjbGVhbiB1cAogICAgICB0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKICAgIH0KICB9LAoKICBpc1NhbWVPcmlnaW46IGZ1bmN0aW9uKCkgewogICAgdmFyIG0gPSB0aGlzLnVybC5tYXRjaCgvXlxzKmh0dHBzPzpcL1wvW15cL10qLyk7CiAgICByZXR1cm4gIW0gfHwgKG1bMF0gPT0gJyN7cHJvdG9jb2x9Ly8je2RvbWFpbn0je3BvcnR9Jy5pbnRlcnBvbGF0ZSh7CiAgICAgIHByb3RvY29sOiBsb2NhdGlvbi5wcm90b2NvbCwKICAgICAgZG9tYWluOiBkb2N1bWVudC5kb21haW4sCiAgICAgIHBvcnQ6IGxvY2F0aW9uLnBvcnQgPyAnOicgKyBsb2NhdGlvbi5wb3J0IDogJycKICAgIH0pKTsKICB9LAoKICBnZXRIZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5nZXRSZXNwb25zZUhlYWRlcihuYW1lKSB8fCBudWxsOwogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9CiAgfSwKCiAgZXZhbFJlc3BvbnNlOiBmdW5jdGlvbigpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBldmFsKCh0aGlzLnRyYW5zcG9ydC5yZXNwb25zZVRleHQgfHwgJycpLnVuZmlsdGVySlNPTigpKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKICAgIH0KICB9LAoKICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7CiAgICAodGhpcy5vcHRpb25zLm9uRXhjZXB0aW9uIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0aGlzLCBleGNlcHRpb24pOwogICAgQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbkV4Y2VwdGlvbicsIHRoaXMsIGV4Y2VwdGlvbik7CiAgfQp9KTsKCkFqYXguUmVxdWVzdC5FdmVudHMgPQogIFsnVW5pbml0aWFsaXplZCcsICdMb2FkaW5nJywgJ0xvYWRlZCcsICdJbnRlcmFjdGl2ZScsICdDb21wbGV0ZSddOwoKQWpheC5SZXNwb25zZSA9IENsYXNzLmNyZWF0ZSh7CiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ocmVxdWVzdCl7CiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwogICAgdmFyIHRyYW5zcG9ydCAgPSB0aGlzLnRyYW5zcG9ydCAgPSByZXF1ZXN0LnRyYW5zcG9ydCwKICAgICAgICByZWFkeVN0YXRlID0gdGhpcy5yZWFkeVN0YXRlID0gdHJhbnNwb3J0LnJlYWR5U3RhdGU7CgogICAgaWYoKHJlYWR5U3RhdGUgPiAyICYmICFQcm90b3R5cGUuQnJvd3Nlci5JRSkgfHwgcmVhZHlTdGF0ZSA9PSA0KSB7CiAgICAgIHRoaXMuc3RhdHVzICAgICAgID0gdGhpcy5nZXRTdGF0dXMoKTsKICAgICAgdGhpcy5zdGF0dXNUZXh0ICAgPSB0aGlzLmdldFN0YXR1c1RleHQoKTsKICAgICAgdGhpcy5yZXNwb25zZVRleHQgPSBTdHJpbmcuaW50ZXJwcmV0KHRyYW5zcG9ydC5yZXNwb25zZVRleHQpOwogICAgICB0aGlzLmhlYWRlckpTT04gICA9IHRoaXMuX2dldEhlYWRlckpTT04oKTsKICAgIH0KCiAgICBpZihyZWFkeVN0YXRlID09IDQpIHsKICAgICAgdmFyIHhtbCA9IHRyYW5zcG9ydC5yZXNwb25zZVhNTDsKICAgICAgdGhpcy5yZXNwb25zZVhNTCAgPSBPYmplY3QuaXNVbmRlZmluZWQoeG1sKSA/IG51bGwgOiB4bWw7CiAgICAgIHRoaXMucmVzcG9uc2VKU09OID0gdGhpcy5fZ2V0UmVzcG9uc2VKU09OKCk7CiAgICB9CiAgfSwKCiAgc3RhdHVzOiAgICAgIDAsCiAgc3RhdHVzVGV4dDogJycsCgogIGdldFN0YXR1czogQWpheC5SZXF1ZXN0LnByb3RvdHlwZS5nZXRTdGF0dXMsCgogIGdldFN0YXR1c1RleHQ6IGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1c1RleHQgfHwgJyc7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiAnJyB9CiAgfSwKCiAgZ2V0SGVhZGVyOiBBamF4LlJlcXVlc3QucHJvdG90eXBlLmdldEhlYWRlciwKCiAgZ2V0QWxsSGVhZGVyczogZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gdGhpcy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTsKICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGwgfQogIH0sCgogIGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbihuYW1lKSB7CiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7CiAgfSwKCiAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTsKICB9LAoKICBfZ2V0SGVhZGVySlNPTjogZnVuY3Rpb24oKSB7CiAgICB2YXIganNvbiA9IHRoaXMuZ2V0SGVhZGVyKCdYLUpTT04nKTsKICAgIGlmICghanNvbikgcmV0dXJuIG51bGw7CiAgICBqc29uID0gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShqc29uKSk7CiAgICB0cnkgewogICAgICByZXR1cm4ganNvbi5ldmFsSlNPTih0aGlzLnJlcXVlc3Qub3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwKICAgICAgICAhdGhpcy5yZXF1ZXN0LmlzU2FtZU9yaWdpbigpKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhpcy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpOwogICAgfQogIH0sCgogIF9nZXRSZXNwb25zZUpTT046IGZ1bmN0aW9uKCkgewogICAgdmFyIG9wdGlvbnMgPSB0aGlzLnJlcXVlc3Qub3B0aW9uczsKICAgIGlmICghb3B0aW9ucy5ldmFsSlNPTiB8fCAob3B0aW9ucy5ldmFsSlNPTiAhPSAnZm9yY2UnICYmCiAgICAgICEodGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScpIHx8ICcnKS5pbmNsdWRlKCdhcHBsaWNhdGlvbi9qc29uJykpIHx8CiAgICAgICAgdGhpcy5yZXNwb25zZVRleHQuYmxhbmsoKSkKICAgICAgICAgIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VUZXh0LmV2YWxKU09OKG9wdGlvbnMuc2FuaXRpemVKU09OIHx8CiAgICAgICAgIXRoaXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHRoaXMucmVxdWVzdC5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKICAgIH0KICB9Cn0pOwoKQWpheC5VcGRhdGVyID0gQ2xhc3MuY3JlYXRlKEFqYXguUmVxdWVzdCwgewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKCRzdXBlciwgY29udGFpbmVyLCB1cmwsIG9wdGlvbnMpIHsKICAgIHRoaXMuY29udGFpbmVyID0gewogICAgICBzdWNjZXNzOiAoY29udGFpbmVyLnN1Y2Nlc3MgfHwgY29udGFpbmVyKSwKICAgICAgZmFpbHVyZTogKGNvbnRhaW5lci5mYWlsdXJlIHx8IChjb250YWluZXIuc3VjY2VzcyA/IG51bGwgOiBjb250YWluZXIpKQogICAgfTsKCiAgICBvcHRpb25zID0gT2JqZWN0LmNsb25lKG9wdGlvbnMpOwogICAgdmFyIG9uQ29tcGxldGUgPSBvcHRpb25zLm9uQ29tcGxldGU7CiAgICBvcHRpb25zLm9uQ29tcGxldGUgPSAoZnVuY3Rpb24ocmVzcG9uc2UsIGpzb24pIHsKICAgICAgdGhpcy51cGRhdGVDb250ZW50KHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7CiAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihvbkNvbXBsZXRlKSkgb25Db21wbGV0ZShyZXNwb25zZSwganNvbik7CiAgICB9KS5iaW5kKHRoaXMpOwoKICAgICRzdXBlcih1cmwsIG9wdGlvbnMpOwogIH0sCgogIHVwZGF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKHJlc3BvbnNlVGV4dCkgewogICAgdmFyIHJlY2VpdmVyID0gdGhpcy5jb250YWluZXJbdGhpcy5zdWNjZXNzKCkgPyAnc3VjY2VzcycgOiAnZmFpbHVyZSddLAogICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgogICAgaWYgKCFvcHRpb25zLmV2YWxTY3JpcHRzKSByZXNwb25zZVRleHQgPSByZXNwb25zZVRleHQuc3RyaXBTY3JpcHRzKCk7CgogICAgaWYgKHJlY2VpdmVyID0gJChyZWNlaXZlcikpIHsKICAgICAgaWYgKG9wdGlvbnMuaW5zZXJ0aW9uKSB7CiAgICAgICAgaWYgKE9iamVjdC5pc1N0cmluZyhvcHRpb25zLmluc2VydGlvbikpIHsKICAgICAgICAgIHZhciBpbnNlcnRpb24gPSB7IH07IGluc2VydGlvbltvcHRpb25zLmluc2VydGlvbl0gPSByZXNwb25zZVRleHQ7CiAgICAgICAgICByZWNlaXZlci5pbnNlcnQoaW5zZXJ0aW9uKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBvcHRpb25zLmluc2VydGlvbihyZWNlaXZlciwgcmVzcG9uc2VUZXh0KTsKICAgICAgfQogICAgICBlbHNlIHJlY2VpdmVyLnVwZGF0ZShyZXNwb25zZVRleHQpOwogICAgfQogIH0KfSk7CgpBamF4LlBlcmlvZGljYWxVcGRhdGVyID0gQ2xhc3MuY3JlYXRlKEFqYXguQmFzZSwgewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKCRzdXBlciwgY29udGFpbmVyLCB1cmwsIG9wdGlvbnMpIHsKICAgICRzdXBlcihvcHRpb25zKTsKICAgIHRoaXMub25Db21wbGV0ZSA9IHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlOwoKICAgIHRoaXMuZnJlcXVlbmN5ID0gKHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgfHwgMik7CiAgICB0aGlzLmRlY2F5ID0gKHRoaXMub3B0aW9ucy5kZWNheSB8fCAxKTsKCiAgICB0aGlzLnVwZGF0ZXIgPSB7IH07CiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKICAgIHRoaXMudXJsID0gdXJsOwoKICAgIHRoaXMuc3RhcnQoKTsKICB9LAoKICBzdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm9wdGlvbnMub25Db21wbGV0ZSA9IHRoaXMudXBkYXRlQ29tcGxldGUuYmluZCh0aGlzKTsKICAgIHRoaXMub25UaW1lckV2ZW50KCk7CiAgfSwKCiAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnVwZGF0ZXIub3B0aW9ucy5vbkNvbXBsZXRlID0gdW5kZWZpbmVkOwogICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpOwogICAgKHRoaXMub25Db21wbGV0ZSB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9LAoKICB1cGRhdGVDb21wbGV0ZTogZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgIGlmICh0aGlzLm9wdGlvbnMuZGVjYXkpIHsKICAgICAgdGhpcy5kZWNheSA9IChyZXNwb25zZS5yZXNwb25zZVRleHQgPT0gdGhpcy5sYXN0VGV4dCA/CiAgICAgICAgdGhpcy5kZWNheSAqIHRoaXMub3B0aW9ucy5kZWNheSA6IDEpOwoKICAgICAgdGhpcy5sYXN0VGV4dCA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDsKICAgIH0KICAgIHRoaXMudGltZXIgPSB0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLmRlbGF5KHRoaXMuZGVjYXkgKiB0aGlzLmZyZXF1ZW5jeSk7CiAgfSwKCiAgb25UaW1lckV2ZW50OiBmdW5jdGlvbigpIHsKICAgIHRoaXMudXBkYXRlciA9IG5ldyBBamF4LlVwZGF0ZXIodGhpcy5jb250YWluZXIsIHRoaXMudXJsLCB0aGlzLm9wdGlvbnMpOwogIH0KfSk7CmZ1bmN0aW9uICQoZWxlbWVudCkgewogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgewogICAgZm9yICh2YXIgaSA9IDAsIGVsZW1lbnRzID0gW10sIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKICAgICAgZWxlbWVudHMucHVzaCgkKGFyZ3VtZW50c1tpXSkpOwogICAgcmV0dXJuIGVsZW1lbnRzOwogIH0KICBpZiAoT2JqZWN0LmlzU3RyaW5nKGVsZW1lbnQpKQogICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpOwogIHJldHVybiBFbGVtZW50LmV4dGVuZChlbGVtZW50KTsKfQoKaWYgKFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGgpIHsKICBkb2N1bWVudC5fZ2V0RWxlbWVudHNCeVhQYXRoID0gZnVuY3Rpb24oZXhwcmVzc2lvbiwgcGFyZW50RWxlbWVudCkgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBxdWVyeSA9IGRvY3VtZW50LmV2YWx1YXRlKGV4cHJlc3Npb24sICQocGFyZW50RWxlbWVudCkgfHwgZG9jdW1lbnQsCiAgICAgIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTsKICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBxdWVyeS5zbmFwc2hvdExlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQogICAgICByZXN1bHRzLnB1c2goRWxlbWVudC5leHRlbmQocXVlcnkuc25hcHNob3RJdGVtKGkpKSk7CiAgICByZXR1cm4gcmVzdWx0czsKICB9Owp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmlmICghd2luZG93Lk5vZGUpIHZhciBOb2RlID0geyB9OwoKaWYgKCFOb2RlLkVMRU1FTlRfTk9ERSkgewogIC8vIERPTSBsZXZlbCAyIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwogIE9iamVjdC5leHRlbmQoTm9kZSwgewogICAgRUxFTUVOVF9OT0RFOiAxLAogICAgQVRUUklCVVRFX05PREU6IDIsCiAgICBURVhUX05PREU6IDMsCiAgICBDREFUQV9TRUNUSU9OX05PREU6IDQsCiAgICBFTlRJVFlfUkVGRVJFTkNFX05PREU6IDUsCiAgICBFTlRJVFlfTk9ERTogNiwKICAgIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTogNywKICAgIENPTU1FTlRfTk9ERTogOCwKICAgIERPQ1VNRU5UX05PREU6IDksCiAgICBET0NVTUVOVF9UWVBFX05PREU6IDEwLAogICAgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTogMTEsCiAgICBOT1RBVElPTl9OT0RFOiAxMgogIH0pOwp9CgooZnVuY3Rpb24oKSB7CiAgdmFyIGVsZW1lbnQgPSB0aGlzLkVsZW1lbnQ7CiAgdGhpcy5FbGVtZW50ID0gZnVuY3Rpb24odGFnTmFtZSwgYXR0cmlidXRlcykgewogICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwgeyB9OwogICAgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIHZhciBjYWNoZSA9IEVsZW1lbnQuY2FjaGU7CiAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUgJiYgYXR0cmlidXRlcy5uYW1lKSB7CiAgICAgIHRhZ05hbWUgPSAnPCcgKyB0YWdOYW1lICsgJyBuYW1lPSInICsgYXR0cmlidXRlcy5uYW1lICsgJyI+JzsKICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMubmFtZTsKICAgICAgcmV0dXJuIEVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSwgYXR0cmlidXRlcyk7CiAgICB9CiAgICBpZiAoIWNhY2hlW3RhZ05hbWVdKSBjYWNoZVt0YWdOYW1lXSA9IEVsZW1lbnQuZXh0ZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpOwogICAgcmV0dXJuIEVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoY2FjaGVbdGFnTmFtZV0uY2xvbmVOb2RlKGZhbHNlKSwgYXR0cmlidXRlcyk7CiAgfTsKICBPYmplY3QuZXh0ZW5kKHRoaXMuRWxlbWVudCwgZWxlbWVudCB8fCB7IH0pOwp9KS5jYWxsKHdpbmRvdyk7CgpFbGVtZW50LmNhY2hlID0geyB9OwoKRWxlbWVudC5NZXRob2RzID0gewogIHZpc2libGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHJldHVybiAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOwogIH0sCgogIHRvZ2dsZTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBFbGVtZW50W0VsZW1lbnQudmlzaWJsZShlbGVtZW50KSA/ICdoaWRlJyA6ICdzaG93J10oZWxlbWVudCk7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICBoaWRlOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICBzaG93OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgIHJldHVybiBlbGVtZW50OwogIH0sCgogIHJlbW92ZTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOwogICAgaWYgKE9iamVjdC5pc0VsZW1lbnQoY29udGVudCkpIHJldHVybiBlbGVtZW50LnVwZGF0ZSgpLmluc2VydChjb250ZW50KTsKICAgIGNvbnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOwogICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOwogICAgY29udGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICByZXBsYWNlOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKICAgIGVsc2UgaWYgKCFPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSB7CiAgICAgIGNvbnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOwogICAgICB2YXIgcmFuZ2UgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZShlbGVtZW50KTsKICAgICAgY29udGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7CiAgICAgIGNvbnRlbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoY29udGVudC5zdHJpcFNjcmlwdHMoKSk7CiAgICB9CiAgICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbnRlbnQsIGVsZW1lbnQpOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfSwKCiAgaW5zZXJ0OiBmdW5jdGlvbihlbGVtZW50LCBpbnNlcnRpb25zKSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKCiAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKGluc2VydGlvbnMpIHx8IE9iamVjdC5pc051bWJlcihpbnNlcnRpb25zKSB8fAogICAgICAgIE9iamVjdC5pc0VsZW1lbnQoaW5zZXJ0aW9ucykgfHwgKGluc2VydGlvbnMgJiYgKGluc2VydGlvbnMudG9FbGVtZW50IHx8IGluc2VydGlvbnMudG9IVE1MKSkpCiAgICAgICAgICBpbnNlcnRpb25zID0ge2JvdHRvbTppbnNlcnRpb25zfTsKCiAgICB2YXIgY29udGVudCwgaW5zZXJ0LCB0YWdOYW1lLCBjaGlsZE5vZGVzOwoKICAgIGZvciAodmFyIHBvc2l0aW9uIGluIGluc2VydGlvbnMpIHsKICAgICAgY29udGVudCAgPSBpbnNlcnRpb25zW3Bvc2l0aW9uXTsKICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbi50b0xvd2VyQ2FzZSgpOwogICAgICBpbnNlcnQgPSBFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnNbcG9zaXRpb25dOwoKICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOwogICAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkgewogICAgICAgIGluc2VydChlbGVtZW50LCBjb250ZW50KTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgY29udGVudCA9IE9iamVjdC50b0hUTUwoY29udGVudCk7CgogICAgICB0YWdOYW1lID0gKChwb3NpdGlvbiA9PSAnYmVmb3JlJyB8fCBwb3NpdGlvbiA9PSAnYWZ0ZXInKQogICAgICAgID8gZWxlbWVudC5wYXJlbnROb2RlIDogZWxlbWVudCkudGFnTmFtZS50b1VwcGVyQ2FzZSgpOwoKICAgICAgY2hpbGROb2RlcyA9IEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKTsKCiAgICAgIGlmIChwb3NpdGlvbiA9PSAndG9wJyB8fCBwb3NpdGlvbiA9PSAnYWZ0ZXInKSBjaGlsZE5vZGVzLnJldmVyc2UoKTsKICAgICAgY2hpbGROb2Rlcy5lYWNoKGluc2VydC5jdXJyeShlbGVtZW50KSk7CgogICAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKICAgIH0KCiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICB3cmFwOiBmdW5jdGlvbihlbGVtZW50LCB3cmFwcGVyLCBhdHRyaWJ1dGVzKSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGlmIChPYmplY3QuaXNFbGVtZW50KHdyYXBwZXIpKQogICAgICAkKHdyYXBwZXIpLndyaXRlQXR0cmlidXRlKGF0dHJpYnV0ZXMgfHwgeyB9KTsKICAgIGVsc2UgaWYgKE9iamVjdC5pc1N0cmluZyh3cmFwcGVyKSkgd3JhcHBlciA9IG5ldyBFbGVtZW50KHdyYXBwZXIsIGF0dHJpYnV0ZXMpOwogICAgZWxzZSB3cmFwcGVyID0gbmV3IEVsZW1lbnQoJ2RpdicsIHdyYXBwZXIpOwogICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkKICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh3cmFwcGVyLCBlbGVtZW50KTsKICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CiAgICByZXR1cm4gd3JhcHBlcjsKICB9LAoKICBpbnNwZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIHZhciByZXN1bHQgPSAnPCcgKyBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgICRIKHsnaWQnOiAnaWQnLCAnY2xhc3NOYW1lJzogJ2NsYXNzJ30pLmVhY2goZnVuY3Rpb24ocGFpcikgewogICAgICB2YXIgcHJvcGVydHkgPSBwYWlyLmZpcnN0KCksIGF0dHJpYnV0ZSA9IHBhaXIubGFzdCgpOwogICAgICB2YXIgdmFsdWUgPSAoZWxlbWVudFtwcm9wZXJ0eV0gfHwgJycpLnRvU3RyaW5nKCk7CiAgICAgIGlmICh2YWx1ZSkgcmVzdWx0ICs9ICcgJyArIGF0dHJpYnV0ZSArICc9JyArIHZhbHVlLmluc3BlY3QodHJ1ZSk7CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQgKyAnPic7CiAgfSwKCiAgcmVjdXJzaXZlbHlDb2xsZWN0OiBmdW5jdGlvbihlbGVtZW50LCBwcm9wZXJ0eSkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICB2YXIgZWxlbWVudHMgPSBbXTsKICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudFtwcm9wZXJ0eV0pCiAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IDEpCiAgICAgICAgZWxlbWVudHMucHVzaChFbGVtZW50LmV4dGVuZChlbGVtZW50KSk7CiAgICByZXR1cm4gZWxlbWVudHM7CiAgfSwKCiAgYW5jZXN0b3JzOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICByZXR1cm4gJChlbGVtZW50KS5yZWN1cnNpdmVseUNvbGxlY3QoJ3BhcmVudE5vZGUnKTsKICB9LAoKICBkZXNjZW5kYW50czogZnVuY3Rpb24oZWxlbWVudCkgewogICAgcmV0dXJuICQoZWxlbWVudCkuc2VsZWN0KCIqIik7CiAgfSwKCiAgZmlyc3REZXNjZW5kYW50OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KS5maXJzdENoaWxkOwogICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSAhPSAxKSBlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZzsKICAgIHJldHVybiAkKGVsZW1lbnQpOwogIH0sCgogIGltbWVkaWF0ZURlc2NlbmRhbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KS5maXJzdENoaWxkKSkgcmV0dXJuIFtdOwogICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSAhPSAxKSBlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZzsKICAgIGlmIChlbGVtZW50KSByZXR1cm4gW2VsZW1lbnRdLmNvbmNhdCgkKGVsZW1lbnQpLm5leHRTaWJsaW5ncygpKTsKICAgIHJldHVybiBbXTsKICB9LAoKICBwcmV2aW91c1NpYmxpbmdzOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICByZXR1cm4gJChlbGVtZW50KS5yZWN1cnNpdmVseUNvbGxlY3QoJ3ByZXZpb3VzU2libGluZycpOwogIH0sCgogIG5leHRTaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkgewogICAgcmV0dXJuICQoZWxlbWVudCkucmVjdXJzaXZlbHlDb2xsZWN0KCduZXh0U2libGluZycpOwogIH0sCgogIHNpYmxpbmdzOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIHJldHVybiBlbGVtZW50LnByZXZpb3VzU2libGluZ3MoKS5yZXZlcnNlKCkuY29uY2F0KGVsZW1lbnQubmV4dFNpYmxpbmdzKCkpOwogIH0sCgogIG1hdGNoOiBmdW5jdGlvbihlbGVtZW50LCBzZWxlY3RvcikgewogICAgaWYgKE9iamVjdC5pc1N0cmluZyhzZWxlY3RvcikpCiAgICAgIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIHJldHVybiBzZWxlY3Rvci5tYXRjaCgkKGVsZW1lbnQpKTsKICB9LAoKICB1cDogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuICQoZWxlbWVudC5wYXJlbnROb2RlKTsKICAgIHZhciBhbmNlc3RvcnMgPSBlbGVtZW50LmFuY2VzdG9ycygpOwogICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSA/IGFuY2VzdG9yc1tleHByZXNzaW9uXSA6CiAgICAgIFNlbGVjdG9yLmZpbmRFbGVtZW50KGFuY2VzdG9ycywgZXhwcmVzc2lvbiwgaW5kZXgpOwogIH0sCgogIGRvd246IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiBlbGVtZW50LmZpcnN0RGVzY2VuZGFudCgpOwogICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSA/IGVsZW1lbnQuZGVzY2VuZGFudHMoKVtleHByZXNzaW9uXSA6CiAgICAgIGVsZW1lbnQuc2VsZWN0KGV4cHJlc3Npb24pW2luZGV4IHx8IDBdOwogIH0sCgogIHByZXZpb3VzOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gJChTZWxlY3Rvci5oYW5kbGVycy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKGVsZW1lbnQpKTsKICAgIHZhciBwcmV2aW91c1NpYmxpbmdzID0gZWxlbWVudC5wcmV2aW91c1NpYmxpbmdzKCk7CiAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pID8gcHJldmlvdXNTaWJsaW5nc1tleHByZXNzaW9uXSA6CiAgICAgIFNlbGVjdG9yLmZpbmRFbGVtZW50KHByZXZpb3VzU2libGluZ3MsIGV4cHJlc3Npb24sIGluZGV4KTsKICB9LAoKICBuZXh0OiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gJChTZWxlY3Rvci5oYW5kbGVycy5uZXh0RWxlbWVudFNpYmxpbmcoZWxlbWVudCkpOwogICAgdmFyIG5leHRTaWJsaW5ncyA9IGVsZW1lbnQubmV4dFNpYmxpbmdzKCk7CiAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pID8gbmV4dFNpYmxpbmdzW2V4cHJlc3Npb25dIDoKICAgICAgU2VsZWN0b3IuZmluZEVsZW1lbnQobmV4dFNpYmxpbmdzLCBleHByZXNzaW9uLCBpbmRleCk7CiAgfSwKCiAgc2VsZWN0OiBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzID0gJEEoYXJndW1lbnRzKSwgZWxlbWVudCA9ICQoYXJncy5zaGlmdCgpKTsKICAgIHJldHVybiBTZWxlY3Rvci5maW5kQ2hpbGRFbGVtZW50cyhlbGVtZW50LCBhcmdzKTsKICB9LAoKICBhZGphY2VudDogZnVuY3Rpb24oKSB7CiAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyksIGVsZW1lbnQgPSAkKGFyZ3Muc2hpZnQoKSk7CiAgICByZXR1cm4gU2VsZWN0b3IuZmluZENoaWxkRWxlbWVudHMoZWxlbWVudC5wYXJlbnROb2RlLCBhcmdzKS53aXRob3V0KGVsZW1lbnQpOwogIH0sCgogIGlkZW50aWZ5OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIHZhciBpZCA9IGVsZW1lbnQucmVhZEF0dHJpYnV0ZSgnaWQnKSwgc2VsZiA9IGFyZ3VtZW50cy5jYWxsZWU7CiAgICBpZiAoaWQpIHJldHVybiBpZDsKICAgIGRvIHsgaWQgPSAnYW5vbnltb3VzX2VsZW1lbnRfJyArIHNlbGYuY291bnRlcisrIH0gd2hpbGUgKCQoaWQpKTsKICAgIGVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoJ2lkJywgaWQpOwogICAgcmV0dXJuIGlkOwogIH0sCgogIHJlYWRBdHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CiAgICAgIHZhciB0ID0gRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnJlYWQ7CiAgICAgIGlmICh0LnZhbHVlc1tuYW1lXSkgcmV0dXJuIHQudmFsdWVzW25hbWVdKGVsZW1lbnQsIG5hbWUpOwogICAgICBpZiAodC5uYW1lc1tuYW1lXSkgbmFtZSA9IHQubmFtZXNbbmFtZV07CiAgICAgIGlmIChuYW1lLmluY2x1ZGUoJzonKSkgewogICAgICAgIHJldHVybiAoIWVsZW1lbnQuYXR0cmlidXRlcyB8fCAhZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdKSA/IG51bGwgOgogICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0udmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTsKICB9LAoKICB3cml0ZUF0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdmFyIGF0dHJpYnV0ZXMgPSB7IH0sIHQgPSBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMud3JpdGU7CgogICAgaWYgKHR5cGVvZiBuYW1lID09ICdvYmplY3QnKSBhdHRyaWJ1dGVzID0gbmFtZTsKICAgIGVsc2UgYXR0cmlidXRlc1tuYW1lXSA9IE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkgPyB0cnVlIDogdmFsdWU7CgogICAgZm9yICh2YXIgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgIG5hbWUgPSB0Lm5hbWVzW2F0dHJdIHx8IGF0dHI7CiAgICAgIHZhbHVlID0gYXR0cmlidXRlc1thdHRyXTsKICAgICAgaWYgKHQudmFsdWVzW2F0dHJdKSBuYW1lID0gdC52YWx1ZXNbYXR0cl0oZWxlbWVudCwgdmFsdWUpOwogICAgICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSBudWxsKQogICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkKICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBuYW1lKTsKICAgICAgZWxzZSBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHJldHVybiAkKGVsZW1lbnQpLmdldERpbWVuc2lvbnMoKS5oZWlnaHQ7CiAgfSwKCiAgZ2V0V2lkdGg6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHJldHVybiAkKGVsZW1lbnQpLmdldERpbWVuc2lvbnMoKS53aWR0aDsKICB9LAoKICBjbGFzc05hbWVzOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICByZXR1cm4gbmV3IEVsZW1lbnQuQ2xhc3NOYW1lcyhlbGVtZW50KTsKICB9LAoKICBoYXNDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgewogICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CiAgICB2YXIgZWxlbWVudENsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lOwogICAgcmV0dXJuIChlbGVtZW50Q2xhc3NOYW1lLmxlbmd0aCA+IDAgJiYgKGVsZW1lbnRDbGFzc05hbWUgPT0gY2xhc3NOYW1lIHx8CiAgICAgIG5ldyBSZWdFeHAoIihefFxccykiICsgY2xhc3NOYW1lICsgIihcXHN8JCkiKS50ZXN0KGVsZW1lbnRDbGFzc05hbWUpKSk7CiAgfSwKCiAgYWRkQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOwogICAgaWYgKCFlbGVtZW50Lmhhc0NsYXNzTmFtZShjbGFzc05hbWUpKQogICAgICBlbGVtZW50LmNsYXNzTmFtZSArPSAoZWxlbWVudC5jbGFzc05hbWUgPyAnICcgOiAnJykgKyBjbGFzc05hbWU7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICByZW1vdmVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgewogICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoCiAgICAgIG5ldyBSZWdFeHAoIihefFxccyspIiArIGNsYXNzTmFtZSArICIoXFxzK3wkKSIpLCAnICcpLnN0cmlwKCk7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICB0b2dnbGVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgewogICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CiAgICByZXR1cm4gZWxlbWVudFtlbGVtZW50Lmhhc0NsYXNzTmFtZShjbGFzc05hbWUpID8KICAgICAgJ3JlbW92ZUNsYXNzTmFtZScgOiAnYWRkQ2xhc3NOYW1lJ10oY2xhc3NOYW1lKTsKICB9LAoKICAvLyByZW1vdmVzIHdoaXRlc3BhY2Utb25seSB0ZXh0IG5vZGUgY2hpbGRyZW4KICBjbGVhbldoaXRlc3BhY2U6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdmFyIG5vZGUgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7CiAgICB3aGlsZSAobm9kZSkgewogICAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmICEvXFMvLnRlc3Qobm9kZS5ub2RlVmFsdWUpKQogICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgIG5vZGUgPSBuZXh0Tm9kZTsKICAgIH0KICAgIHJldHVybiBlbGVtZW50OwogIH0sCgogIGVtcHR5OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICByZXR1cm4gJChlbGVtZW50KS5pbm5lckhUTUwuYmxhbmsoKTsKICB9LAoKICBkZXNjZW5kYW50T2Y6IGZ1bmN0aW9uKGVsZW1lbnQsIGFuY2VzdG9yKSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KSwgYW5jZXN0b3IgPSAkKGFuY2VzdG9yKTsKICAgIHZhciBvcmlnaW5hbEFuY2VzdG9yID0gYW5jZXN0b3I7CgogICAgaWYgKGVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pCiAgICAgIHJldHVybiAoZWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhbmNlc3RvcikgJiA4KSA9PT0gODsKCiAgICBpZiAoZWxlbWVudC5zb3VyY2VJbmRleCAmJiAhUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpIHsKICAgICAgdmFyIGUgPSBlbGVtZW50LnNvdXJjZUluZGV4LCBhID0gYW5jZXN0b3Iuc291cmNlSW5kZXgsCiAgICAgICBuZXh0QW5jZXN0b3IgPSBhbmNlc3Rvci5uZXh0U2libGluZzsKICAgICAgaWYgKCFuZXh0QW5jZXN0b3IpIHsKICAgICAgICBkbyB7IGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZTsgfQogICAgICAgIHdoaWxlICghKG5leHRBbmNlc3RvciA9IGFuY2VzdG9yLm5leHRTaWJsaW5nKSAmJiBhbmNlc3Rvci5wYXJlbnROb2RlKTsKICAgICAgfQogICAgICBpZiAobmV4dEFuY2VzdG9yICYmIG5leHRBbmNlc3Rvci5zb3VyY2VJbmRleCkKICAgICAgIHJldHVybiAoZSA+IGEgJiYgZSA8IG5leHRBbmNlc3Rvci5zb3VyY2VJbmRleCk7CiAgICB9CgogICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpCiAgICAgIGlmIChlbGVtZW50ID09IG9yaWdpbmFsQW5jZXN0b3IpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIHNjcm9sbFRvOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIHZhciBwb3MgPSBlbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQoKTsKICAgIHdpbmRvdy5zY3JvbGxUbyhwb3NbMF0sIHBvc1sxXSk7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICBnZXRTdHlsZTogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgc3R5bGUgPSBzdHlsZSA9PSAnZmxvYXQnID8gJ2Nzc0Zsb2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7CiAgICB2YXIgdmFsdWUgPSBlbGVtZW50LnN0eWxlW3N0eWxlXTsKICAgIGlmICghdmFsdWUpIHsKICAgICAgdmFyIGNzcyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7CiAgICAgIHZhbHVlID0gY3NzID8gY3NzW3N0eWxlXSA6IG51bGw7CiAgICB9CiAgICBpZiAoc3R5bGUgPT0gJ29wYWNpdHknKSByZXR1cm4gdmFsdWUgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IDEuMDsKICAgIHJldHVybiB2YWx1ZSA9PSAnYXV0bycgPyBudWxsIDogdmFsdWU7CiAgfSwKCiAgZ2V0T3BhY2l0eTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgcmV0dXJuICQoZWxlbWVudCkuZ2V0U3R5bGUoJ29wYWNpdHknKTsKICB9LAoKICBzZXRTdHlsZTogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGVzKSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIHZhciBlbGVtZW50U3R5bGUgPSBlbGVtZW50LnN0eWxlLCBtYXRjaDsKICAgIGlmIChPYmplY3QuaXNTdHJpbmcoc3R5bGVzKSkgewogICAgICBlbGVtZW50LnN0eWxlLmNzc1RleHQgKz0gJzsnICsgc3R5bGVzOwogICAgICByZXR1cm4gc3R5bGVzLmluY2x1ZGUoJ29wYWNpdHknKSA/CiAgICAgICAgZWxlbWVudC5zZXRPcGFjaXR5KHN0eWxlcy5tYXRjaCgvb3BhY2l0eTpccyooXGQ/XC4/XGQqKS8pWzFdKSA6IGVsZW1lbnQ7CiAgICB9CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBzdHlsZXMpCiAgICAgIGlmIChwcm9wZXJ0eSA9PSAnb3BhY2l0eScpIGVsZW1lbnQuc2V0T3BhY2l0eShzdHlsZXNbcHJvcGVydHldKTsKICAgICAgZWxzZQogICAgICAgIGVsZW1lbnRTdHlsZVsocHJvcGVydHkgPT0gJ2Zsb2F0JyB8fCBwcm9wZXJ0eSA9PSAnY3NzRmxvYXQnKSA/CiAgICAgICAgICAoT2JqZWN0LmlzVW5kZWZpbmVkKGVsZW1lbnRTdHlsZS5zdHlsZUZsb2F0KSA/ICdjc3NGbG9hdCcgOiAnc3R5bGVGbG9hdCcpIDoKICAgICAgICAgICAgcHJvcGVydHldID0gc3R5bGVzW3Byb3BlcnR5XTsKCiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICBzZXRPcGFjaXR5OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAodmFsdWUgPT0gMSB8fCB2YWx1ZSA9PT0gJycpID8gJycgOgogICAgICAodmFsdWUgPCAwLjAwMDAxKSA/IDAgOiB2YWx1ZTsKICAgIHJldHVybiBlbGVtZW50OwogIH0sCgogIGdldERpbWVuc2lvbnM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdmFyIGRpc3BsYXkgPSAkKGVsZW1lbnQpLmdldFN0eWxlKCdkaXNwbGF5Jyk7CiAgICBpZiAoZGlzcGxheSAhPSAnbm9uZScgJiYgZGlzcGxheSAhPSBudWxsKSAvLyBTYWZhcmkgYnVnCiAgICAgIHJldHVybiB7d2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHR9OwoKICAgIC8vIEFsbCAqV2lkdGggYW5kICpIZWlnaHQgcHJvcGVydGllcyBnaXZlIDAgb24gZWxlbWVudHMgd2l0aCBkaXNwbGF5IG5vbmUsCiAgICAvLyBzbyBlbmFibGUgdGhlIGVsZW1lbnQgdGVtcG9yYXJpbHkKICAgIHZhciBlbHMgPSBlbGVtZW50LnN0eWxlOwogICAgdmFyIG9yaWdpbmFsVmlzaWJpbGl0eSA9IGVscy52aXNpYmlsaXR5OwogICAgdmFyIG9yaWdpbmFsUG9zaXRpb24gPSBlbHMucG9zaXRpb247CiAgICB2YXIgb3JpZ2luYWxEaXNwbGF5ID0gZWxzLmRpc3BsYXk7CiAgICBlbHMudmlzaWJpbGl0eSA9ICdoaWRkZW4nOwogICAgZWxzLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKICAgIGVscy5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIHZhciBvcmlnaW5hbFdpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDsKICAgIHZhciBvcmlnaW5hbEhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgZWxzLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgICBlbHMucG9zaXRpb24gPSBvcmlnaW5hbFBvc2l0aW9uOwogICAgZWxzLnZpc2liaWxpdHkgPSBvcmlnaW5hbFZpc2liaWxpdHk7CiAgICByZXR1cm4ge3dpZHRoOiBvcmlnaW5hbFdpZHRoLCBoZWlnaHQ6IG9yaWdpbmFsSGVpZ2h0fTsKICB9LAoKICBtYWtlUG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICB2YXIgcG9zID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKTsKICAgIGlmIChwb3MgPT0gJ3N0YXRpYycgfHwgIXBvcykgewogICAgICBlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCA9IHRydWU7CiAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOwogICAgICAvLyBPcGVyYSByZXR1cm5zIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uaW5nIGNvbnRleHQsIHdoZW4gYW4KICAgICAgLy8gZWxlbWVudCBpcyBwb3NpdGlvbiByZWxhdGl2ZSBidXQgdG9wIGFuZCBsZWZ0IGhhdmUgbm90IGJlZW4gZGVmaW5lZAogICAgICBpZiAod2luZG93Lm9wZXJhKSB7CiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSAwOwogICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBlbGVtZW50OwogIH0sCgogIHVuZG9Qb3NpdGlvbmVkOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGlmIChlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCkgewogICAgICBlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCA9IHVuZGVmaW5lZDsKICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9CiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPQogICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9CiAgICAgICAgZWxlbWVudC5zdHlsZS5ib3R0b20gPQogICAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnJzsKICAgIH0KICAgIHJldHVybiBlbGVtZW50OwogIH0sCgogIG1ha2VDbGlwcGluZzogZnVuY3Rpb24oZWxlbWVudCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBpZiAoZWxlbWVudC5fb3ZlcmZsb3cpIHJldHVybiBlbGVtZW50OwogICAgZWxlbWVudC5fb3ZlcmZsb3cgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdvdmVyZmxvdycpIHx8ICdhdXRvJzsKICAgIGlmIChlbGVtZW50Ll9vdmVyZmxvdyAhPT0gJ2hpZGRlbicpCiAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICAgIHJldHVybiBlbGVtZW50OwogIH0sCgogIHVuZG9DbGlwcGluZzogZnVuY3Rpb24oZWxlbWVudCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBpZiAoIWVsZW1lbnQuX292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsKICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBlbGVtZW50Ll9vdmVyZmxvdyA9PSAnYXV0bycgPyAnJyA6IGVsZW1lbnQuX292ZXJmbG93OwogICAgZWxlbWVudC5fb3ZlcmZsb3cgPSBudWxsOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfSwKCiAgY3VtdWxhdGl2ZU9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkgewogICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7CiAgICBkbyB7CiAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKICAgICAgdmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOwogICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CiAgICB9IHdoaWxlIChlbGVtZW50KTsKICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOwogIH0sCgogIHBvc2l0aW9uZWRPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOwogICAgZG8gewogICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CiAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50OwogICAgICBpZiAoZWxlbWVudCkgewogICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT0gJ0JPRFknKSBicmVhazsKICAgICAgICB2YXIgcCA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7CiAgICAgICAgaWYgKHAgIT09ICdzdGF0aWMnKSBicmVhazsKICAgICAgfQogICAgfSB3aGlsZSAoZWxlbWVudCk7CiAgICByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKICB9LAoKICBhYnNvbHV0aXplOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGlmIChlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIHJldHVybjsKICAgIC8vIFBvc2l0aW9uLnByZXBhcmUoKTsgLy8gVG8gYmUgZG9uZSBtYW51YWxseSBieSBTY3JpcHR5IHdoZW4gaXQgbmVlZHMgaXQuCgogICAgdmFyIG9mZnNldHMgPSBlbGVtZW50LnBvc2l0aW9uZWRPZmZzZXQoKTsKICAgIHZhciB0b3AgICAgID0gb2Zmc2V0c1sxXTsKICAgIHZhciBsZWZ0ICAgID0gb2Zmc2V0c1swXTsKICAgIHZhciB3aWR0aCAgID0gZWxlbWVudC5jbGllbnRXaWR0aDsKICAgIHZhciBoZWlnaHQgID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7CgogICAgZWxlbWVudC5fb3JpZ2luYWxMZWZ0ICAgPSBsZWZ0IC0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLmxlZnQgIHx8IDApOwogICAgZWxlbWVudC5fb3JpZ2luYWxUb3AgICAgPSB0b3AgIC0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLnRvcCB8fCAwKTsKICAgIGVsZW1lbnQuX29yaWdpbmFsV2lkdGggID0gZWxlbWVudC5zdHlsZS53aWR0aDsKICAgIGVsZW1lbnQuX29yaWdpbmFsSGVpZ2h0ID0gZWxlbWVudC5zdHlsZS5oZWlnaHQ7CgogICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICBlbGVtZW50LnN0eWxlLnRvcCAgICA9IHRvcCArICdweCc7CiAgICBlbGVtZW50LnN0eWxlLmxlZnQgICA9IGxlZnQgKyAncHgnOwogICAgZWxlbWVudC5zdHlsZS53aWR0aCAgPSB3aWR0aCArICdweCc7CiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICByZWxhdGl2aXplOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGlmIChlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpID09ICdyZWxhdGl2ZScpIHJldHVybjsKICAgIC8vIFBvc2l0aW9uLnByZXBhcmUoKTsgLy8gVG8gYmUgZG9uZSBtYW51YWxseSBieSBTY3JpcHR5IHdoZW4gaXQgbmVlZHMgaXQuCgogICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CiAgICB2YXIgdG9wICA9IHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS50b3AgIHx8IDApIC0gKGVsZW1lbnQuX29yaWdpbmFsVG9wIHx8IDApOwogICAgdmFyIGxlZnQgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCB8fCAwKSAtIChlbGVtZW50Ll9vcmlnaW5hbExlZnQgfHwgMCk7CgogICAgZWxlbWVudC5zdHlsZS50b3AgICAgPSB0b3AgKyAncHgnOwogICAgZWxlbWVudC5zdHlsZS5sZWZ0ICAgPSBsZWZ0ICsgJ3B4JzsKICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gZWxlbWVudC5fb3JpZ2luYWxIZWlnaHQ7CiAgICBlbGVtZW50LnN0eWxlLndpZHRoICA9IGVsZW1lbnQuX29yaWdpbmFsV2lkdGg7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICBjdW11bGF0aXZlU2Nyb2xsT2Zmc2V0OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKICAgIGRvIHsKICAgICAgdmFsdWVUICs9IGVsZW1lbnQuc2Nyb2xsVG9wICB8fCAwOwogICAgICB2YWx1ZUwgKz0gZWxlbWVudC5zY3JvbGxMZWZ0IHx8IDA7CiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CiAgICB9IHdoaWxlIChlbGVtZW50KTsKICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOwogIH0sCgogIGdldE9mZnNldFBhcmVudDogZnVuY3Rpb24oZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50KSByZXR1cm4gJChlbGVtZW50Lm9mZnNldFBhcmVudCk7CiAgICBpZiAoZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5KSByZXR1cm4gJChlbGVtZW50KTsKCiAgICB3aGlsZSAoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpICYmIGVsZW1lbnQgIT0gZG9jdW1lbnQuYm9keSkKICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgIT0gJ3N0YXRpYycpCiAgICAgICAgcmV0dXJuICQoZWxlbWVudCk7CgogICAgcmV0dXJuICQoZG9jdW1lbnQuYm9keSk7CiAgfSwKCiAgdmlld3BvcnRPZmZzZXQ6IGZ1bmN0aW9uKGZvckVsZW1lbnQpIHsKICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOwoKICAgIHZhciBlbGVtZW50ID0gZm9yRWxlbWVudDsKICAgIGRvIHsKICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOwogICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7CgogICAgICAvLyBTYWZhcmkgZml4CiAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PSBkb2N1bWVudC5ib2R5ICYmCiAgICAgICAgRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKSBicmVhazsKCiAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQpOwoKICAgIGVsZW1lbnQgPSBmb3JFbGVtZW50OwogICAgZG8gewogICAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyLk9wZXJhIHx8IGVsZW1lbnQudGFnTmFtZSA9PSAnQk9EWScpIHsKICAgICAgICB2YWx1ZVQgLT0gZWxlbWVudC5zY3JvbGxUb3AgIHx8IDA7CiAgICAgICAgdmFsdWVMIC09IGVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOwogICAgICB9CiAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKTsKCiAgICByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKICB9LAoKICBjbG9uZVBvc2l0aW9uOiBmdW5jdGlvbihlbGVtZW50LCBzb3VyY2UpIHsKICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CiAgICAgIHNldExlZnQ6ICAgIHRydWUsCiAgICAgIHNldFRvcDogICAgIHRydWUsCiAgICAgIHNldFdpZHRoOiAgIHRydWUsCiAgICAgIHNldEhlaWdodDogIHRydWUsCiAgICAgIG9mZnNldFRvcDogIDAsCiAgICAgIG9mZnNldExlZnQ6IDAKICAgIH0sIGFyZ3VtZW50c1syXSB8fCB7IH0pOwoKICAgIC8vIGZpbmQgcGFnZSBwb3NpdGlvbiBvZiBzb3VyY2UKICAgIHNvdXJjZSA9ICQoc291cmNlKTsKICAgIHZhciBwID0gc291cmNlLnZpZXdwb3J0T2Zmc2V0KCk7CgogICAgLy8gZmluZCBjb29yZGluYXRlIHN5c3RlbSB0byB1c2UKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdmFyIGRlbHRhID0gWzAsIDBdOwogICAgdmFyIHBhcmVudCA9IG51bGw7CiAgICAvLyBkZWx0YSBbMCwwXSB3aWxsIGRvIGZpbmUgd2l0aCBwb3NpdGlvbjogZml4ZWQgZWxlbWVudHMsCiAgICAvLyBwb3NpdGlvbjphYnNvbHV0ZSBuZWVkcyBvZmZzZXRQYXJlbnQgZGVsdGFzCiAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKSB7CiAgICAgIHBhcmVudCA9IGVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50KCk7CiAgICAgIGRlbHRhID0gcGFyZW50LnZpZXdwb3J0T2Zmc2V0KCk7CiAgICB9CgogICAgLy8gY29ycmVjdCBieSBib2R5IG9mZnNldHMgKGZpeGVzIFNhZmFyaSkKICAgIGlmIChwYXJlbnQgPT0gZG9jdW1lbnQuYm9keSkgewogICAgICBkZWx0YVswXSAtPSBkb2N1bWVudC5ib2R5Lm9mZnNldExlZnQ7CiAgICAgIGRlbHRhWzFdIC09IGRvY3VtZW50LmJvZHkub2Zmc2V0VG9wOwogICAgfQoKICAgIC8vIHNldCBwb3NpdGlvbgogICAgaWYgKG9wdGlvbnMuc2V0TGVmdCkgICBlbGVtZW50LnN0eWxlLmxlZnQgID0gKHBbMF0gLSBkZWx0YVswXSArIG9wdGlvbnMub2Zmc2V0TGVmdCkgKyAncHgnOwogICAgaWYgKG9wdGlvbnMuc2V0VG9wKSAgICBlbGVtZW50LnN0eWxlLnRvcCAgID0gKHBbMV0gLSBkZWx0YVsxXSArIG9wdGlvbnMub2Zmc2V0VG9wKSArICdweCc7CiAgICBpZiAob3B0aW9ucy5zZXRXaWR0aCkgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBzb3VyY2Uub2Zmc2V0V2lkdGggKyAncHgnOwogICAgaWYgKG9wdGlvbnMuc2V0SGVpZ2h0KSBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHNvdXJjZS5vZmZzZXRIZWlnaHQgKyAncHgnOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfQp9OwoKRWxlbWVudC5NZXRob2RzLmlkZW50aWZ5LmNvdW50ZXIgPSAxOwoKT2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMsIHsKICBnZXRFbGVtZW50c0J5U2VsZWN0b3I6IEVsZW1lbnQuTWV0aG9kcy5zZWxlY3QsCiAgY2hpbGRFbGVtZW50czogRWxlbWVudC5NZXRob2RzLmltbWVkaWF0ZURlc2NlbmRhbnRzCn0pOwoKRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zID0gewogIHdyaXRlOiB7CiAgICBuYW1lczogewogICAgICBjbGFzc05hbWU6ICdjbGFzcycsCiAgICAgIGh0bWxGb3I6ICAgJ2ZvcicKICAgIH0sCiAgICB2YWx1ZXM6IHsgfQogIH0KfTsKCmlmIChQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSkgewogIEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZSA9IEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZS53cmFwKAogICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCwgc3R5bGUpIHsKICAgICAgc3dpdGNoIChzdHlsZSkgewogICAgICAgIGNhc2UgJ2xlZnQnOiBjYXNlICd0b3AnOiBjYXNlICdyaWdodCc6IGNhc2UgJ2JvdHRvbSc6CiAgICAgICAgICBpZiAocHJvY2VlZChlbGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHJldHVybiBudWxsOwogICAgICAgIGNhc2UgJ2hlaWdodCc6IGNhc2UgJ3dpZHRoJzoKICAgICAgICAgIC8vIHJldHVybnMgJzBweCcgZm9yIGhpZGRlbiBlbGVtZW50czsgd2Ugd2FudCBpdCB0byByZXR1cm4gbnVsbAogICAgICAgICAgaWYgKCFFbGVtZW50LnZpc2libGUoZWxlbWVudCkpIHJldHVybiBudWxsOwoKICAgICAgICAgIC8vIHJldHVybnMgdGhlIGJvcmRlci1ib3ggZGltZW5zaW9ucyByYXRoZXIgdGhhbiB0aGUgY29udGVudC1ib3gKICAgICAgICAgIC8vIGRpbWVuc2lvbnMsIHNvIHdlIHN1YnRyYWN0IHBhZGRpbmcgYW5kIGJvcmRlcnMgZnJvbSB0aGUgdmFsdWUKICAgICAgICAgIHZhciBkaW0gPSBwYXJzZUludChwcm9jZWVkKGVsZW1lbnQsIHN0eWxlKSwgMTApOwoKICAgICAgICAgIGlmIChkaW0gIT09IGVsZW1lbnRbJ29mZnNldCcgKyBzdHlsZS5jYXBpdGFsaXplKCldKQogICAgICAgICAgICByZXR1cm4gZGltICsgJ3B4JzsKCiAgICAgICAgICB2YXIgcHJvcGVydGllczsKICAgICAgICAgIGlmIChzdHlsZSA9PT0gJ2hlaWdodCcpIHsKICAgICAgICAgICAgcHJvcGVydGllcyA9IFsnYm9yZGVyLXRvcC13aWR0aCcsICdwYWRkaW5nLXRvcCcsCiAgICAgICAgICAgICAncGFkZGluZy1ib3R0b20nLCAnYm9yZGVyLWJvdHRvbS13aWR0aCddOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbJ2JvcmRlci1sZWZ0LXdpZHRoJywgJ3BhZGRpbmctbGVmdCcsCiAgICAgICAgICAgICAncGFkZGluZy1yaWdodCcsICdib3JkZXItcmlnaHQtd2lkdGgnXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmluamVjdChkaW0sIGZ1bmN0aW9uKG1lbW8sIHByb3BlcnR5KSB7CiAgICAgICAgICAgIHZhciB2YWwgPSBwcm9jZWVkKGVsZW1lbnQsIHByb3BlcnR5KTsKICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCA/IG1lbW8gOiBtZW1vIC0gcGFyc2VJbnQodmFsLCAxMCk7CiAgICAgICAgICB9KSArICdweCc7CiAgICAgICAgZGVmYXVsdDogcmV0dXJuIHByb2NlZWQoZWxlbWVudCwgc3R5bGUpOwogICAgICB9CiAgICB9CiAgKTsKCiAgRWxlbWVudC5NZXRob2RzLnJlYWRBdHRyaWJ1dGUgPSBFbGVtZW50Lk1ldGhvZHMucmVhZEF0dHJpYnV0ZS53cmFwKAogICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCwgYXR0cmlidXRlKSB7CiAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICd0aXRsZScpIHJldHVybiBlbGVtZW50LnRpdGxlOwogICAgICByZXR1cm4gcHJvY2VlZChlbGVtZW50LCBhdHRyaWJ1dGUpOwogICAgfQogICk7Cn0KCmVsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CiAgLy8gSUUgZG9lc24ndCByZXBvcnQgb2Zmc2V0cyBjb3JyZWN0bHkgZm9yIHN0YXRpYyBlbGVtZW50cywgc28gd2UgY2hhbmdlIHRoZW0KICAvLyB0byAicmVsYXRpdmUiIHRvIGdldCB0aGUgdmFsdWVzLCB0aGVuIGNoYW5nZSB0aGVtIGJhY2suCiAgRWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVudCA9IEVsZW1lbnQuTWV0aG9kcy5nZXRPZmZzZXRQYXJlbnQud3JhcCgKICAgIGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQpIHsKICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICAgIHZhciBwb3NpdGlvbiA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJyk7CiAgICAgIGlmIChwb3NpdGlvbiAhPT0gJ3N0YXRpYycpIHJldHVybiBwcm9jZWVkKGVsZW1lbnQpOwogICAgICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfSk7CiAgICAgIHZhciB2YWx1ZSA9IHByb2NlZWQoZWxlbWVudCk7CiAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogcG9zaXRpb24gfSk7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICApOwoKICAkdygncG9zaXRpb25lZE9mZnNldCB2aWV3cG9ydE9mZnNldCcpLmVhY2goZnVuY3Rpb24obWV0aG9kKSB7CiAgICBFbGVtZW50Lk1ldGhvZHNbbWV0aG9kXSA9IEVsZW1lbnQuTWV0aG9kc1ttZXRob2RdLndyYXAoCiAgICAgIGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQpIHsKICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgICAgICB2YXIgcG9zaXRpb24gPSBlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpOwogICAgICAgIGlmIChwb3NpdGlvbiAhPT0gJ3N0YXRpYycpIHJldHVybiBwcm9jZWVkKGVsZW1lbnQpOwogICAgICAgIC8vIFRyaWdnZXIgaGFzTGF5b3V0IG9uIHRoZSBvZmZzZXQgcGFyZW50IHNvIHRoYXQgSUU2IHJlcG9ydHMKICAgICAgICAvLyBhY2N1cmF0ZSBvZmZzZXRUb3AgYW5kIG9mZnNldExlZnQgdmFsdWVzIGZvciBwb3NpdGlvbjogZml4ZWQuCiAgICAgICAgdmFyIG9mZnNldFBhcmVudCA9IGVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50KCk7CiAgICAgICAgaWYgKG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpCiAgICAgICAgICBvZmZzZXRQYXJlbnQuc2V0U3R5bGUoeyB6b29tOiAxIH0pOwogICAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9KTsKICAgICAgICB2YXIgdmFsdWUgPSBwcm9jZWVkKGVsZW1lbnQpOwogICAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogcG9zaXRpb24gfSk7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICApOwogIH0pOwoKICBFbGVtZW50Lk1ldGhvZHMuZ2V0U3R5bGUgPSBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBzdHlsZSA9IChzdHlsZSA9PSAnZmxvYXQnIHx8IHN0eWxlID09ICdjc3NGbG9hdCcpID8gJ3N0eWxlRmxvYXQnIDogc3R5bGUuY2FtZWxpemUoKTsKICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQuc3R5bGVbc3R5bGVdOwogICAgaWYgKCF2YWx1ZSAmJiBlbGVtZW50LmN1cnJlbnRTdHlsZSkgdmFsdWUgPSBlbGVtZW50LmN1cnJlbnRTdHlsZVtzdHlsZV07CgogICAgaWYgKHN0eWxlID09ICdvcGFjaXR5JykgewogICAgICBpZiAodmFsdWUgPSAoZWxlbWVudC5nZXRTdHlsZSgnZmlsdGVyJykgfHwgJycpLm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKSkKICAgICAgICBpZiAodmFsdWVbMV0pIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlWzFdKSAvIDEwMDsKICAgICAgcmV0dXJuIDEuMDsKICAgIH0KCiAgICBpZiAodmFsdWUgPT0gJ2F1dG8nKSB7CiAgICAgIGlmICgoc3R5bGUgPT0gJ3dpZHRoJyB8fCBzdHlsZSA9PSAnaGVpZ2h0JykgJiYgKGVsZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXknKSAhPSAnbm9uZScpKQogICAgICAgIHJldHVybiBlbGVtZW50WydvZmZzZXQnICsgc3R5bGUuY2FwaXRhbGl6ZSgpXSArICdweCc7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH07CgogIEVsZW1lbnQuTWV0aG9kcy5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKICAgIGZ1bmN0aW9uIHN0cmlwQWxwaGEoZmlsdGVyKXsKICAgICAgcmV0dXJuIGZpbHRlci5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksJycpOwogICAgfQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICB2YXIgY3VycmVudFN0eWxlID0gZWxlbWVudC5jdXJyZW50U3R5bGU7CiAgICBpZiAoKGN1cnJlbnRTdHlsZSAmJiAhY3VycmVudFN0eWxlLmhhc0xheW91dCkgfHwKICAgICAgKCFjdXJyZW50U3R5bGUgJiYgZWxlbWVudC5zdHlsZS56b29tID09ICdub3JtYWwnKSkKICAgICAgICBlbGVtZW50LnN0eWxlLnpvb20gPSAxOwoKICAgIHZhciBmaWx0ZXIgPSBlbGVtZW50LmdldFN0eWxlKCdmaWx0ZXInKSwgc3R5bGUgPSBlbGVtZW50LnN0eWxlOwogICAgaWYgKHZhbHVlID09IDEgfHwgdmFsdWUgPT09ICcnKSB7CiAgICAgIChmaWx0ZXIgPSBzdHJpcEFscGhhKGZpbHRlcikpID8KICAgICAgICBzdHlsZS5maWx0ZXIgPSBmaWx0ZXIgOiBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoJ2ZpbHRlcicpOwogICAgICByZXR1cm4gZWxlbWVudDsKICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwLjAwMDAxKSB2YWx1ZSA9IDA7CiAgICBzdHlsZS5maWx0ZXIgPSBzdHJpcEFscGhhKGZpbHRlcikgKwogICAgICAnYWxwaGEob3BhY2l0eT0nICsgKHZhbHVlICogMTAwKSArICcpJzsKICAgIHJldHVybiBlbGVtZW50OwogIH07CgogIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucyA9IHsKICAgIHJlYWQ6IHsKICAgICAgbmFtZXM6IHsKICAgICAgICAnY2xhc3MnOiAnY2xhc3NOYW1lJywKICAgICAgICAnZm9yJzogICAnaHRtbEZvcicKICAgICAgfSwKICAgICAgdmFsdWVzOiB7CiAgICAgICAgX2dldEF0dHI6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgewogICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgMik7CiAgICAgICAgfSwKICAgICAgICBfZ2V0QXR0ck5vZGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgewogICAgICAgICAgdmFyIG5vZGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKICAgICAgICAgIHJldHVybiBub2RlID8gbm9kZS52YWx1ZSA6ICIiOwogICAgICAgIH0sCiAgICAgICAgX2dldEV2OiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKICAgICAgICAgIGF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlID8gYXR0cmlidXRlLnRvU3RyaW5nKCkuc2xpY2UoMjMsIC0yKSA6IG51bGw7CiAgICAgICAgfSwKICAgICAgICBfZmxhZzogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CiAgICAgICAgICByZXR1cm4gJChlbGVtZW50KS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSA/IGF0dHJpYnV0ZSA6IG51bGw7CiAgICAgICAgfSwKICAgICAgICBzdHlsZTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0sCiAgICAgICAgdGl0bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgICAgICAgIHJldHVybiBlbGVtZW50LnRpdGxlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy53cml0ZSA9IHsKICAgIG5hbWVzOiBPYmplY3QuZXh0ZW5kKHsKICAgICAgY2VsbHBhZGRpbmc6ICdjZWxsUGFkZGluZycsCiAgICAgIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnCiAgICB9LCBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMucmVhZC5uYW1lcyksCiAgICB2YWx1ZXM6IHsKICAgICAgY2hlY2tlZDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKICAgICAgICBlbGVtZW50LmNoZWNrZWQgPSAhIXZhbHVlOwogICAgICB9LAoKICAgICAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CiAgICAgICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gdmFsdWUgPyB2YWx1ZSA6ICcnOwogICAgICB9CiAgICB9CiAgfTsKCiAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLmhhcyA9IHt9OwoKICAkdygnY29sU3BhbiByb3dTcGFuIHZBbGlnbiBkYXRlVGltZSBhY2Nlc3NLZXkgdGFiSW5kZXggJyArCiAgICAgICdlbmNUeXBlIG1heExlbmd0aCByZWFkT25seSBsb25nRGVzYycpLmVhY2goZnVuY3Rpb24oYXR0cikgewogICAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLndyaXRlLm5hbWVzW2F0dHIudG9Mb3dlckNhc2UoKV0gPSBhdHRyOwogICAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLmhhc1thdHRyLnRvTG93ZXJDYXNlKCldID0gYXR0cjsKICB9KTsKCiAgKGZ1bmN0aW9uKHYpIHsKICAgIE9iamVjdC5leHRlbmQodiwgewogICAgICBocmVmOiAgICAgICAgdi5fZ2V0QXR0ciwKICAgICAgc3JjOiAgICAgICAgIHYuX2dldEF0dHIsCiAgICAgIHR5cGU6ICAgICAgICB2Ll9nZXRBdHRyLAogICAgICBhY3Rpb246ICAgICAgdi5fZ2V0QXR0ck5vZGUsCiAgICAgIGRpc2FibGVkOiAgICB2Ll9mbGFnLAogICAgICBjaGVja2VkOiAgICAgdi5fZmxhZywKICAgICAgcmVhZG9ubHk6ICAgIHYuX2ZsYWcsCiAgICAgIG11bHRpcGxlOiAgICB2Ll9mbGFnLAogICAgICBvbmxvYWQ6ICAgICAgdi5fZ2V0RXYsCiAgICAgIG9udW5sb2FkOiAgICB2Ll9nZXRFdiwKICAgICAgb25jbGljazogICAgIHYuX2dldEV2LAogICAgICBvbmRibGNsaWNrOiAgdi5fZ2V0RXYsCiAgICAgIG9ubW91c2Vkb3duOiB2Ll9nZXRFdiwKICAgICAgb25tb3VzZXVwOiAgIHYuX2dldEV2LAogICAgICBvbm1vdXNlb3Zlcjogdi5fZ2V0RXYsCiAgICAgIG9ubW91c2Vtb3ZlOiB2Ll9nZXRFdiwKICAgICAgb25tb3VzZW91dDogIHYuX2dldEV2LAogICAgICBvbmZvY3VzOiAgICAgdi5fZ2V0RXYsCiAgICAgIG9uYmx1cjogICAgICB2Ll9nZXRFdiwKICAgICAgb25rZXlwcmVzczogIHYuX2dldEV2LAogICAgICBvbmtleWRvd246ICAgdi5fZ2V0RXYsCiAgICAgIG9ua2V5dXA6ICAgICB2Ll9nZXRFdiwKICAgICAgb25zdWJtaXQ6ICAgIHYuX2dldEV2LAogICAgICBvbnJlc2V0OiAgICAgdi5fZ2V0RXYsCiAgICAgIG9uc2VsZWN0OiAgICB2Ll9nZXRFdiwKICAgICAgb25jaGFuZ2U6ICAgIHYuX2dldEV2CiAgICB9KTsKICB9KShFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMucmVhZC52YWx1ZXMpOwp9CgplbHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5HZWNrbyAmJiAvcnY6MVwuOFwuMC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgewogIEVsZW1lbnQuTWV0aG9kcy5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gKHZhbHVlID09IDEpID8gMC45OTk5OTkgOgogICAgICAodmFsdWUgPT09ICcnKSA/ICcnIDogKHZhbHVlIDwgMC4wMDAwMSkgPyAwIDogdmFsdWU7CiAgICByZXR1cm4gZWxlbWVudDsKICB9Owp9CgplbHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsKICBFbGVtZW50Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICh2YWx1ZSA9PSAxIHx8IHZhbHVlID09PSAnJykgPyAnJyA6CiAgICAgICh2YWx1ZSA8IDAuMDAwMDEpID8gMCA6IHZhbHVlOwoKICAgIGlmICh2YWx1ZSA9PSAxKQogICAgICBpZihlbGVtZW50LnRhZ05hbWUgPT0gJ0lNRycgJiYgZWxlbWVudC53aWR0aCkgewogICAgICAgIGVsZW1lbnQud2lkdGgrKzsgZWxlbWVudC53aWR0aC0tOwogICAgICB9IGVsc2UgdHJ5IHsKICAgICAgICB2YXIgbiA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyk7CiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChuKTsKICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG4pOwogICAgICB9IGNhdGNoIChlKSB7IH0KCiAgICByZXR1cm4gZWxlbWVudDsKICB9OwoKICAvLyBTYWZhcmkgcmV0dXJucyBtYXJnaW5zIG9uIGJvZHkgd2hpY2ggaXMgaW5jb3JyZWN0IGlmIHRoZSBjaGlsZCBpcyBhYnNvbHV0ZWx5CiAgLy8gcG9zaXRpb25lZC4gIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCByZWRlZmluZSBFbGVtZW50I2N1bXVsYXRpdmVPZmZzZXQgZm9yCiAgLy8gS0hUTUwvV2ViS2l0IG9ubHkuCiAgRWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKICAgIGRvIHsKICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOwogICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7CiAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PSBkb2N1bWVudC5ib2R5KQogICAgICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIGJyZWFrOwoKICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50OwogICAgfSB3aGlsZSAoZWxlbWVudCk7CgogICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCh2YWx1ZUwsIHZhbHVlVCk7CiAgfTsKfQoKaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFIHx8IFByb3RvdHlwZS5Ccm93c2VyLk9wZXJhKSB7CiAgLy8gSUUgYW5kIE9wZXJhIGFyZSBtaXNzaW5nIC5pbm5lckhUTUwgc3VwcG9ydCBmb3IgVEFCTEUtcmVsYXRlZCBhbmQgU0VMRUNUIGVsZW1lbnRzCiAgRWxlbWVudC5NZXRob2RzLnVwZGF0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwoKICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSByZXR1cm4gZWxlbWVudC51cGRhdGUoKS5pbnNlcnQoY29udGVudCk7CgogICAgY29udGVudCA9IE9iamVjdC50b0hUTUwoY29udGVudCk7CiAgICB2YXIgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOwoKICAgIGlmICh0YWdOYW1lIGluIEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucy50YWdzKSB7CiAgICAgICRBKGVsZW1lbnQuY2hpbGROb2RlcykuZWFjaChmdW5jdGlvbihub2RlKSB7IGVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSkgfSk7CiAgICAgIEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKQogICAgICAgIC5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsgZWxlbWVudC5hcHBlbmRDaGlsZChub2RlKSB9KTsKICAgIH0KICAgIGVsc2UgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOwoKICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfTsKfQoKaWYgKCdvdXRlckhUTUwnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSB7CiAgRWxlbWVudC5NZXRob2RzLnJlcGxhY2UgPSBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKCiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQudG9FbGVtZW50KCk7CiAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkgewogICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbnRlbnQsIGVsZW1lbnQpOwogICAgICByZXR1cm4gZWxlbWVudDsKICAgIH0KCiAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsKICAgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGUsIHRhZ05hbWUgPSBwYXJlbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOwoKICAgIGlmIChFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMudGFnc1t0YWdOYW1lXSkgewogICAgICB2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHQoKTsKICAgICAgdmFyIGZyYWdtZW50cyA9IEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKTsKICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpOwogICAgICBpZiAobmV4dFNpYmxpbmcpCiAgICAgICAgZnJhZ21lbnRzLmVhY2goZnVuY3Rpb24obm9kZSkgeyBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHRTaWJsaW5nKSB9KTsKICAgICAgZWxzZQogICAgICAgIGZyYWdtZW50cy5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsgcGFyZW50LmFwcGVuZENoaWxkKG5vZGUpIH0pOwogICAgfQogICAgZWxzZSBlbGVtZW50Lm91dGVySFRNTCA9IGNvbnRlbnQuc3RyaXBTY3JpcHRzKCk7CgogICAgY29udGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7CiAgICByZXR1cm4gZWxlbWVudDsKICB9Owp9CgpFbGVtZW50Ll9yZXR1cm5PZmZzZXQgPSBmdW5jdGlvbihsLCB0KSB7CiAgdmFyIHJlc3VsdCA9IFtsLCB0XTsKICByZXN1bHQubGVmdCA9IGw7CiAgcmVzdWx0LnRvcCA9IHQ7CiAgcmV0dXJuIHJlc3VsdDsKfTsKCkVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudCA9IGZ1bmN0aW9uKHRhZ05hbWUsIGh0bWwpIHsKICB2YXIgZGl2ID0gbmV3IEVsZW1lbnQoJ2RpdicpLCB0ID0gRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRhZ3NbdGFnTmFtZV07CiAgaWYgKHQpIHsKICAgIGRpdi5pbm5lckhUTUwgPSB0WzBdICsgaHRtbCArIHRbMV07CiAgICB0WzJdLnRpbWVzKGZ1bmN0aW9uKCkgeyBkaXYgPSBkaXYuZmlyc3RDaGlsZCB9KTsKICB9IGVsc2UgZGl2LmlubmVySFRNTCA9IGh0bWw7CiAgcmV0dXJuICRBKGRpdi5jaGlsZE5vZGVzKTsKfTsKCkVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucyA9IHsKICBiZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgZWxlbWVudCk7CiAgfSwKICB0b3A6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW1lbnQuZmlyc3RDaGlsZCk7CiAgfSwKICBib3R0b206IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7CiAgfSwKICBhZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgbm9kZSkgewogICAgZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBlbGVtZW50Lm5leHRTaWJsaW5nKTsKICB9LAogIHRhZ3M6IHsKICAgIFRBQkxFOiAgWyc8dGFibGU+JywgICAgICAgICAgICAgICAgJzwvdGFibGU+JywgICAgICAgICAgICAgICAgICAgMV0sCiAgICBUQk9EWTogIFsnPHRhYmxlPjx0Ym9keT4nLCAgICAgICAgICc8L3Rib2R5PjwvdGFibGU+JywgICAgICAgICAgIDJdLAogICAgVFI6ICAgICBbJzx0YWJsZT48dGJvZHk+PHRyPicsICAgICAnPC90cj48L3Rib2R5PjwvdGFibGU+JywgICAgICAzXSwKICAgIFREOiAgICAgWyc8dGFibGU+PHRib2R5Pjx0cj48dGQ+JywgJzwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+JywgNF0sCiAgICBTRUxFQ1Q6IFsnPHNlbGVjdD4nLCAgICAgICAgICAgICAgICc8L3NlbGVjdD4nLCAgICAgICAgICAgICAgICAgIDFdCiAgfQp9OwoKKGZ1bmN0aW9uKCkgewogIE9iamVjdC5leHRlbmQodGhpcy50YWdzLCB7CiAgICBUSEVBRDogdGhpcy50YWdzLlRCT0RZLAogICAgVEZPT1Q6IHRoaXMudGFncy5UQk9EWSwKICAgIFRIOiAgICB0aGlzLnRhZ3MuVEQKICB9KTsKfSkuY2FsbChFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMpOwoKRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZCA9IHsKICBoYXNBdHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgewogICAgYXR0cmlidXRlID0gRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLmhhc1thdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKICAgIHZhciBub2RlID0gJChlbGVtZW50KS5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZSk7CiAgICByZXR1cm4gbm9kZSAmJiBub2RlLnNwZWNpZmllZDsKICB9Cn07CgpFbGVtZW50Lk1ldGhvZHMuQnlUYWcgPSB7IH07CgpPYmplY3QuZXh0ZW5kKEVsZW1lbnQsIEVsZW1lbnQuTWV0aG9kcyk7CgppZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMgJiYKICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLl9fcHJvdG9fXykgewogIHdpbmRvdy5IVE1MRWxlbWVudCA9IHsgfTsKICB3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykuX19wcm90b19fOwogIFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMgPSB0cnVlOwp9CgpFbGVtZW50LmV4dGVuZCA9IChmdW5jdGlvbigpIHsKICBpZiAoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zKQogICAgcmV0dXJuIFByb3RvdHlwZS5LOwoKICB2YXIgTWV0aG9kcyA9IHsgfSwgQnlUYWcgPSBFbGVtZW50Lk1ldGhvZHMuQnlUYWc7CgogIHZhciBleHRlbmQgPSBPYmplY3QuZXh0ZW5kKGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlIHx8CiAgICAgICAgZWxlbWVudC5ub2RlVHlwZSAhPSAxIHx8IGVsZW1lbnQgPT0gd2luZG93KSByZXR1cm4gZWxlbWVudDsKCiAgICB2YXIgbWV0aG9kcyA9IE9iamVjdC5jbG9uZShNZXRob2RzKSwKICAgICAgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZSwgcHJvcGVydHksIHZhbHVlOwoKICAgIC8vIGV4dGVuZCBtZXRob2RzIGZvciBzcGVjaWZpYyB0YWdzCiAgICBpZiAoQnlUYWdbdGFnTmFtZV0pIE9iamVjdC5leHRlbmQobWV0aG9kcywgQnlUYWdbdGFnTmFtZV0pOwoKICAgIGZvciAocHJvcGVydHkgaW4gbWV0aG9kcykgewogICAgICB2YWx1ZSA9IG1ldGhvZHNbcHJvcGVydHldOwogICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpICYmICEocHJvcGVydHkgaW4gZWxlbWVudCkpCiAgICAgICAgZWxlbWVudFtwcm9wZXJ0eV0gPSB2YWx1ZS5tZXRob2RpemUoKTsKICAgIH0KCiAgICBlbGVtZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CiAgICByZXR1cm4gZWxlbWVudDsKCiAgfSwgewogICAgcmVmcmVzaDogZnVuY3Rpb24oKSB7CiAgICAgIC8vIGV4dGVuZCBtZXRob2RzIGZvciBhbGwgdGFncyAoU2FmYXJpIGRvZXNuJ3QgbmVlZCB0aGlzKQogICAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMpIHsKICAgICAgICBPYmplY3QuZXh0ZW5kKE1ldGhvZHMsIEVsZW1lbnQuTWV0aG9kcyk7CiAgICAgICAgT2JqZWN0LmV4dGVuZChNZXRob2RzLCBFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkKTsKICAgICAgfQogICAgfQogIH0pOwoKICBleHRlbmQucmVmcmVzaCgpOwogIHJldHVybiBleHRlbmQ7Cn0pKCk7CgpFbGVtZW50Lmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgewogIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSkgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgcmV0dXJuIEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQuaGFzQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZSk7Cn07CgpFbGVtZW50LmFkZE1ldGhvZHMgPSBmdW5jdGlvbihtZXRob2RzKSB7CiAgdmFyIEYgPSBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLCBUID0gRWxlbWVudC5NZXRob2RzLkJ5VGFnOwoKICBpZiAoIW1ldGhvZHMpIHsKICAgIE9iamVjdC5leHRlbmQoRm9ybSwgRm9ybS5NZXRob2RzKTsKICAgIE9iamVjdC5leHRlbmQoRm9ybS5FbGVtZW50LCBGb3JtLkVsZW1lbnQuTWV0aG9kcyk7CiAgICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcy5CeVRhZywgewogICAgICAiRk9STSI6ICAgICBPYmplY3QuY2xvbmUoRm9ybS5NZXRob2RzKSwKICAgICAgIklOUFVUIjogICAgT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSwKICAgICAgIlNFTEVDVCI6ICAgT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSwKICAgICAgIlRFWFRBUkVBIjogT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKQogICAgfSk7CiAgfQoKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7CiAgICB2YXIgdGFnTmFtZSA9IG1ldGhvZHM7CiAgICBtZXRob2RzID0gYXJndW1lbnRzWzFdOwogIH0KCiAgaWYgKCF0YWdOYW1lKSBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcywgbWV0aG9kcyB8fCB7IH0pOwogIGVsc2UgewogICAgaWYgKE9iamVjdC5pc0FycmF5KHRhZ05hbWUpKSB0YWdOYW1lLmVhY2goZXh0ZW5kKTsKICAgIGVsc2UgZXh0ZW5kKHRhZ05hbWUpOwogIH0KCiAgZnVuY3Rpb24gZXh0ZW5kKHRhZ05hbWUpIHsKICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7CiAgICBpZiAoIUVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXSkKICAgICAgRWxlbWVudC5NZXRob2RzLkJ5VGFnW3RhZ05hbWVdID0geyB9OwogICAgT2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFtZV0sIG1ldGhvZHMpOwogIH0KCiAgZnVuY3Rpb24gY29weShtZXRob2RzLCBkZXN0aW5hdGlvbiwgb25seUlmQWJzZW50KSB7CiAgICBvbmx5SWZBYnNlbnQgPSBvbmx5SWZBYnNlbnQgfHwgZmFsc2U7CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBtZXRob2RzKSB7CiAgICAgIHZhciB2YWx1ZSA9IG1ldGhvZHNbcHJvcGVydHldOwogICAgICBpZiAoIU9iamVjdC5pc0Z1bmN0aW9uKHZhbHVlKSkgY29udGludWU7CiAgICAgIGlmICghb25seUlmQWJzZW50IHx8ICEocHJvcGVydHkgaW4gZGVzdGluYXRpb24pKQogICAgICAgIGRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IHZhbHVlLm1ldGhvZGl6ZSgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZERPTUNsYXNzKHRhZ05hbWUpIHsKICAgIHZhciBrbGFzczsKICAgIHZhciB0cmFucyA9IHsKICAgICAgIk9QVEdST1VQIjogIk9wdEdyb3VwIiwgIlRFWFRBUkVBIjogIlRleHRBcmVhIiwgIlAiOiAiUGFyYWdyYXBoIiwKICAgICAgIkZJRUxEU0VUIjogIkZpZWxkU2V0IiwgIlVMIjogIlVMaXN0IiwgIk9MIjogIk9MaXN0IiwgIkRMIjogIkRMaXN0IiwKICAgICAgIkRJUiI6ICJEaXJlY3RvcnkiLCAiSDEiOiAiSGVhZGluZyIsICJIMiI6ICJIZWFkaW5nIiwgIkgzIjogIkhlYWRpbmciLAogICAgICAiSDQiOiAiSGVhZGluZyIsICJINSI6ICJIZWFkaW5nIiwgIkg2IjogIkhlYWRpbmciLCAiUSI6ICJRdW90ZSIsCiAgICAgICJJTlMiOiAiTW9kIiwgIkRFTCI6ICJNb2QiLCAiQSI6ICJBbmNob3IiLCAiSU1HIjogIkltYWdlIiwgIkNBUFRJT04iOgogICAgICAiVGFibGVDYXB0aW9uIiwgIkNPTCI6ICJUYWJsZUNvbCIsICJDT0xHUk9VUCI6ICJUYWJsZUNvbCIsICJUSEVBRCI6CiAgICAgICJUYWJsZVNlY3Rpb24iLCAiVEZPT1QiOiAiVGFibGVTZWN0aW9uIiwgIlRCT0RZIjogIlRhYmxlU2VjdGlvbiIsICJUUiI6CiAgICAgICJUYWJsZVJvdyIsICJUSCI6ICJUYWJsZUNlbGwiLCAiVEQiOiAiVGFibGVDZWxsIiwgIkZSQU1FU0VUIjoKICAgICAgIkZyYW1lU2V0IiwgIklGUkFNRSI6ICJJRnJhbWUiCiAgICB9OwogICAgaWYgKHRyYW5zW3RhZ05hbWVdKSBrbGFzcyA9ICdIVE1MJyArIHRyYW5zW3RhZ05hbWVdICsgJ0VsZW1lbnQnOwogICAgaWYgKHdpbmRvd1trbGFzc10pIHJldHVybiB3aW5kb3dba2xhc3NdOwogICAga2xhc3MgPSAnSFRNTCcgKyB0YWdOYW1lICsgJ0VsZW1lbnQnOwogICAgaWYgKHdpbmRvd1trbGFzc10pIHJldHVybiB3aW5kb3dba2xhc3NdOwogICAga2xhc3MgPSAnSFRNTCcgKyB0YWdOYW1lLmNhcGl0YWxpemUoKSArICdFbGVtZW50JzsKICAgIGlmICh3aW5kb3dba2xhc3NdKSByZXR1cm4gd2luZG93W2tsYXNzXTsKCiAgICB3aW5kb3dba2xhc3NdID0geyB9OwogICAgd2luZG93W2tsYXNzXS5wcm90b3R5cGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpLl9fcHJvdG9fXzsKICAgIHJldHVybiB3aW5kb3dba2xhc3NdOwogIH0KCiAgaWYgKEYuRWxlbWVudEV4dGVuc2lvbnMpIHsKICAgIGNvcHkoRWxlbWVudC5NZXRob2RzLCBIVE1MRWxlbWVudC5wcm90b3R5cGUpOwogICAgY29weShFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkLCBIVE1MRWxlbWVudC5wcm90b3R5cGUsIHRydWUpOwogIH0KCiAgaWYgKEYuU3BlY2lmaWNFbGVtZW50RXh0ZW5zaW9ucykgewogICAgZm9yICh2YXIgdGFnIGluIEVsZW1lbnQuTWV0aG9kcy5CeVRhZykgewogICAgICB2YXIga2xhc3MgPSBmaW5kRE9NQ2xhc3ModGFnKTsKICAgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZChrbGFzcykpIGNvbnRpbnVlOwogICAgICBjb3B5KFRbdGFnXSwga2xhc3MucHJvdG90eXBlKTsKICAgIH0KICB9CgogIE9iamVjdC5leHRlbmQoRWxlbWVudCwgRWxlbWVudC5NZXRob2RzKTsKICBkZWxldGUgRWxlbWVudC5CeVRhZzsKCiAgaWYgKEVsZW1lbnQuZXh0ZW5kLnJlZnJlc2gpIEVsZW1lbnQuZXh0ZW5kLnJlZnJlc2goKTsKICBFbGVtZW50LmNhY2hlID0geyB9Owp9OwoKZG9jdW1lbnQudmlld3BvcnQgPSB7CiAgZ2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZGltZW5zaW9ucyA9IHsgfTsKICAgIHZhciBCID0gUHJvdG90eXBlLkJyb3dzZXI7CiAgICAkdygnd2lkdGggaGVpZ2h0JykuZWFjaChmdW5jdGlvbihkKSB7CiAgICAgIHZhciBEID0gZC5jYXBpdGFsaXplKCk7CiAgICAgIGRpbWVuc2lvbnNbZF0gPSAoQi5XZWJLaXQgJiYgIWRvY3VtZW50LmV2YWx1YXRlKSA/IHNlbGZbJ2lubmVyJyArIERdIDoKICAgICAgICAoQi5PcGVyYSkgPyBkb2N1bWVudC5ib2R5WydjbGllbnQnICsgRF0gOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbJ2NsaWVudCcgKyBEXTsKICAgIH0pOwogICAgcmV0dXJuIGRpbWVuc2lvbnM7CiAgfSwKCiAgZ2V0V2lkdGg6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZ2V0RGltZW5zaW9ucygpLndpZHRoOwogIH0sCgogIGdldEhlaWdodDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkuaGVpZ2h0OwogIH0sCgogIGdldFNjcm9sbE9mZnNldHM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCgKICAgICAgd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCwKICAgICAgd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApOwogIH0KfTsKLyogUG9ydGlvbnMgb2YgdGhlIFNlbGVjdG9yIGNsYXNzIGFyZSBkZXJpdmVkIGZyb20gSmFjayBTbG9jdW3DouKCrOKEonMgRG9tUXVlcnksCiAqIHBhcnQgb2YgWVVJLUV4dCB2ZXJzaW9uIDAuNDAsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbiBNSVQtc3R5bGUKICogbGljZW5zZS4gIFBsZWFzZSBzZWUgaHR0cDovL3d3dy55dWktZXh0LmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uICovCgp2YXIgU2VsZWN0b3IgPSBDbGFzcy5jcmVhdGUoewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHsKICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3RyaXAoKTsKICAgIHRoaXMuY29tcGlsZU1hdGNoZXIoKTsKICB9LAoKICBzaG91bGRVc2VYUGF0aDogZnVuY3Rpb24oKSB7CiAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGgpIHJldHVybiBmYWxzZTsKCiAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lvbjsKCiAgICAvLyBTYWZhcmkgMyBjaG9rZXMgb24gOiotb2YtdHlwZSBhbmQgOmVtcHR5CiAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0ICYmCiAgICAgKGUuaW5jbHVkZSgiLW9mLXR5cGUiKSB8fCBlLmluY2x1ZGUoIjplbXB0eSIpKSkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFhQYXRoIGNhbid0IGRvIG5hbWVzcGFjZWQgYXR0cmlidXRlcywgbm9yIGNhbiBpdCByZWFkCiAgICAvLyB0aGUgImNoZWNrZWQiIHByb3BlcnR5IGZyb20gRE9NIG5vZGVzCiAgICBpZiAoKC8oXFtbXHctXSo/Onw6Y2hlY2tlZCkvKS50ZXN0KHRoaXMuZXhwcmVzc2lvbikpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBjb21waWxlTWF0Y2hlcjogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5zaG91bGRVc2VYUGF0aCgpKQogICAgICByZXR1cm4gdGhpcy5jb21waWxlWFBhdGhNYXRjaGVyKCk7CgogICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Npb24sIHBzID0gU2VsZWN0b3IucGF0dGVybnMsIGggPSBTZWxlY3Rvci5oYW5kbGVycywKICAgICAgICBjID0gU2VsZWN0b3IuY3JpdGVyaWEsIGxlLCBwLCBtOwoKICAgIGlmIChTZWxlY3Rvci5fY2FjaGVbZV0pIHsKICAgICAgdGhpcy5tYXRjaGVyID0gU2VsZWN0b3IuX2NhY2hlW2VdOwogICAgICByZXR1cm47CiAgICB9CgogICAgdGhpcy5tYXRjaGVyID0gWyJ0aGlzLm1hdGNoZXIgPSBmdW5jdGlvbihyb290KSB7IiwKICAgICAgICAgICAgICAgICAgICAidmFyIHIgPSByb290LCBoID0gU2VsZWN0b3IuaGFuZGxlcnMsIGMgPSBmYWxzZSwgbjsiXTsKCiAgICB3aGlsZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7CiAgICAgIGxlID0gZTsKICAgICAgZm9yICh2YXIgaSBpbiBwcykgewogICAgICAgIHAgPSBwc1tpXTsKICAgICAgICBpZiAobSA9IGUubWF0Y2gocCkpIHsKICAgICAgICAgIHRoaXMubWF0Y2hlci5wdXNoKE9iamVjdC5pc0Z1bmN0aW9uKGNbaV0pID8gY1tpXShtKSA6CiAgICAJICAgICAgbmV3IFRlbXBsYXRlKGNbaV0pLmV2YWx1YXRlKG0pKTsKICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdGhpcy5tYXRjaGVyLnB1c2goInJldHVybiBoLnVuaXF1ZShuKTtcbn0iKTsKICAgIGV2YWwodGhpcy5tYXRjaGVyLmpvaW4oJ1xuJykpOwogICAgU2VsZWN0b3IuX2NhY2hlW3RoaXMuZXhwcmVzc2lvbl0gPSB0aGlzLm1hdGNoZXI7CiAgfSwKCiAgY29tcGlsZVhQYXRoTWF0Y2hlcjogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lvbiwgcHMgPSBTZWxlY3Rvci5wYXR0ZXJucywKICAgICAgICB4ID0gU2VsZWN0b3IueHBhdGgsIGxlLCBtOwoKICAgIGlmIChTZWxlY3Rvci5fY2FjaGVbZV0pIHsKICAgICAgdGhpcy54cGF0aCA9IFNlbGVjdG9yLl9jYWNoZVtlXTsgcmV0dXJuOwogICAgfQoKICAgIHRoaXMubWF0Y2hlciA9IFsnLi8vKiddOwogICAgd2hpbGUgKGUgJiYgbGUgIT0gZSAmJiAoL1xTLykudGVzdChlKSkgewogICAgICBsZSA9IGU7CiAgICAgIGZvciAodmFyIGkgaW4gcHMpIHsKICAgICAgICBpZiAobSA9IGUubWF0Y2gocHNbaV0pKSB7CiAgICAgICAgICB0aGlzLm1hdGNoZXIucHVzaChPYmplY3QuaXNGdW5jdGlvbih4W2ldKSA/IHhbaV0obSkgOgogICAgICAgICAgICBuZXcgVGVtcGxhdGUoeFtpXSkuZXZhbHVhdGUobSkpOwogICAgICAgICAgZSA9IGUucmVwbGFjZShtWzBdLCAnJyk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB0aGlzLnhwYXRoID0gdGhpcy5tYXRjaGVyLmpvaW4oJycpOwogICAgU2VsZWN0b3IuX2NhY2hlW3RoaXMuZXhwcmVzc2lvbl0gPSB0aGlzLnhwYXRoOwogIH0sCgogIGZpbmRFbGVtZW50czogZnVuY3Rpb24ocm9vdCkgewogICAgcm9vdCA9IHJvb3QgfHwgZG9jdW1lbnQ7CiAgICBpZiAodGhpcy54cGF0aCkgcmV0dXJuIGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGgodGhpcy54cGF0aCwgcm9vdCk7CiAgICByZXR1cm4gdGhpcy5tYXRjaGVyKHJvb3QpOwogIH0sCgogIG1hdGNoOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICB0aGlzLnRva2VucyA9IFtdOwoKICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uLCBwcyA9IFNlbGVjdG9yLnBhdHRlcm5zLCBhcyA9IFNlbGVjdG9yLmFzc2VydGlvbnM7CiAgICB2YXIgbGUsIHAsIG07CgogICAgd2hpbGUgKGUgJiYgbGUgIT09IGUgJiYgKC9cUy8pLnRlc3QoZSkpIHsKICAgICAgbGUgPSBlOwogICAgICBmb3IgKHZhciBpIGluIHBzKSB7CiAgICAgICAgcCA9IHBzW2ldOwogICAgICAgIGlmIChtID0gZS5tYXRjaChwKSkgewogICAgICAgICAgLy8gdXNlIHRoZSBTZWxlY3Rvci5hc3NlcnRpb25zIG1ldGhvZHMgdW5sZXNzIHRoZSBzZWxlY3RvcgogICAgICAgICAgLy8gaXMgdG9vIGNvbXBsZXguCiAgICAgICAgICBpZiAoYXNbaV0pIHsKICAgICAgICAgICAgdGhpcy50b2tlbnMucHVzaChbaSwgT2JqZWN0LmNsb25lKG0pXSk7CiAgICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmVsdWN0YW50bHkgZG8gYSBkb2N1bWVudC13aWRlIHNlYXJjaAogICAgICAgICAgICAvLyBhbmQgbG9vayBmb3IgYSBtYXRjaCBpbiB0aGUgYXJyYXkKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEVsZW1lbnRzKGRvY3VtZW50KS5pbmNsdWRlKGVsZW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHZhciBtYXRjaCA9IHRydWUsIG5hbWUsIG1hdGNoZXM7CiAgICBmb3IgKHZhciBpID0gMCwgdG9rZW47IHRva2VuID0gdGhpcy50b2tlbnNbaV07IGkrKykgewogICAgICBuYW1lID0gdG9rZW5bMF0sIG1hdGNoZXMgPSB0b2tlblsxXTsKICAgICAgaWYgKCFTZWxlY3Rvci5hc3NlcnRpb25zW25hbWVdKGVsZW1lbnQsIG1hdGNoZXMpKSB7CiAgICAgICAgbWF0Y2ggPSBmYWxzZTsgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWF0Y2g7CiAgfSwKCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKICB9LAoKICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiAiIzxTZWxlY3RvcjoiICsgdGhpcy5leHByZXNzaW9uLmluc3BlY3QoKSArICI+IjsKICB9Cn0pOwoKT2JqZWN0LmV4dGVuZChTZWxlY3RvciwgewogIF9jYWNoZTogeyB9LAoKICB4cGF0aDogewogICAgZGVzY2VuZGFudDogICAiLy8qIiwKICAgIGNoaWxkOiAgICAgICAgIi8qIiwKICAgIGFkamFjZW50OiAgICAgIi9mb2xsb3dpbmctc2libGluZzo6KlsxXSIsCiAgICBsYXRlclNpYmxpbmc6ICcvZm9sbG93aW5nLXNpYmxpbmc6OionLAogICAgdGFnTmFtZTogICAgICBmdW5jdGlvbihtKSB7CiAgICAgIGlmIChtWzFdID09ICcqJykgcmV0dXJuICcnOwogICAgICByZXR1cm4gIltsb2NhbC1uYW1lKCk9JyIgKyBtWzFdLnRvTG93ZXJDYXNlKCkgKwogICAgICAgICAgICAgIicgb3IgbG9jYWwtbmFtZSgpPSciICsgbVsxXS50b1VwcGVyQ2FzZSgpICsgIiddIjsKICAgIH0sCiAgICBjbGFzc05hbWU6ICAgICJbY29udGFpbnMoY29uY2F0KCcgJywgQGNsYXNzLCAnICcpLCAnICN7MX0gJyldIiwKICAgIGlkOiAgICAgICAgICAgIltAaWQ9JyN7MX0nXSIsCiAgICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9uKG0pIHsKICAgICAgbVsxXSA9IG1bMV0udG9Mb3dlckNhc2UoKTsKICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgiW0AjezF9XSIpLmV2YWx1YXRlKG0pOwogICAgfSwKICAgIGF0dHI6IGZ1bmN0aW9uKG0pIHsKICAgICAgbVsxXSA9IG1bMV0udG9Mb3dlckNhc2UoKTsKICAgICAgbVszXSA9IG1bNV0gfHwgbVs2XTsKICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShTZWxlY3Rvci54cGF0aC5vcGVyYXRvcnNbbVsyXV0pLmV2YWx1YXRlKG0pOwogICAgfSwKICAgIHBzZXVkbzogZnVuY3Rpb24obSkgewogICAgICB2YXIgaCA9IFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbbVsxXV07CiAgICAgIGlmICghaCkgcmV0dXJuICcnOwogICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24oaCkpIHJldHVybiBoKG0pOwogICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbbVsxXV0pLmV2YWx1YXRlKG0pOwogICAgfSwKICAgIG9wZXJhdG9yczogewogICAgICAnPSc6ICAiW0AjezF9PScjezN9J10iLAogICAgICAnIT0nOiAiW0AjezF9IT0nI3szfSddIiwKICAgICAgJ149JzogIltzdGFydHMtd2l0aChAI3sxfSwgJyN7M30nKV0iLAogICAgICAnJD0nOiAiW3N1YnN0cmluZyhAI3sxfSwgKHN0cmluZy1sZW5ndGgoQCN7MX0pIC0gc3RyaW5nLWxlbmd0aCgnI3szfScpICsgMSkpPScjezN9J10iLAogICAgICAnKj0nOiAiW2NvbnRhaW5zKEAjezF9LCAnI3szfScpXSIsCiAgICAgICd+PSc6ICJbY29udGFpbnMoY29uY2F0KCcgJywgQCN7MX0sICcgJyksICcgI3szfSAnKV0iLAogICAgICAnfD0nOiAiW2NvbnRhaW5zKGNvbmNhdCgnLScsIEAjezF9LCAnLScpLCAnLSN7M30tJyldIgogICAgfSwKICAgIHBzZXVkb3M6IHsKICAgICAgJ2ZpcnN0LWNoaWxkJzogJ1tub3QocHJlY2VkaW5nLXNpYmxpbmc6OiopXScsCiAgICAgICdsYXN0LWNoaWxkJzogICdbbm90KGZvbGxvd2luZy1zaWJsaW5nOjoqKV0nLAogICAgICAnb25seS1jaGlsZCc6ICAnW25vdChwcmVjZWRpbmctc2libGluZzo6KiBvciBmb2xsb3dpbmctc2libGluZzo6KildJywKICAgICAgJ2VtcHR5JzogICAgICAgIltjb3VudCgqKSA9IDAgYW5kIChjb3VudCh0ZXh0KCkpID0gMCBvciB0cmFuc2xhdGUodGV4dCgpLCAnIFx0XHJcbicsICcnKSA9ICcnKV0iLAogICAgICAnY2hlY2tlZCc6ICAgICAiW0BjaGVja2VkXSIsCiAgICAgICdkaXNhYmxlZCc6ICAgICJbQGRpc2FibGVkXSIsCiAgICAgICdlbmFibGVkJzogICAgICJbbm90KEBkaXNhYmxlZCldIiwKICAgICAgJ25vdCc6IGZ1bmN0aW9uKG0pIHsKICAgICAgICB2YXIgZSA9IG1bNl0sIHAgPSBTZWxlY3Rvci5wYXR0ZXJucywKICAgICAgICAgICAgeCA9IFNlbGVjdG9yLnhwYXRoLCBsZSwgdjsKCiAgICAgICAgdmFyIGV4Y2x1c2lvbiA9IFtdOwogICAgICAgIHdoaWxlIChlICYmIGxlICE9IGUgJiYgKC9cUy8pLnRlc3QoZSkpIHsKICAgICAgICAgIGxlID0gZTsKICAgICAgICAgIGZvciAodmFyIGkgaW4gcCkgewogICAgICAgICAgICBpZiAobSA9IGUubWF0Y2gocFtpXSkpIHsKICAgICAgICAgICAgICB2ID0gT2JqZWN0LmlzRnVuY3Rpb24oeFtpXSkgPyB4W2ldKG0pIDogbmV3IFRlbXBsYXRlKHhbaV0pLmV2YWx1YXRlKG0pOwogICAgICAgICAgICAgIGV4Y2x1c2lvbi5wdXNoKCIoIiArIHYuc3Vic3RyaW5nKDEsIHYubGVuZ3RoIC0gMSkgKyAiKSIpOwogICAgICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAiW25vdCgiICsgZXhjbHVzaW9uLmpvaW4oIiBhbmQgIikgKyAiKV0iOwogICAgICB9LAogICAgICAnbnRoLWNoaWxkJzogICAgICBmdW5jdGlvbihtKSB7CiAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCIoY291bnQoLi9wcmVjZWRpbmctc2libGluZzo6KikgKyAxKSAiLCBtKTsKICAgICAgfSwKICAgICAgJ250aC1sYXN0LWNoaWxkJzogZnVuY3Rpb24obSkgewogICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50aCgiKGNvdW50KC4vZm9sbG93aW5nLXNpYmxpbmc6OiopICsgMSkgIiwgbSk7CiAgICAgIH0sCiAgICAgICdudGgtb2YtdHlwZSc6ICAgIGZ1bmN0aW9uKG0pIHsKICAgICAgICByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5udGgoInBvc2l0aW9uKCkgIiwgbSk7CiAgICAgIH0sCiAgICAgICdudGgtbGFzdC1vZi10eXBlJzogZnVuY3Rpb24obSkgewogICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50aCgiKGxhc3QoKSArIDEgLSBwb3NpdGlvbigpKSAiLCBtKTsKICAgICAgfSwKICAgICAgJ2ZpcnN0LW9mLXR5cGUnOiAgZnVuY3Rpb24obSkgewogICAgICAgIG1bNl0gPSAiMSI7IHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zWydudGgtb2YtdHlwZSddKG0pOwogICAgICB9LAogICAgICAnbGFzdC1vZi10eXBlJzogICBmdW5jdGlvbihtKSB7CiAgICAgICAgbVs2XSA9ICIxIjsgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbJ250aC1sYXN0LW9mLXR5cGUnXShtKTsKICAgICAgfSwKICAgICAgJ29ubHktb2YtdHlwZSc6ICAgZnVuY3Rpb24obSkgewogICAgICAgIHZhciBwID0gU2VsZWN0b3IueHBhdGgucHNldWRvczsgcmV0dXJuIHBbJ2ZpcnN0LW9mLXR5cGUnXShtKSArIHBbJ2xhc3Qtb2YtdHlwZSddKG0pOwogICAgICB9LAogICAgICBudGg6IGZ1bmN0aW9uKGZyYWdtZW50LCBtKSB7CiAgICAgICAgdmFyIG1tLCBmb3JtdWxhID0gbVs2XSwgcHJlZGljYXRlOwogICAgICAgIGlmIChmb3JtdWxhID09ICdldmVuJykgZm9ybXVsYSA9ICcybiswJzsKICAgICAgICBpZiAoZm9ybXVsYSA9PSAnb2RkJykgIGZvcm11bGEgPSAnMm4rMSc7CiAgICAgICAgaWYgKG1tID0gZm9ybXVsYS5tYXRjaCgvXihcZCspJC8pKSAvLyBkaWdpdCBvbmx5CiAgICAgICAgICByZXR1cm4gJ1snICsgZnJhZ21lbnQgKyAiPSAiICsgbW1bMV0gKyAnXSc7CiAgICAgICAgaWYgKG1tID0gZm9ybXVsYS5tYXRjaCgvXigtP1xkKik/bigoWystXSkoXGQrKSk/LykpIHsgLy8gYW4rYgogICAgICAgICAgaWYgKG1tWzFdID09ICItIikgbW1bMV0gPSAtMTsKICAgICAgICAgIHZhciBhID0gbW1bMV0gPyBOdW1iZXIobW1bMV0pIDogMTsKICAgICAgICAgIHZhciBiID0gbW1bMl0gPyBOdW1iZXIobW1bMl0pIDogMDsKICAgICAgICAgIHByZWRpY2F0ZSA9ICJbKCgje2ZyYWdtZW50fSAtICN7Yn0pIG1vZCAje2F9ID0gMCkgYW5kICIgKwogICAgICAgICAgIigoI3tmcmFnbWVudH0gLSAje2J9KSBkaXYgI3thfSA+PSAwKV0iOwogICAgICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShwcmVkaWNhdGUpLmV2YWx1YXRlKHsKICAgICAgICAgICAgZnJhZ21lbnQ6IGZyYWdtZW50LCBhOiBhLCBiOiBiIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIGNyaXRlcmlhOiB7CiAgICB0YWdOYW1lOiAgICAgICduID0gaC50YWdOYW1lKG4sIHIsICIjezF9IiwgYyk7ICAgICAgYyA9IGZhbHNlOycsCiAgICBjbGFzc05hbWU6ICAgICduID0gaC5jbGFzc05hbWUobiwgciwgIiN7MX0iLCBjKTsgICAgYyA9IGZhbHNlOycsCiAgICBpZDogICAgICAgICAgICduID0gaC5pZChuLCByLCAiI3sxfSIsIGMpOyAgICAgICAgICAgYyA9IGZhbHNlOycsCiAgICBhdHRyUHJlc2VuY2U6ICduID0gaC5hdHRyUHJlc2VuY2UobiwgciwgIiN7MX0iLCBjKTsgYyA9IGZhbHNlOycsCiAgICBhdHRyOiBmdW5jdGlvbihtKSB7CiAgICAgIG1bM10gPSAobVs1XSB8fCBtWzZdKTsKICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgnbiA9IGguYXR0cihuLCByLCAiI3sxfSIsICIjezN9IiwgIiN7Mn0iLCBjKTsgYyA9IGZhbHNlOycpLmV2YWx1YXRlKG0pOwogICAgfSwKICAgIHBzZXVkbzogZnVuY3Rpb24obSkgewogICAgICBpZiAobVs2XSkgbVs2XSA9IG1bNl0ucmVwbGFjZSgvIi9nLCAnXFwiJyk7CiAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUoJ24gPSBoLnBzZXVkbyhuLCAiI3sxfSIsICIjezZ9IiwgciwgYyk7IGMgPSBmYWxzZTsnKS5ldmFsdWF0ZShtKTsKICAgIH0sCiAgICBkZXNjZW5kYW50OiAgICdjID0gImRlc2NlbmRhbnQiOycsCiAgICBjaGlsZDogICAgICAgICdjID0gImNoaWxkIjsnLAogICAgYWRqYWNlbnQ6ICAgICAnYyA9ICJhZGphY2VudCI7JywKICAgIGxhdGVyU2libGluZzogJ2MgPSAibGF0ZXJTaWJsaW5nIjsnCiAgfSwKCiAgcGF0dGVybnM6IHsKICAgIC8vIGNvbWJpbmF0b3JzIG11c3QgYmUgbGlzdGVkIGZpcnN0CiAgICAvLyAoYW5kIGRlc2NlbmRhbnQgbmVlZHMgdG8gYmUgbGFzdCBjb21iaW5hdG9yKQogICAgbGF0ZXJTaWJsaW5nOiAvXlxzKn5ccyovLAogICAgY2hpbGQ6ICAgICAgICAvXlxzKj5ccyovLAogICAgYWRqYWNlbnQ6ICAgICAvXlxzKlwrXHMqLywKICAgIGRlc2NlbmRhbnQ6ICAgL15ccy8sCgogICAgLy8gc2VsZWN0b3JzIGZvbGxvdwogICAgdGFnTmFtZTogICAgICAvXlxzKihcKnxbXHdcLV0rKShcYnwkKT8vLAogICAgaWQ6ICAgICAgICAgICAvXiMoW1x3XC1cKl0rKShcYnwkKS8sCiAgICBjbGFzc05hbWU6ICAgIC9eXC4oW1x3XC1cKl0rKShcYnwkKS8sCiAgICBwc2V1ZG86Ci9eOigoZmlyc3R8bGFzdHxudGh8bnRoLWxhc3R8b25seSkoLWNoaWxkfC1vZi10eXBlKXxlbXB0eXxjaGVja2VkfChlbnxkaXMpYWJsZWR8bm90KShcKCguKj8pXCkpPyhcYnwkfCg/PVxzfFs6K34+XSkpLywKICAgIGF0dHJQcmVzZW5jZTogL15cWyhbXHddKylcXS8sCiAgICBhdHRyOiAgICAgICAgIC9cWygoPzpbXHctXSo6KT9bXHctXSspXHMqKD86KFshXiQqfnxdPz0pXHMqKChbJyJdKShbXlw0XSo/KVw0fChbXiciXVteXF1dKj8pKSk/XF0vCiAgfSwKCiAgLy8gZm9yIFNlbGVjdG9yLm1hdGNoIGFuZCBFbGVtZW50I21hdGNoCiAgYXNzZXJ0aW9uczogewogICAgdGFnTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgewogICAgICByZXR1cm4gbWF0Y2hlc1sxXS50b1VwcGVyQ2FzZSgpID09IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOwogICAgfSwKCiAgICBjbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKICAgICAgcmV0dXJuIEVsZW1lbnQuaGFzQ2xhc3NOYW1lKGVsZW1lbnQsIG1hdGNoZXNbMV0pOwogICAgfSwKCiAgICBpZDogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgewogICAgICByZXR1cm4gZWxlbWVudC5pZCA9PT0gbWF0Y2hlc1sxXTsKICAgIH0sCgogICAgYXR0clByZXNlbmNlOiBmdW5jdGlvbihlbGVtZW50LCBtYXRjaGVzKSB7CiAgICAgIHJldHVybiBFbGVtZW50Lmhhc0F0dHJpYnV0ZShlbGVtZW50LCBtYXRjaGVzWzFdKTsKICAgIH0sCgogICAgYXR0cjogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgewogICAgICB2YXIgbm9kZVZhbHVlID0gRWxlbWVudC5yZWFkQXR0cmlidXRlKGVsZW1lbnQsIG1hdGNoZXNbMV0pOwogICAgICByZXR1cm4gbm9kZVZhbHVlICYmIFNlbGVjdG9yLm9wZXJhdG9yc1ttYXRjaGVzWzJdXShub2RlVmFsdWUsIG1hdGNoZXNbNV0gfHwgbWF0Y2hlc1s2XSk7CiAgICB9CiAgfSwKCiAgaGFuZGxlcnM6IHsKICAgIC8vIFVUSUxJVFkgRlVOQ1RJT05TCiAgICAvLyBqb2lucyB0d28gY29sbGVjdGlvbnMKICAgIGNvbmNhdDogZnVuY3Rpb24oYSwgYikgewogICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IGJbaV07IGkrKykKICAgICAgICBhLnB1c2gobm9kZSk7CiAgICAgIHJldHVybiBhOwogICAgfSwKCiAgICAvLyBtYXJrcyBhbiBhcnJheSBvZiBub2RlcyBmb3IgY291bnRpbmcKICAgIG1hcms6IGZ1bmN0aW9uKG5vZGVzKSB7CiAgICAgIHZhciBfdHJ1ZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOwogICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCiAgICAgICAgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlID0gX3RydWU7CiAgICAgIHJldHVybiBub2RlczsKICAgIH0sCgogICAgdW5tYXJrOiBmdW5jdGlvbihub2RlcykgewogICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCiAgICAgICAgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlID0gdW5kZWZpbmVkOwogICAgICByZXR1cm4gbm9kZXM7CiAgICB9LAoKICAgIC8vIG1hcmsgZWFjaCBjaGlsZCBub2RlIHdpdGggaXRzIHBvc2l0aW9uIChmb3IgbnRoIGNhbGxzKQogICAgLy8gIm9mVHlwZSIgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB3ZSdyZSBpbmRleGluZyBmb3IgbnRoLW9mLXR5cGUKICAgIC8vIHJhdGhlciB0aGFuIG50aC1jaGlsZAogICAgaW5kZXg6IGZ1bmN0aW9uKHBhcmVudE5vZGUsIHJldmVyc2UsIG9mVHlwZSkgewogICAgICBwYXJlbnROb2RlLl9jb3VudGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICBmb3IgKHZhciBub2RlcyA9IHBhcmVudE5vZGUuY2hpbGROb2RlcywgaSA9IG5vZGVzLmxlbmd0aCAtIDEsIGogPSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgKCFvZlR5cGUgfHwgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlKSkgbm9kZS5ub2RlSW5kZXggPSBqKys7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gMSwgbm9kZXMgPSBwYXJlbnROb2RlLmNoaWxkTm9kZXM7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQogICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiAoIW9mVHlwZSB8fCBub2RlLl9jb3VudGVkQnlQcm90b3R5cGUpKSBub2RlLm5vZGVJbmRleCA9IGorKzsKICAgICAgfQogICAgfSwKCiAgICAvLyBmaWx0ZXJzIG91dCBkdXBsaWNhdGVzIGFuZCBleHRlbmRzIGFsbCBub2RlcwogICAgdW5pcXVlOiBmdW5jdGlvbihub2RlcykgewogICAgICBpZiAobm9kZXMubGVuZ3RoID09IDApIHJldHVybiBub2RlczsKICAgICAgdmFyIHJlc3VsdHMgPSBbXSwgbjsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspCiAgICAgICAgaWYgKCEobiA9IG5vZGVzW2ldKS5fY291bnRlZEJ5UHJvdG90eXBlKSB7CiAgICAgICAgICBuLl9jb3VudGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKICAgICAgICAgIHJlc3VsdHMucHVzaChFbGVtZW50LmV4dGVuZChuKSk7CiAgICAgICAgfQogICAgICByZXR1cm4gU2VsZWN0b3IuaGFuZGxlcnMudW5tYXJrKHJlc3VsdHMpOwogICAgfSwKCiAgICAvLyBDT01CSU5BVE9SIEZVTkNUSU9OUwogICAgZGVzY2VuZGFudDogZnVuY3Rpb24obm9kZXMpIHsKICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCiAgICAgICAgaC5jb25jYXQocmVzdWx0cywgbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKTsKICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9LAoKICAgIGNoaWxkOiBmdW5jdGlvbihub2RlcykgewogICAgICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOwogICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgewogICAgICAgIGZvciAodmFyIGogPSAwLCBjaGlsZDsgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbal07IGorKykKICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxICYmIGNoaWxkLnRhZ05hbWUgIT0gJyEnKSByZXN1bHRzLnB1c2goY2hpbGQpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSwKCiAgICBhZGphY2VudDogZnVuY3Rpb24obm9kZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKICAgICAgICB2YXIgbmV4dCA9IHRoaXMubmV4dEVsZW1lbnRTaWJsaW5nKG5vZGUpOwogICAgICAgIGlmIChuZXh0KSByZXN1bHRzLnB1c2gobmV4dCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9LAoKICAgIGxhdGVyU2libGluZzogZnVuY3Rpb24obm9kZXMpIHsKICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCiAgICAgICAgaC5jb25jYXQocmVzdWx0cywgRWxlbWVudC5uZXh0U2libGluZ3Mobm9kZSkpOwogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0sCgogICAgbmV4dEVsZW1lbnRTaWJsaW5nOiBmdW5jdGlvbihub2RlKSB7CiAgICAgIHdoaWxlIChub2RlID0gbm9kZS5uZXh0U2libGluZykKCSAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHJldHVybiBub2RlOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgcHJldmlvdXNFbGVtZW50U2libGluZzogZnVuY3Rpb24obm9kZSkgewogICAgICB3aGlsZSAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKQogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHJldHVybiBub2RlOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgLy8gVE9LRU4gRlVOQ1RJT05TCiAgICB0YWdOYW1lOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgdGFnTmFtZSwgY29tYmluYXRvcikgewogICAgICB2YXIgdVRhZ05hbWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7CiAgICAgIHZhciByZXN1bHRzID0gW10sIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKICAgICAgaWYgKG5vZGVzKSB7CiAgICAgICAgaWYgKGNvbWJpbmF0b3IpIHsKICAgICAgICAgIC8vIGZhc3RsYW5lIGZvciBvcmRpbmFyeSBkZXNjZW5kYW50IGNvbWJpbmF0b3JzCiAgICAgICAgICBpZiAoY29tYmluYXRvciA9PSAiZGVzY2VuZGFudCIpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQogICAgICAgICAgICAgIGguY29uY2F0KHJlc3VsdHMsIG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgICAgIH0gZWxzZSBub2RlcyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOwogICAgICAgICAgaWYgKHRhZ05hbWUgPT0gIioiKSByZXR1cm4gbm9kZXM7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKICAgICAgICAgIGlmIChub2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gdVRhZ05hbWUpIHJlc3VsdHMucHVzaChub2RlKTsKICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgfSBlbHNlIHJldHVybiByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOwogICAgfSwKCiAgICBpZDogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGlkLCBjb21iaW5hdG9yKSB7CiAgICAgIHZhciB0YXJnZXROb2RlID0gJChpZCksIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKICAgICAgaWYgKCF0YXJnZXROb2RlKSByZXR1cm4gW107CiAgICAgIGlmICghbm9kZXMgJiYgcm9vdCA9PSBkb2N1bWVudCkgcmV0dXJuIFt0YXJnZXROb2RlXTsKICAgICAgaWYgKG5vZGVzKSB7CiAgICAgICAgaWYgKGNvbWJpbmF0b3IpIHsKICAgICAgICAgIGlmIChjb21iaW5hdG9yID09ICdjaGlsZCcpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQogICAgICAgICAgICAgIGlmICh0YXJnZXROb2RlLnBhcmVudE5vZGUgPT0gbm9kZSkgcmV0dXJuIFt0YXJnZXROb2RlXTsKICAgICAgICAgIH0gZWxzZSBpZiAoY29tYmluYXRvciA9PSAnZGVzY2VuZGFudCcpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQogICAgICAgICAgICAgIGlmIChFbGVtZW50LmRlc2NlbmRhbnRPZih0YXJnZXROb2RlLCBub2RlKSkgcmV0dXJuIFt0YXJnZXROb2RlXTsKICAgICAgICAgIH0gZWxzZSBpZiAoY29tYmluYXRvciA9PSAnYWRqYWNlbnQnKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKICAgICAgICAgICAgICBpZiAoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2libGluZyh0YXJnZXROb2RlKSA9PSBub2RlKQogICAgICAgICAgICAgICAgcmV0dXJuIFt0YXJnZXROb2RlXTsKICAgICAgICAgIH0gZWxzZSBub2RlcyA9IGhbY29tYmluYXRvcl0obm9kZXMpOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCiAgICAgICAgICBpZiAobm9kZSA9PSB0YXJnZXROb2RlKSByZXR1cm4gW3RhcmdldE5vZGVdOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQogICAgICByZXR1cm4gKHRhcmdldE5vZGUgJiYgRWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSwgcm9vdCkpID8gW3RhcmdldE5vZGVdIDogW107CiAgICB9LAoKICAgIGNsYXNzTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGNsYXNzTmFtZSwgY29tYmluYXRvcikgewogICAgICBpZiAobm9kZXMgJiYgY29tYmluYXRvcikgbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsKICAgICAgcmV0dXJuIFNlbGVjdG9yLmhhbmRsZXJzLmJ5Q2xhc3NOYW1lKG5vZGVzLCByb290LCBjbGFzc05hbWUpOwogICAgfSwKCiAgICBieUNsYXNzTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGNsYXNzTmFtZSkgewogICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IFNlbGVjdG9yLmhhbmRsZXJzLmRlc2NlbmRhbnQoW3Jvb3RdKTsKICAgICAgdmFyIG5lZWRsZSA9ICcgJyArIGNsYXNzTmFtZSArICcgJzsKICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZSwgbm9kZUNsYXNzTmFtZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKICAgICAgICBub2RlQ2xhc3NOYW1lID0gbm9kZS5jbGFzc05hbWU7CiAgICAgICAgaWYgKG5vZGVDbGFzc05hbWUubGVuZ3RoID09IDApIGNvbnRpbnVlOwogICAgICAgIGlmIChub2RlQ2xhc3NOYW1lID09IGNsYXNzTmFtZSB8fCAoJyAnICsgbm9kZUNsYXNzTmFtZSArICcgJykuaW5jbHVkZShuZWVkbGUpKQogICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSwKCiAgICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBhdHRyLCBjb21iaW5hdG9yKSB7CiAgICAgIGlmICghbm9kZXMpIG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOwogICAgICBpZiAobm9kZXMgJiYgY29tYmluYXRvcikgbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsKICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQogICAgICAgIGlmIChFbGVtZW50Lmhhc0F0dHJpYnV0ZShub2RlLCBhdHRyKSkgcmVzdWx0cy5wdXNoKG5vZGUpOwogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0sCgogICAgYXR0cjogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGF0dHIsIHZhbHVlLCBvcGVyYXRvciwgY29tYmluYXRvcikgewogICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKICAgICAgaWYgKG5vZGVzICYmIGNvbWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CiAgICAgIHZhciBoYW5kbGVyID0gU2VsZWN0b3Iub3BlcmF0b3JzW29wZXJhdG9yXSwgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKICAgICAgICB2YXIgbm9kZVZhbHVlID0gRWxlbWVudC5yZWFkQXR0cmlidXRlKG5vZGUsIGF0dHIpOwogICAgICAgIGlmIChub2RlVmFsdWUgPT09IG51bGwpIGNvbnRpbnVlOwogICAgICAgIGlmIChoYW5kbGVyKG5vZGVWYWx1ZSwgdmFsdWUpKSByZXN1bHRzLnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9LAoKICAgIHBzZXVkbzogZnVuY3Rpb24obm9kZXMsIG5hbWUsIHZhbHVlLCByb290LCBjb21iaW5hdG9yKSB7CiAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2RlcyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOwogICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3NbbmFtZV0obm9kZXMsIHZhbHVlLCByb290KTsKICAgIH0KICB9LAoKICBwc2V1ZG9zOiB7CiAgICAnZmlyc3QtY2hpbGQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKICAgICAgICBpZiAoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2libGluZyhub2RlKSkgY29udGludWU7CiAgICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9LAogICAgJ2xhc3QtY2hpbGQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKICAgICAgICBpZiAoU2VsZWN0b3IuaGFuZGxlcnMubmV4dEVsZW1lbnRTaWJsaW5nKG5vZGUpKSBjb250aW51ZTsKICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0sCiAgICAnb25seS1jaGlsZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgewogICAgICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOwogICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKICAgICAgICBpZiAoIWgucHJldmlvdXNFbGVtZW50U2libGluZyhub2RlKSAmJiAhaC5uZXh0RWxlbWVudFNpYmxpbmcobm9kZSkpCiAgICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSwKICAgICdudGgtY2hpbGQnOiAgICAgICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290KTsKICAgIH0sCiAgICAnbnRoLWxhc3QtY2hpbGQnOiAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CiAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCwgdHJ1ZSk7CiAgICB9LAogICAgJ250aC1vZi10eXBlJzogICAgICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgewogICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsIGZvcm11bGEsIHJvb3QsIGZhbHNlLCB0cnVlKTsKICAgIH0sCiAgICAnbnRoLWxhc3Qtb2YtdHlwZSc6IGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CiAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCwgdHJ1ZSwgdHJ1ZSk7CiAgICB9LAogICAgJ2ZpcnN0LW9mLXR5cGUnOiAgICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgewogICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsICIxIiwgcm9vdCwgZmFsc2UsIHRydWUpOwogICAgfSwKICAgICdsYXN0LW9mLXR5cGUnOiAgICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCAiMSIsIHJvb3QsIHRydWUsIHRydWUpOwogICAgfSwKICAgICdvbmx5LW9mLXR5cGUnOiAgICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKICAgICAgdmFyIHAgPSBTZWxlY3Rvci5wc2V1ZG9zOwogICAgICByZXR1cm4gcFsnbGFzdC1vZi10eXBlJ10ocFsnZmlyc3Qtb2YtdHlwZSddKG5vZGVzLCBmb3JtdWxhLCByb290KSwgZm9ybXVsYSwgcm9vdCk7CiAgICB9LAoKICAgIC8vIGhhbmRsZXMgdGhlIGFuK2IgbG9naWMKICAgIGdldEluZGljZXM6IGZ1bmN0aW9uKGEsIGIsIHRvdGFsKSB7CiAgICAgIGlmIChhID09IDApIHJldHVybiBiID4gMCA/IFtiXSA6IFtdOwogICAgICByZXR1cm4gJFIoMSwgdG90YWwpLmluamVjdChbXSwgZnVuY3Rpb24obWVtbywgaSkgewogICAgICAgIGlmICgwID09IChpIC0gYikgJSBhICYmIChpIC0gYikgLyBhID49IDApIG1lbW8ucHVzaChpKTsKICAgICAgICByZXR1cm4gbWVtbzsKICAgICAgfSk7CiAgICB9LAoKICAgIC8vIGhhbmRsZXMgbnRoKC1sYXN0KS1jaGlsZCwgbnRoKC1sYXN0KS1vZi10eXBlLCBhbmQgKGZpcnN0fGxhc3QpLW9mLXR5cGUKICAgIG50aDogZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QsIHJldmVyc2UsIG9mVHlwZSkgewogICAgICBpZiAobm9kZXMubGVuZ3RoID09IDApIHJldHVybiBbXTsKICAgICAgaWYgKGZvcm11bGEgPT0gJ2V2ZW4nKSBmb3JtdWxhID0gJzJuKzAnOwogICAgICBpZiAoZm9ybXVsYSA9PSAnb2RkJykgIGZvcm11bGEgPSAnMm4rMSc7CiAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFuZGxlcnMsIHJlc3VsdHMgPSBbXSwgaW5kZXhlZCA9IFtdLCBtOwogICAgICBoLm1hcmsobm9kZXMpOwogICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKICAgICAgICBpZiAoIW5vZGUucGFyZW50Tm9kZS5fY291bnRlZEJ5UHJvdG90eXBlKSB7CiAgICAgICAgICBoLmluZGV4KG5vZGUucGFyZW50Tm9kZSwgcmV2ZXJzZSwgb2ZUeXBlKTsKICAgICAgICAgIGluZGV4ZWQucHVzaChub2RlLnBhcmVudE5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZm9ybXVsYS5tYXRjaCgvXlxkKyQvKSkgeyAvLyBqdXN0IGEgbnVtYmVyCiAgICAgICAgZm9ybXVsYSA9IE51bWJlcihmb3JtdWxhKTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCiAgICAgICAgICBpZiAobm9kZS5ub2RlSW5kZXggPT0gZm9ybXVsYSkgcmVzdWx0cy5wdXNoKG5vZGUpOwogICAgICB9IGVsc2UgaWYgKG0gPSBmb3JtdWxhLm1hdGNoKC9eKC0/XGQqKT9uKChbKy1dKShcZCspKT8vKSkgeyAvLyBhbitiCiAgICAgICAgaWYgKG1bMV0gPT0gIi0iKSBtWzFdID0gLTE7CiAgICAgICAgdmFyIGEgPSBtWzFdID8gTnVtYmVyKG1bMV0pIDogMTsKICAgICAgICB2YXIgYiA9IG1bMl0gPyBOdW1iZXIobVsyXSkgOiAwOwogICAgICAgIHZhciBpbmRpY2VzID0gU2VsZWN0b3IucHNldWRvcy5nZXRJbmRpY2VzKGEsIGIsIG5vZGVzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUsIGwgPSBpbmRpY2VzLmxlbmd0aDsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbDsgaisrKQogICAgICAgICAgICBpZiAobm9kZS5ub2RlSW5kZXggPT0gaW5kaWNlc1tqXSkgcmVzdWx0cy5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBoLnVubWFyayhub2Rlcyk7CiAgICAgIGgudW5tYXJrKGluZGV4ZWQpOwogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0sCgogICAgJ2VtcHR5JzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CiAgICAgICAgLy8gSUUgdHJlYXRzIGNvbW1lbnRzIGFzIGVsZW1lbnQgbm9kZXMKICAgICAgICBpZiAobm9kZS50YWdOYW1lID09ICchJyB8fCAobm9kZS5maXJzdENoaWxkICYmICFub2RlLmlubmVySFRNTC5tYXRjaCgvXlxzKiQvKSkpIGNvbnRpbnVlOwogICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0sCgogICAgJ25vdCc6IGZ1bmN0aW9uKG5vZGVzLCBzZWxlY3Rvciwgcm9vdCkgewogICAgICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLCBzZWxlY3RvclR5cGUsIG07CiAgICAgIHZhciBleGNsdXNpb25zID0gbmV3IFNlbGVjdG9yKHNlbGVjdG9yKS5maW5kRWxlbWVudHMocm9vdCk7CiAgICAgIGgubWFyayhleGNsdXNpb25zKTsKICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCiAgICAgICAgaWYgKCFub2RlLl9jb3VudGVkQnlQcm90b3R5cGUpIHJlc3VsdHMucHVzaChub2RlKTsKICAgICAgaC51bm1hcmsoZXhjbHVzaW9ucyk7CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSwKCiAgICAnZW5hYmxlZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgewogICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKICAgICAgICBpZiAoIW5vZGUuZGlzYWJsZWQpIHJlc3VsdHMucHVzaChub2RlKTsKICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9LAoKICAgICdkaXNhYmxlZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgewogICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKICAgICAgICBpZiAobm9kZS5kaXNhYmxlZCkgcmVzdWx0cy5wdXNoKG5vZGUpOwogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0sCgogICAgJ2NoZWNrZWQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCiAgICAgICAgaWYgKG5vZGUuY2hlY2tlZCkgcmVzdWx0cy5wdXNoKG5vZGUpOwogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0KICB9LAoKICBvcGVyYXRvcnM6IHsKICAgICc9JzogIGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudiA9PSB2OyB9LAogICAgJyE9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52ICE9IHY7IH0sCiAgICAnXj0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYuc3RhcnRzV2l0aCh2KTsgfSwKICAgICckPSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudi5lbmRzV2l0aCh2KTsgfSwKICAgICcqPSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudi5pbmNsdWRlKHYpOyB9LAogICAgJ349JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuICgnICcgKyBudiArICcgJykuaW5jbHVkZSgnICcgKyB2ICsgJyAnKTsgfSwKICAgICd8PSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiAoJy0nICsgbnYudG9VcHBlckNhc2UoKSArICctJykuaW5jbHVkZSgnLScgKyB2LnRvVXBwZXJDYXNlKCkgKyAnLScpOyB9CiAgfSwKCiAgc3BsaXQ6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHsKICAgIHZhciBleHByZXNzaW9ucyA9IFtdOwogICAgZXhwcmVzc2lvbi5zY2FuKC8oKFtcdyM6Ln4+KygpXHMtXSt8XCp8XFsuKj9cXSkrKVxzKigsfCQpLywgZnVuY3Rpb24obSkgewogICAgICBleHByZXNzaW9ucy5wdXNoKG1bMV0uc3RyaXAoKSk7CiAgICB9KTsKICAgIHJldHVybiBleHByZXNzaW9uczsKICB9LAoKICBtYXRjaEVsZW1lbnRzOiBmdW5jdGlvbihlbGVtZW50cywgZXhwcmVzc2lvbikgewogICAgdmFyIG1hdGNoZXMgPSAkJChleHByZXNzaW9uKSwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOwogICAgaC5tYXJrKG1hdGNoZXMpOwogICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgZWxlbWVudDsgZWxlbWVudCA9IGVsZW1lbnRzW2ldOyBpKyspCiAgICAgIGlmIChlbGVtZW50Ll9jb3VudGVkQnlQcm90b3R5cGUpIHJlc3VsdHMucHVzaChlbGVtZW50KTsKICAgIGgudW5tYXJrKG1hdGNoZXMpOwogICAgcmV0dXJuIHJlc3VsdHM7CiAgfSwKCiAgZmluZEVsZW1lbnQ6IGZ1bmN0aW9uKGVsZW1lbnRzLCBleHByZXNzaW9uLCBpbmRleCkgewogICAgaWYgKE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSkgewogICAgICBpbmRleCA9IGV4cHJlc3Npb247IGV4cHJlc3Npb24gPSBmYWxzZTsKICAgIH0KICAgIHJldHVybiBTZWxlY3Rvci5tYXRjaEVsZW1lbnRzKGVsZW1lbnRzLCBleHByZXNzaW9uIHx8ICcqJylbaW5kZXggfHwgMF07CiAgfSwKCiAgZmluZENoaWxkRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb25zKSB7CiAgICBleHByZXNzaW9ucyA9IFNlbGVjdG9yLnNwbGl0KGV4cHJlc3Npb25zLmpvaW4oJywnKSk7CiAgICB2YXIgcmVzdWx0cyA9IFtdLCBoID0gU2VsZWN0b3IuaGFuZGxlcnM7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV4cHJlc3Npb25zLmxlbmd0aCwgc2VsZWN0b3I7IGkgPCBsOyBpKyspIHsKICAgICAgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IoZXhwcmVzc2lvbnNbaV0uc3RyaXAoKSk7CiAgICAgIGguY29uY2F0KHJlc3VsdHMsIHNlbGVjdG9yLmZpbmRFbGVtZW50cyhlbGVtZW50KSk7CiAgICB9CiAgICByZXR1cm4gKGwgPiAxKSA/IGgudW5pcXVlKHJlc3VsdHMpIDogcmVzdWx0czsKICB9Cn0pOwoKaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CiAgT2JqZWN0LmV4dGVuZChTZWxlY3Rvci5oYW5kbGVycywgewogICAgLy8gSUUgcmV0dXJucyBjb21tZW50IG5vZGVzIG9uIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikuCiAgICAvLyBGaWx0ZXIgdGhlbSBvdXQuCiAgICBjb25jYXQ6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBiW2ldOyBpKyspCiAgICAgICAgaWYgKG5vZGUudGFnTmFtZSAhPT0gIiEiKSBhLnB1c2gobm9kZSk7CiAgICAgIHJldHVybiBhOwogICAgfSwKCiAgICAvLyBJRSBpbXByb3Blcmx5IHNlcmlhbGl6ZXMgX2NvdW50ZWRCeVByb3RvdHlwZSBpbiAoaW5uZXJ8b3V0ZXIpSFRNTC4KICAgIHVubWFyazogZnVuY3Rpb24obm9kZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQogICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdfY291bnRlZEJ5UHJvdG90eXBlJyk7CiAgICAgIHJldHVybiBub2RlczsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gJCQoKSB7CiAgcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVsZW1lbnRzKGRvY3VtZW50LCAkQShhcmd1bWVudHMpKTsKfQp2YXIgRm9ybSA9IHsKICByZXNldDogZnVuY3Rpb24oZm9ybSkgewogICAgJChmb3JtKS5yZXNldCgpOwogICAgcmV0dXJuIGZvcm07CiAgfSwKCiAgc2VyaWFsaXplRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7CiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT0gJ29iamVjdCcpIG9wdGlvbnMgPSB7IGhhc2g6ICEhb3B0aW9ucyB9OwogICAgZWxzZSBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKG9wdGlvbnMuaGFzaCkpIG9wdGlvbnMuaGFzaCA9IHRydWU7CiAgICB2YXIga2V5LCB2YWx1ZSwgc3VibWl0dGVkID0gZmFsc2UsIHN1Ym1pdCA9IG9wdGlvbnMuc3VibWl0OwoKICAgIHZhciBkYXRhID0gZWxlbWVudHMuaW5qZWN0KHsgfSwgZnVuY3Rpb24ocmVzdWx0LCBlbGVtZW50KSB7CiAgICAgIGlmICghZWxlbWVudC5kaXNhYmxlZCAmJiBlbGVtZW50Lm5hbWUpIHsKICAgICAgICBrZXkgPSBlbGVtZW50Lm5hbWU7IHZhbHVlID0gJChlbGVtZW50KS5nZXRWYWx1ZSgpOwogICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIChlbGVtZW50LnR5cGUgIT0gJ3N1Ym1pdCcgfHwgKCFzdWJtaXR0ZWQgJiYKICAgICAgICAgICAgc3VibWl0ICE9PSBmYWxzZSAmJiAoIXN1Ym1pdCB8fCBrZXkgPT0gc3VibWl0KSAmJiAoc3VibWl0dGVkID0gdHJ1ZSkpKSkgewogICAgICAgICAgaWYgKGtleSBpbiByZXN1bHQpIHsKICAgICAgICAgICAgLy8gYSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50OyBjb25zdHJ1Y3QgYW4gYXJyYXkgb2YgdmFsdWVzCiAgICAgICAgICAgIGlmICghT2JqZWN0LmlzQXJyYXkocmVzdWx0W2tleV0pKSByZXN1bHRba2V5XSA9IFtyZXN1bHRba2V5XV07CiAgICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSByZXN1bHRba2V5XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSk7CgogICAgcmV0dXJuIG9wdGlvbnMuaGFzaCA/IGRhdGEgOiBPYmplY3QudG9RdWVyeVN0cmluZyhkYXRhKTsKICB9Cn07CgpGb3JtLk1ldGhvZHMgPSB7CiAgc2VyaWFsaXplOiBmdW5jdGlvbihmb3JtLCBvcHRpb25zKSB7CiAgICByZXR1cm4gRm9ybS5zZXJpYWxpemVFbGVtZW50cyhGb3JtLmdldEVsZW1lbnRzKGZvcm0pLCBvcHRpb25zKTsKICB9LAoKICBnZXRFbGVtZW50czogZnVuY3Rpb24oZm9ybSkgewogICAgcmV0dXJuICRBKCQoZm9ybSkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSkuaW5qZWN0KFtdLAogICAgICBmdW5jdGlvbihlbGVtZW50cywgY2hpbGQpIHsKICAgICAgICBpZiAoRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzW2NoaWxkLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pCiAgICAgICAgICBlbGVtZW50cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGNoaWxkKSk7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzOwogICAgICB9CiAgICApOwogIH0sCgogIGdldElucHV0czogZnVuY3Rpb24oZm9ybSwgdHlwZU5hbWUsIG5hbWUpIHsKICAgIGZvcm0gPSAkKGZvcm0pOwogICAgdmFyIGlucHV0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7CgogICAgaWYgKCF0eXBlTmFtZSAmJiAhbmFtZSkgcmV0dXJuICRBKGlucHV0cykubWFwKEVsZW1lbnQuZXh0ZW5kKTsKCiAgICBmb3IgKHZhciBpID0gMCwgbWF0Y2hpbmdJbnB1dHMgPSBbXSwgbGVuZ3RoID0gaW5wdXRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBpbnB1dCA9IGlucHV0c1tpXTsKICAgICAgaWYgKCh0eXBlTmFtZSAmJiBpbnB1dC50eXBlICE9IHR5cGVOYW1lKSB8fCAobmFtZSAmJiBpbnB1dC5uYW1lICE9IG5hbWUpKQogICAgICAgIGNvbnRpbnVlOwogICAgICBtYXRjaGluZ0lucHV0cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGlucHV0KSk7CiAgICB9CgogICAgcmV0dXJuIG1hdGNoaW5nSW5wdXRzOwogIH0sCgogIGRpc2FibGU6IGZ1bmN0aW9uKGZvcm0pIHsKICAgIGZvcm0gPSAkKGZvcm0pOwogICAgRm9ybS5nZXRFbGVtZW50cyhmb3JtKS5pbnZva2UoJ2Rpc2FibGUnKTsKICAgIHJldHVybiBmb3JtOwogIH0sCgogIGVuYWJsZTogZnVuY3Rpb24oZm9ybSkgewogICAgZm9ybSA9ICQoZm9ybSk7CiAgICBGb3JtLmdldEVsZW1lbnRzKGZvcm0pLmludm9rZSgnZW5hYmxlJyk7CiAgICByZXR1cm4gZm9ybTsKICB9LAoKICBmaW5kRmlyc3RFbGVtZW50OiBmdW5jdGlvbihmb3JtKSB7CiAgICB2YXIgZWxlbWVudHMgPSAkKGZvcm0pLmdldEVsZW1lbnRzKCkuZmluZEFsbChmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgIHJldHVybiAnaGlkZGVuJyAhPSBlbGVtZW50LnR5cGUgJiYgIWVsZW1lbnQuZGlzYWJsZWQ7CiAgICB9KTsKICAgIHZhciBmaXJzdEJ5SW5kZXggPSBlbGVtZW50cy5maW5kQWxsKGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd0YWJJbmRleCcpICYmIGVsZW1lbnQudGFiSW5kZXggPj0gMDsKICAgIH0pLnNvcnRCeShmdW5jdGlvbihlbGVtZW50KSB7IHJldHVybiBlbGVtZW50LnRhYkluZGV4IH0pLmZpcnN0KCk7CgogICAgcmV0dXJuIGZpcnN0QnlJbmRleCA/IGZpcnN0QnlJbmRleCA6IGVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZWxlbWVudCkgewogICAgICByZXR1cm4gWydpbnB1dCcsICdzZWxlY3QnLCAndGV4dGFyZWEnXS5pbmNsdWRlKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgIH0pOwogIH0sCgogIGZvY3VzRmlyc3RFbGVtZW50OiBmdW5jdGlvbihmb3JtKSB7CiAgICBmb3JtID0gJChmb3JtKTsKICAgIGZvcm0uZmluZEZpcnN0RWxlbWVudCgpLmFjdGl2YXRlKCk7CiAgICByZXR1cm4gZm9ybTsKICB9LAoKICByZXF1ZXN0OiBmdW5jdGlvbihmb3JtLCBvcHRpb25zKSB7CiAgICBmb3JtID0gJChmb3JtKSwgb3B0aW9ucyA9IE9iamVjdC5jbG9uZShvcHRpb25zIHx8IHsgfSk7CgogICAgdmFyIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1ldGVycywgYWN0aW9uID0gZm9ybS5yZWFkQXR0cmlidXRlKCdhY3Rpb24nKSB8fCAnJzsKICAgIGlmIChhY3Rpb24uYmxhbmsoKSkgYWN0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICBvcHRpb25zLnBhcmFtZXRlcnMgPSBmb3JtLnNlcmlhbGl6ZSh0cnVlKTsKCiAgICBpZiAocGFyYW1zKSB7CiAgICAgIGlmIChPYmplY3QuaXNTdHJpbmcocGFyYW1zKSkgcGFyYW1zID0gcGFyYW1zLnRvUXVlcnlQYXJhbXMoKTsKICAgICAgT2JqZWN0LmV4dGVuZChvcHRpb25zLnBhcmFtZXRlcnMsIHBhcmFtcyk7CiAgICB9CgogICAgaWYgKGZvcm0uaGFzQXR0cmlidXRlKCdtZXRob2QnKSAmJiAhb3B0aW9ucy5tZXRob2QpCiAgICAgIG9wdGlvbnMubWV0aG9kID0gZm9ybS5tZXRob2Q7CgogICAgcmV0dXJuIG5ldyBBamF4LlJlcXVlc3QoYWN0aW9uLCBvcHRpb25zKTsKICB9Cn07CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCkZvcm0uRWxlbWVudCA9IHsKICBmb2N1czogZnVuY3Rpb24oZWxlbWVudCkgewogICAgJChlbGVtZW50KS5mb2N1cygpOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfSwKCiAgc2VsZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAkKGVsZW1lbnQpLnNlbGVjdCgpOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfQp9OwoKRm9ybS5FbGVtZW50Lk1ldGhvZHMgPSB7CiAgc2VyaWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGlmICghZWxlbWVudC5kaXNhYmxlZCAmJiBlbGVtZW50Lm5hbWUpIHsKICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC5nZXRWYWx1ZSgpOwogICAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFyIHBhaXIgPSB7IH07CiAgICAgICAgcGFpcltlbGVtZW50Lm5hbWVdID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIE9iamVjdC50b1F1ZXJ5U3RyaW5nKHBhaXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gJyc7CiAgfSwKCiAgZ2V0VmFsdWU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdmFyIG1ldGhvZCA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1ttZXRob2RdKGVsZW1lbnQpOwogIH0sCgogIHNldFZhbHVlOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICB2YXIgbWV0aG9kID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVtZW50LCB2YWx1ZSk7CiAgICByZXR1cm4gZWxlbWVudDsKICB9LAoKICBjbGVhcjogZnVuY3Rpb24oZWxlbWVudCkgewogICAgJChlbGVtZW50KS52YWx1ZSA9ICcnOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfSwKCiAgcHJlc2VudDogZnVuY3Rpb24oZWxlbWVudCkgewogICAgcmV0dXJuICQoZWxlbWVudCkudmFsdWUgIT0gJyc7CiAgfSwKCiAgYWN0aXZhdGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdHJ5IHsKICAgICAgZWxlbWVudC5mb2N1cygpOwogICAgICBpZiAoZWxlbWVudC5zZWxlY3QgJiYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdpbnB1dCcgfHwKICAgICAgICAgICFbJ2J1dHRvbicsICdyZXNldCcsICdzdWJtaXQnXS5pbmNsdWRlKGVsZW1lbnQudHlwZSkpKQogICAgICAgIGVsZW1lbnQuc2VsZWN0KCk7CiAgICB9IGNhdGNoIChlKSB7IH0KICAgIHJldHVybiBlbGVtZW50OwogIH0sCgogIGRpc2FibGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgZWxlbWVudC5ibHVyKCk7CiAgICBlbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKICAgIHJldHVybiBlbGVtZW50OwogIH0sCgogIGVuYWJsZTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBlbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CiAgICByZXR1cm4gZWxlbWVudDsKICB9Cn07CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnZhciBGaWVsZCA9IEZvcm0uRWxlbWVudDsKdmFyICRGID0gRm9ybS5FbGVtZW50Lk1ldGhvZHMuZ2V0VmFsdWU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCkZvcm0uRWxlbWVudC5TZXJpYWxpemVycyA9IHsKICBpbnB1dDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKICAgIHN3aXRjaCAoZWxlbWVudC50eXBlLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgY2FzZSAnY2hlY2tib3gnOgogICAgICBjYXNlICdyYWRpbyc6CiAgICAgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVycy5pbnB1dFNlbGVjdG9yKGVsZW1lbnQsIHZhbHVlKTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzLnRleHRhcmVhKGVsZW1lbnQsIHZhbHVlKTsKICAgIH0KICB9LAoKICBpbnB1dFNlbGVjdG9yOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgewogICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDsKICAgIGVsc2UgZWxlbWVudC5jaGVja2VkID0gISF2YWx1ZTsKICB9LAoKICB0ZXh0YXJlYTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gZWxlbWVudC52YWx1ZTsKICAgIGVsc2UgZWxlbWVudC52YWx1ZSA9IHZhbHVlOwogIH0sCgogIHNlbGVjdDogZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHsKICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQoaW5kZXgpKQogICAgICByZXR1cm4gdGhpc1tlbGVtZW50LnR5cGUgPT0gJ3NlbGVjdC1vbmUnID8KICAgICAgICAnc2VsZWN0T25lJyA6ICdzZWxlY3RNYW55J10oZWxlbWVudCk7CiAgICBlbHNlIHsKICAgICAgdmFyIG9wdCwgdmFsdWUsIHNpbmdsZSA9ICFPYmplY3QuaXNBcnJheShpbmRleCk7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBlbGVtZW50Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgb3B0ID0gZWxlbWVudC5vcHRpb25zW2ldOwogICAgICAgIHZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZShvcHQpOwogICAgICAgIGlmIChzaW5nbGUpIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PSBpbmRleCkgewogICAgICAgICAgICBvcHQuc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2Ugb3B0LnNlbGVjdGVkID0gaW5kZXguaW5jbHVkZSh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9LAoKICBzZWxlY3RPbmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHZhciBpbmRleCA9IGVsZW1lbnQuc2VsZWN0ZWRJbmRleDsKICAgIHJldHVybiBpbmRleCA+PSAwID8gdGhpcy5vcHRpb25WYWx1ZShlbGVtZW50Lm9wdGlvbnNbaW5kZXhdKSA6IG51bGw7CiAgfSwKCiAgc2VsZWN0TWFueTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgdmFyIHZhbHVlcywgbGVuZ3RoID0gZWxlbWVudC5sZW5ndGg7CiAgICBpZiAoIWxlbmd0aCkgcmV0dXJuIG51bGw7CgogICAgZm9yICh2YXIgaSA9IDAsIHZhbHVlcyA9IFtdOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIG9wdCA9IGVsZW1lbnQub3B0aW9uc1tpXTsKICAgICAgaWYgKG9wdC5zZWxlY3RlZCkgdmFsdWVzLnB1c2godGhpcy5vcHRpb25WYWx1ZShvcHQpKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZXM7CiAgfSwKCiAgb3B0aW9uVmFsdWU6IGZ1bmN0aW9uKG9wdCkgewogICAgLy8gZXh0ZW5kIGVsZW1lbnQgYmVjYXVzZSBoYXNBdHRyaWJ1dGUgbWF5IG5vdCBiZSBuYXRpdmUKICAgIHJldHVybiBFbGVtZW50LmV4dGVuZChvcHQpLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSA/IG9wdC52YWx1ZSA6IG9wdC50ZXh0OwogIH0KfTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKQWJzdHJhY3QuVGltZWRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZShQZXJpb2RpY2FsRXhlY3V0ZXIsIHsKICBpbml0aWFsaXplOiBmdW5jdGlvbigkc3VwZXIsIGVsZW1lbnQsIGZyZXF1ZW5jeSwgY2FsbGJhY2spIHsKICAgICRzdXBlcihjYWxsYmFjaywgZnJlcXVlbmN5KTsKICAgIHRoaXMuZWxlbWVudCAgID0gJChlbGVtZW50KTsKICAgIHRoaXMubGFzdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogIH0sCgogIGV4ZWN1dGU6IGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgaWYgKE9iamVjdC5pc1N0cmluZyh0aGlzLmxhc3RWYWx1ZSkgJiYgT2JqZWN0LmlzU3RyaW5nKHZhbHVlKSA/CiAgICAgICAgdGhpcy5sYXN0VmFsdWUgIT0gdmFsdWUgOiBTdHJpbmcodGhpcy5sYXN0VmFsdWUpICE9IFN0cmluZyh2YWx1ZSkpIHsKICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIHZhbHVlKTsKICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKICAgIH0KICB9Cn0pOwoKRm9ybS5FbGVtZW50Lk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKEFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIsIHsKICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gRm9ybS5FbGVtZW50LmdldFZhbHVlKHRoaXMuZWxlbWVudCk7CiAgfQp9KTsKCkZvcm0uT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlciwgewogIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBGb3JtLnNlcmlhbGl6ZSh0aGlzLmVsZW1lbnQpOwogIH0KfSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCkFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNhbGxiYWNrKSB7CiAgICB0aGlzLmVsZW1lbnQgID0gJChlbGVtZW50KTsKICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKCiAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdmb3JtJykKICAgICAgdGhpcy5yZWdpc3RlckZvcm1DYWxsYmFja3MoKTsKICAgIGVsc2UKICAgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKHRoaXMuZWxlbWVudCk7CiAgfSwKCiAgb25FbGVtZW50RXZlbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAgaWYgKHRoaXMubGFzdFZhbHVlICE9IHZhbHVlKSB7CiAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LCB2YWx1ZSk7CiAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7CiAgICB9CiAgfSwKCiAgcmVnaXN0ZXJGb3JtQ2FsbGJhY2tzOiBmdW5jdGlvbigpIHsKICAgIEZvcm0uZ2V0RWxlbWVudHModGhpcy5lbGVtZW50KS5lYWNoKHRoaXMucmVnaXN0ZXJDYWxsYmFjaywgdGhpcyk7CiAgfSwKCiAgcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rpb24oZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQudHlwZSkgewogICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgY2FzZSAnY2hlY2tib3gnOgogICAgICAgIGNhc2UgJ3JhZGlvJzoKICAgICAgICAgIEV2ZW50Lm9ic2VydmUoZWxlbWVudCwgJ2NsaWNrJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICdjaGFuZ2UnLCB0aGlzLm9uRWxlbWVudEV2ZW50LmJpbmQodGhpcykpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9Cn0pOwoKRm9ybS5FbGVtZW50LkV2ZW50T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuRXZlbnRPYnNlcnZlciwgewogIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBGb3JtLkVsZW1lbnQuZ2V0VmFsdWUodGhpcy5lbGVtZW50KTsKICB9Cn0pOwoKRm9ybS5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKEFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIsIHsKICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsKICB9Cn0pOwppZiAoIXdpbmRvdy5FdmVudCkgdmFyIEV2ZW50ID0geyB9OwoKT2JqZWN0LmV4dGVuZChFdmVudCwgewogIEtFWV9CQUNLU1BBQ0U6IDgsCiAgS0VZX1RBQjogICAgICAgOSwKICBLRVlfUkVUVVJOOiAgIDEzLAogIEtFWV9FU0M6ICAgICAgMjcsCiAgS0VZX0xFRlQ6ICAgICAzNywKICBLRVlfVVA6ICAgICAgIDM4LAogIEtFWV9SSUdIVDogICAgMzksCiAgS0VZX0RPV046ICAgICA0MCwKICBLRVlfREVMRVRFOiAgIDQ2LAogIEtFWV9IT01FOiAgICAgMzYsCiAgS0VZX0VORDogICAgICAzNSwKICBLRVlfUEFHRVVQOiAgIDMzLAogIEtFWV9QQUdFRE9XTjogMzQsCiAgS0VZX0lOU0VSVDogICA0NSwKCiAgY2FjaGU6IHsgfSwKCiAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24oZXZlbnQpIHsKICAgIHZhciBlbGVtZW50OwogICAgc3dpdGNoKGV2ZW50LnR5cGUpIHsKICAgICAgY2FzZSAnbW91c2VvdmVyJzogZWxlbWVudCA9IGV2ZW50LmZyb21FbGVtZW50OyBicmVhazsKICAgICAgY2FzZSAnbW91c2VvdXQnOiAgZWxlbWVudCA9IGV2ZW50LnRvRWxlbWVudDsgICBicmVhazsKICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudCk7CiAgfQp9KTsKCkV2ZW50Lk1ldGhvZHMgPSAoZnVuY3Rpb24oKSB7CiAgdmFyIGlzQnV0dG9uOwoKICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHsKICAgIHZhciBidXR0b25NYXAgPSB7IDA6IDEsIDE6IDQsIDI6IDIgfTsKICAgIGlzQnV0dG9uID0gZnVuY3Rpb24oZXZlbnQsIGNvZGUpIHsKICAgICAgcmV0dXJuIGV2ZW50LmJ1dHRvbiA9PSBidXR0b25NYXBbY29kZV07CiAgICB9OwoKICB9IGVsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCkgewogICAgaXNCdXR0b24gPSBmdW5jdGlvbihldmVudCwgY29kZSkgewogICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICBjYXNlIDA6IHJldHVybiBldmVudC53aGljaCA9PSAxICYmICFldmVudC5tZXRhS2V5OwogICAgICAgIGNhc2UgMTogcmV0dXJuIGV2ZW50LndoaWNoID09IDEgJiYgZXZlbnQubWV0YUtleTsKICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH07CgogIH0gZWxzZSB7CiAgICBpc0J1dHRvbiA9IGZ1bmN0aW9uKGV2ZW50LCBjb2RlKSB7CiAgICAgIHJldHVybiBldmVudC53aGljaCA/IChldmVudC53aGljaCA9PT0gY29kZSArIDEpIDogKGV2ZW50LmJ1dHRvbiA9PT0gY29kZSk7CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIGlzTGVmdENsaWNrOiAgIGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBpc0J1dHRvbihldmVudCwgMCkgfSwKICAgIGlzTWlkZGxlQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBpc0J1dHRvbihldmVudCwgMSkgfSwKICAgIGlzUmlnaHRDbGljazogIGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBpc0J1dHRvbihldmVudCwgMikgfSwKCiAgICBlbGVtZW50OiBmdW5jdGlvbihldmVudCkgewogICAgICB2YXIgbm9kZSA9IEV2ZW50LmV4dGVuZChldmVudCkudGFyZ2V0OwogICAgICByZXR1cm4gRWxlbWVudC5leHRlbmQobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSA/IG5vZGUucGFyZW50Tm9kZSA6IG5vZGUpOwogICAgfSwKCiAgICBmaW5kRWxlbWVudDogZnVuY3Rpb24oZXZlbnQsIGV4cHJlc3Npb24pIHsKICAgICAgdmFyIGVsZW1lbnQgPSBFdmVudC5lbGVtZW50KGV2ZW50KTsKICAgICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm4gZWxlbWVudDsKICAgICAgdmFyIGVsZW1lbnRzID0gW2VsZW1lbnRdLmNvbmNhdChlbGVtZW50LmFuY2VzdG9ycygpKTsKICAgICAgcmV0dXJuIFNlbGVjdG9yLmZpbmRFbGVtZW50KGVsZW1lbnRzLCBleHByZXNzaW9uLCAwKTsKICAgIH0sCgogICAgcG9pbnRlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB4OiBldmVudC5wYWdlWCB8fCAoZXZlbnQuY2xpZW50WCArCiAgICAgICAgICAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSksCiAgICAgICAgeTogZXZlbnQucGFnZVkgfHwgKGV2ZW50LmNsaWVudFkgKwogICAgICAgICAgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApKQogICAgICB9OwogICAgfSwKCiAgICBwb2ludGVyWDogZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIEV2ZW50LnBvaW50ZXIoZXZlbnQpLnggfSwKICAgIHBvaW50ZXJZOiBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gRXZlbnQucG9pbnRlcihldmVudCkueSB9LAoKICAgIHN0b3A6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIEV2ZW50LmV4dGVuZChldmVudCk7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBldmVudC5zdG9wcGVkID0gdHJ1ZTsKICAgIH0KICB9Owp9KSgpOwoKRXZlbnQuZXh0ZW5kID0gKGZ1bmN0aW9uKCkgewogIHZhciBtZXRob2RzID0gT2JqZWN0LmtleXMoRXZlbnQuTWV0aG9kcykuaW5qZWN0KHsgfSwgZnVuY3Rpb24obSwgbmFtZSkgewogICAgbVtuYW1lXSA9IEV2ZW50Lk1ldGhvZHNbbmFtZV0ubWV0aG9kaXplKCk7CiAgICByZXR1cm4gbTsKICB9KTsKCiAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CiAgICBPYmplY3QuZXh0ZW5kKG1ldGhvZHMsIHsKICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsgdGhpcy5jYW5jZWxCdWJibGUgPSB0cnVlIH0sCiAgICAgIHByZXZlbnREZWZhdWx0OiAgZnVuY3Rpb24oKSB7IHRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZSB9LAogICAgICBpbnNwZWN0OiBmdW5jdGlvbigpIHsgcmV0dXJuICJbb2JqZWN0IEV2ZW50XSIgfQogICAgfSk7CgogICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIGlmICghZXZlbnQpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGV2ZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlKSByZXR1cm4gZXZlbnQ7CgogICAgICBldmVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOwogICAgICB2YXIgcG9pbnRlciA9IEV2ZW50LnBvaW50ZXIoZXZlbnQpOwogICAgICBPYmplY3QuZXh0ZW5kKGV2ZW50LCB7CiAgICAgICAgdGFyZ2V0OiBldmVudC5zcmNFbGVtZW50LAogICAgICAgIHJlbGF0ZWRUYXJnZXQ6IEV2ZW50LnJlbGF0ZWRUYXJnZXQoZXZlbnQpLAogICAgICAgIHBhZ2VYOiAgcG9pbnRlci54LAogICAgICAgIHBhZ2VZOiAgcG9pbnRlci55CiAgICAgIH0pOwogICAgICByZXR1cm4gT2JqZWN0LmV4dGVuZChldmVudCwgbWV0aG9kcyk7CiAgICB9OwoKICB9IGVsc2UgewogICAgRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlIHx8IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikuX19wcm90b19fOwogICAgT2JqZWN0LmV4dGVuZChFdmVudC5wcm90b3R5cGUsIG1ldGhvZHMpOwogICAgcmV0dXJuIFByb3RvdHlwZS5LOwogIH0KfSkoKTsKCk9iamVjdC5leHRlbmQoRXZlbnQsIChmdW5jdGlvbigpIHsKICB2YXIgY2FjaGUgPSBFdmVudC5jYWNoZTsKCiAgZnVuY3Rpb24gZ2V0RXZlbnRJRChlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJRCkgcmV0dXJuIGVsZW1lbnQuX3Byb3RvdHlwZUV2ZW50SURbMF07CiAgICBhcmd1bWVudHMuY2FsbGVlLmlkID0gYXJndW1lbnRzLmNhbGxlZS5pZCB8fCAxOwogICAgcmV0dXJuIGVsZW1lbnQuX3Byb3RvdHlwZUV2ZW50SUQgPSBbKythcmd1bWVudHMuY2FsbGVlLmlkXTsKICB9CgogIGZ1bmN0aW9uIGdldERPTUV2ZW50TmFtZShldmVudE5hbWUpIHsKICAgIGlmIChldmVudE5hbWUgJiYgZXZlbnROYW1lLmluY2x1ZGUoJzonKSkgcmV0dXJuICJkYXRhYXZhaWxhYmxlIjsKICAgIHJldHVybiBldmVudE5hbWU7CiAgfQoKICBmdW5jdGlvbiBnZXRDYWNoZUZvcklEKGlkKSB7CiAgICByZXR1cm4gY2FjaGVbaWRdID0gY2FjaGVbaWRdIHx8IHsgfTsKICB9CgogIGZ1bmN0aW9uIGdldFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLCBldmVudE5hbWUpIHsKICAgIHZhciBjID0gZ2V0Q2FjaGVGb3JJRChpZCk7CiAgICByZXR1cm4gY1tldmVudE5hbWVdID0gY1tldmVudE5hbWVdIHx8IFtdOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlV3JhcHBlcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgIHZhciBpZCA9IGdldEV2ZW50SUQoZWxlbWVudCk7CiAgICB2YXIgYyA9IGdldFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLCBldmVudE5hbWUpOwogICAgaWYgKGMucGx1Y2soImhhbmRsZXIiKS5pbmNsdWRlKGhhbmRsZXIpKSByZXR1cm4gZmFsc2U7CgogICAgdmFyIHdyYXBwZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBpZiAoIUV2ZW50IHx8ICFFdmVudC5leHRlbmQgfHwKICAgICAgICAoZXZlbnQuZXZlbnROYW1lICYmIGV2ZW50LmV2ZW50TmFtZSAhPSBldmVudE5hbWUpKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgRXZlbnQuZXh0ZW5kKGV2ZW50KTsKICAgICAgaGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTsKICAgIH07CgogICAgd3JhcHBlci5oYW5kbGVyID0gaGFuZGxlcjsKICAgIGMucHVzaCh3cmFwcGVyKTsKICAgIHJldHVybiB3cmFwcGVyOwogIH0KCiAgZnVuY3Rpb24gZmluZFdyYXBwZXIoaWQsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgdmFyIGMgPSBnZXRXcmFwcGVyc0ZvckV2ZW50TmFtZShpZCwgZXZlbnROYW1lKTsKICAgIHJldHVybiBjLmZpbmQoZnVuY3Rpb24od3JhcHBlcikgeyByZXR1cm4gd3JhcHBlci5oYW5kbGVyID09IGhhbmRsZXIgfSk7CiAgfQoKICBmdW5jdGlvbiBkZXN0cm95V3JhcHBlcihpZCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICB2YXIgYyA9IGdldENhY2hlRm9ySUQoaWQpOwogICAgaWYgKCFjW2V2ZW50TmFtZV0pIHJldHVybiBmYWxzZTsKICAgIGNbZXZlbnROYW1lXSA9IGNbZXZlbnROYW1lXS53aXRob3V0KGZpbmRXcmFwcGVyKGlkLCBldmVudE5hbWUsIGhhbmRsZXIpKTsKICB9CgogIGZ1bmN0aW9uIGRlc3Ryb3lDYWNoZSgpIHsKICAgIGZvciAodmFyIGlkIGluIGNhY2hlKQogICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gY2FjaGVbaWRdKQogICAgICAgIGNhY2hlW2lkXVtldmVudE5hbWVdID0gbnVsbDsKICB9CgogIGlmICh3aW5kb3cuYXR0YWNoRXZlbnQpIHsKICAgIHdpbmRvdy5hdHRhY2hFdmVudCgib251bmxvYWQiLCBkZXN0cm95Q2FjaGUpOwogIH0KCiAgcmV0dXJuIHsKICAgIG9ic2VydmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgICAgdmFyIG5hbWUgPSBnZXRET01FdmVudE5hbWUoZXZlbnROYW1lKTsKCiAgICAgIHZhciB3cmFwcGVyID0gY3JlYXRlV3JhcHBlcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICBpZiAoIXdyYXBwZXIpIHJldHVybiBlbGVtZW50OwoKICAgICAgaWYgKGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwcGVyLCBmYWxzZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgib24iICsgbmFtZSwgd3JhcHBlcik7CiAgICAgIH0KCiAgICAgIHJldHVybiBlbGVtZW50OwogICAgfSwKCiAgICBzdG9wT2JzZXJ2aW5nOiBmdW5jdGlvbihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICAgIHZhciBpZCA9IGdldEV2ZW50SUQoZWxlbWVudCksIG5hbWUgPSBnZXRET01FdmVudE5hbWUoZXZlbnROYW1lKTsKCiAgICAgIGlmICghaGFuZGxlciAmJiBldmVudE5hbWUpIHsKICAgICAgICBnZXRXcmFwcGVyc0ZvckV2ZW50TmFtZShpZCwgZXZlbnROYW1lKS5lYWNoKGZ1bmN0aW9uKHdyYXBwZXIpIHsKICAgICAgICAgIGVsZW1lbnQuc3RvcE9ic2VydmluZyhldmVudE5hbWUsIHdyYXBwZXIuaGFuZGxlcik7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CgogICAgICB9IGVsc2UgaWYgKCFldmVudE5hbWUpIHsKICAgICAgICBPYmplY3Qua2V5cyhnZXRDYWNoZUZvcklEKGlkKSkuZWFjaChmdW5jdGlvbihldmVudE5hbWUpIHsKICAgICAgICAgIGVsZW1lbnQuc3RvcE9ic2VydmluZyhldmVudE5hbWUpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICB9CgogICAgICB2YXIgd3JhcHBlciA9IGZpbmRXcmFwcGVyKGlkLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICBpZiAoIXdyYXBwZXIpIHJldHVybiBlbGVtZW50OwoKICAgICAgaWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcikgewogICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwcGVyLCBmYWxzZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZWxlbWVudC5kZXRhY2hFdmVudCgib24iICsgbmFtZSwgd3JhcHBlcik7CiAgICAgIH0KCiAgICAgIGRlc3Ryb3lXcmFwcGVyKGlkLCBldmVudE5hbWUsIGhhbmRsZXIpOwoKICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICB9LAoKICAgIGZpcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSwgbWVtbykgewogICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgICAgaWYgKGVsZW1lbnQgPT0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgIWVsZW1lbnQuZGlzcGF0Y2hFdmVudCkKICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoKICAgICAgdmFyIGV2ZW50OwogICAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHsKICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIik7CiAgICAgICAgZXZlbnQuaW5pdEV2ZW50KCJkYXRhYXZhaWxhYmxlIiwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpOwogICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9ICJvbmRhdGFhdmFpbGFibGUiOwogICAgICB9CgogICAgICBldmVudC5ldmVudE5hbWUgPSBldmVudE5hbWU7CiAgICAgIGV2ZW50Lm1lbW8gPSBtZW1vIHx8IHsgfTsKCiAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkgewogICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZWxlbWVudC5maXJlRXZlbnQoZXZlbnQuZXZlbnRUeXBlLCBldmVudCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBFdmVudC5leHRlbmQoZXZlbnQpOwogICAgfQogIH07Cn0pKCkpOwoKT2JqZWN0LmV4dGVuZChFdmVudCwgRXZlbnQuTWV0aG9kcyk7CgpFbGVtZW50LmFkZE1ldGhvZHMoewogIGZpcmU6ICAgICAgICAgIEV2ZW50LmZpcmUsCiAgb2JzZXJ2ZTogICAgICAgRXZlbnQub2JzZXJ2ZSwKICBzdG9wT2JzZXJ2aW5nOiBFdmVudC5zdG9wT2JzZXJ2aW5nCn0pOwoKT2JqZWN0LmV4dGVuZChkb2N1bWVudCwgewogIGZpcmU6ICAgICAgICAgIEVsZW1lbnQuTWV0aG9kcy5maXJlLm1ldGhvZGl6ZSgpLAogIG9ic2VydmU6ICAgICAgIEVsZW1lbnQuTWV0aG9kcy5vYnNlcnZlLm1ldGhvZGl6ZSgpLAogIHN0b3BPYnNlcnZpbmc6IEVsZW1lbnQuTWV0aG9kcy5zdG9wT2JzZXJ2aW5nLm1ldGhvZGl6ZSgpLAogIGxvYWRlZDogICAgICAgIGZhbHNlCn0pOwoKKGZ1bmN0aW9uKCkgewogIC8qIFN1cHBvcnQgZm9yIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGlzIGJhc2VkIG9uIHdvcmsgYnkgRGFuIFdlYmIsCiAgICAgTWF0dGhpYXMgTWlsbGVyLCBEZWFuIEVkd2FyZHMgYW5kIEpvaG4gUmVzaWcuICovCgogIHZhciB0aW1lcjsKCiAgZnVuY3Rpb24gZmlyZUNvbnRlbnRMb2FkZWRFdmVudCgpIHsKICAgIGlmIChkb2N1bWVudC5sb2FkZWQpIHJldHVybjsKICAgIGlmICh0aW1lcikgd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgZG9jdW1lbnQuZmlyZSgiZG9tOmxvYWRlZCIpOwogICAgZG9jdW1lbnQubG9hZGVkID0gdHJ1ZTsKICB9CgogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CiAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB7CiAgICAgIHRpbWVyID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICgvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGRvY3VtZW50LnJlYWR5U3RhdGUpKQogICAgICAgICAgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCgpOwogICAgICB9LCAwKTsKCiAgICAgIEV2ZW50Lm9ic2VydmUod2luZG93LCAibG9hZCIsIGZpcmVDb250ZW50TG9hZGVkRXZlbnQpOwoKICAgIH0gZWxzZSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLAogICAgICAgIGZpcmVDb250ZW50TG9hZGVkRXZlbnQsIGZhbHNlKTsKICAgIH0KCiAgfSBlbHNlIHsKICAgIGRvY3VtZW50LndyaXRlKCI8c2NyaXB0IGlkPV9fb25ET01Db250ZW50TG9hZGVkIGRlZmVyIHNyYz0vLzo+PFwvc2NyaXB0PiIpOwogICAgJCgiX19vbkRPTUNvbnRlbnRMb2FkZWQiKS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSB7CiAgICAgICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwogICAgICAgIGZpcmVDb250ZW50TG9hZGVkRXZlbnQoKTsKICAgICAgfQogICAgfTsKICB9Cn0pKCk7Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBERVBSRUNBVEVEIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKSGFzaC50b1F1ZXJ5U3RyaW5nID0gT2JqZWN0LnRvUXVlcnlTdHJpbmc7Cgp2YXIgVG9nZ2xlID0geyBkaXNwbGF5OiBFbGVtZW50LnRvZ2dsZSB9OwoKRWxlbWVudC5NZXRob2RzLmNoaWxkT2YgPSBFbGVtZW50Lk1ldGhvZHMuZGVzY2VuZGFudE9mOwoKdmFyIEluc2VydGlvbiA9IHsKICBCZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7YmVmb3JlOmNvbnRlbnR9KTsKICB9LAoKICBUb3A6IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7dG9wOmNvbnRlbnR9KTsKICB9LAoKICBCb3R0b206IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7Ym90dG9tOmNvbnRlbnR9KTsKICB9LAoKICBBZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgewogICAgcmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGVsZW1lbnQsIHthZnRlcjpjb250ZW50fSk7CiAgfQp9OwoKdmFyICRjb250aW51ZSA9IG5ldyBFcnJvcignInRocm93ICRjb250aW51ZSIgaXMgZGVwcmVjYXRlZCwgdXNlICJyZXR1cm4iIGluc3RlYWQnKTsKCi8vIFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHNjcmlwdC5hY3Vsby51czsgbm90aWNlIHRoZSBkZXByZWNhdGVkIG1ldGhvZHMKLy8gZnVydGhlciBiZWxvdywgdGhhdCBtYXAgdG8gdGhlIG5ld2VyIEVsZW1lbnQgbWV0aG9kcy4KdmFyIFBvc2l0aW9uID0gewogIC8vIHNldCB0byB0cnVlIGlmIG5lZWRlZCwgd2FybmluZzogZmlyZWZveCBwZXJmb3JtYW5jZSBwcm9ibGVtcwogIC8vIE5PVCBuZWVlZGVkIGZvciBwYWdlIHNjcm9sbGluZywgb25seSBpZiBkcmFnZ2FibGUgY29udGFpbmVkIGluCiAgLy8gc2Nyb2xsYWJsZSBlbGVtZW50cwogIGluY2x1ZGVTY3JvbGxPZmZzZXRzOiBmYWxzZSwKCiAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgd2l0aGluSW5jbHVkaW5nU2Nyb2xsb2Zmc2V0LCBldmVyeSB0aW1lIHRoZQogIC8vIHBhZ2UgaXMgc2Nyb2xsZWQKICBwcmVwYXJlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGVsdGFYID0gIHdpbmRvdy5wYWdlWE9mZnNldAogICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQKICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdAogICAgICAgICAgICAgICAgfHwgMDsKICAgIHRoaXMuZGVsdGFZID0gIHdpbmRvdy5wYWdlWU9mZnNldAogICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcAogICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AKICAgICAgICAgICAgICAgIHx8IDA7CiAgfSwKCiAgLy8gY2FjaGVzIHgveSBjb29yZGluYXRlIHBhaXIgdG8gdXNlIHdpdGggb3ZlcmxhcAogIHdpdGhpbjogZnVuY3Rpb24oZWxlbWVudCwgeCwgeSkgewogICAgaWYgKHRoaXMuaW5jbHVkZVNjcm9sbE9mZnNldHMpCiAgICAgIHJldHVybiB0aGlzLndpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHMoZWxlbWVudCwgeCwgeSk7CiAgICB0aGlzLnhjb21wID0geDsKICAgIHRoaXMueWNvbXAgPSB5OwogICAgdGhpcy5vZmZzZXQgPSBFbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQoZWxlbWVudCk7CgogICAgcmV0dXJuICh5ID49IHRoaXMub2Zmc2V0WzFdICYmCiAgICAgICAgICAgIHkgPCAgdGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCAmJgogICAgICAgICAgICB4ID49IHRoaXMub2Zmc2V0WzBdICYmCiAgICAgICAgICAgIHggPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKTsKICB9LAoKICB3aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXRzOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7CiAgICB2YXIgb2Zmc2V0Y2FjaGUgPSBFbGVtZW50LmN1bXVsYXRpdmVTY3JvbGxPZmZzZXQoZWxlbWVudCk7CgogICAgdGhpcy54Y29tcCA9IHggKyBvZmZzZXRjYWNoZVswXSAtIHRoaXMuZGVsdGFYOwogICAgdGhpcy55Y29tcCA9IHkgKyBvZmZzZXRjYWNoZVsxXSAtIHRoaXMuZGVsdGFZOwogICAgdGhpcy5vZmZzZXQgPSBFbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQoZWxlbWVudCk7CgogICAgcmV0dXJuICh0aGlzLnljb21wID49IHRoaXMub2Zmc2V0WzFdICYmCiAgICAgICAgICAgIHRoaXMueWNvbXAgPCAgdGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCAmJgogICAgICAgICAgICB0aGlzLnhjb21wID49IHRoaXMub2Zmc2V0WzBdICYmCiAgICAgICAgICAgIHRoaXMueGNvbXAgPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKTsKICB9LAoKICAvLyB3aXRoaW4gbXVzdCBiZSBjYWxsZWQgZGlyZWN0bHkgYmVmb3JlCiAgb3ZlcmxhcDogZnVuY3Rpb24obW9kZSwgZWxlbWVudCkgewogICAgaWYgKCFtb2RlKSByZXR1cm4gMDsKICAgIGlmIChtb2RlID09ICd2ZXJ0aWNhbCcpCiAgICAgIHJldHVybiAoKHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQpIC0gdGhpcy55Y29tcCkgLwogICAgICAgIGVsZW1lbnQub2Zmc2V0SGVpZ2h0OwogICAgaWYgKG1vZGUgPT0gJ2hvcml6b250YWwnKQogICAgICByZXR1cm4gKCh0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpIC0gdGhpcy54Y29tcCkgLwogICAgICAgIGVsZW1lbnQub2Zmc2V0V2lkdGg7CiAgfSwKCiAgLy8gRGVwcmVjYXRpb24gbGF5ZXIgLS0gdXNlIG5ld2VyIEVsZW1lbnQgbWV0aG9kcyBub3cgKDEuNS4yKS4KCiAgY3VtdWxhdGl2ZU9mZnNldDogRWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQsCgogIHBvc2l0aW9uZWRPZmZzZXQ6IEVsZW1lbnQuTWV0aG9kcy5wb3NpdGlvbmVkT2Zmc2V0LAoKICBhYnNvbHV0aXplOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBQb3NpdGlvbi5wcmVwYXJlKCk7CiAgICByZXR1cm4gRWxlbWVudC5hYnNvbHV0aXplKGVsZW1lbnQpOwogIH0sCgogIHJlbGF0aXZpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIFBvc2l0aW9uLnByZXBhcmUoKTsKICAgIHJldHVybiBFbGVtZW50LnJlbGF0aXZpemUoZWxlbWVudCk7CiAgfSwKCiAgcmVhbE9mZnNldDogRWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVTY3JvbGxPZmZzZXQsCgogIG9mZnNldFBhcmVudDogRWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVudCwKCiAgcGFnZTogRWxlbWVudC5NZXRob2RzLnZpZXdwb3J0T2Zmc2V0LAoKICBjbG9uZTogZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHsgfTsKICAgIHJldHVybiBFbGVtZW50LmNsb25lUG9zaXRpb24odGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpOwogIH0KfTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzKXsKICBmdW5jdGlvbiBpdGVyKG5hbWUpIHsKICAgIHJldHVybiBuYW1lLmJsYW5rKCkgPyBudWxsIDogIltjb250YWlucyhjb25jYXQoJyAnLCBAY2xhc3MsICcgJyksICcgIiArIG5hbWUgKyAiICcpXSI7CiAgfQoKICBpbnN0YW5jZU1ldGhvZHMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGggPwogIGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgewogICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvU3RyaW5nKCkuc3RyaXAoKTsKICAgIHZhciBjb25kID0gL1xzLy50ZXN0KGNsYXNzTmFtZSkgPyAkdyhjbGFzc05hbWUpLm1hcChpdGVyKS5qb2luKCcnKSA6IGl0ZXIoY2xhc3NOYW1lKTsKICAgIHJldHVybiBjb25kID8gZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlYUGF0aCgnLi8vKicgKyBjb25kLCBlbGVtZW50KSA6IFtdOwogIH0gOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlwKCk7CiAgICB2YXIgZWxlbWVudHMgPSBbXSwgY2xhc3NOYW1lcyA9ICgvXHMvLnRlc3QoY2xhc3NOYW1lKSA/ICR3KGNsYXNzTmFtZSkgOiBudWxsKTsKICAgIGlmICghY2xhc3NOYW1lcyAmJiAhY2xhc3NOYW1lKSByZXR1cm4gZWxlbWVudHM7CgogICAgdmFyIG5vZGVzID0gJChlbGVtZW50KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOwogICAgY2xhc3NOYW1lID0gJyAnICsgY2xhc3NOYW1lICsgJyAnOwoKICAgIGZvciAodmFyIGkgPSAwLCBjaGlsZCwgY247IGNoaWxkID0gbm9kZXNbaV07IGkrKykgewogICAgICBpZiAoY2hpbGQuY2xhc3NOYW1lICYmIChjbiA9ICcgJyArIGNoaWxkLmNsYXNzTmFtZSArICcgJykgJiYgKGNuLmluY2x1ZGUoY2xhc3NOYW1lKSB8fAogICAgICAgICAgKGNsYXNzTmFtZXMgJiYgY2xhc3NOYW1lcy5hbGwoZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgICByZXR1cm4gIW5hbWUudG9TdHJpbmcoKS5ibGFuaygpICYmIGNuLmluY2x1ZGUoJyAnICsgbmFtZSArICcgJyk7CiAgICAgICAgICB9KSkpKQogICAgICAgIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQpKTsKICAgIH0KICAgIHJldHVybiBlbGVtZW50czsKICB9OwoKICByZXR1cm4gZnVuY3Rpb24oY2xhc3NOYW1lLCBwYXJlbnRFbGVtZW50KSB7CiAgICByZXR1cm4gJChwYXJlbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lKTsKICB9Owp9KEVsZW1lbnQuTWV0aG9kcyk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCkVsZW1lbnQuQ2xhc3NOYW1lcyA9IENsYXNzLmNyZWF0ZSgpOwpFbGVtZW50LkNsYXNzTmFtZXMucHJvdG90eXBlID0gewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgfSwKCiAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKS5zZWxlY3QoZnVuY3Rpb24obmFtZSkgewogICAgICByZXR1cm4gbmFtZS5sZW5ndGggPiAwOwogICAgfSkuX2VhY2goaXRlcmF0b3IpOwogIH0sCgogIHNldDogZnVuY3Rpb24oY2xhc3NOYW1lKSB7CiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogIH0sCgogIGFkZDogZnVuY3Rpb24oY2xhc3NOYW1lVG9BZGQpIHsKICAgIGlmICh0aGlzLmluY2x1ZGUoY2xhc3NOYW1lVG9BZGQpKSByZXR1cm47CiAgICB0aGlzLnNldCgkQSh0aGlzKS5jb25jYXQoY2xhc3NOYW1lVG9BZGQpLmpvaW4oJyAnKSk7CiAgfSwKCiAgcmVtb3ZlOiBmdW5jdGlvbihjbGFzc05hbWVUb1JlbW92ZSkgewogICAgaWYgKCF0aGlzLmluY2x1ZGUoY2xhc3NOYW1lVG9SZW1vdmUpKSByZXR1cm47CiAgICB0aGlzLnNldCgkQSh0aGlzKS53aXRob3V0KGNsYXNzTmFtZVRvUmVtb3ZlKS5qb2luKCcgJykpOwogIH0sCgogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiAkQSh0aGlzKS5qb2luKCcgJyk7CiAgfQp9OwoKT2JqZWN0LmV4dGVuZChFbGVtZW50LkNsYXNzTmFtZXMucHJvdG90eXBlLCBFbnVtZXJhYmxlKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRWxlbWVudC5hZGRNZXRob2RzKCk7]]></data>
	</file>
	<file>
	  <filename>/js/scriptaculous.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gc2NyaXB0LmFjdWxvLnVzIHNjcmlwdGFjdWxvdXMuanMgdjEuOC4xLCBUaHUgSmFuIDAzIDIyOjA3OjEyIC0wNTAwIDIwMDgKCi8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykKLy8gCi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwovLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLy8gIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwovLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwovLyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLy8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgovLyAKLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKLy8gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi8vCi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAovLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQovLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgovLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLy8KLy8gRm9yIGRldGFpbHMsIHNlZSB0aGUgc2NyaXB0LmFjdWxvLnVzIHdlYiBzaXRlOiBodHRwOi8vc2NyaXB0LmFjdWxvLnVzLwoKdmFyIFNjcmlwdGFjdWxvdXMgPSB7CiAgVmVyc2lvbjogJzEuOC4xJywKICByZXF1aXJlOiBmdW5jdGlvbihsaWJyYXJ5TmFtZSkgewogICAgLy8gaW5zZXJ0aW5nIHZpYSBET00gZmFpbHMgaW4gU2FmYXJpIDIuMCwgc28gYnJ1dGUgZm9yY2UgYXBwcm9hY2gKICAgIGRvY3VtZW50LndyaXRlKCc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInK2xpYnJhcnlOYW1lKyciPjxcL3NjcmlwdD4nKTsKICB9LAogIFJFUVVJUkVEX1BST1RPVFlQRTogJzEuNi4wJywKICBsb2FkOiBmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGNvbnZlcnRWZXJzaW9uU3RyaW5nKHZlcnNpb25TdHJpbmcpewogICAgICB2YXIgciA9IHZlcnNpb25TdHJpbmcuc3BsaXQoJy4nKTsKICAgICAgcmV0dXJuIHBhcnNlSW50KHJbMF0pKjEwMDAwMCArIHBhcnNlSW50KHJbMV0pKjEwMDAgKyBwYXJzZUludChyWzJdKTsKICAgIH0KIAogICAgaWYoKHR5cGVvZiBQcm90b3R5cGU9PSd1bmRlZmluZWQnKSB8fCAKICAgICAgICh0eXBlb2YgRWxlbWVudCA9PSAndW5kZWZpbmVkJykgfHwgCiAgICAgICAodHlwZW9mIEVsZW1lbnQuTWV0aG9kcz09J3VuZGVmaW5lZCcpIHx8CiAgICAgICAoY29udmVydFZlcnNpb25TdHJpbmcoUHJvdG90eXBlLlZlcnNpb24pIDwgCiAgICAgICAgY29udmVydFZlcnNpb25TdHJpbmcoU2NyaXB0YWN1bG91cy5SRVFVSVJFRF9QUk9UT1RZUEUpKSkKICAgICAgIHRocm93KCJzY3JpcHQuYWN1bG8udXMgcmVxdWlyZXMgdGhlIFByb3RvdHlwZSBKYXZhU2NyaXB0IGZyYW1ld29yayA+PSAiICsKICAgICAgICBTY3JpcHRhY3Vsb3VzLlJFUVVJUkVEX1BST1RPVFlQRSk7CiAgICAKICAgICRBKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkuZmluZEFsbCggZnVuY3Rpb24ocykgewogICAgICByZXR1cm4gKHMuc3JjICYmIHMuc3JjLm1hdGNoKC9zY3JpcHRhY3Vsb3VzXC5qcyhcPy4qKT8kLykpCiAgICB9KS5lYWNoKCBmdW5jdGlvbihzKSB7CiAgICAgIHZhciBwYXRoID0gcy5zcmMucmVwbGFjZSgvc2NyaXB0YWN1bG91c1wuanMoXD8uKik/JC8sJycpOwogICAgICB2YXIgaW5jbHVkZXMgPSBzLnNyYy5tYXRjaCgvXD8uKmxvYWQ9KFthLXosXSopLyk7CiAgICAgIChpbmNsdWRlcyA/IGluY2x1ZGVzWzFdIDogJ2J1aWxkZXIsZWZmZWN0cyxkcmFnZHJvcCxjb250cm9scyxzbGlkZXIsc291bmQnKS5zcGxpdCgnLCcpLmVhY2goCiAgICAgICBmdW5jdGlvbihpbmNsdWRlKSB7IFNjcmlwdGFjdWxvdXMucmVxdWlyZShwYXRoK2luY2x1ZGUrJy5qcycpIH0pOwogICAgfSk7CiAgfQp9CgpTY3JpcHRhY3Vsb3VzLmxvYWQoKTs=]]></data>
	</file>
</gallerytpl>
