PCEtLSA9PT09PT09PT09PT0gSU5TVEFMTFNNQVJUTFkgQk9PS0lORyBXSVpBUkQgdjEgPT09PT09PT09PT09IC0tPgo8c3R5bGU+CiNpcS1id3tmb250LWZhbWlseTp2YXIoLS1mYiwnRE0gU2Fucycsc2Fucy1zZXJpZik7Y29sb3I6dmFyKC0tdGV4dCwjMEEwRjFFKTttYXgtd2lkdGg6OTAwcHg7bWFyZ2luOjAgYXV0b30KI2lxLWJ3ICp7Ym94LXNpemluZzpib3JkZXItYm94fQouaXEtc3RlcHBlcntkaXNwbGF5OmZsZXg7Z2FwOjA7cGFkZGluZzoyNHB4IDMycHg7YmFja2dyb3VuZDojRkFGQkZDO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLHJnYmEoMCwwLDAsLjA2KSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1yLDE4cHgpIHZhcigtLXIsMThweCkgMCAwfQouaXEtc3RlcHtmbGV4OjE7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo1MDA7Y29sb3I6dmFyKC0tdGV4dDMsIzZCNzM5NCk7cG9zaXRpb246cmVsYXRpdmV9Ci5pcS1zdGVwOm5vdCg6bGFzdC1jaGlsZCk6OmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MTJweDt3aWR0aDpjYWxjKDEwMCUgLSAxMzBweCk7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOnZhcigtLWJvcmRlcjIscmdiYSgwLDAsMCwuMSkpfQouaXEtc3RlcC1udW17d2lkdGg6MjZweDtoZWlnaHQ6MjZweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOnZhcigtLWJvcmRlcjIscmdiYSgwLDAsMCwuMSkpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0MywjNkI3Mzk0KTtmbGV4LXNocmluazowO3RyYW5zaXRpb246YWxsIC4zc30KLmlxLXN0ZXAuaXMtYWN0aXZle2NvbG9yOnZhcigtLXRleHQsIzBBMEYxRSl9Ci5pcS1zdGVwLmlzLWFjdGl2ZSAuaXEtc3RlcC1udW17YmFja2dyb3VuZDp2YXIoLS1ibHVlLCMwMDY2RkYpO2NvbG9yOiNmZmY7Ym94LXNoYWRvdzp2YXIoLS1zaC1ibHVlLDAgNHB4IDI0cHggcmdiYSgwLDEwMiwyNTUsLjIpKX0KLmlxLXN0ZXAuaXMtZG9uZSAuaXEtc3RlcC1udW17YmFja2dyb3VuZDp2YXIoLS1ncmVlbiwjMDBDODc1KTtjb2xvcjojZmZmfQouaXEtYm9keXtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjEuNWZyIDFmcjtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcixyZ2JhKDAsMCwwLC4wNikpO2JvcmRlci10b3A6bm9uZTtib3JkZXItcmFkaXVzOjAgMCB2YXIoLS1yLDE4cHgpIHZhcigtLXIsMThweCk7b3ZlcmZsb3c6aGlkZGVufQouaXEtbWFpbntwYWRkaW5nOjI4cHggMzJweH0KLmlxLXNpZGV7cGFkZGluZzoyOHB4IDI0cHg7YmFja2dyb3VuZDojRkFGQkZDO2JvcmRlci1sZWZ0OjFweCBzb2xpZCB2YXIoLS1ib3JkZXIscmdiYSgwLDAsMCwuMDYpKX0KLmlxLXNoe2ZvbnQtZmFtaWx5OnZhcigtLWZkLCdETSBTZXJpZiBEaXNwbGF5JyxHZW9yZ2lhLHNlcmlmKTtmb250LXNpemU6MjBweDttYXJnaW46MCAwIDZweH0KLmlxLXN1Yntjb2xvcjp2YXIoLS10ZXh0MywjNkI3Mzk0KTtmb250LXNpemU6MTNweDttYXJnaW46MCAwIDIwcHh9Ci8qIEVzdGltYXRlIGJhbm5lciAqLwouaXEtZXN0LWJhbm5lcntiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxMzVkZWcscmdiYSgxNzcsMTU1LDI1NSwuMSkscmdiYSgxMTEsMTY3LDI1NSwuMDgpKTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoNzksMTQwLDI1NSwuMik7Ym9yZGVyLXJhZGl1czp2YXIoLS1yLXNtLDEycHgpO3BhZGRpbmc6MTRweCAxOHB4O21hcmdpbi1ib3R0b206MjBweDtkaXNwbGF5Om5vbmV9Ci5pcS1lc3QtYmFubmVyLm9ue2Rpc3BsYXk6YmxvY2t9Ci5pcS1lc3QtZXllYnJvd3tmb250LXNpemU6MTBweDtsZXR0ZXItc3BhY2luZzouMDhlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Y29sb3I6dmFyKC0tdGV4dDMsIzZCNzM5NCk7bWFyZ2luLWJvdHRvbTo0cHh9Ci5pcS1lc3QtcHJpY2V7Zm9udC1zaXplOjI2cHg7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOi0uMDJlbX0KLmlxLWVzdC1yYW5nZXtmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0MywjNkI3Mzk0KTttYXJnaW4tbGVmdDoxMHB4fQouaXEtZXN0LXN2Y3N7Zm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tdGV4dDIsIzNENDQ2MCk7bWFyZ2luLXRvcDo2cHh9Ci8qIFNlcnZpY2VzIGdyaWQgKi8KLmlxLXN2Yy1ncmlke2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTBweH0KLmlxLXN2Yy1jYXJke2JvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1ib3JkZXIyLHJnYmEoMCwwLDAsLjEpKTtib3JkZXItcmFkaXVzOnZhcigtLXItc20sMTJweCk7cGFkZGluZzoxMXB4IDE0cHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDt0cmFuc2l0aW9uOmFsbCAuMnM7dXNlci1zZWxlY3Q6bm9uZTtmb250LXNpemU6MTRweH0KLmlxLXN2Yy1jYXJkOmhvdmVye2JvcmRlci1jb2xvcjp2YXIoLS1ibHVlLCMwMDY2RkYpO2JhY2tncm91bmQ6cmdiYSgwLDEwMiwyNTUsLjAzKX0KLmlxLXN2Yy1jYXJkLm9ue2JvcmRlci1jb2xvcjp2YXIoLS1ibHVlLCMwMDY2RkYpO2JhY2tncm91bmQ6cmdiYSgwLDEwMiwyNTUsLjA1KX0KLmlxLWNoa3t3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2JvcmRlcjoycHggc29saWQgdmFyKC0tYm9yZGVyMixyZ2JhKDAsMCwwLC4xKSk7Ym9yZGVyLXJhZGl1czo1cHg7ZmxleC1zaHJpbms6MDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7dHJhbnNpdGlvbjphbGwgLjJzfQouaXEtc3ZjLWNhcmQub24gLmlxLWNoa3tiYWNrZ3JvdW5kOnZhcigtLWJsdWUsIzAwNjZGRik7Ym9yZGVyLWNvbG9yOnZhcigtLWJsdWUsIzAwNjZGRil9Ci8qIENhbGVuZGFyICovCi5pcS1jYWx7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIscmdiYSgwLDAsMCwuMDYpKTtib3JkZXItcmFkaXVzOnZhcigtLXItc20sMTJweCk7cGFkZGluZzoxNnB4O21hcmdpbi1ib3R0b206MjBweH0KLmlxLWNhbC1oZWFke2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbToxNHB4fQouaXEtY2FsLXRpdGxle2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTVweH0KLmlxLWNhbC1idG57YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2NvbG9yOnZhcigtLXRleHQzLCM2QjczOTQpO2ZvbnQtc2l6ZToxOHB4O3BhZGRpbmc6MnB4IDZweDtib3JkZXItcmFkaXVzOjZweH0KLmlxLWNhbC1idG46aG92ZXJ7YmFja2dyb3VuZDp2YXIoLS1ib3JkZXIscmdiYSgwLDAsMCwuMDYpKTtjb2xvcjp2YXIoLS10ZXh0LCMwQTBGMUUpfQouaXEtY2FsLWdyaWR7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoNywxZnIpO2dhcDozcHg7dGV4dC1hbGlnbjpjZW50ZXJ9Ci5pcS1jYWwtZG57Zm9udC1zaXplOjExcHg7Y29sb3I6dmFyKC0tdGV4dDMsIzZCNzM5NCk7cGFkZGluZy1ib3R0b206NnB4O2ZvbnQtd2VpZ2h0OjYwMH0KLmlxLWNhbC1ke2FzcGVjdC1yYXRpbzoxO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtib3JkZXItcmFkaXVzOjUwJTtmb250LXNpemU6MTNweDtjdXJzb3I6cG9pbnRlcjt0cmFuc2l0aW9uOmFsbCAuMTVzfQouaXEtY2FsLWQ6aG92ZXI6bm90KC5vZmYpOm5vdCguZW1wKXtiYWNrZ3JvdW5kOiNGMEY3RkY7Y29sb3I6dmFyKC0tYmx1ZSwjMDA2NkZGKX0KLmlxLWNhbC1kLnNlbHtiYWNrZ3JvdW5kOnZhcigtLWJsdWUsIzAwNjZGRik7Y29sb3I6I2ZmZn0KLmlxLWNhbC1kLm9mZntjb2xvcjp2YXIoLS1ib3JkZXIyLHJnYmEoMCwwLDAsLjEpKTtjdXJzb3I6bm90LWFsbG93ZWR9Ci5pcS1jYWwtZC5lbXB7Y3Vyc29yOmRlZmF1bHR9Ci5pcS1jYWwtZC50b2R7Zm9udC13ZWlnaHQ6NzAwO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYmx1ZSwjMDA2NkZGKX0KLyogVGltZSBzbG90cyAqLwouaXEtdHMtbGFiZWx7Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQyLCMzRDQ0NjApO21hcmdpbi1ib3R0b206MTBweH0KLmlxLXNsb3Rze2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDMsMWZyKTtnYXA6OHB4fQouaXEtc2xvdHtib3JkZXI6MS41cHggc29saWQgdmFyKC0tYm9yZGVyMixyZ2JhKDAsMCwwLC4xKSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1yLXNtLDEycHgpO3BhZGRpbmc6MTBweDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTNweDtjdXJzb3I6cG9pbnRlcjt0cmFuc2l0aW9uOmFsbCAuMnN9Ci5pcS1zbG90OmhvdmVyOm5vdCguYmspe2JvcmRlci1jb2xvcjp2YXIoLS1ibHVlLCMwMDY2RkYpO2NvbG9yOnZhcigtLWJsdWUsIzAwNjZGRil9Ci5pcS1zbG90LnNlbHtiYWNrZ3JvdW5kOnZhcigtLWJsdWUsIzAwNjZGRik7Y29sb3I6I2ZmZjtib3JkZXItY29sb3I6dmFyKC0tYmx1ZSwjMDA2NkZGKX0KLmlxLXNsb3QuYmt7Y29sb3I6dmFyKC0tYm9yZGVyMixyZ2JhKDAsMCwwLC4xKSk7dGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaDtjdXJzb3I6bm90LWFsbG93ZWQ7YmFja2dyb3VuZDojRkFGQUZBfQovKiBGb3JtICovCi5pcS1mZ3ttYXJnaW4tYm90dG9tOjE0cHh9Ci5pcS1sYmx7ZGlzcGxheTpibG9jaztmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dDIsIzNENDQ2MCk7bWFyZ2luLWJvdHRvbTo1cHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi4wNWVtfQouaXEtaW5we3dpZHRoOjEwMCU7cGFkZGluZzoxMXB4IDE0cHg7Ym9yZGVyOjEuNXB4IHNvbGlkIHZhcigtLWJvcmRlcjIscmdiYSgwLDAsMCwuMSkpO2JvcmRlci1yYWRpdXM6dmFyKC0tci1zbSwxMnB4KTtmb250LWZhbWlseTp2YXIoLS1mYiwnRE0gU2Fucycsc2Fucy1zZXJpZik7Zm9udC1zaXplOjE0cHg7b3V0bGluZTpub25lO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4yc30KLmlxLWlucDpmb2N1c3tib3JkZXItY29sb3I6dmFyKC0tYmx1ZSwjMDA2NkZGKX0KLmlxLWlucC5lcnJ7Ym9yZGVyLWNvbG9yOiNlZjQ0NDR9CnRleHRhcmVhLmlxLWlucHtyZXNpemU6dmVydGljYWw7bWluLWhlaWdodDo4MHB4fQovKiBOYXYgKi8KLmlxLW5hdntkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi10b3A6MjRweDtwYWRkaW5nLXRvcDoyMHB4O2JvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWJvcmRlcixyZ2JhKDAsMCwwLC4wNikpfQouaXEtYnRuLWJhY2t7YmFja2dyb3VuZDpub25lO2JvcmRlcjoxLjVweCBzb2xpZCB2YXIoLS1ib3JkZXIyLHJnYmEoMCwwLDAsLjEpKTtib3JkZXItcmFkaXVzOnZhcigtLXItZnVsbCwxMDBweCk7cGFkZGluZzoxMXB4IDI0cHg7Zm9udC1mYW1pbHk6dmFyKC0tZmIsJ0RNIFNhbnMnLHNhbnMtc2VyaWYpO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMDtjdXJzb3I6cG9pbnRlcjtjb2xvcjp2YXIoLS10ZXh0MiwjM0Q0NDYwKTt0cmFuc2l0aW9uOmFsbCAuMnN9Ci5pcS1idG4tYmFjazpob3Zlcjpub3QoOmRpc2FibGVkKXtib3JkZXItY29sb3I6dmFyKC0tdGV4dCwjMEEwRjFFKTtjb2xvcjp2YXIoLS10ZXh0LCMwQTBGMUUpfQouaXEtYnRuLWJhY2s6ZGlzYWJsZWR7b3BhY2l0eTouNDtjdXJzb3I6bm90LWFsbG93ZWR9Ci5pcS1idG4tbmV4dHtiYWNrZ3JvdW5kOnZhcigtLWJsdWUsIzAwNjZGRik7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOnZhcigtLXItZnVsbCwxMDBweCk7cGFkZGluZzoxM3B4IDMycHg7Zm9udC1mYW1pbHk6dmFyKC0tZmIsJ0RNIFNhbnMnLHNhbnMtc2VyaWYpO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjcwMDtjdXJzb3I6cG9pbnRlcjtib3gtc2hhZG93OnZhcigtLXNoLWJsdWUsMCA0cHggMjRweCByZ2JhKDAsMTAyLDI1NSwuMikpO3RyYW5zaXRpb246YWxsIC4zc30KLmlxLWJ0bi1uZXh0OmhvdmVyOm5vdCg6ZGlzYWJsZWQpe3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xcHgpO2JveC1zaGFkb3c6MCA4cHggMzJweCByZ2JhKDAsMTAyLDI1NSwuMyl9Ci5pcS1idG4tbmV4dDpkaXNhYmxlZHtvcGFjaXR5Oi41O2N1cnNvcjpub3QtYWxsb3dlZDt0cmFuc2Zvcm06bm9uZX0KLyogU3VtbWFyeSBzaWRlYmFyICovCi5pcS1zdW0taHtmb250LWZhbWlseTp2YXIoLS1mZCwnRE0gU2VyaWYgRGlzcGxheScsR2VvcmdpYSxzZXJpZik7Zm9udC1zaXplOjE2cHg7bWFyZ2luOjAgMCAxNnB4fQouaXEtc3VtLXJvd3tkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Zm9udC1zaXplOjEzcHg7cGFkZGluZzo4cHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIscmdiYSgwLDAsMCwuMDYpKX0KLmlxLXN1bS1yb3cgc3BhbjpmaXJzdC1jaGlsZHtjb2xvcjp2YXIoLS10ZXh0MywjNkI3Mzk0KX0KLmlxLXN1bS1yb3cgc3BhbjpsYXN0LWNoaWxke2ZvbnQtd2VpZ2h0OjUwMDt0ZXh0LWFsaWduOnJpZ2h0O21heC13aWR0aDo1NSV9Ci5pcS1zdW0tc3Zjc3tmb250LXNpemU6MTNweDtjb2xvcjp2YXIoLS10ZXh0MiwjM0Q0NDYwKTtwYWRkaW5nOjhweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcixyZ2JhKDAsMCwwLC4wNikpfQouaXEtc3VtLXN2Y3Mgc3BhbntkaXNwbGF5OmJsb2NrO2NvbG9yOnZhcigtLXRleHQzLCM2QjczOTQpO2ZvbnQtc2l6ZToxMnB4O21hcmdpbi1ib3R0b206NHB4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouMDVlbTtmb250LXdlaWdodDo2MDB9Ci5pcS10cnVzdHttYXJnaW4tdG9wOjIwcHg7Zm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tdGV4dDMsIzZCNzM5NCk7bGluZS1oZWlnaHQ6MS42fQouaXEtdHJ1c3Qgc3Ryb25ne2Rpc3BsYXk6YmxvY2s7Y29sb3I6dmFyKC0tdGV4dDIsIzNENDQ2MCk7bWFyZ2luLWJvdHRvbTo2cHg7Zm9udC1zaXplOjEzcHh9Ci8qIFN1Y2Nlc3MgKi8KLmlxLXN1Y2Nlc3N7cGFkZGluZzo0OHB4IDMycHg7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTpub25lfQouaXEtc3VjY2Vzcy5vbntkaXNwbGF5OmJsb2NrfQouaXEtc3VjY2Vzcy1pY29ue3dpZHRoOjYwcHg7aGVpZ2h0OjYwcHg7YmFja2dyb3VuZDp2YXIoLS1ncmVlbiwjMDBDODc1KTtib3JkZXItcmFkaXVzOjUwJTttYXJnaW46MCBhdXRvIDIwcHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfQouaXEtc3VjY2VzcyBoMntmb250LWZhbWlseTp2YXIoLS1mZCwnRE0gU2VyaWYgRGlzcGxheScsR2VvcmdpYSxzZXJpZik7Zm9udC1zaXplOjI4cHg7bWFyZ2luOjAgMCAxMHB4fQouaXEtc3VjY2VzcyBwe2NvbG9yOnZhcigtLXRleHQyLCMzRDQ0NjApO2ZvbnQtc2l6ZToxNXB4O21hcmdpbjowIDAgMTZweH0KLmlxLXJlZntkaXNwbGF5OmlubGluZS1ibG9jaztiYWNrZ3JvdW5kOiNGMEY3RkY7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMTAyLDI1NSwuMTUpO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6OHB4IDIwcHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjp2YXIoLS1ibHVlLCMwMDY2RkYpO2xldHRlci1zcGFjaW5nOi4xZW07bWFyZ2luLWJvdHRvbToyMHB4fQouaXEtbG9hZGluZ3t0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjQwcHg7ZGlzcGxheTpub25lfQouaXEtbG9hZGluZy5vbntkaXNwbGF5OmJsb2NrfQouaXEtc3Bpbm5lcnt3aWR0aDozMnB4O2hlaWdodDozMnB4O2JvcmRlcjozcHggc29saWQgdmFyKC0tYm9yZGVyLHJnYmEoMCwwLDAsLjA2KSk7Ym9yZGVyLXRvcC1jb2xvcjp2YXIoLS1ibHVlLCMwMDY2RkYpO2JvcmRlci1yYWRpdXM6NTAlO2FuaW1hdGlvbjppcS1zcGluIDAuOHMgbGluZWFyIGluZmluaXRlO21hcmdpbjowIGF1dG8gMTRweH0KQGtleWZyYW1lcyBpcS1zcGlue3Rve3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19Ci5pcS1lcnItbXNne2JhY2tncm91bmQ6I0ZGRjVGNTtib3JkZXI6MXB4IHNvbGlkICNGRUNBQ0E7Ym9yZGVyLXJhZGl1czp2YXIoLS1yLXNtLDEycHgpO3BhZGRpbmc6MTRweCAxOHB4O2NvbG9yOiM5OTFCMUI7Zm9udC1zaXplOjE0cHg7bWFyZ2luLXRvcDoxNnB4O2Rpc3BsYXk6bm9uZX0KLmlxLWVyci1tc2cub257ZGlzcGxheTpibG9ja30KQG1lZGlhKG1heC13aWR0aDo3MDBweCl7LmlxLWJvZHl7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn0uaXEtc2lkZXtib3JkZXItbGVmdDpub25lO2JvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWJvcmRlcixyZ2JhKDAsMCwwLC4wNikpfS5pcS1zdmMtZ3JpZHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyfS5pcS1zdGVwcGVye3BhZGRpbmc6MTZweCAyMHB4fS5pcS1tYWlue3BhZGRpbmc6MjBweH0uaXEtc3RlcC1sYWJlbHtkaXNwbGF5Om5vbmV9fQo8L3N0eWxlPgoKPGRpdiBpZD0iaXEtYnciPgogIDwhLS0gU3RlcHBlciAtLT4KICA8ZGl2IGNsYXNzPSJpcS1zdGVwcGVyIj4KICAgIDxkaXYgY2xhc3M9ImlxLXN0ZXAgaXMtYWN0aXZlIiBpZD0iaXEtczEiPjxkaXYgY2xhc3M9ImlxLXN0ZXAtbnVtIiBpZD0iaXEtc24xIj4xPC9kaXY+PHNwYW4gY2xhc3M9ImlxLXN0ZXAtbGFiZWwiPlNlcnZpY2VzPC9zcGFuPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iaXEtc3RlcCIgaWQ9ImlxLXMyIj48ZGl2IGNsYXNzPSJpcS1zdGVwLW51bSIgaWQ9ImlxLXNuMiI+MjwvZGl2PjxzcGFuIGNsYXNzPSJpcS1zdGVwLWxhYmVsIj5EYXRlICZhbXA7IFRpbWU8L3NwYW4+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJpcS1zdGVwIiBpZD0iaXEtczMiPjxkaXYgY2xhc3M9ImlxLXN0ZXAtbnVtIiBpZD0iaXEtc24zIj4zPC9kaXY+PHNwYW4gY2xhc3M9ImlxLXN0ZXAtbGFiZWwiPllvdXIgaW5mbzwvc3Bhbj48L2Rpdj4KICA8L2Rpdj4KCiAgPCEtLSBMb2FkaW5nIC0tPgogIDxkaXYgY2xhc3M9ImlxLWxvYWRpbmciIGlkPSJpcS1sb2FkaW5nIj4KICAgIDxkaXYgY2xhc3M9ImlxLXNwaW5uZXIiPjwvZGl2PgogICAgPHAgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQzLCM2QjczOTQpO2ZvbnQtc2l6ZToxNHB4Ij5Db25maXJtaW5nIHlvdXIgYm9va2luZ+KApjwvcD4KICA8L2Rpdj4KCiAgPCEtLSBTdWNjZXNzIC0tPgogIDxkaXYgY2xhc3M9ImlxLXN1Y2Nlc3MiIGlkPSJpcS1zdWNjZXNzIj4KICAgIDxkaXYgY2xhc3M9ImlxLXN1Y2Nlc3MtaWNvbiI+PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cG9seWxpbmUgcG9pbnRzPSIyMCA2IDkgMTcgNCAxMiIvPjwvc3ZnPjwvZGl2PgogICAgPGgyPkJvb2tpbmcgcmVjZWl2ZWQuPC9oMj4KICAgIDxwPldlJ2xsIHRleHQgeW91IGEgY29uZmlybWF0aW9uIHdpdGhpbiBhIGZldyBtaW51dGVzLiBZb3VyIHRlY2huaWNpYW4gd2lsbCBhcnJpdmUgb24gdGhlIGRvdC48L3A+CiAgICA8ZGl2IGNsYXNzPSJpcS1yZWYiIGlkPSJpcS1yZWYtY29kZSI+PC9kaXY+CiAgICA8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tdGV4dDMsIzZCNzM5NCkiPlF1ZXN0aW9ucz8gQ2FsbCB1cyBhdCA8YSBocmVmPSJ0ZWw6NTEyNjQ5NDU2NyIgc3R5bGU9ImNvbG9yOnZhcigtLWJsdWUsIzAwNjZGRik7Zm9udC13ZWlnaHQ6NjAwIj4oNTEyKSA2NDktNDU2NzwvYT48L3A+CiAgPC9kaXY+CgogIDwhLS0gTWFpbiBib2R5IC0tPgogIDxkaXYgY2xhc3M9ImlxLWJvZHkiIGlkPSJpcS1ib2R5Ij4KICAgIDxkaXYgY2xhc3M9ImlxLW1haW4iPgogICAgICA8IS0tIFNURVAgMSAtLT4KICAgICAgPGRpdiBpZD0iaXEtc3RlcDEiPgogICAgICAgIDxoMiBjbGFzcz0iaXEtc2giPlNlbGVjdCB5b3VyIHNlcnZpY2VzLjwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImlxLXN1YiI+UHJlLXNlbGVjdGVkIGZyb20geW91ciBlc3RpbWF0ZS4gQWRkIG9yIHJlbW92ZSBhcyBuZWVkZWQuPC9wPgogICAgICAgIDxkaXYgY2xhc3M9ImlxLWVzdC1iYW5uZXIiIGlkPSJpcS1lYiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpcS1lc3QtZXllYnJvdyIgaWQ9ImlxLWViLWV5Ij5Zb3VyIGVzdGltYXRlPC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6YmFzZWxpbmU7ZmxleC13cmFwOndyYXA7Z2FwOjhweCI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpcS1lc3QtcHJpY2UiIGlkPSJpcS1lYi1wcmljZSI+PC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXEtZXN0LXJhbmdlIiBpZD0iaXEtZWItcmFuZ2UiPjwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXEtZXN0LXN2Y3MiIGlkPSJpcS1lYi1zdmNzIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpcS1zdmMtZ3JpZCIgaWQ9ImlxLXN2Yy1ncmlkIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpcS1lcnItbXNnIiBpZD0iaXEtc3ZjLWVyciI+UGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgc2VydmljZSB0byBjb250aW51ZS48L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDwhLS0gU1RFUCAyIC0tPgogICAgICA8ZGl2IGlkPSJpcS1zdGVwMiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgICAgPGgyIGNsYXNzPSJpcS1zaCI+UGljayBhIGRhdGUgJmFtcDsgdGltZS48L2gyPgogICAgICAgIDxwIGNsYXNzPSJpcS1zdWIiPk1vbmRheeKAk1NhdHVyZGF5LiBTYW1lLXdlZWsgc2xvdHMgYXZhaWxhYmxlIGluIG1vc3QgbWFya2V0cy48L3A+CiAgICAgICAgPGRpdiBjbGFzcz0iaXEtY2FsIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImlxLWNhbC1oZWFkIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iaXEtY2FsLWJ0biIgaWQ9ImlxLXByZXYiPiYjODI0OTs8L2J1dHRvbj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXEtY2FsLXRpdGxlIiBpZD0iaXEtY2FsLXRpdGxlIj48L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iaXEtY2FsLWJ0biIgaWQ9ImlxLW5leHQiPiYjODI1MDs8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXEtY2FsLWdyaWQiIGlkPSJpcS1jYWwtZ3JpZCI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iaXEtc2xvdHMtd3JhcCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpcS10cy1sYWJlbCI+QXZhaWxhYmxlIHRpbWVzPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpcS1zbG90cyIgaWQ9ImlxLXNsb3RzIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpcS1lcnItbXNnIiBpZD0iaXEtZHQtZXJyIj5QbGVhc2Ugc2VsZWN0IGEgZGF0ZSBhbmQgdGltZSB0byBjb250aW51ZS48L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDwhLS0gU1RFUCAzIC0tPgogICAgICA8ZGl2IGlkPSJpcS1zdGVwMyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgICAgPGgyIGNsYXNzPSJpcS1zaCI+WW91ciBpbmZvcm1hdGlvbi48L2gyPgogICAgICAgIDxwIGNsYXNzPSJpcS1zdWIiPldlJ2xsIGNvbmZpcm0gdmlhIFNNUyB3aXRoaW4gbWludXRlcy48L3A+CiAgICAgICAgPGRpdiBjbGFzcz0iaXEtZmciPjxsYWJlbCBjbGFzcz0iaXEtbGJsIj5GdWxsIG5hbWUgKjwvbGFiZWw+PGlucHV0IGNsYXNzPSJpcS1pbnAiIGlkPSJpcS1uYW1lIiBwbGFjZWhvbGRlcj0iSmFuZSBTbWl0aCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaXEtZmciPjxsYWJlbCBjbGFzcz0iaXEtbGJsIj5QaG9uZSAqPC9sYWJlbD48aW5wdXQgY2xhc3M9ImlxLWlucCIgaWQ9ImlxLXBob25lIiBwbGFjZWhvbGRlcj0iKDUxMikgNTU1LTAxMDAiIHR5cGU9InRlbCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaXEtZmciPjxsYWJlbCBjbGFzcz0iaXEtbGJsIj5FbWFpbCAqPC9sYWJlbD48aW5wdXQgY2xhc3M9ImlxLWlucCIgaWQ9ImlxLWVtYWlsIiBwbGFjZWhvbGRlcj0iamFuZUBleGFtcGxlLmNvbSIgdHlwZT0iZW1haWwiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImlxLWZnIj48bGFiZWwgY2xhc3M9ImlxLWxibCI+QWRkcmVzcyAmYW1wOyB6aXAgKjwvbGFiZWw+PGlucHV0IGNsYXNzPSJpcS1pbnAiIGlkPSJpcS1hZGRyIiBwbGFjZWhvbGRlcj0iMTIzNCBNYWluIFN0LCBBdXN0aW4gVFggNzg3MDEiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImlxLWZnIj48bGFiZWwgY2xhc3M9ImlxLWxibCI+Tm90ZXMgKG9wdGlvbmFsKTwvbGFiZWw+PHRleHRhcmVhIGNsYXNzPSJpcS1pbnAiIGlkPSJpcS1ub3RlcyIgcGxhY2Vob2xkZXI9IkFueXRoaW5nIHdlIHNob3VsZCBrbm93IOKAlCBwaG90b3MsIHBhcmtpbmcgaW5mbywgYWNjZXNzIGluc3RydWN0aW9uc+KApiI+PC90ZXh0YXJlYT48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpcS1lcnItbXNnIiBpZD0iaXEtaW5mby1lcnIiPlBsZWFzZSBmaWxsIGluIGFsbCByZXF1aXJlZCBmaWVsZHMuPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8IS0tIE5hdiAtLT4KICAgICAgPGRpdiBjbGFzcz0iaXEtbmF2Ij4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJpcS1idG4tYmFjayIgaWQ9ImlxLWJhY2siIGRpc2FibGVkPiYjODU5MjsgQmFjazwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImlxLWJ0bi1uZXh0IiBpZD0iaXEtZndkIj5OZXh0ICYjODU5NDs8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDwhLS0gU2lkZWJhciAtLT4KICAgIDxkaXYgY2xhc3M9ImlxLXNpZGUiPgogICAgICA8ZGl2IGNsYXNzPSJpcS1zdW0taCI+WW91ciBib29raW5nPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImlxLXN1bS1zdmNzIj48c3Bhbj5TZXJ2aWNlczwvc3Bhbj48ZGl2IGlkPSJpcS1zdW0tc3Zjcy1saXN0IiBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dDMsIzZCNzM5NCk7Zm9udC1zdHlsZTppdGFsaWMiPk5vbmUgc2VsZWN0ZWQ8L2Rpdj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXEtc3VtLXJvdyI+PHNwYW4+RGF0ZTwvc3Bhbj48c3BhbiBpZD0iaXEtc3VtLWRhdGUiPuKAlDwvc3Bhbj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXEtc3VtLXJvdyI+PHNwYW4+VGltZTwvc3Bhbj48c3BhbiBpZD0iaXEtc3VtLXRpbWUiPuKAlDwvc3Bhbj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXEtdHJ1c3QiPjxzdHJvbmc+SG93IGl0IHdvcmtzPC9zdHJvbmc+U2xvdCByZXNlcnZlZCBpbnN0YW50bHkuIFRlY2ggcmV2aWV3cyB5b3VyIGJyaWVmIGFuZCBjb25maXJtcy4gWW91IGdldCBTTVMgKyBlbWFpbCBjb25maXJtYXRpb24gaW1tZWRpYXRlbHkuPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9kaXY+Cgo8c2NyaXB0PgooZnVuY3Rpb24oKXsKICB2YXIgU1ZDUyA9IHsKICAgIHR2OidUViBNb3VudGluZycsIGRvb3JiZWxsOidTbWFydCBEb29yYmVsbCcsIHdpZmk6J1dpLUZpIE1lc2gnLAogICAgY2FtZXJhOidTZWN1cml0eSBDYW1lcmFzJywgbG9jazonU21hcnQgTG9ja3MnLCB0aGVybW9zdGF0OidTbWFydCBUaGVybW9zdGF0JywKICAgIGxpZ2h0aW5nOidTbWFydCBMaWdodGluZycsIGF1ZGlvOidXaG9sZS1Ib21lIEF1ZGlvJywgaHViOidTbWFydCBIb21lIEh1YicsCiAgICBjb25zdWx0OidGcmVlIENvbnN1bHRhdGlvbicsIHNpdGVfc3VydmV5OidTaXRlIFN1cnZleScKICB9OwogIHZhciBQUklDRVMgPSB7CiAgICB0djp7bWluOjE3OSxtYXg6MzgwfSwgZG9vcmJlbGw6e21pbjoxMjksbWF4OjI1MH0sIHdpZmk6e21pbjoyNDksbWF4OjQ4MH0sCiAgICBjYW1lcmE6e21pbjoxOTksbWF4OjQ4MH0sIGxvY2s6e21pbjoxNTksbWF4OjMyMH0sIHRoZXJtb3N0YXQ6e21pbjoxMzksbWF4OjI4MH0sCiAgICBsaWdodGluZzp7bWluOjE0OSxtYXg6MzIwfSwgYXVkaW86e21pbjozNDksbWF4Ojc4MH0sIGh1Yjp7bWluOjEyOSxtYXg6MjYwfSwKICAgIGNvbnN1bHQ6e21pbjowLG1heDowfSwgc2l0ZV9zdXJ2ZXk6e21pbjowLG1heDowfQogIH07CiAgdmFyIFRJTUVTID0gWyc4OjAwIEFNJywnMTA6MDAgQU0nLCcxMjowMCBQTScsJzI6MDAgUE0nLCc0OjAwIFBNJywnNjowMCBQTSddOwogIHZhciBCT09LRUQgPSBbJzEwOjAwIEFNJywnMjowMCBQTSddOwogIHZhciBNT05USFMgPSBbJ0phbnVhcnknLCdGZWJydWFyeScsJ01hcmNoJywnQXByaWwnLCdNYXknLCdKdW5lJywnSnVseScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09jdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJ107CgogIHZhciBzdGF0ZSA9IHsgc3RlcDoxLCBzdmNzOnt9LCBkYXRlOm51bGwsIHRpbWU6bnVsbCwgdmlld1k6MCwgdmlld006MCB9OwogIHZhciBub3cgPSBuZXcgRGF0ZSgpOwogIHN0YXRlLnZpZXdZID0gbm93LmdldEZ1bGxZZWFyKCk7CiAgc3RhdGUudmlld00gPSBub3cuZ2V0TW9udGgoKTsKCiAgLy8gUmVhZCBVUkwgcGFyYW1zCiAgdmFyIHAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7CiAgdmFyIHBTZWwgPSBwLmdldCgnc2VsZWN0ZWQnKSB8fCAnJzsKICB2YXIgcEVzdCA9IHAuZ2V0KCdlc3RpbWF0ZScpIHx8ICcnOwogIHZhciBwUm5nID0gcC5nZXQoJ3JhbmdlJykgfHwgJyc7CiAgdmFyIHBJbnQgPSBwLmdldCgnaW50ZW50JykgfHwgJyc7CgogIC8vIFByZS1zZWxlY3Qgc2VydmljZXMKICBpZiAocFNlbCkgewogICAgcFNlbC5zcGxpdCgnLCcpLmZvckVhY2goZnVuY3Rpb24oayl7IGlmKFNWQ1Nba10pIHN0YXRlLnN2Y3Nba10gPSB0cnVlOyB9KTsKICB9CgogIC8vIFJlbmRlciBlc3RpbWF0ZSBiYW5uZXIKICBpZiAocEVzdCB8fCBwUm5nIHx8IHBTZWwpIHsKICAgIHZhciBlYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1lYicpOwogICAgZWIuY2xhc3NMaXN0LmFkZCgnb24nKTsKICAgIGlmIChwSW50KSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtZWItZXknKS50ZXh0Q29udGVudCA9IHBJbnQ7CiAgICBpZiAocEVzdCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLWViLXByaWNlJykudGV4dENvbnRlbnQgPSAnJCcgKyBwRXN0OwogICAgaWYgKHBSbmcpIHsKICAgICAgdmFyIHB0cyA9IHBSbmcuc3BsaXQoJy0nKTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLWViLXJhbmdlJykudGV4dENvbnRlbnQgPSAnUmFuZ2U6ICQnICsgcHRzWzBdICsgJyDigJMgJCcgKyAocHRzWzFdfHxwdHNbMF0pOwogICAgfQogICAgaWYgKHBTZWwpIHsKICAgICAgdmFyIG5hbWVzID0gcFNlbC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbihrKXsgcmV0dXJuIFNWQ1Nba118fGs7IH0pOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtZWItc3ZjcycpLnRleHRDb250ZW50ID0gJ1lvdSBwaWNrZWQ6ICcgKyBuYW1lcy5qb2luKCcgKyAnKTsKICAgIH0KICB9CgogIC8vIEJ1aWxkIHNlcnZpY2UgY2FyZHMKICB2YXIgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1zdmMtZ3JpZCcpOwogIE9iamVjdC5rZXlzKFNWQ1MpLmZvckVhY2goZnVuY3Rpb24oayl7CiAgICB2YXIgY2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgY2FyZC5jbGFzc05hbWUgPSAnaXEtc3ZjLWNhcmQnICsgKHN0YXRlLnN2Y3Nba10/JyBvbic6JycpOwogICAgY2FyZC5kYXRhc2V0LmsgPSBrOwogICAgY2FyZC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iaXEtY2hrIj48c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBvbHlsaW5lIHBvaW50cz0iMjAgNiA5IDE3IDQgMTIiLz48L3N2Zz48L2Rpdj48c3Bhbj4nICsgU1ZDU1trXSArICc8L3NwYW4+JzsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpewogICAgICBpZiAoc3RhdGUuc3Zjc1trXSkgeyBkZWxldGUgc3RhdGUuc3Zjc1trXTsgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCdvbicpOyB9CiAgICAgIGVsc2UgeyBzdGF0ZS5zdmNzW2tdID0gdHJ1ZTsgY2FyZC5jbGFzc0xpc3QuYWRkKCdvbicpOyB9CiAgICAgIHVwZGF0ZVN1bW1hcnkoKTsKICAgIH0pOwogICAgZ3JpZC5hcHBlbmRDaGlsZChjYXJkKTsKICB9KTsKCiAgLy8gQ2FsZW5kYXIKICBmdW5jdGlvbiBidWlsZENhbCgpIHsKICAgIHZhciB5ID0gc3RhdGUudmlld1ksIG0gPSBzdGF0ZS52aWV3TTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1jYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9IE1PTlRIU1ttXSArICcgJyArIHk7CiAgICB2YXIgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1jYWwtZ3JpZCcpOwogICAgZ3JpZC5pbm5lckhUTUwgPSAnJzsKICAgIFsnU3UnLCdNbycsJ1R1JywnV2UnLCdUaCcsJ0ZyJywnU2EnXS5mb3JFYWNoKGZ1bmN0aW9uKGQpewogICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgZWwuY2xhc3NOYW1lID0gJ2lxLWNhbC1kbic7IGVsLnRleHRDb250ZW50ID0gZDsgZ3JpZC5hcHBlbmRDaGlsZChlbCk7CiAgICB9KTsKICAgIHZhciBmaXJzdCA9IG5ldyBEYXRlKHksIG0sIDEpLmdldERheSgpOwogICAgZm9yICh2YXIgaT0wOyBpPGZpcnN0OyBpKyspIHsKICAgICAgdmFyIGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBlbXAuY2xhc3NOYW1lPSdpcS1jYWwtZCBlbXAnOyBncmlkLmFwcGVuZENoaWxkKGVtcCk7CiAgICB9CiAgICB2YXIgZGF5cyA9IG5ldyBEYXRlKHksIG0rMSwgMCkuZ2V0RGF0ZSgpOwogICAgZm9yICh2YXIgZD0xOyBkPD1kYXlzOyBkKyspIHsKICAgICAgdmFyIGR0ID0gbmV3IERhdGUoeSwgbSwgZCk7CiAgICAgIHZhciBpc1RvZGF5ID0gZHQudG9EYXRlU3RyaW5nKCkgPT09IG5vdy50b0RhdGVTdHJpbmcoKTsKICAgICAgdmFyIGlzUGFzdCA9IGR0IDwgbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCBub3cuZ2V0RGF0ZSgpKTsKICAgICAgdmFyIGlzU3VuID0gZHQuZ2V0RGF5KCkgPT09IDA7CiAgICAgIHZhciBpc0ZhciA9IGR0ID4gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCBub3cuZ2V0RGF0ZSgpKzYwKTsKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGVsLmNsYXNzTmFtZSA9ICdpcS1jYWwtZCc7CiAgICAgIGlmIChpc1RvZGF5KSBlbC5jbGFzc0xpc3QuYWRkKCd0b2QnKTsKICAgICAgaWYgKGlzUGFzdCB8fCBpc1N1biB8fCBpc0ZhcikgeyBlbC5jbGFzc0xpc3QuYWRkKCdvZmYnKTsgfQogICAgICBlbHNlIHsKICAgICAgICB2YXIgZGQgPSBkOwogICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGZ1bmN0aW9uKGRkKXsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpewogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjaXEtY2FsLWdyaWQgLmlxLWNhbC1kJykuZm9yRWFjaChmdW5jdGlvbih4KXsgeC5jbGFzc0xpc3QucmVtb3ZlKCdzZWwnKTsgfSk7CiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnc2VsJyk7CiAgICAgICAgICAgIHN0YXRlLmRhdGUgPSBNT05USFNbbV0uc3Vic3RyaW5nKDAsMykgKyAnICcgKyBkZCArICcsICcgKyB5OwogICAgICAgICAgICBzdGF0ZS50aW1lID0gbnVsbDsKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmlxLXNsb3QnKS5mb3JFYWNoKGZ1bmN0aW9uKHMpeyBzLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbCcpOyB9KTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLXNsb3RzLXdyYXAnKS5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgICAgIGJ1aWxkU2xvdHMoKTsKICAgICAgICAgICAgdXBkYXRlU3VtbWFyeSgpOwogICAgICAgICAgfTsKICAgICAgICB9KShkZCkuYmluZChlbCkpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5kYXRlID09PSBNT05USFNbbV0uc3Vic3RyaW5nKDAsMykrJyAnK2QrJywgJyt5KSBlbC5jbGFzc0xpc3QuYWRkKCdzZWwnKTsKICAgICAgZWwudGV4dENvbnRlbnQgPSBkOwogICAgICBncmlkLmFwcGVuZENoaWxkKGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJ1aWxkU2xvdHMoKSB7CiAgICB2YXIgc2wgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtc2xvdHMnKTsgc2wuaW5uZXJIVE1MID0gJyc7CiAgICBUSU1FUy5mb3JFYWNoKGZ1bmN0aW9uKHQpewogICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgZWwuY2xhc3NOYW1lID0gJ2lxLXNsb3QnICsgKEJPT0tFRC5pbmRleE9mKHQpPj0wPycgYmsnOicnKTsKICAgICAgaWYgKHN0YXRlLnRpbWU9PT10KSBlbC5jbGFzc0xpc3QuYWRkKCdzZWwnKTsKICAgICAgZWwudGV4dENvbnRlbnQgPSB0OwogICAgICBpZiAoQk9PS0VELmluZGV4T2YodCk8MCkgewogICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pcS1zbG90JykuZm9yRWFjaChmdW5jdGlvbihzKXsgcy5jbGFzc0xpc3QucmVtb3ZlKCdzZWwnKTsgfSk7CiAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdzZWwnKTsKICAgICAgICAgIHN0YXRlLnRpbWUgPSB0OyB1cGRhdGVTdW1tYXJ5KCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgc2wuYXBwZW5kQ2hpbGQoZWwpOwogICAgfSk7CiAgfQoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtcHJldicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgIHN0YXRlLnZpZXdNLS07IGlmIChzdGF0ZS52aWV3TTwwKXsgc3RhdGUudmlld009MTE7IHN0YXRlLnZpZXdZLS07IH0gYnVpbGRDYWwoKTsKICB9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtbmV4dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgIHN0YXRlLnZpZXdNKys7IGlmIChzdGF0ZS52aWV3TT4xMSl7IHN0YXRlLnZpZXdNPTA7IHN0YXRlLnZpZXdZKys7IH0gYnVpbGRDYWwoKTsKICB9KTsKICBidWlsZENhbCgpOwoKICAvLyBTdW1tYXJ5IHVwZGF0ZXIg4oCUIGxpdmUgcHJpY2UgcmVjYWxjIG9uIGV2ZXJ5IGNoZWNrYm94IGNoYW5nZQogIGZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnkoKSB7CiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlLnN2Y3MpOwogICAgdmFyIHN2Y3MgPSBrZXlzLm1hcChmdW5jdGlvbihrKXsgcmV0dXJuIFNWQ1Nba107IH0pOwogICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLXN1bS1zdmNzLWxpc3QnKTsKICAgIGVsLnN0eWxlLmZvbnRTdHlsZSA9IHN2Y3MubGVuZ3RoID8gJ25vcm1hbCcgOiAnaXRhbGljJzsKICAgIGVsLnN0eWxlLmNvbG9yID0gc3Zjcy5sZW5ndGggPyAndmFyKC0tdGV4dDIsIzNENDQ2MCknIDogJ3ZhcigtLXRleHQzLCM2QjczOTQpJzsKICAgIGVsLnRleHRDb250ZW50ID0gc3Zjcy5sZW5ndGggPyBzdmNzLmpvaW4oJywgJykgOiAnTm9uZSBzZWxlY3RlZCc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtc3VtLWRhdGUnKS50ZXh0Q29udGVudCA9IHN0YXRlLmRhdGUgfHwgJ+KAlCc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtc3VtLXRpbWUnKS50ZXh0Q29udGVudCA9IHN0YXRlLnRpbWUgfHwgJ+KAlCc7CiAgICB2YXIgdG90YWxNaW4gPSAwLCB0b3RhbE1heCA9IDA7CiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oayl7IGlmKFBSSUNFU1trXSl7IHRvdGFsTWluKz1QUklDRVNba10ubWluOyB0b3RhbE1heCs9UFJJQ0VTW2tdLm1heDsgfSB9KTsKICAgIHZhciBlYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1lYicpOwogICAgaWYgKCFrZXlzLmxlbmd0aCB8fCB0b3RhbE1pbiA9PT0gMCkgewogICAgICBpZihlYikgZWIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIH0gZWxzZSB7CiAgICAgIGlmKGViKSBlYi5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgIHZhciBtaWQgPSBNYXRoLnJvdW5kKCh0b3RhbE1pbiArIHRvdGFsTWF4KSAvIDIpOwogICAgICB2YXIgcGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtZWItcHJpY2UnKTsKICAgICAgdmFyIHJuZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1lYi1yYW5nZScpOwogICAgICB2YXIgc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtZWItc3ZjcycpOwogICAgICBpZihwZSkgcGUudGV4dENvbnRlbnQgPSAnJCcgKyBtaWQ7CiAgICAgIGlmKHJuZykgcm5nLnRleHRDb250ZW50ID0gJ1JhbmdlOiAkJyArIHRvdGFsTWluICsgJyDigJMgJCcgKyB0b3RhbE1heDsKICAgICAgaWYoc2UpIHNlLnRleHRDb250ZW50ID0gJ1lvdSBwaWNrZWQ6ICcgKyBzdmNzLmpvaW4oJyArICcpOwogICAgfQogIH0KICB1cGRhdGVTdW1tYXJ5KCk7CgogIC8vIFN0ZXAgbmF2aWdhdGlvbgogIGZ1bmN0aW9uIGdvVG8obikgewogICAgWzEsMiwzXS5mb3JFYWNoKGZ1bmN0aW9uKGkpewogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtc3RlcCcraSkuc3R5bGUuZGlzcGxheSA9IGk9PT1uID8gJycgOiAnbm9uZSc7CiAgICAgIHZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLXMnK2kpOwogICAgICBzLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScsIGk9PT1uKTsKICAgICAgcy5jbGFzc0xpc3QudG9nZ2xlKCdpcy1kb25lJywgaTxuKTsKICAgICAgdmFyIHNuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLXNuJytpKTsKICAgICAgc24udGV4dENvbnRlbnQgPSBpPG4gPyAn4pyTJyA6IFN0cmluZyhpKTsKICAgIH0pOwogICAgc3RhdGUuc3RlcCA9IG47CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtYmFjaycpLmRpc2FibGVkID0gbj09PTE7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtZndkJykudGV4dENvbnRlbnQgPSBuPT09MyA/ICdDb25maXJtIGJvb2tpbmcg4oaSJyA6ICdOZXh0IOKGkic7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaXEtZXJyLW1zZycpLmZvckVhY2goZnVuY3Rpb24oZSl7IGUuY2xhc3NMaXN0LnJlbW92ZSgnb24nKTsgfSk7CiAgfQoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtYmFjaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsgaWYoc3RhdGUuc3RlcD4xKSBnb1RvKHN0YXRlLnN0ZXAtMSk7IH0pOwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtZndkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpewogICAgaWYgKHN0YXRlLnN0ZXA9PT0xKSB7CiAgICAgIGlmICghT2JqZWN0LmtleXMoc3RhdGUuc3ZjcykubGVuZ3RoKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLXN2Yy1lcnInKS5jbGFzc0xpc3QuYWRkKCdvbicpOyByZXR1cm47CiAgICAgIH0KICAgICAgZ29UbygyKTsKICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RlcD09PTIpIHsKICAgICAgaWYgKCFzdGF0ZS5kYXRlIHx8ICFzdGF0ZS50aW1lKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLWR0LWVycicpLmNsYXNzTGlzdC5hZGQoJ29uJyk7IHJldHVybjsKICAgICAgfQogICAgICBnb1RvKDMpOwogICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwPT09MykgewogICAgICBzdWJtaXRCb29raW5nKCk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIHN1Ym1pdEJvb2tpbmcoKSB7CiAgICB2YXIgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1uYW1lJykudmFsdWUudHJpbSgpOwogICAgdmFyIHBob25lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLXBob25lJykudmFsdWUudHJpbSgpOwogICAgdmFyIGVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLWVtYWlsJykudmFsdWUudHJpbSgpOwogICAgdmFyIGFkZHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtYWRkcicpLnZhbHVlLnRyaW0oKTsKICAgIHZhciBub3RlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1ub3RlcycpLnZhbHVlLnRyaW0oKTsKICAgIGlmICghbmFtZSB8fCAhcGhvbmUgfHwgIWVtYWlsIHx8ICFhZGRyKSB7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1pbmZvLWVycicpLmNsYXNzTGlzdC5hZGQoJ29uJyk7IHJldHVybjsKICAgIH0KICAgIHZhciByZWYgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiw4KS50b1VwcGVyQ2FzZSgpOwogICAgdmFyIHBheWxvYWQgPSB7CiAgICAgIHJlZjogcmVmLAogICAgICBjdXN0b21lcjogeyBuYW1lOm5hbWUsIHBob25lOnBob25lLCBlbWFpbDplbWFpbCwgYWRkcmVzczphZGRyLCBub3Rlczpub3RlcyB9LAogICAgICBzZXJ2aWNlczogT2JqZWN0LmtleXMoc3RhdGUuc3ZjcyksCiAgICAgIHNlcnZpY2VfbGFiZWxzOiBPYmplY3Qua2V5cyhzdGF0ZS5zdmNzKS5tYXAoZnVuY3Rpb24oayl7IHJldHVybiBTVkNTW2tdOyB9KSwKICAgICAgZGF0ZTogc3RhdGUuZGF0ZSwKICAgICAgdGltZTogc3RhdGUudGltZSwKICAgICAgZXN0aW1hdGU6IHsgcHJpY2U6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1lYi1wcmljZScpLnRleHRDb250ZW50LCByYW5nZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLWViLXJhbmdlJykudGV4dENvbnRlbnQgfSwKICAgICAgc291cmNlOiAnYm9va2luZy13aXphcmQtdjEnLAogICAgICBzdWJtaXR0ZWRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKQogICAgfTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1ib2R5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pcS1zdGVwcGVyJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcS1sb2FkaW5nJykuY2xhc3NMaXN0LmFkZCgnb24nKTsKICAgIGZldGNoKCdodHRwczovL244bi5pbnN0YWxsc21hcnRseS5jb20vd2ViaG9vay9ib29raW5nLXN1Ym1pdCcsIHsKICAgICAgbWV0aG9kOidQT1NUJywgaGVhZGVyczp7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb24nfSwgYm9keTpKU09OLnN0cmluZ2lmeShwYXlsb2FkKQogICAgfSkudGhlbihmdW5jdGlvbigpewogICAgICBzaG93U3VjY2VzcyhyZWYpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oKXsKICAgICAgc2hvd1N1Y2Nlc3MocmVmKTsgLy8gdHJlYXQgZXJyb3IgYXMgc3VjY2VzcyDigJQgbjhuIG1heSByZXR1cm4gbm9uLTIwMCBidXQgc3RpbGwgcHJvY2Vzc2VzCiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNob3dTdWNjZXNzKHJlZikgewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLWxvYWRpbmcnKS5jbGFzc0xpc3QucmVtb3ZlKCdvbicpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lxLXJlZi1jb2RlJykudGV4dENvbnRlbnQgPSAnI0lTLScgKyByZWY7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXEtc3VjY2VzcycpLmNsYXNzTGlzdC5hZGQoJ29uJyk7CiAgfQoKICBnb1RvKDEpOwp9KSgpOwo8L3NjcmlwdD4K
Leave a Reply