diff --git a/README.md b/README.md index af8c6e6..2387c65 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Scan is the frontend for SANE built with golang and svelte. -![Scan with SANE test devices](screenshot.jpeg) +![Scan with SANE test devices](screenshot.png) Features: @@ -25,6 +25,45 @@ go build -o scan ./cmd/scan LISTEN=0.0.0.0:8085 ./scan ``` +### Building with frontend + +Build Svelte frontend with `node` and `npm`: + +```bash +cd web +npm install +npm run build +``` + +Include fronend into the binary: + +```bash +cd cmd/scan +go run github.com/gobuffalo/packr/packr +``` + +Now build the service: + +```bash +go build -o scan ./cmd/scan +``` + +### Enabling test scanners + +Open `dll.conf` file and uncomment `#test` line. + +For Ubuntu/Debian: + +``` +/etc/sane.d/dll.conf +``` + +For Mac OS X: + +``` +/usr/local/etc/sane.d/dll.conf +``` + ## Environment variables - `DEBUG` enables debug log level and text format for logs. diff --git a/cmd/scan/a_main-packr.go b/cmd/scan/a_main-packr.go index 9029bc6..29034c6 100644 --- a/cmd/scan/a_main-packr.go +++ b/cmd/scan/a_main-packr.go @@ -8,8 +8,8 @@ import "github.com/gobuffalo/packr" // and any other packr generated files. func init() { packr.PackJSONBytes("../../web/public", "build/bundle.css", "\"LyohCiAqIEJvb3RzdHJhcCB2NC41LjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pCiAqIENvcHlyaWdodCAyMDExLTIwMjAgVGhlIEJvb3RzdHJhcCBBdXRob3JzCiAqIENvcHlyaWdodCAyMDExLTIwMjAgVHdpdHRlciwgSW5jLgogKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSkKICovOnJvb3R7LS1ibHVlOiMwMDdiZmY7LS1pbmRpZ286IzY2MTBmMjstLXB1cnBsZTojNmY0MmMxOy0tcGluazojZTgzZThjOy0tcmVkOiNkYzM1NDU7LS1vcmFuZ2U6I2ZkN2UxNDstLXllbGxvdzojZmZjMTA3Oy0tZ3JlZW46IzI4YTc0NTstLXRlYWw6IzIwYzk5NzstLWN5YW46IzE3YTJiODstLXdoaXRlOiNmZmY7LS1ncmF5OiM2Yzc1N2Q7LS1ncmF5LWRhcms6IzM0M2E0MDstLXByaW1hcnk6IzAwN2JmZjstLXNlY29uZGFyeTojNmM3NTdkOy0tc3VjY2VzczojMjhhNzQ1Oy0taW5mbzojMTdhMmI4Oy0td2FybmluZzojZmZjMTA3Oy0tZGFuZ2VyOiNkYzM1NDU7LS1saWdodDojZjhmOWZhOy0tZGFyazojMzQzYTQwOy0tYnJlYWtwb2ludC14czowOy0tYnJlYWtwb2ludC1zbTo1NzZweDstLWJyZWFrcG9pbnQtbWQ6NzY4cHg7LS1icmVha3BvaW50LWxnOjk5MnB4Oy0tYnJlYWtwb2ludC14bDoxMjAwcHg7LS1mb250LWZhbWlseS1zYW5zLXNlcmlmOi1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCJTZWdvZSBVSSIsUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsQXJpYWwsIk5vdG8gU2FucyIsc2Fucy1zZXJpZiwiQXBwbGUgQ29sb3IgRW1vamkiLCJTZWdvZSBVSSBFbW9qaSIsIlNlZ29lIFVJIFN5bWJvbCIsIk5vdG8gQ29sb3IgRW1vamkiOy0tZm9udC1mYW1pbHktbW9ub3NwYWNlOlNGTW9uby1SZWd1bGFyLE1lbmxvLE1vbmFjbyxDb25zb2xhcywiTGliZXJhdGlvbiBNb25vIiwiQ291cmllciBOZXciLG1vbm9zcGFjZX0qLDo6YWZ0ZXIsOjpiZWZvcmV7Ym94LXNpemluZzpib3JkZXItYm94fWh0bWx7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtsaW5lLWhlaWdodDoxLjE1Oy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH1hcnRpY2xlLGFzaWRlLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG1haW4sbmF2LHNlY3Rpb257ZGlzcGxheTpibG9ja31ib2R5e21hcmdpbjowO2ZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCJTZWdvZSBVSSIsUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsQXJpYWwsIk5vdG8gU2FucyIsc2Fucy1zZXJpZiwiQXBwbGUgQ29sb3IgRW1vamkiLCJTZWdvZSBVSSBFbW9qaSIsIlNlZ29lIFVJIFN5bWJvbCIsIk5vdG8gQ29sb3IgRW1vamkiO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjU7Y29sb3I6IzIxMjUyOTt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZC1jb2xvcjojZmZmfVt0YWJpbmRleD0iLTEiXTpmb2N1czpub3QoOmZvY3VzLXZpc2libGUpe291dGxpbmU6MCFpbXBvcnRhbnR9aHJ7Ym94LXNpemluZzpjb250ZW50LWJveDtoZWlnaHQ6MDtvdmVyZmxvdzp2aXNpYmxlfWgxLGgyLGgzLGg0LGg1LGg2e21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOi41cmVtfXB7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MXJlbX1hYmJyW2RhdGEtb3JpZ2luYWwtdGl0bGVdLGFiYnJbdGl0bGVde3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7LXdlYmtpdC10ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZDtjdXJzb3I6aGVscDtib3JkZXItYm90dG9tOjA7LXdlYmtpdC10ZXh0LWRlY29yYXRpb24tc2tpcC1pbms6bm9uZTt0ZXh0LWRlY29yYXRpb24tc2tpcC1pbms6bm9uZX1hZGRyZXNze21hcmdpbi1ib3R0b206MXJlbTtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDppbmhlcml0fWRsLG9sLHVse21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjFyZW19b2wgb2wsb2wgdWwsdWwgb2wsdWwgdWx7bWFyZ2luLWJvdHRvbTowfWR0e2ZvbnQtd2VpZ2h0OjcwMH1kZHttYXJnaW4tYm90dG9tOi41cmVtO21hcmdpbi1sZWZ0OjB9YmxvY2txdW90ZXttYXJnaW46MCAwIDFyZW19YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtwb3NpdGlvbjpyZWxhdGl2ZTtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX1he2NvbG9yOiMwMDdiZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH1hOmhvdmVye2NvbG9yOiMwMDU2YjM7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1hOm5vdChbaHJlZl0pOm5vdChbY2xhc3NdKXtjb2xvcjppbmhlcml0O3RleHQtZGVjb3JhdGlvbjpub25lfWE6bm90KFtocmVmXSk6bm90KFtjbGFzc10pOmhvdmVye2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Y29kZSxrYmQscHJlLHNhbXB7Zm9udC1mYW1pbHk6U0ZNb25vLVJlZ3VsYXIsTWVubG8sTW9uYWNvLENvbnNvbGFzLCJMaWJlcmF0aW9uIE1vbm8iLCJDb3VyaWVyIE5ldyIsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19cHJle21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjFyZW07b3ZlcmZsb3c6YXV0bzstbXMtb3ZlcmZsb3ctc3R5bGU6c2Nyb2xsYmFyfWZpZ3VyZXttYXJnaW46MCAwIDFyZW19aW1ne3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3JkZXItc3R5bGU6bm9uZX1zdmd7b3ZlcmZsb3c6aGlkZGVuO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX10YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2V9Y2FwdGlvbntwYWRkaW5nLXRvcDouNzVyZW07cGFkZGluZy1ib3R0b206Ljc1cmVtO2NvbG9yOiM2Yzc1N2Q7dGV4dC1hbGlnbjpsZWZ0O2NhcHRpb24tc2lkZTpib3R0b219dGh7dGV4dC1hbGlnbjppbmhlcml0O3RleHQtYWxpZ246LXdlYmtpdC1tYXRjaC1wYXJlbnR9bGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWJvdHRvbTouNXJlbX1idXR0b257Ym9yZGVyLXJhZGl1czowfWJ1dHRvbjpmb2N1c3tvdXRsaW5lOjFweCBkb3R0ZWQ7b3V0bGluZTo1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3J9YnV0dG9uLGlucHV0LG9wdGdyb3VwLHNlbGVjdCx0ZXh0YXJlYXttYXJnaW46MDtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXR9YnV0dG9uLGlucHV0e292ZXJmbG93OnZpc2libGV9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfVtyb2xlPWJ1dHRvbl17Y3Vyc29yOnBvaW50ZXJ9c2VsZWN0e3dvcmQtd3JhcDpub3JtYWx9W3R5cGU9YnV0dG9uXSxbdHlwZT1yZXNldF0sW3R5cGU9c3VibWl0XSxidXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbn1bdHlwZT1idXR0b25dOm5vdCg6ZGlzYWJsZWQpLFt0eXBlPXJlc2V0XTpub3QoOmRpc2FibGVkKSxbdHlwZT1zdWJtaXRdOm5vdCg6ZGlzYWJsZWQpLGJ1dHRvbjpub3QoOmRpc2FibGVkKXtjdXJzb3I6cG9pbnRlcn1bdHlwZT1idXR0b25dOjotbW96LWZvY3VzLWlubmVyLFt0eXBlPXJlc2V0XTo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1zdWJtaXRdOjotbW96LWZvY3VzLWlubmVyLGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntwYWRkaW5nOjA7Ym9yZGVyLXN0eWxlOm5vbmV9aW5wdXRbdHlwZT1jaGVja2JveF0saW5wdXRbdHlwZT1yYWRpb117Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MH10ZXh0YXJlYXtvdmVyZmxvdzphdXRvO3Jlc2l6ZTp2ZXJ0aWNhbH1maWVsZHNldHttaW4td2lkdGg6MDtwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjB9bGVnZW5ke2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOjA7bWFyZ2luLWJvdHRvbTouNXJlbTtmb250LXNpemU6MS41cmVtO2xpbmUtaGVpZ2h0OmluaGVyaXQ7Y29sb3I6aW5oZXJpdDt3aGl0ZS1zcGFjZTpub3JtYWx9cHJvZ3Jlc3N7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9W3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixbdHlwZT1udW1iZXJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfVt0eXBlPXNlYXJjaF17b3V0bGluZS1vZmZzZXQ6LTJweDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX1bdHlwZT1zZWFyY2hdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfTo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b257Zm9udDppbmhlcml0Oy13ZWJraXQtYXBwZWFyYW5jZTpidXR0b259b3V0cHV0e2Rpc3BsYXk6aW5saW5lLWJsb2NrfXN1bW1hcnl7ZGlzcGxheTpsaXN0LWl0ZW07Y3Vyc29yOnBvaW50ZXJ9dGVtcGxhdGV7ZGlzcGxheTpub25lfVtoaWRkZW5de2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LmgxLC5oMiwuaDMsLmg0LC5oNSwuaDYsaDEsaDIsaDMsaDQsaDUsaDZ7bWFyZ2luLWJvdHRvbTouNXJlbTtmb250LXdlaWdodDo1MDA7bGluZS1oZWlnaHQ6MS4yfS5oMSxoMXtmb250LXNpemU6Mi41cmVtfS5oMixoMntmb250LXNpemU6MnJlbX0uaDMsaDN7Zm9udC1zaXplOjEuNzVyZW19Lmg0LGg0e2ZvbnQtc2l6ZToxLjVyZW19Lmg1LGg1e2ZvbnQtc2l6ZToxLjI1cmVtfS5oNixoNntmb250LXNpemU6MXJlbX0ubGVhZHtmb250LXNpemU6MS4yNXJlbTtmb250LXdlaWdodDozMDB9LmRpc3BsYXktMXtmb250LXNpemU6NnJlbTtmb250LXdlaWdodDozMDA7bGluZS1oZWlnaHQ6MS4yfS5kaXNwbGF5LTJ7Zm9udC1zaXplOjUuNXJlbTtmb250LXdlaWdodDozMDA7bGluZS1oZWlnaHQ6MS4yfS5kaXNwbGF5LTN7Zm9udC1zaXplOjQuNXJlbTtmb250LXdlaWdodDozMDA7bGluZS1oZWlnaHQ6MS4yfS5kaXNwbGF5LTR7Zm9udC1zaXplOjMuNXJlbTtmb250LXdlaWdodDozMDA7bGluZS1oZWlnaHQ6MS4yfWhye21hcmdpbi10b3A6MXJlbTttYXJnaW4tYm90dG9tOjFyZW07Ym9yZGVyOjA7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMSl9LnNtYWxsLHNtYWxse2ZvbnQtc2l6ZTo4MCU7Zm9udC13ZWlnaHQ6NDAwfS5tYXJrLG1hcmt7cGFkZGluZzouMmVtO2JhY2tncm91bmQtY29sb3I6I2ZjZjhlM30ubGlzdC11bnN0eWxlZHtwYWRkaW5nLWxlZnQ6MDtsaXN0LXN0eWxlOm5vbmV9Lmxpc3QtaW5saW5le3BhZGRpbmctbGVmdDowO2xpc3Qtc3R5bGU6bm9uZX0ubGlzdC1pbmxpbmUtaXRlbXtkaXNwbGF5OmlubGluZS1ibG9ja30ubGlzdC1pbmxpbmUtaXRlbTpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1yaWdodDouNXJlbX0uaW5pdGlhbGlzbXtmb250LXNpemU6OTAlO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uYmxvY2txdW90ZXttYXJnaW4tYm90dG9tOjFyZW07Zm9udC1zaXplOjEuMjVyZW19LmJsb2NrcXVvdGUtZm9vdGVye2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjgwJTtjb2xvcjojNmM3NTdkfS5ibG9ja3F1b3RlLWZvb3Rlcjo6YmVmb3Jle2NvbnRlbnQ6IlwyMDE0XDAwQTAifS5pbWctZmx1aWR7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG99LmltZy10aHVtYm5haWx7cGFkZGluZzouMjVyZW07YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2RlZTJlNjtib3JkZXItcmFkaXVzOi4yNXJlbTttYXgtd2lkdGg6MTAwJTtoZWlnaHQ6YXV0b30uZmlndXJle2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5maWd1cmUtaW1ne21hcmdpbi1ib3R0b206LjVyZW07bGluZS1oZWlnaHQ6MX0uZmlndXJlLWNhcHRpb257Zm9udC1zaXplOjkwJTtjb2xvcjojNmM3NTdkfWNvZGV7Zm9udC1zaXplOjg3LjUlO2NvbG9yOiNlODNlOGM7d29yZC13cmFwOmJyZWFrLXdvcmR9YT5jb2Rle2NvbG9yOmluaGVyaXR9a2Jke3BhZGRpbmc6LjJyZW0gLjRyZW07Zm9udC1zaXplOjg3LjUlO2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMjEyNTI5O2JvcmRlci1yYWRpdXM6LjJyZW19a2JkIGtiZHtwYWRkaW5nOjA7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6NzAwfXByZXtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTo4Ny41JTtjb2xvcjojMjEyNTI5fXByZSBjb2Rle2ZvbnQtc2l6ZTppbmhlcml0O2NvbG9yOmluaGVyaXQ7d29yZC1icmVhazpub3JtYWx9LnByZS1zY3JvbGxhYmxle21heC1oZWlnaHQ6MzQwcHg7b3ZlcmZsb3cteTpzY3JvbGx9LmNvbnRhaW5lciwuY29udGFpbmVyLWZsdWlkLC5jb250YWluZXItbGcsLmNvbnRhaW5lci1tZCwuY29udGFpbmVyLXNtLC5jb250YWluZXIteGx7d2lkdGg6MTAwJTtwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjE1cHg7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0b31AbWVkaWEgKG1pbi13aWR0aDo1NzZweCl7LmNvbnRhaW5lciwuY29udGFpbmVyLXNte21heC13aWR0aDo1NDBweH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5jb250YWluZXIsLmNvbnRhaW5lci1tZCwuY29udGFpbmVyLXNte21heC13aWR0aDo3MjBweH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5jb250YWluZXIsLmNvbnRhaW5lci1sZywuY29udGFpbmVyLW1kLC5jb250YWluZXItc217bWF4LXdpZHRoOjk2MHB4fX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey5jb250YWluZXIsLmNvbnRhaW5lci1sZywuY29udGFpbmVyLW1kLC5jb250YWluZXItc20sLmNvbnRhaW5lci14bHttYXgtd2lkdGg6MTE0MHB4fX0ucm93e2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcDttYXJnaW4tcmlnaHQ6LTE1cHg7bWFyZ2luLWxlZnQ6LTE1cHh9Lm5vLWd1dHRlcnN7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MH0ubm8tZ3V0dGVycz4uY29sLC5uby1ndXR0ZXJzPltjbGFzcyo9Y29sLV17cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDowfS5jb2wsLmNvbC0xLC5jb2wtMTAsLmNvbC0xMSwuY29sLTEyLC5jb2wtMiwuY29sLTMsLmNvbC00LC5jb2wtNSwuY29sLTYsLmNvbC03LC5jb2wtOCwuY29sLTksLmNvbC1hdXRvLC5jb2wtbGcsLmNvbC1sZy0xLC5jb2wtbGctMTAsLmNvbC1sZy0xMSwuY29sLWxnLTEyLC5jb2wtbGctMiwuY29sLWxnLTMsLmNvbC1sZy00LC5jb2wtbGctNSwuY29sLWxnLTYsLmNvbC1sZy03LC5jb2wtbGctOCwuY29sLWxnLTksLmNvbC1sZy1hdXRvLC5jb2wtbWQsLmNvbC1tZC0xLC5jb2wtbWQtMTAsLmNvbC1tZC0xMSwuY29sLW1kLTEyLC5jb2wtbWQtMiwuY29sLW1kLTMsLmNvbC1tZC00LC5jb2wtbWQtNSwuY29sLW1kLTYsLmNvbC1tZC03LC5jb2wtbWQtOCwuY29sLW1kLTksLmNvbC1tZC1hdXRvLC5jb2wtc20sLmNvbC1zbS0xLC5jb2wtc20tMTAsLmNvbC1zbS0xMSwuY29sLXNtLTEyLC5jb2wtc20tMiwuY29sLXNtLTMsLmNvbC1zbS00LC5jb2wtc20tNSwuY29sLXNtLTYsLmNvbC1zbS03LC5jb2wtc20tOCwuY29sLXNtLTksLmNvbC1zbS1hdXRvLC5jb2wteGwsLmNvbC14bC0xLC5jb2wteGwtMTAsLmNvbC14bC0xMSwuY29sLXhsLTEyLC5jb2wteGwtMiwuY29sLXhsLTMsLmNvbC14bC00LC5jb2wteGwtNSwuY29sLXhsLTYsLmNvbC14bC03LC5jb2wteGwtOCwuY29sLXhsLTksLmNvbC14bC1hdXRve3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCU7cGFkZGluZy1yaWdodDoxNXB4O3BhZGRpbmctbGVmdDoxNXB4fS5jb2x7LW1zLWZsZXgtcHJlZmVycmVkLXNpemU6MDtmbGV4LWJhc2lzOjA7LW1zLWZsZXgtcG9zaXRpdmU6MTtmbGV4LWdyb3c6MTttYXgtd2lkdGg6MTAwJX0ucm93LWNvbHMtMT4qey1tcy1mbGV4OjAgMCAxMDAlO2ZsZXg6MCAwIDEwMCU7bWF4LXdpZHRoOjEwMCV9LnJvdy1jb2xzLTI+KnstbXMtZmxleDowIDAgNTAlO2ZsZXg6MCAwIDUwJTttYXgtd2lkdGg6NTAlfS5yb3ctY29scy0zPip7LW1zLWZsZXg6MCAwIDMzLjMzMzMzMyU7ZmxleDowIDAgMzMuMzMzMzMzJTttYXgtd2lkdGg6MzMuMzMzMzMzJX0ucm93LWNvbHMtND4qey1tcy1mbGV4OjAgMCAyNSU7ZmxleDowIDAgMjUlO21heC13aWR0aDoyNSV9LnJvdy1jb2xzLTU+KnstbXMtZmxleDowIDAgMjAlO2ZsZXg6MCAwIDIwJTttYXgtd2lkdGg6MjAlfS5yb3ctY29scy02Pip7LW1zLWZsZXg6MCAwIDE2LjY2NjY2NyU7ZmxleDowIDAgMTYuNjY2NjY3JTttYXgtd2lkdGg6MTYuNjY2NjY3JX0uY29sLWF1dG97LW1zLWZsZXg6MCAwIGF1dG87ZmxleDowIDAgYXV0bzt3aWR0aDphdXRvO21heC13aWR0aDoxMDAlfS5jb2wtMXstbXMtZmxleDowIDAgOC4zMzMzMzMlO2ZsZXg6MCAwIDguMzMzMzMzJTttYXgtd2lkdGg6OC4zMzMzMzMlfS5jb2wtMnstbXMtZmxleDowIDAgMTYuNjY2NjY3JTtmbGV4OjAgMCAxNi42NjY2NjclO21heC13aWR0aDoxNi42NjY2NjclfS5jb2wtM3stbXMtZmxleDowIDAgMjUlO2ZsZXg6MCAwIDI1JTttYXgtd2lkdGg6MjUlfS5jb2wtNHstbXMtZmxleDowIDAgMzMuMzMzMzMzJTtmbGV4OjAgMCAzMy4zMzMzMzMlO21heC13aWR0aDozMy4zMzMzMzMlfS5jb2wtNXstbXMtZmxleDowIDAgNDEuNjY2NjY3JTtmbGV4OjAgMCA0MS42NjY2NjclO21heC13aWR0aDo0MS42NjY2NjclfS5jb2wtNnstbXMtZmxleDowIDAgNTAlO2ZsZXg6MCAwIDUwJTttYXgtd2lkdGg6NTAlfS5jb2wtN3stbXMtZmxleDowIDAgNTguMzMzMzMzJTtmbGV4OjAgMCA1OC4zMzMzMzMlO21heC13aWR0aDo1OC4zMzMzMzMlfS5jb2wtOHstbXMtZmxleDowIDAgNjYuNjY2NjY3JTtmbGV4OjAgMCA2Ni42NjY2NjclO21heC13aWR0aDo2Ni42NjY2NjclfS5jb2wtOXstbXMtZmxleDowIDAgNzUlO2ZsZXg6MCAwIDc1JTttYXgtd2lkdGg6NzUlfS5jb2wtMTB7LW1zLWZsZXg6MCAwIDgzLjMzMzMzMyU7ZmxleDowIDAgODMuMzMzMzMzJTttYXgtd2lkdGg6ODMuMzMzMzMzJX0uY29sLTExey1tcy1mbGV4OjAgMCA5MS42NjY2NjclO2ZsZXg6MCAwIDkxLjY2NjY2NyU7bWF4LXdpZHRoOjkxLjY2NjY2NyV9LmNvbC0xMnstbXMtZmxleDowIDAgMTAwJTtmbGV4OjAgMCAxMDAlO21heC13aWR0aDoxMDAlfS5vcmRlci1maXJzdHstbXMtZmxleC1vcmRlcjotMTtvcmRlcjotMX0ub3JkZXItbGFzdHstbXMtZmxleC1vcmRlcjoxMztvcmRlcjoxM30ub3JkZXItMHstbXMtZmxleC1vcmRlcjowO29yZGVyOjB9Lm9yZGVyLTF7LW1zLWZsZXgtb3JkZXI6MTtvcmRlcjoxfS5vcmRlci0yey1tcy1mbGV4LW9yZGVyOjI7b3JkZXI6Mn0ub3JkZXItM3stbXMtZmxleC1vcmRlcjozO29yZGVyOjN9Lm9yZGVyLTR7LW1zLWZsZXgtb3JkZXI6NDtvcmRlcjo0fS5vcmRlci01ey1tcy1mbGV4LW9yZGVyOjU7b3JkZXI6NX0ub3JkZXItNnstbXMtZmxleC1vcmRlcjo2O29yZGVyOjZ9Lm9yZGVyLTd7LW1zLWZsZXgtb3JkZXI6NztvcmRlcjo3fS5vcmRlci04ey1tcy1mbGV4LW9yZGVyOjg7b3JkZXI6OH0ub3JkZXItOXstbXMtZmxleC1vcmRlcjo5O29yZGVyOjl9Lm9yZGVyLTEwey1tcy1mbGV4LW9yZGVyOjEwO29yZGVyOjEwfS5vcmRlci0xMXstbXMtZmxleC1vcmRlcjoxMTtvcmRlcjoxMX0ub3JkZXItMTJ7LW1zLWZsZXgtb3JkZXI6MTI7b3JkZXI6MTJ9Lm9mZnNldC0xe21hcmdpbi1sZWZ0OjguMzMzMzMzJX0ub2Zmc2V0LTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjY3JX0ub2Zmc2V0LTN7bWFyZ2luLWxlZnQ6MjUlfS5vZmZzZXQtNHttYXJnaW4tbGVmdDozMy4zMzMzMzMlfS5vZmZzZXQtNXttYXJnaW4tbGVmdDo0MS42NjY2NjclfS5vZmZzZXQtNnttYXJnaW4tbGVmdDo1MCV9Lm9mZnNldC03e21hcmdpbi1sZWZ0OjU4LjMzMzMzMyV9Lm9mZnNldC04e21hcmdpbi1sZWZ0OjY2LjY2NjY2NyV9Lm9mZnNldC05e21hcmdpbi1sZWZ0Ojc1JX0ub2Zmc2V0LTEwe21hcmdpbi1sZWZ0OjgzLjMzMzMzMyV9Lm9mZnNldC0xMXttYXJnaW4tbGVmdDo5MS42NjY2NjclfUBtZWRpYSAobWluLXdpZHRoOjU3NnB4KXsuY29sLXNtey1tcy1mbGV4LXByZWZlcnJlZC1zaXplOjA7ZmxleC1iYXNpczowOy1tcy1mbGV4LXBvc2l0aXZlOjE7ZmxleC1ncm93OjE7bWF4LXdpZHRoOjEwMCV9LnJvdy1jb2xzLXNtLTE+KnstbXMtZmxleDowIDAgMTAwJTtmbGV4OjAgMCAxMDAlO21heC13aWR0aDoxMDAlfS5yb3ctY29scy1zbS0yPip7LW1zLWZsZXg6MCAwIDUwJTtmbGV4OjAgMCA1MCU7bWF4LXdpZHRoOjUwJX0ucm93LWNvbHMtc20tMz4qey1tcy1mbGV4OjAgMCAzMy4zMzMzMzMlO2ZsZXg6MCAwIDMzLjMzMzMzMyU7bWF4LXdpZHRoOjMzLjMzMzMzMyV9LnJvdy1jb2xzLXNtLTQ+KnstbXMtZmxleDowIDAgMjUlO2ZsZXg6MCAwIDI1JTttYXgtd2lkdGg6MjUlfS5yb3ctY29scy1zbS01Pip7LW1zLWZsZXg6MCAwIDIwJTtmbGV4OjAgMCAyMCU7bWF4LXdpZHRoOjIwJX0ucm93LWNvbHMtc20tNj4qey1tcy1mbGV4OjAgMCAxNi42NjY2NjclO2ZsZXg6MCAwIDE2LjY2NjY2NyU7bWF4LXdpZHRoOjE2LjY2NjY2NyV9LmNvbC1zbS1hdXRvey1tcy1mbGV4OjAgMCBhdXRvO2ZsZXg6MCAwIGF1dG87d2lkdGg6YXV0bzttYXgtd2lkdGg6MTAwJX0uY29sLXNtLTF7LW1zLWZsZXg6MCAwIDguMzMzMzMzJTtmbGV4OjAgMCA4LjMzMzMzMyU7bWF4LXdpZHRoOjguMzMzMzMzJX0uY29sLXNtLTJ7LW1zLWZsZXg6MCAwIDE2LjY2NjY2NyU7ZmxleDowIDAgMTYuNjY2NjY3JTttYXgtd2lkdGg6MTYuNjY2NjY3JX0uY29sLXNtLTN7LW1zLWZsZXg6MCAwIDI1JTtmbGV4OjAgMCAyNSU7bWF4LXdpZHRoOjI1JX0uY29sLXNtLTR7LW1zLWZsZXg6MCAwIDMzLjMzMzMzMyU7ZmxleDowIDAgMzMuMzMzMzMzJTttYXgtd2lkdGg6MzMuMzMzMzMzJX0uY29sLXNtLTV7LW1zLWZsZXg6MCAwIDQxLjY2NjY2NyU7ZmxleDowIDAgNDEuNjY2NjY3JTttYXgtd2lkdGg6NDEuNjY2NjY3JX0uY29sLXNtLTZ7LW1zLWZsZXg6MCAwIDUwJTtmbGV4OjAgMCA1MCU7bWF4LXdpZHRoOjUwJX0uY29sLXNtLTd7LW1zLWZsZXg6MCAwIDU4LjMzMzMzMyU7ZmxleDowIDAgNTguMzMzMzMzJTttYXgtd2lkdGg6NTguMzMzMzMzJX0uY29sLXNtLTh7LW1zLWZsZXg6MCAwIDY2LjY2NjY2NyU7ZmxleDowIDAgNjYuNjY2NjY3JTttYXgtd2lkdGg6NjYuNjY2NjY3JX0uY29sLXNtLTl7LW1zLWZsZXg6MCAwIDc1JTtmbGV4OjAgMCA3NSU7bWF4LXdpZHRoOjc1JX0uY29sLXNtLTEwey1tcy1mbGV4OjAgMCA4My4zMzMzMzMlO2ZsZXg6MCAwIDgzLjMzMzMzMyU7bWF4LXdpZHRoOjgzLjMzMzMzMyV9LmNvbC1zbS0xMXstbXMtZmxleDowIDAgOTEuNjY2NjY3JTtmbGV4OjAgMCA5MS42NjY2NjclO21heC13aWR0aDo5MS42NjY2NjclfS5jb2wtc20tMTJ7LW1zLWZsZXg6MCAwIDEwMCU7ZmxleDowIDAgMTAwJTttYXgtd2lkdGg6MTAwJX0ub3JkZXItc20tZmlyc3R7LW1zLWZsZXgtb3JkZXI6LTE7b3JkZXI6LTF9Lm9yZGVyLXNtLWxhc3R7LW1zLWZsZXgtb3JkZXI6MTM7b3JkZXI6MTN9Lm9yZGVyLXNtLTB7LW1zLWZsZXgtb3JkZXI6MDtvcmRlcjowfS5vcmRlci1zbS0xey1tcy1mbGV4LW9yZGVyOjE7b3JkZXI6MX0ub3JkZXItc20tMnstbXMtZmxleC1vcmRlcjoyO29yZGVyOjJ9Lm9yZGVyLXNtLTN7LW1zLWZsZXgtb3JkZXI6MztvcmRlcjozfS5vcmRlci1zbS00ey1tcy1mbGV4LW9yZGVyOjQ7b3JkZXI6NH0ub3JkZXItc20tNXstbXMtZmxleC1vcmRlcjo1O29yZGVyOjV9Lm9yZGVyLXNtLTZ7LW1zLWZsZXgtb3JkZXI6NjtvcmRlcjo2fS5vcmRlci1zbS03ey1tcy1mbGV4LW9yZGVyOjc7b3JkZXI6N30ub3JkZXItc20tOHstbXMtZmxleC1vcmRlcjo4O29yZGVyOjh9Lm9yZGVyLXNtLTl7LW1zLWZsZXgtb3JkZXI6OTtvcmRlcjo5fS5vcmRlci1zbS0xMHstbXMtZmxleC1vcmRlcjoxMDtvcmRlcjoxMH0ub3JkZXItc20tMTF7LW1zLWZsZXgtb3JkZXI6MTE7b3JkZXI6MTF9Lm9yZGVyLXNtLTEyey1tcy1mbGV4LW9yZGVyOjEyO29yZGVyOjEyfS5vZmZzZXQtc20tMHttYXJnaW4tbGVmdDowfS5vZmZzZXQtc20tMXttYXJnaW4tbGVmdDo4LjMzMzMzMyV9Lm9mZnNldC1zbS0ye21hcmdpbi1sZWZ0OjE2LjY2NjY2NyV9Lm9mZnNldC1zbS0ze21hcmdpbi1sZWZ0OjI1JX0ub2Zmc2V0LXNtLTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMzJX0ub2Zmc2V0LXNtLTV7bWFyZ2luLWxlZnQ6NDEuNjY2NjY3JX0ub2Zmc2V0LXNtLTZ7bWFyZ2luLWxlZnQ6NTAlfS5vZmZzZXQtc20tN3ttYXJnaW4tbGVmdDo1OC4zMzMzMzMlfS5vZmZzZXQtc20tOHttYXJnaW4tbGVmdDo2Ni42NjY2NjclfS5vZmZzZXQtc20tOXttYXJnaW4tbGVmdDo3NSV9Lm9mZnNldC1zbS0xMHttYXJnaW4tbGVmdDo4My4zMzMzMzMlfS5vZmZzZXQtc20tMTF7bWFyZ2luLWxlZnQ6OTEuNjY2NjY3JX19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5jb2wtbWR7LW1zLWZsZXgtcHJlZmVycmVkLXNpemU6MDtmbGV4LWJhc2lzOjA7LW1zLWZsZXgtcG9zaXRpdmU6MTtmbGV4LWdyb3c6MTttYXgtd2lkdGg6MTAwJX0ucm93LWNvbHMtbWQtMT4qey1tcy1mbGV4OjAgMCAxMDAlO2ZsZXg6MCAwIDEwMCU7bWF4LXdpZHRoOjEwMCV9LnJvdy1jb2xzLW1kLTI+KnstbXMtZmxleDowIDAgNTAlO2ZsZXg6MCAwIDUwJTttYXgtd2lkdGg6NTAlfS5yb3ctY29scy1tZC0zPip7LW1zLWZsZXg6MCAwIDMzLjMzMzMzMyU7ZmxleDowIDAgMzMuMzMzMzMzJTttYXgtd2lkdGg6MzMuMzMzMzMzJX0ucm93LWNvbHMtbWQtND4qey1tcy1mbGV4OjAgMCAyNSU7ZmxleDowIDAgMjUlO21heC13aWR0aDoyNSV9LnJvdy1jb2xzLW1kLTU+KnstbXMtZmxleDowIDAgMjAlO2ZsZXg6MCAwIDIwJTttYXgtd2lkdGg6MjAlfS5yb3ctY29scy1tZC02Pip7LW1zLWZsZXg6MCAwIDE2LjY2NjY2NyU7ZmxleDowIDAgMTYuNjY2NjY3JTttYXgtd2lkdGg6MTYuNjY2NjY3JX0uY29sLW1kLWF1dG97LW1zLWZsZXg6MCAwIGF1dG87ZmxleDowIDAgYXV0bzt3aWR0aDphdXRvO21heC13aWR0aDoxMDAlfS5jb2wtbWQtMXstbXMtZmxleDowIDAgOC4zMzMzMzMlO2ZsZXg6MCAwIDguMzMzMzMzJTttYXgtd2lkdGg6OC4zMzMzMzMlfS5jb2wtbWQtMnstbXMtZmxleDowIDAgMTYuNjY2NjY3JTtmbGV4OjAgMCAxNi42NjY2NjclO21heC13aWR0aDoxNi42NjY2NjclfS5jb2wtbWQtM3stbXMtZmxleDowIDAgMjUlO2ZsZXg6MCAwIDI1JTttYXgtd2lkdGg6MjUlfS5jb2wtbWQtNHstbXMtZmxleDowIDAgMzMuMzMzMzMzJTtmbGV4OjAgMCAzMy4zMzMzMzMlO21heC13aWR0aDozMy4zMzMzMzMlfS5jb2wtbWQtNXstbXMtZmxleDowIDAgNDEuNjY2NjY3JTtmbGV4OjAgMCA0MS42NjY2NjclO21heC13aWR0aDo0MS42NjY2NjclfS5jb2wtbWQtNnstbXMtZmxleDowIDAgNTAlO2ZsZXg6MCAwIDUwJTttYXgtd2lkdGg6NTAlfS5jb2wtbWQtN3stbXMtZmxleDowIDAgNTguMzMzMzMzJTtmbGV4OjAgMCA1OC4zMzMzMzMlO21heC13aWR0aDo1OC4zMzMzMzMlfS5jb2wtbWQtOHstbXMtZmxleDowIDAgNjYuNjY2NjY3JTtmbGV4OjAgMCA2Ni42NjY2NjclO21heC13aWR0aDo2Ni42NjY2NjclfS5jb2wtbWQtOXstbXMtZmxleDowIDAgNzUlO2ZsZXg6MCAwIDc1JTttYXgtd2lkdGg6NzUlfS5jb2wtbWQtMTB7LW1zLWZsZXg6MCAwIDgzLjMzMzMzMyU7ZmxleDowIDAgODMuMzMzMzMzJTttYXgtd2lkdGg6ODMuMzMzMzMzJX0uY29sLW1kLTExey1tcy1mbGV4OjAgMCA5MS42NjY2NjclO2ZsZXg6MCAwIDkxLjY2NjY2NyU7bWF4LXdpZHRoOjkxLjY2NjY2NyV9LmNvbC1tZC0xMnstbXMtZmxleDowIDAgMTAwJTtmbGV4OjAgMCAxMDAlO21heC13aWR0aDoxMDAlfS5vcmRlci1tZC1maXJzdHstbXMtZmxleC1vcmRlcjotMTtvcmRlcjotMX0ub3JkZXItbWQtbGFzdHstbXMtZmxleC1vcmRlcjoxMztvcmRlcjoxM30ub3JkZXItbWQtMHstbXMtZmxleC1vcmRlcjowO29yZGVyOjB9Lm9yZGVyLW1kLTF7LW1zLWZsZXgtb3JkZXI6MTtvcmRlcjoxfS5vcmRlci1tZC0yey1tcy1mbGV4LW9yZGVyOjI7b3JkZXI6Mn0ub3JkZXItbWQtM3stbXMtZmxleC1vcmRlcjozO29yZGVyOjN9Lm9yZGVyLW1kLTR7LW1zLWZsZXgtb3JkZXI6NDtvcmRlcjo0fS5vcmRlci1tZC01ey1tcy1mbGV4LW9yZGVyOjU7b3JkZXI6NX0ub3JkZXItbWQtNnstbXMtZmxleC1vcmRlcjo2O29yZGVyOjZ9Lm9yZGVyLW1kLTd7LW1zLWZsZXgtb3JkZXI6NztvcmRlcjo3fS5vcmRlci1tZC04ey1tcy1mbGV4LW9yZGVyOjg7b3JkZXI6OH0ub3JkZXItbWQtOXstbXMtZmxleC1vcmRlcjo5O29yZGVyOjl9Lm9yZGVyLW1kLTEwey1tcy1mbGV4LW9yZGVyOjEwO29yZGVyOjEwfS5vcmRlci1tZC0xMXstbXMtZmxleC1vcmRlcjoxMTtvcmRlcjoxMX0ub3JkZXItbWQtMTJ7LW1zLWZsZXgtb3JkZXI6MTI7b3JkZXI6MTJ9Lm9mZnNldC1tZC0we21hcmdpbi1sZWZ0OjB9Lm9mZnNldC1tZC0xe21hcmdpbi1sZWZ0OjguMzMzMzMzJX0ub2Zmc2V0LW1kLTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjY3JX0ub2Zmc2V0LW1kLTN7bWFyZ2luLWxlZnQ6MjUlfS5vZmZzZXQtbWQtNHttYXJnaW4tbGVmdDozMy4zMzMzMzMlfS5vZmZzZXQtbWQtNXttYXJnaW4tbGVmdDo0MS42NjY2NjclfS5vZmZzZXQtbWQtNnttYXJnaW4tbGVmdDo1MCV9Lm9mZnNldC1tZC03e21hcmdpbi1sZWZ0OjU4LjMzMzMzMyV9Lm9mZnNldC1tZC04e21hcmdpbi1sZWZ0OjY2LjY2NjY2NyV9Lm9mZnNldC1tZC05e21hcmdpbi1sZWZ0Ojc1JX0ub2Zmc2V0LW1kLTEwe21hcmdpbi1sZWZ0OjgzLjMzMzMzMyV9Lm9mZnNldC1tZC0xMXttYXJnaW4tbGVmdDo5MS42NjY2NjclfX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7LmNvbC1sZ3stbXMtZmxleC1wcmVmZXJyZWQtc2l6ZTowO2ZsZXgtYmFzaXM6MDstbXMtZmxleC1wb3NpdGl2ZToxO2ZsZXgtZ3JvdzoxO21heC13aWR0aDoxMDAlfS5yb3ctY29scy1sZy0xPip7LW1zLWZsZXg6MCAwIDEwMCU7ZmxleDowIDAgMTAwJTttYXgtd2lkdGg6MTAwJX0ucm93LWNvbHMtbGctMj4qey1tcy1mbGV4OjAgMCA1MCU7ZmxleDowIDAgNTAlO21heC13aWR0aDo1MCV9LnJvdy1jb2xzLWxnLTM+KnstbXMtZmxleDowIDAgMzMuMzMzMzMzJTtmbGV4OjAgMCAzMy4zMzMzMzMlO21heC13aWR0aDozMy4zMzMzMzMlfS5yb3ctY29scy1sZy00Pip7LW1zLWZsZXg6MCAwIDI1JTtmbGV4OjAgMCAyNSU7bWF4LXdpZHRoOjI1JX0ucm93LWNvbHMtbGctNT4qey1tcy1mbGV4OjAgMCAyMCU7ZmxleDowIDAgMjAlO21heC13aWR0aDoyMCV9LnJvdy1jb2xzLWxnLTY+KnstbXMtZmxleDowIDAgMTYuNjY2NjY3JTtmbGV4OjAgMCAxNi42NjY2NjclO21heC13aWR0aDoxNi42NjY2NjclfS5jb2wtbGctYXV0b3stbXMtZmxleDowIDAgYXV0bztmbGV4OjAgMCBhdXRvO3dpZHRoOmF1dG87bWF4LXdpZHRoOjEwMCV9LmNvbC1sZy0xey1tcy1mbGV4OjAgMCA4LjMzMzMzMyU7ZmxleDowIDAgOC4zMzMzMzMlO21heC13aWR0aDo4LjMzMzMzMyV9LmNvbC1sZy0yey1tcy1mbGV4OjAgMCAxNi42NjY2NjclO2ZsZXg6MCAwIDE2LjY2NjY2NyU7bWF4LXdpZHRoOjE2LjY2NjY2NyV9LmNvbC1sZy0zey1tcy1mbGV4OjAgMCAyNSU7ZmxleDowIDAgMjUlO21heC13aWR0aDoyNSV9LmNvbC1sZy00ey1tcy1mbGV4OjAgMCAzMy4zMzMzMzMlO2ZsZXg6MCAwIDMzLjMzMzMzMyU7bWF4LXdpZHRoOjMzLjMzMzMzMyV9LmNvbC1sZy01ey1tcy1mbGV4OjAgMCA0MS42NjY2NjclO2ZsZXg6MCAwIDQxLjY2NjY2NyU7bWF4LXdpZHRoOjQxLjY2NjY2NyV9LmNvbC1sZy02ey1tcy1mbGV4OjAgMCA1MCU7ZmxleDowIDAgNTAlO21heC13aWR0aDo1MCV9LmNvbC1sZy03ey1tcy1mbGV4OjAgMCA1OC4zMzMzMzMlO2ZsZXg6MCAwIDU4LjMzMzMzMyU7bWF4LXdpZHRoOjU4LjMzMzMzMyV9LmNvbC1sZy04ey1tcy1mbGV4OjAgMCA2Ni42NjY2NjclO2ZsZXg6MCAwIDY2LjY2NjY2NyU7bWF4LXdpZHRoOjY2LjY2NjY2NyV9LmNvbC1sZy05ey1tcy1mbGV4OjAgMCA3NSU7ZmxleDowIDAgNzUlO21heC13aWR0aDo3NSV9LmNvbC1sZy0xMHstbXMtZmxleDowIDAgODMuMzMzMzMzJTtmbGV4OjAgMCA4My4zMzMzMzMlO21heC13aWR0aDo4My4zMzMzMzMlfS5jb2wtbGctMTF7LW1zLWZsZXg6MCAwIDkxLjY2NjY2NyU7ZmxleDowIDAgOTEuNjY2NjY3JTttYXgtd2lkdGg6OTEuNjY2NjY3JX0uY29sLWxnLTEyey1tcy1mbGV4OjAgMCAxMDAlO2ZsZXg6MCAwIDEwMCU7bWF4LXdpZHRoOjEwMCV9Lm9yZGVyLWxnLWZpcnN0ey1tcy1mbGV4LW9yZGVyOi0xO29yZGVyOi0xfS5vcmRlci1sZy1sYXN0ey1tcy1mbGV4LW9yZGVyOjEzO29yZGVyOjEzfS5vcmRlci1sZy0wey1tcy1mbGV4LW9yZGVyOjA7b3JkZXI6MH0ub3JkZXItbGctMXstbXMtZmxleC1vcmRlcjoxO29yZGVyOjF9Lm9yZGVyLWxnLTJ7LW1zLWZsZXgtb3JkZXI6MjtvcmRlcjoyfS5vcmRlci1sZy0zey1tcy1mbGV4LW9yZGVyOjM7b3JkZXI6M30ub3JkZXItbGctNHstbXMtZmxleC1vcmRlcjo0O29yZGVyOjR9Lm9yZGVyLWxnLTV7LW1zLWZsZXgtb3JkZXI6NTtvcmRlcjo1fS5vcmRlci1sZy02ey1tcy1mbGV4LW9yZGVyOjY7b3JkZXI6Nn0ub3JkZXItbGctN3stbXMtZmxleC1vcmRlcjo3O29yZGVyOjd9Lm9yZGVyLWxnLTh7LW1zLWZsZXgtb3JkZXI6ODtvcmRlcjo4fS5vcmRlci1sZy05ey1tcy1mbGV4LW9yZGVyOjk7b3JkZXI6OX0ub3JkZXItbGctMTB7LW1zLWZsZXgtb3JkZXI6MTA7b3JkZXI6MTB9Lm9yZGVyLWxnLTExey1tcy1mbGV4LW9yZGVyOjExO29yZGVyOjExfS5vcmRlci1sZy0xMnstbXMtZmxleC1vcmRlcjoxMjtvcmRlcjoxMn0ub2Zmc2V0LWxnLTB7bWFyZ2luLWxlZnQ6MH0ub2Zmc2V0LWxnLTF7bWFyZ2luLWxlZnQ6OC4zMzMzMzMlfS5vZmZzZXQtbGctMnttYXJnaW4tbGVmdDoxNi42NjY2NjclfS5vZmZzZXQtbGctM3ttYXJnaW4tbGVmdDoyNSV9Lm9mZnNldC1sZy00e21hcmdpbi1sZWZ0OjMzLjMzMzMzMyV9Lm9mZnNldC1sZy01e21hcmdpbi1sZWZ0OjQxLjY2NjY2NyV9Lm9mZnNldC1sZy02e21hcmdpbi1sZWZ0OjUwJX0ub2Zmc2V0LWxnLTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMzJX0ub2Zmc2V0LWxnLTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjY3JX0ub2Zmc2V0LWxnLTl7bWFyZ2luLWxlZnQ6NzUlfS5vZmZzZXQtbGctMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMzJX0ub2Zmc2V0LWxnLTExe21hcmdpbi1sZWZ0OjkxLjY2NjY2NyV9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LmNvbC14bHstbXMtZmxleC1wcmVmZXJyZWQtc2l6ZTowO2ZsZXgtYmFzaXM6MDstbXMtZmxleC1wb3NpdGl2ZToxO2ZsZXgtZ3JvdzoxO21heC13aWR0aDoxMDAlfS5yb3ctY29scy14bC0xPip7LW1zLWZsZXg6MCAwIDEwMCU7ZmxleDowIDAgMTAwJTttYXgtd2lkdGg6MTAwJX0ucm93LWNvbHMteGwtMj4qey1tcy1mbGV4OjAgMCA1MCU7ZmxleDowIDAgNTAlO21heC13aWR0aDo1MCV9LnJvdy1jb2xzLXhsLTM+KnstbXMtZmxleDowIDAgMzMuMzMzMzMzJTtmbGV4OjAgMCAzMy4zMzMzMzMlO21heC13aWR0aDozMy4zMzMzMzMlfS5yb3ctY29scy14bC00Pip7LW1zLWZsZXg6MCAwIDI1JTtmbGV4OjAgMCAyNSU7bWF4LXdpZHRoOjI1JX0ucm93LWNvbHMteGwtNT4qey1tcy1mbGV4OjAgMCAyMCU7ZmxleDowIDAgMjAlO21heC13aWR0aDoyMCV9LnJvdy1jb2xzLXhsLTY+KnstbXMtZmxleDowIDAgMTYuNjY2NjY3JTtmbGV4OjAgMCAxNi42NjY2NjclO21heC13aWR0aDoxNi42NjY2NjclfS5jb2wteGwtYXV0b3stbXMtZmxleDowIDAgYXV0bztmbGV4OjAgMCBhdXRvO3dpZHRoOmF1dG87bWF4LXdpZHRoOjEwMCV9LmNvbC14bC0xey1tcy1mbGV4OjAgMCA4LjMzMzMzMyU7ZmxleDowIDAgOC4zMzMzMzMlO21heC13aWR0aDo4LjMzMzMzMyV9LmNvbC14bC0yey1tcy1mbGV4OjAgMCAxNi42NjY2NjclO2ZsZXg6MCAwIDE2LjY2NjY2NyU7bWF4LXdpZHRoOjE2LjY2NjY2NyV9LmNvbC14bC0zey1tcy1mbGV4OjAgMCAyNSU7ZmxleDowIDAgMjUlO21heC13aWR0aDoyNSV9LmNvbC14bC00ey1tcy1mbGV4OjAgMCAzMy4zMzMzMzMlO2ZsZXg6MCAwIDMzLjMzMzMzMyU7bWF4LXdpZHRoOjMzLjMzMzMzMyV9LmNvbC14bC01ey1tcy1mbGV4OjAgMCA0MS42NjY2NjclO2ZsZXg6MCAwIDQxLjY2NjY2NyU7bWF4LXdpZHRoOjQxLjY2NjY2NyV9LmNvbC14bC02ey1tcy1mbGV4OjAgMCA1MCU7ZmxleDowIDAgNTAlO21heC13aWR0aDo1MCV9LmNvbC14bC03ey1tcy1mbGV4OjAgMCA1OC4zMzMzMzMlO2ZsZXg6MCAwIDU4LjMzMzMzMyU7bWF4LXdpZHRoOjU4LjMzMzMzMyV9LmNvbC14bC04ey1tcy1mbGV4OjAgMCA2Ni42NjY2NjclO2ZsZXg6MCAwIDY2LjY2NjY2NyU7bWF4LXdpZHRoOjY2LjY2NjY2NyV9LmNvbC14bC05ey1tcy1mbGV4OjAgMCA3NSU7ZmxleDowIDAgNzUlO21heC13aWR0aDo3NSV9LmNvbC14bC0xMHstbXMtZmxleDowIDAgODMuMzMzMzMzJTtmbGV4OjAgMCA4My4zMzMzMzMlO21heC13aWR0aDo4My4zMzMzMzMlfS5jb2wteGwtMTF7LW1zLWZsZXg6MCAwIDkxLjY2NjY2NyU7ZmxleDowIDAgOTEuNjY2NjY3JTttYXgtd2lkdGg6OTEuNjY2NjY3JX0uY29sLXhsLTEyey1tcy1mbGV4OjAgMCAxMDAlO2ZsZXg6MCAwIDEwMCU7bWF4LXdpZHRoOjEwMCV9Lm9yZGVyLXhsLWZpcnN0ey1tcy1mbGV4LW9yZGVyOi0xO29yZGVyOi0xfS5vcmRlci14bC1sYXN0ey1tcy1mbGV4LW9yZGVyOjEzO29yZGVyOjEzfS5vcmRlci14bC0wey1tcy1mbGV4LW9yZGVyOjA7b3JkZXI6MH0ub3JkZXIteGwtMXstbXMtZmxleC1vcmRlcjoxO29yZGVyOjF9Lm9yZGVyLXhsLTJ7LW1zLWZsZXgtb3JkZXI6MjtvcmRlcjoyfS5vcmRlci14bC0zey1tcy1mbGV4LW9yZGVyOjM7b3JkZXI6M30ub3JkZXIteGwtNHstbXMtZmxleC1vcmRlcjo0O29yZGVyOjR9Lm9yZGVyLXhsLTV7LW1zLWZsZXgtb3JkZXI6NTtvcmRlcjo1fS5vcmRlci14bC02ey1tcy1mbGV4LW9yZGVyOjY7b3JkZXI6Nn0ub3JkZXIteGwtN3stbXMtZmxleC1vcmRlcjo3O29yZGVyOjd9Lm9yZGVyLXhsLTh7LW1zLWZsZXgtb3JkZXI6ODtvcmRlcjo4fS5vcmRlci14bC05ey1tcy1mbGV4LW9yZGVyOjk7b3JkZXI6OX0ub3JkZXIteGwtMTB7LW1zLWZsZXgtb3JkZXI6MTA7b3JkZXI6MTB9Lm9yZGVyLXhsLTExey1tcy1mbGV4LW9yZGVyOjExO29yZGVyOjExfS5vcmRlci14bC0xMnstbXMtZmxleC1vcmRlcjoxMjtvcmRlcjoxMn0ub2Zmc2V0LXhsLTB7bWFyZ2luLWxlZnQ6MH0ub2Zmc2V0LXhsLTF7bWFyZ2luLWxlZnQ6OC4zMzMzMzMlfS5vZmZzZXQteGwtMnttYXJnaW4tbGVmdDoxNi42NjY2NjclfS5vZmZzZXQteGwtM3ttYXJnaW4tbGVmdDoyNSV9Lm9mZnNldC14bC00e21hcmdpbi1sZWZ0OjMzLjMzMzMzMyV9Lm9mZnNldC14bC01e21hcmdpbi1sZWZ0OjQxLjY2NjY2NyV9Lm9mZnNldC14bC02e21hcmdpbi1sZWZ0OjUwJX0ub2Zmc2V0LXhsLTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMzJX0ub2Zmc2V0LXhsLTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjY3JX0ub2Zmc2V0LXhsLTl7bWFyZ2luLWxlZnQ6NzUlfS5vZmZzZXQteGwtMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMzJX0ub2Zmc2V0LXhsLTExe21hcmdpbi1sZWZ0OjkxLjY2NjY2NyV9fS50YWJsZXt3aWR0aDoxMDAlO21hcmdpbi1ib3R0b206MXJlbTtjb2xvcjojMjEyNTI5fS50YWJsZSB0ZCwudGFibGUgdGh7cGFkZGluZzouNzVyZW07dmVydGljYWwtYWxpZ246dG9wO2JvcmRlci10b3A6MXB4IHNvbGlkICNkZWUyZTZ9LnRhYmxlIHRoZWFkIHRoe3ZlcnRpY2FsLWFsaWduOmJvdHRvbTtib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZGVlMmU2fS50YWJsZSB0Ym9keSt0Ym9keXtib3JkZXItdG9wOjJweCBzb2xpZCAjZGVlMmU2fS50YWJsZS1zbSB0ZCwudGFibGUtc20gdGh7cGFkZGluZzouM3JlbX0udGFibGUtYm9yZGVyZWR7Ym9yZGVyOjFweCBzb2xpZCAjZGVlMmU2fS50YWJsZS1ib3JkZXJlZCB0ZCwudGFibGUtYm9yZGVyZWQgdGh7Ym9yZGVyOjFweCBzb2xpZCAjZGVlMmU2fS50YWJsZS1ib3JkZXJlZCB0aGVhZCB0ZCwudGFibGUtYm9yZGVyZWQgdGhlYWQgdGh7Ym9yZGVyLWJvdHRvbS13aWR0aDoycHh9LnRhYmxlLWJvcmRlcmxlc3MgdGJvZHkrdGJvZHksLnRhYmxlLWJvcmRlcmxlc3MgdGQsLnRhYmxlLWJvcmRlcmxlc3MgdGgsLnRhYmxlLWJvcmRlcmxlc3MgdGhlYWQgdGh7Ym9yZGVyOjB9LnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLW9mLXR5cGUob2RkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA1KX0udGFibGUtaG92ZXIgdGJvZHkgdHI6aG92ZXJ7Y29sb3I6IzIxMjUyOTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA3NSl9LnRhYmxlLXByaW1hcnksLnRhYmxlLXByaW1hcnk+dGQsLnRhYmxlLXByaW1hcnk+dGh7YmFja2dyb3VuZC1jb2xvcjojYjhkYWZmfS50YWJsZS1wcmltYXJ5IHRib2R5K3Rib2R5LC50YWJsZS1wcmltYXJ5IHRkLC50YWJsZS1wcmltYXJ5IHRoLC50YWJsZS1wcmltYXJ5IHRoZWFkIHRoe2JvcmRlci1jb2xvcjojN2FiYWZmfS50YWJsZS1ob3ZlciAudGFibGUtcHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM5ZmNkZmZ9LnRhYmxlLWhvdmVyIC50YWJsZS1wcmltYXJ5OmhvdmVyPnRkLC50YWJsZS1ob3ZlciAudGFibGUtcHJpbWFyeTpob3Zlcj50aHtiYWNrZ3JvdW5kLWNvbG9yOiM5ZmNkZmZ9LnRhYmxlLXNlY29uZGFyeSwudGFibGUtc2Vjb25kYXJ5PnRkLC50YWJsZS1zZWNvbmRhcnk+dGh7YmFja2dyb3VuZC1jb2xvcjojZDZkOGRifS50YWJsZS1zZWNvbmRhcnkgdGJvZHkrdGJvZHksLnRhYmxlLXNlY29uZGFyeSB0ZCwudGFibGUtc2Vjb25kYXJ5IHRoLC50YWJsZS1zZWNvbmRhcnkgdGhlYWQgdGh7Ym9yZGVyLWNvbG9yOiNiM2I3YmJ9LnRhYmxlLWhvdmVyIC50YWJsZS1zZWNvbmRhcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzhjYmNmfS50YWJsZS1ob3ZlciAudGFibGUtc2Vjb25kYXJ5OmhvdmVyPnRkLC50YWJsZS1ob3ZlciAudGFibGUtc2Vjb25kYXJ5OmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2M4Y2JjZn0udGFibGUtc3VjY2VzcywudGFibGUtc3VjY2Vzcz50ZCwudGFibGUtc3VjY2Vzcz50aHtiYWNrZ3JvdW5kLWNvbG9yOiNjM2U2Y2J9LnRhYmxlLXN1Y2Nlc3MgdGJvZHkrdGJvZHksLnRhYmxlLXN1Y2Nlc3MgdGQsLnRhYmxlLXN1Y2Nlc3MgdGgsLnRhYmxlLXN1Y2Nlc3MgdGhlYWQgdGh7Ym9yZGVyLWNvbG9yOiM4ZmQxOWV9LnRhYmxlLWhvdmVyIC50YWJsZS1zdWNjZXNzOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2IxZGZiYn0udGFibGUtaG92ZXIgLnRhYmxlLXN1Y2Nlc3M6aG92ZXI+dGQsLnRhYmxlLWhvdmVyIC50YWJsZS1zdWNjZXNzOmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2IxZGZiYn0udGFibGUtaW5mbywudGFibGUtaW5mbz50ZCwudGFibGUtaW5mbz50aHtiYWNrZ3JvdW5kLWNvbG9yOiNiZWU1ZWJ9LnRhYmxlLWluZm8gdGJvZHkrdGJvZHksLnRhYmxlLWluZm8gdGQsLnRhYmxlLWluZm8gdGgsLnRhYmxlLWluZm8gdGhlYWQgdGh7Ym9yZGVyLWNvbG9yOiM4NmNmZGF9LnRhYmxlLWhvdmVyIC50YWJsZS1pbmZvOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2FiZGRlNX0udGFibGUtaG92ZXIgLnRhYmxlLWluZm86aG92ZXI+dGQsLnRhYmxlLWhvdmVyIC50YWJsZS1pbmZvOmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2FiZGRlNX0udGFibGUtd2FybmluZywudGFibGUtd2FybmluZz50ZCwudGFibGUtd2FybmluZz50aHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmVlYmF9LnRhYmxlLXdhcm5pbmcgdGJvZHkrdGJvZHksLnRhYmxlLXdhcm5pbmcgdGQsLnRhYmxlLXdhcm5pbmcgdGgsLnRhYmxlLXdhcm5pbmcgdGhlYWQgdGh7Ym9yZGVyLWNvbG9yOiNmZmRmN2V9LnRhYmxlLWhvdmVyIC50YWJsZS13YXJuaW5nOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZThhMX0udGFibGUtaG92ZXIgLnRhYmxlLXdhcm5pbmc6aG92ZXI+dGQsLnRhYmxlLWhvdmVyIC50YWJsZS13YXJuaW5nOmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2ZmZThhMX0udGFibGUtZGFuZ2VyLC50YWJsZS1kYW5nZXI+dGQsLnRhYmxlLWRhbmdlcj50aHtiYWNrZ3JvdW5kLWNvbG9yOiNmNWM2Y2J9LnRhYmxlLWRhbmdlciB0Ym9keSt0Ym9keSwudGFibGUtZGFuZ2VyIHRkLC50YWJsZS1kYW5nZXIgdGgsLnRhYmxlLWRhbmdlciB0aGVhZCB0aHtib3JkZXItY29sb3I6I2VkOTY5ZX0udGFibGUtaG92ZXIgLnRhYmxlLWRhbmdlcjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMWIwYjd9LnRhYmxlLWhvdmVyIC50YWJsZS1kYW5nZXI6aG92ZXI+dGQsLnRhYmxlLWhvdmVyIC50YWJsZS1kYW5nZXI6aG92ZXI+dGh7YmFja2dyb3VuZC1jb2xvcjojZjFiMGI3fS50YWJsZS1saWdodCwudGFibGUtbGlnaHQ+dGQsLnRhYmxlLWxpZ2h0PnRoe2JhY2tncm91bmQtY29sb3I6I2ZkZmRmZX0udGFibGUtbGlnaHQgdGJvZHkrdGJvZHksLnRhYmxlLWxpZ2h0IHRkLC50YWJsZS1saWdodCB0aCwudGFibGUtbGlnaHQgdGhlYWQgdGh7Ym9yZGVyLWNvbG9yOiNmYmZjZmN9LnRhYmxlLWhvdmVyIC50YWJsZS1saWdodDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlY2VjZjZ9LnRhYmxlLWhvdmVyIC50YWJsZS1saWdodDpob3Zlcj50ZCwudGFibGUtaG92ZXIgLnRhYmxlLWxpZ2h0OmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2VjZWNmNn0udGFibGUtZGFyaywudGFibGUtZGFyaz50ZCwudGFibGUtZGFyaz50aHtiYWNrZ3JvdW5kLWNvbG9yOiNjNmM4Y2F9LnRhYmxlLWRhcmsgdGJvZHkrdGJvZHksLnRhYmxlLWRhcmsgdGQsLnRhYmxlLWRhcmsgdGgsLnRhYmxlLWRhcmsgdGhlYWQgdGh7Ym9yZGVyLWNvbG9yOiM5NTk5OWN9LnRhYmxlLWhvdmVyIC50YWJsZS1kYXJrOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2I5YmJiZX0udGFibGUtaG92ZXIgLnRhYmxlLWRhcms6aG92ZXI+dGQsLnRhYmxlLWhvdmVyIC50YWJsZS1kYXJrOmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2I5YmJiZX0udGFibGUtYWN0aXZlLC50YWJsZS1hY3RpdmU+dGQsLnRhYmxlLWFjdGl2ZT50aHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA3NSl9LnRhYmxlLWhvdmVyIC50YWJsZS1hY3RpdmU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNzUpfS50YWJsZS1ob3ZlciAudGFibGUtYWN0aXZlOmhvdmVyPnRkLC50YWJsZS1ob3ZlciAudGFibGUtYWN0aXZlOmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDc1KX0udGFibGUgLnRoZWFkLWRhcmsgdGh7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzNDNhNDA7Ym9yZGVyLWNvbG9yOiM0NTRkNTV9LnRhYmxlIC50aGVhZC1saWdodCB0aHtjb2xvcjojNDk1MDU3O2JhY2tncm91bmQtY29sb3I6I2U5ZWNlZjtib3JkZXItY29sb3I6I2RlZTJlNn0udGFibGUtZGFya3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzM0M2E0MH0udGFibGUtZGFyayB0ZCwudGFibGUtZGFyayB0aCwudGFibGUtZGFyayB0aGVhZCB0aHtib3JkZXItY29sb3I6IzQ1NGQ1NX0udGFibGUtZGFyay50YWJsZS1ib3JkZXJlZHtib3JkZXI6MH0udGFibGUtZGFyay50YWJsZS1zdHJpcGVkIHRib2R5IHRyOm50aC1vZi10eXBlKG9kZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4wNSl9LnRhYmxlLWRhcmsudGFibGUtaG92ZXIgdGJvZHkgdHI6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjA3NSl9QG1lZGlhIChtYXgtd2lkdGg6NTc1Ljk4cHgpey50YWJsZS1yZXNwb25zaXZlLXNte2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtvdmVyZmxvdy14OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnRhYmxlLXJlc3BvbnNpdmUtc20+LnRhYmxlLWJvcmRlcmVke2JvcmRlcjowfX1AbWVkaWEgKG1heC13aWR0aDo3NjcuOThweCl7LnRhYmxlLXJlc3BvbnNpdmUtbWR7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO292ZXJmbG93LXg6YXV0bzstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0udGFibGUtcmVzcG9uc2l2ZS1tZD4udGFibGUtYm9yZGVyZWR7Ym9yZGVyOjB9fUBtZWRpYSAobWF4LXdpZHRoOjk5MS45OHB4KXsudGFibGUtcmVzcG9uc2l2ZS1sZ3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7b3ZlcmZsb3cteDphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS50YWJsZS1yZXNwb25zaXZlLWxnPi50YWJsZS1ib3JkZXJlZHtib3JkZXI6MH19QG1lZGlhIChtYXgtd2lkdGg6MTE5OS45OHB4KXsudGFibGUtcmVzcG9uc2l2ZS14bHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7b3ZlcmZsb3cteDphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS50YWJsZS1yZXNwb25zaXZlLXhsPi50YWJsZS1ib3JkZXJlZHtib3JkZXI6MH19LnRhYmxlLXJlc3BvbnNpdmV7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO292ZXJmbG93LXg6YXV0bzstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWR7Ym9yZGVyOjB9LmZvcm0tY29udHJvbHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OmNhbGMoMS41ZW0gKyAuNzVyZW0gKyAycHgpO3BhZGRpbmc6LjM3NXJlbSAuNzVyZW07Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNTtjb2xvcjojNDk1MDU3O2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOjFweCBzb2xpZCAjY2VkNGRhO2JvcmRlci1yYWRpdXM6LjI1cmVtO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsYm94LXNoYWRvdyAuMTVzIGVhc2UtaW4tb3V0fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjpyZWR1Y2Upey5mb3JtLWNvbnRyb2x7dHJhbnNpdGlvbjpub25lfX0uZm9ybS1jb250cm9sOjotbXMtZXhwYW5ke2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjB9LmZvcm0tY29udHJvbDotbW96LWZvY3VzcmluZ3tjb2xvcjp0cmFuc3BhcmVudDt0ZXh0LXNoYWRvdzowIDAgMCAjNDk1MDU3fS5mb3JtLWNvbnRyb2w6Zm9jdXN7Y29sb3I6IzQ5NTA1NztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiM4MGJkZmY7b3V0bGluZTowO2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgwLDEyMywyNTUsLjI1KX0uZm9ybS1jb250cm9sOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM2Yzc1N2Q7b3BhY2l0eToxfS5mb3JtLWNvbnRyb2w6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6IzZjNzU3ZDtvcGFjaXR5OjF9LmZvcm0tY29udHJvbDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6IzZjNzU3ZDtvcGFjaXR5OjF9LmZvcm0tY29udHJvbDo6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM2Yzc1N2Q7b3BhY2l0eToxfS5mb3JtLWNvbnRyb2w6OnBsYWNlaG9sZGVye2NvbG9yOiM2Yzc1N2Q7b3BhY2l0eToxfS5mb3JtLWNvbnRyb2w6ZGlzYWJsZWQsLmZvcm0tY29udHJvbFtyZWFkb25seV17YmFja2dyb3VuZC1jb2xvcjojZTllY2VmO29wYWNpdHk6MX1pbnB1dFt0eXBlPWRhdGVdLmZvcm0tY29udHJvbCxpbnB1dFt0eXBlPWRhdGV0aW1lLWxvY2FsXS5mb3JtLWNvbnRyb2wsaW5wdXRbdHlwZT1tb250aF0uZm9ybS1jb250cm9sLGlucHV0W3R5cGU9dGltZV0uZm9ybS1jb250cm9sey13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lO2FwcGVhcmFuY2U6bm9uZX1zZWxlY3QuZm9ybS1jb250cm9sOmZvY3VzOjotbXMtdmFsdWV7Y29sb3I6IzQ5NTA1NztiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmZvcm0tY29udHJvbC1maWxlLC5mb3JtLWNvbnRyb2wtcmFuZ2V7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfS5jb2wtZm9ybS1sYWJlbHtwYWRkaW5nLXRvcDpjYWxjKC4zNzVyZW0gKyAxcHgpO3BhZGRpbmctYm90dG9tOmNhbGMoLjM3NXJlbSArIDFweCk7bWFyZ2luLWJvdHRvbTowO2ZvbnQtc2l6ZTppbmhlcml0O2xpbmUtaGVpZ2h0OjEuNX0uY29sLWZvcm0tbGFiZWwtbGd7cGFkZGluZy10b3A6Y2FsYyguNXJlbSArIDFweCk7cGFkZGluZy1ib3R0b206Y2FsYyguNXJlbSArIDFweCk7Zm9udC1zaXplOjEuMjVyZW07bGluZS1oZWlnaHQ6MS41fS5jb2wtZm9ybS1sYWJlbC1zbXtwYWRkaW5nLXRvcDpjYWxjKC4yNXJlbSArIDFweCk7cGFkZGluZy1ib3R0b206Y2FsYyguMjVyZW0gKyAxcHgpO2ZvbnQtc2l6ZTouODc1cmVtO2xpbmUtaGVpZ2h0OjEuNX0uZm9ybS1jb250cm9sLXBsYWludGV4dHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZzouMzc1cmVtIDA7bWFyZ2luLWJvdHRvbTowO2ZvbnQtc2l6ZToxcmVtO2xpbmUtaGVpZ2h0OjEuNTtjb2xvcjojMjEyNTI5O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOnNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci13aWR0aDoxcHggMH0uZm9ybS1jb250cm9sLXBsYWludGV4dC5mb3JtLWNvbnRyb2wtbGcsLmZvcm0tY29udHJvbC1wbGFpbnRleHQuZm9ybS1jb250cm9sLXNte3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MH0uZm9ybS1jb250cm9sLXNte2hlaWdodDpjYWxjKDEuNWVtICsgLjVyZW0gKyAycHgpO3BhZGRpbmc6LjI1cmVtIC41cmVtO2ZvbnQtc2l6ZTouODc1cmVtO2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOi4ycmVtfS5mb3JtLWNvbnRyb2wtbGd7aGVpZ2h0OmNhbGMoMS41ZW0gKyAxcmVtICsgMnB4KTtwYWRkaW5nOi41cmVtIDFyZW07Zm9udC1zaXplOjEuMjVyZW07bGluZS1oZWlnaHQ6MS41O2JvcmRlci1yYWRpdXM6LjNyZW19c2VsZWN0LmZvcm0tY29udHJvbFttdWx0aXBsZV0sc2VsZWN0LmZvcm0tY29udHJvbFtzaXplXXtoZWlnaHQ6YXV0b310ZXh0YXJlYS5mb3JtLWNvbnRyb2x7aGVpZ2h0OmF1dG99LmZvcm0tZ3JvdXB7bWFyZ2luLWJvdHRvbToxcmVtfS5mb3JtLXRleHR7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOi4yNXJlbX0uZm9ybS1yb3d7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LW1zLWZsZXgtd3JhcDp3cmFwO2ZsZXgtd3JhcDp3cmFwO21hcmdpbi1yaWdodDotNXB4O21hcmdpbi1sZWZ0Oi01cHh9LmZvcm0tcm93Pi5jb2wsLmZvcm0tcm93PltjbGFzcyo9Y29sLV17cGFkZGluZy1yaWdodDo1cHg7cGFkZGluZy1sZWZ0OjVweH0uZm9ybS1jaGVja3twb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmctbGVmdDoxLjI1cmVtfS5mb3JtLWNoZWNrLWlucHV0e3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbi10b3A6LjNyZW07bWFyZ2luLWxlZnQ6LTEuMjVyZW19LmZvcm0tY2hlY2staW5wdXQ6ZGlzYWJsZWR+LmZvcm0tY2hlY2stbGFiZWwsLmZvcm0tY2hlY2staW5wdXRbZGlzYWJsZWRdfi5mb3JtLWNoZWNrLWxhYmVse2NvbG9yOiM2Yzc1N2R9LmZvcm0tY2hlY2stbGFiZWx7bWFyZ2luLWJvdHRvbTowfS5mb3JtLWNoZWNrLWlubGluZXtkaXNwbGF5Oi1tcy1pbmxpbmUtZmxleGJveDtkaXNwbGF5OmlubGluZS1mbGV4Oy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7cGFkZGluZy1sZWZ0OjA7bWFyZ2luLXJpZ2h0Oi43NXJlbX0uZm9ybS1jaGVjay1pbmxpbmUgLmZvcm0tY2hlY2staW5wdXR7cG9zaXRpb246c3RhdGljO21hcmdpbi10b3A6MDttYXJnaW4tcmlnaHQ6LjMxMjVyZW07bWFyZ2luLWxlZnQ6MH0udmFsaWQtZmVlZGJhY2t7ZGlzcGxheTpub25lO3dpZHRoOjEwMCU7bWFyZ2luLXRvcDouMjVyZW07Zm9udC1zaXplOjgwJTtjb2xvcjojMjhhNzQ1fS52YWxpZC10b29sdGlwe3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMDAlO2xlZnQ6MDt6LWluZGV4OjU7ZGlzcGxheTpub25lO21heC13aWR0aDoxMDAlO3BhZGRpbmc6LjI1cmVtIC41cmVtO21hcmdpbi10b3A6LjFyZW07Zm9udC1zaXplOi44NzVyZW07bGluZS1oZWlnaHQ6MS41O2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDQwLDE2Nyw2OSwuOSk7Ym9yZGVyLXJhZGl1czouMjVyZW19LmlzLXZhbGlkfi52YWxpZC1mZWVkYmFjaywuaXMtdmFsaWR+LnZhbGlkLXRvb2x0aXAsLndhcy12YWxpZGF0ZWQgOnZhbGlkfi52YWxpZC1mZWVkYmFjaywud2FzLXZhbGlkYXRlZCA6dmFsaWR+LnZhbGlkLXRvb2x0aXB7ZGlzcGxheTpibG9ja30uZm9ybS1jb250cm9sLmlzLXZhbGlkLC53YXMtdmFsaWRhdGVkIC5mb3JtLWNvbnRyb2w6dmFsaWR7Ym9yZGVyLWNvbG9yOiMyOGE3NDU7cGFkZGluZy1yaWdodDpjYWxjKDEuNWVtICsgLjc1cmVtKTtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc4JyBoZWlnaHQ9JzgnIHZpZXdCb3g9JzAgMCA4IDgnJTNlJTNjcGF0aCBmaWxsPSclMjMyOGE3NDUnIGQ9J00yLjMgNi43M0wuNiA0LjUzYy0uNC0xLjA0LjQ2LTEuNCAxLjEtLjhsMS4xIDEuNCAzLjQtMy44Yy42LS42MyAxLjYtLjI3IDEuMi43bC00IDQuNmMtLjQzLjUtLjguNC0xLjEuMXonLyUzZSUzYy9zdmclM2UiKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpyaWdodCBjYWxjKC4zNzVlbSArIC4xODc1cmVtKSBjZW50ZXI7YmFja2dyb3VuZC1zaXplOmNhbGMoLjc1ZW0gKyAuMzc1cmVtKSBjYWxjKC43NWVtICsgLjM3NXJlbSl9LmZvcm0tY29udHJvbC5pcy12YWxpZDpmb2N1cywud2FzLXZhbGlkYXRlZCAuZm9ybS1jb250cm9sOnZhbGlkOmZvY3Vze2JvcmRlci1jb2xvcjojMjhhNzQ1O2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg0MCwxNjcsNjksLjI1KX0ud2FzLXZhbGlkYXRlZCB0ZXh0YXJlYS5mb3JtLWNvbnRyb2w6dmFsaWQsdGV4dGFyZWEuZm9ybS1jb250cm9sLmlzLXZhbGlke3BhZGRpbmctcmlnaHQ6Y2FsYygxLjVlbSArIC43NXJlbSk7YmFja2dyb3VuZC1wb3NpdGlvbjp0b3AgY2FsYyguMzc1ZW0gKyAuMTg3NXJlbSkgcmlnaHQgY2FsYyguMzc1ZW0gKyAuMTg3NXJlbSl9LmN1c3RvbS1zZWxlY3QuaXMtdmFsaWQsLndhcy12YWxpZGF0ZWQgLmN1c3RvbS1zZWxlY3Q6dmFsaWR7Ym9yZGVyLWNvbG9yOiMyOGE3NDU7cGFkZGluZy1yaWdodDpjYWxjKC43NWVtICsgMi4zMTI1cmVtKTtiYWNrZ3JvdW5kOnVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc0JyBoZWlnaHQ9JzUnIHZpZXdCb3g9JzAgMCA0IDUnJTNlJTNjcGF0aCBmaWxsPSclMjMzNDNhNDAnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLyUzZSUzYy9zdmclM2UiKSBuby1yZXBlYXQgcmlnaHQgLjc1cmVtIGNlbnRlci84cHggMTBweCx1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nOCcgaGVpZ2h0PSc4JyB2aWV3Qm94PScwIDAgOCA4JyUzZSUzY3BhdGggZmlsbD0nJTIzMjhhNzQ1JyBkPSdNMi4zIDYuNzNMLjYgNC41M2MtLjQtMS4wNC40Ni0xLjQgMS4xLS44bDEuMSAxLjQgMy40LTMuOGMuNi0uNjMgMS42LS4yNyAxLjIuN2wtNCA0LjZjLS40My41LS44LjQtMS4xLjF6Jy8lM2UlM2Mvc3ZnJTNlIikgI2ZmZiBuby1yZXBlYXQgY2VudGVyIHJpZ2h0IDEuNzVyZW0vY2FsYyguNzVlbSArIC4zNzVyZW0pIGNhbGMoLjc1ZW0gKyAuMzc1cmVtKX0uY3VzdG9tLXNlbGVjdC5pcy12YWxpZDpmb2N1cywud2FzLXZhbGlkYXRlZCAuY3VzdG9tLXNlbGVjdDp2YWxpZDpmb2N1c3tib3JkZXItY29sb3I6IzI4YTc0NTtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNDAsMTY3LDY5LC4yNSl9LmZvcm0tY2hlY2staW5wdXQuaXMtdmFsaWR+LmZvcm0tY2hlY2stbGFiZWwsLndhcy12YWxpZGF0ZWQgLmZvcm0tY2hlY2staW5wdXQ6dmFsaWR+LmZvcm0tY2hlY2stbGFiZWx7Y29sb3I6IzI4YTc0NX0uZm9ybS1jaGVjay1pbnB1dC5pcy12YWxpZH4udmFsaWQtZmVlZGJhY2ssLmZvcm0tY2hlY2staW5wdXQuaXMtdmFsaWR+LnZhbGlkLXRvb2x0aXAsLndhcy12YWxpZGF0ZWQgLmZvcm0tY2hlY2staW5wdXQ6dmFsaWR+LnZhbGlkLWZlZWRiYWNrLC53YXMtdmFsaWRhdGVkIC5mb3JtLWNoZWNrLWlucHV0OnZhbGlkfi52YWxpZC10b29sdGlwe2Rpc3BsYXk6YmxvY2t9LmN1c3RvbS1jb250cm9sLWlucHV0LmlzLXZhbGlkfi5jdXN0b20tY29udHJvbC1sYWJlbCwud2FzLXZhbGlkYXRlZCAuY3VzdG9tLWNvbnRyb2wtaW5wdXQ6dmFsaWR+LmN1c3RvbS1jb250cm9sLWxhYmVse2NvbG9yOiMyOGE3NDV9LmN1c3RvbS1jb250cm9sLWlucHV0LmlzLXZhbGlkfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3JlLC53YXMtdmFsaWRhdGVkIC5jdXN0b20tY29udHJvbC1pbnB1dDp2YWxpZH4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtib3JkZXItY29sb3I6IzI4YTc0NX0uY3VzdG9tLWNvbnRyb2wtaW5wdXQuaXMtdmFsaWQ6Y2hlY2tlZH4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZSwud2FzLXZhbGlkYXRlZCAuY3VzdG9tLWNvbnRyb2wtaW5wdXQ6dmFsaWQ6Y2hlY2tlZH4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtib3JkZXItY29sb3I6IzM0Y2U1NztiYWNrZ3JvdW5kLWNvbG9yOiMzNGNlNTd9LmN1c3RvbS1jb250cm9sLWlucHV0LmlzLXZhbGlkOmZvY3Vzfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3JlLC53YXMtdmFsaWRhdGVkIC5jdXN0b20tY29udHJvbC1pbnB1dDp2YWxpZDpmb2N1c34uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNDAsMTY3LDY5LC4yNSl9LmN1c3RvbS1jb250cm9sLWlucHV0LmlzLXZhbGlkOmZvY3VzOm5vdCg6Y2hlY2tlZCl+LmN1c3RvbS1jb250cm9sLWxhYmVsOjpiZWZvcmUsLndhcy12YWxpZGF0ZWQgLmN1c3RvbS1jb250cm9sLWlucHV0OnZhbGlkOmZvY3VzOm5vdCg6Y2hlY2tlZCl+LmN1c3RvbS1jb250cm9sLWxhYmVsOjpiZWZvcmV7Ym9yZGVyLWNvbG9yOiMyOGE3NDV9LmN1c3RvbS1maWxlLWlucHV0LmlzLXZhbGlkfi5jdXN0b20tZmlsZS1sYWJlbCwud2FzLXZhbGlkYXRlZCAuY3VzdG9tLWZpbGUtaW5wdXQ6dmFsaWR+LmN1c3RvbS1maWxlLWxhYmVse2JvcmRlci1jb2xvcjojMjhhNzQ1fS5jdXN0b20tZmlsZS1pbnB1dC5pcy12YWxpZDpmb2N1c34uY3VzdG9tLWZpbGUtbGFiZWwsLndhcy12YWxpZGF0ZWQgLmN1c3RvbS1maWxlLWlucHV0OnZhbGlkOmZvY3Vzfi5jdXN0b20tZmlsZS1sYWJlbHtib3JkZXItY29sb3I6IzI4YTc0NTtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNDAsMTY3LDY5LC4yNSl9LmludmFsaWQtZmVlZGJhY2t7ZGlzcGxheTpub25lO3dpZHRoOjEwMCU7bWFyZ2luLXRvcDouMjVyZW07Zm9udC1zaXplOjgwJTtjb2xvcjojZGMzNTQ1fS5pbnZhbGlkLXRvb2x0aXB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEwMCU7bGVmdDowO3otaW5kZXg6NTtkaXNwbGF5Om5vbmU7bWF4LXdpZHRoOjEwMCU7cGFkZGluZzouMjVyZW0gLjVyZW07bWFyZ2luLXRvcDouMXJlbTtmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjU7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjIwLDUzLDY5LC45KTtib3JkZXItcmFkaXVzOi4yNXJlbX0uaXMtaW52YWxpZH4uaW52YWxpZC1mZWVkYmFjaywuaXMtaW52YWxpZH4uaW52YWxpZC10b29sdGlwLC53YXMtdmFsaWRhdGVkIDppbnZhbGlkfi5pbnZhbGlkLWZlZWRiYWNrLC53YXMtdmFsaWRhdGVkIDppbnZhbGlkfi5pbnZhbGlkLXRvb2x0aXB7ZGlzcGxheTpibG9ja30uZm9ybS1jb250cm9sLmlzLWludmFsaWQsLndhcy12YWxpZGF0ZWQgLmZvcm0tY29udHJvbDppbnZhbGlke2JvcmRlci1jb2xvcjojZGMzNTQ1O3BhZGRpbmctcmlnaHQ6Y2FsYygxLjVlbSArIC43NXJlbSk7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTInIGhlaWdodD0nMTInIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzZGMzNTQ1JyB2aWV3Qm94PScwIDAgMTIgMTInJTNlJTNjY2lyY2xlIGN4PSc2JyBjeT0nNicgcj0nNC41Jy8lM2UlM2NwYXRoIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIGQ9J001LjggMy42aC40TDYgNi41eicvJTNlJTNjY2lyY2xlIGN4PSc2JyBjeT0nOC4yJyByPScuNicgZmlsbD0nJTIzZGMzNTQ1JyBzdHJva2U9J25vbmUnLyUzZSUzYy9zdmclM2UiKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpyaWdodCBjYWxjKC4zNzVlbSArIC4xODc1cmVtKSBjZW50ZXI7YmFja2dyb3VuZC1zaXplOmNhbGMoLjc1ZW0gKyAuMzc1cmVtKSBjYWxjKC43NWVtICsgLjM3NXJlbSl9LmZvcm0tY29udHJvbC5pcy1pbnZhbGlkOmZvY3VzLC53YXMtdmFsaWRhdGVkIC5mb3JtLWNvbnRyb2w6aW52YWxpZDpmb2N1c3tib3JkZXItY29sb3I6I2RjMzU0NTtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMjIwLDUzLDY5LC4yNSl9Lndhcy12YWxpZGF0ZWQgdGV4dGFyZWEuZm9ybS1jb250cm9sOmludmFsaWQsdGV4dGFyZWEuZm9ybS1jb250cm9sLmlzLWludmFsaWR7cGFkZGluZy1yaWdodDpjYWxjKDEuNWVtICsgLjc1cmVtKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOnRvcCBjYWxjKC4zNzVlbSArIC4xODc1cmVtKSByaWdodCBjYWxjKC4zNzVlbSArIC4xODc1cmVtKX0uY3VzdG9tLXNlbGVjdC5pcy1pbnZhbGlkLC53YXMtdmFsaWRhdGVkIC5jdXN0b20tc2VsZWN0OmludmFsaWR7Ym9yZGVyLWNvbG9yOiNkYzM1NDU7cGFkZGluZy1yaWdodDpjYWxjKC43NWVtICsgMi4zMTI1cmVtKTtiYWNrZ3JvdW5kOnVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc0JyBoZWlnaHQ9JzUnIHZpZXdCb3g9JzAgMCA0IDUnJTNlJTNjcGF0aCBmaWxsPSclMjMzNDNhNDAnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLyUzZSUzYy9zdmclM2UiKSBuby1yZXBlYXQgcmlnaHQgLjc1cmVtIGNlbnRlci84cHggMTBweCx1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTInIGhlaWdodD0nMTInIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzZGMzNTQ1JyB2aWV3Qm94PScwIDAgMTIgMTInJTNlJTNjY2lyY2xlIGN4PSc2JyBjeT0nNicgcj0nNC41Jy8lM2UlM2NwYXRoIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIGQ9J001LjggMy42aC40TDYgNi41eicvJTNlJTNjY2lyY2xlIGN4PSc2JyBjeT0nOC4yJyByPScuNicgZmlsbD0nJTIzZGMzNTQ1JyBzdHJva2U9J25vbmUnLyUzZSUzYy9zdmclM2UiKSAjZmZmIG5vLXJlcGVhdCBjZW50ZXIgcmlnaHQgMS43NXJlbS9jYWxjKC43NWVtICsgLjM3NXJlbSkgY2FsYyguNzVlbSArIC4zNzVyZW0pfS5jdXN0b20tc2VsZWN0LmlzLWludmFsaWQ6Zm9jdXMsLndhcy12YWxpZGF0ZWQgLmN1c3RvbS1zZWxlY3Q6aW52YWxpZDpmb2N1c3tib3JkZXItY29sb3I6I2RjMzU0NTtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMjIwLDUzLDY5LC4yNSl9LmZvcm0tY2hlY2staW5wdXQuaXMtaW52YWxpZH4uZm9ybS1jaGVjay1sYWJlbCwud2FzLXZhbGlkYXRlZCAuZm9ybS1jaGVjay1pbnB1dDppbnZhbGlkfi5mb3JtLWNoZWNrLWxhYmVse2NvbG9yOiNkYzM1NDV9LmZvcm0tY2hlY2staW5wdXQuaXMtaW52YWxpZH4uaW52YWxpZC1mZWVkYmFjaywuZm9ybS1jaGVjay1pbnB1dC5pcy1pbnZhbGlkfi5pbnZhbGlkLXRvb2x0aXAsLndhcy12YWxpZGF0ZWQgLmZvcm0tY2hlY2staW5wdXQ6aW52YWxpZH4uaW52YWxpZC1mZWVkYmFjaywud2FzLXZhbGlkYXRlZCAuZm9ybS1jaGVjay1pbnB1dDppbnZhbGlkfi5pbnZhbGlkLXRvb2x0aXB7ZGlzcGxheTpibG9ja30uY3VzdG9tLWNvbnRyb2wtaW5wdXQuaXMtaW52YWxpZH4uY3VzdG9tLWNvbnRyb2wtbGFiZWwsLndhcy12YWxpZGF0ZWQgLmN1c3RvbS1jb250cm9sLWlucHV0OmludmFsaWR+LmN1c3RvbS1jb250cm9sLWxhYmVse2NvbG9yOiNkYzM1NDV9LmN1c3RvbS1jb250cm9sLWlucHV0LmlzLWludmFsaWR+LmN1c3RvbS1jb250cm9sLWxhYmVsOjpiZWZvcmUsLndhcy12YWxpZGF0ZWQgLmN1c3RvbS1jb250cm9sLWlucHV0OmludmFsaWR+LmN1c3RvbS1jb250cm9sLWxhYmVsOjpiZWZvcmV7Ym9yZGVyLWNvbG9yOiNkYzM1NDV9LmN1c3RvbS1jb250cm9sLWlucHV0LmlzLWludmFsaWQ6Y2hlY2tlZH4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZSwud2FzLXZhbGlkYXRlZCAuY3VzdG9tLWNvbnRyb2wtaW5wdXQ6aW52YWxpZDpjaGVja2Vkfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3Jle2JvcmRlci1jb2xvcjojZTQ2MDZkO2JhY2tncm91bmQtY29sb3I6I2U0NjA2ZH0uY3VzdG9tLWNvbnRyb2wtaW5wdXQuaXMtaW52YWxpZDpmb2N1c34uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZSwud2FzLXZhbGlkYXRlZCAuY3VzdG9tLWNvbnRyb2wtaW5wdXQ6aW52YWxpZDpmb2N1c34uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMjIwLDUzLDY5LC4yNSl9LmN1c3RvbS1jb250cm9sLWlucHV0LmlzLWludmFsaWQ6Zm9jdXM6bm90KDpjaGVja2VkKX4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZSwud2FzLXZhbGlkYXRlZCAuY3VzdG9tLWNvbnRyb2wtaW5wdXQ6aW52YWxpZDpmb2N1czpub3QoOmNoZWNrZWQpfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3Jle2JvcmRlci1jb2xvcjojZGMzNTQ1fS5jdXN0b20tZmlsZS1pbnB1dC5pcy1pbnZhbGlkfi5jdXN0b20tZmlsZS1sYWJlbCwud2FzLXZhbGlkYXRlZCAuY3VzdG9tLWZpbGUtaW5wdXQ6aW52YWxpZH4uY3VzdG9tLWZpbGUtbGFiZWx7Ym9yZGVyLWNvbG9yOiNkYzM1NDV9LmN1c3RvbS1maWxlLWlucHV0LmlzLWludmFsaWQ6Zm9jdXN+LmN1c3RvbS1maWxlLWxhYmVsLC53YXMtdmFsaWRhdGVkIC5jdXN0b20tZmlsZS1pbnB1dDppbnZhbGlkOmZvY3Vzfi5jdXN0b20tZmlsZS1sYWJlbHtib3JkZXItY29sb3I6I2RjMzU0NTtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMjIwLDUzLDY5LC4yNSl9LmZvcm0taW5saW5le2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWZsb3c6cm93IHdyYXA7ZmxleC1mbG93OnJvdyB3cmFwOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LmZvcm0taW5saW5lIC5mb3JtLWNoZWNre3dpZHRoOjEwMCV9QG1lZGlhIChtaW4td2lkdGg6NTc2cHgpey5mb3JtLWlubGluZSBsYWJlbHtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLWJvdHRvbTowfS5mb3JtLWlubGluZSAuZm9ybS1ncm91cHtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleDowIDAgYXV0bztmbGV4OjAgMCBhdXRvOy1tcy1mbGV4LWZsb3c6cm93IHdyYXA7ZmxleC1mbG93OnJvdyB3cmFwOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbTowfS5mb3JtLWlubGluZSAuZm9ybS1jb250cm9se2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOmF1dG87dmVydGljYWwtYWxpZ246bWlkZGxlfS5mb3JtLWlubGluZSAuZm9ybS1jb250cm9sLXBsYWludGV4dHtkaXNwbGF5OmlubGluZS1ibG9ja30uZm9ybS1pbmxpbmUgLmN1c3RvbS1zZWxlY3QsLmZvcm0taW5saW5lIC5pbnB1dC1ncm91cHt3aWR0aDphdXRvfS5mb3JtLWlubGluZSAuZm9ybS1jaGVja3tkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6YXV0bztwYWRkaW5nLWxlZnQ6MH0uZm9ybS1pbmxpbmUgLmZvcm0tY2hlY2staW5wdXR7cG9zaXRpb246cmVsYXRpdmU7LW1zLWZsZXgtbmVnYXRpdmU6MDtmbGV4LXNocmluazowO21hcmdpbi10b3A6MDttYXJnaW4tcmlnaHQ6LjI1cmVtO21hcmdpbi1sZWZ0OjB9LmZvcm0taW5saW5lIC5jdXN0b20tY29udHJvbHstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmZvcm0taW5saW5lIC5jdXN0b20tY29udHJvbC1sYWJlbHttYXJnaW4tYm90dG9tOjB9fS5idG57ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiMyMTI1Mjk7dGV4dC1hbGlnbjpjZW50ZXI7dmVydGljYWwtYWxpZ246bWlkZGxlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7cGFkZGluZzouMzc1cmVtIC43NXJlbTtmb250LXNpemU6MXJlbTtsaW5lLWhlaWdodDoxLjU7Ym9yZGVyLXJhZGl1czouMjVyZW07dHJhbnNpdGlvbjpjb2xvciAuMTVzIGVhc2UtaW4tb3V0LGJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3JkZXItY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3gtc2hhZG93IC4xNXMgZWFzZS1pbi1vdXR9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOnJlZHVjZSl7LmJ0bnt0cmFuc2l0aW9uOm5vbmV9fS5idG46aG92ZXJ7Y29sb3I6IzIxMjUyOTt0ZXh0LWRlY29yYXRpb246bm9uZX0uYnRuLmZvY3VzLC5idG46Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgwLDEyMywyNTUsLjI1KX0uYnRuLmRpc2FibGVkLC5idG46ZGlzYWJsZWR7b3BhY2l0eTouNjV9LmJ0bjpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKXtjdXJzb3I6cG9pbnRlcn1hLmJ0bi5kaXNhYmxlZCxmaWVsZHNldDpkaXNhYmxlZCBhLmJ0bntwb2ludGVyLWV2ZW50czpub25lfS5idG4tcHJpbWFyeXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzAwN2JmZjtib3JkZXItY29sb3I6IzAwN2JmZn0uYnRuLXByaW1hcnk6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDY5ZDk7Ym9yZGVyLWNvbG9yOiMwMDYyY2N9LmJ0bi1wcmltYXJ5LmZvY3VzLC5idG4tcHJpbWFyeTpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzAwNjlkOTtib3JkZXItY29sb3I6IzAwNjJjYztib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMzgsMTQzLDI1NSwuNSl9LmJ0bi1wcmltYXJ5LmRpc2FibGVkLC5idG4tcHJpbWFyeTpkaXNhYmxlZHtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzAwN2JmZjtib3JkZXItY29sb3I6IzAwN2JmZn0uYnRuLXByaW1hcnk6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlLC5idG4tcHJpbWFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmUsLnNob3c+LmJ0bi1wcmltYXJ5LmRyb3Bkb3duLXRvZ2dsZXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzAwNjJjYztib3JkZXItY29sb3I6IzAwNWNiZn0uYnRuLXByaW1hcnk6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlOmZvY3VzLC5idG4tcHJpbWFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmU6Zm9jdXMsLnNob3c+LmJ0bi1wcmltYXJ5LmRyb3Bkb3duLXRvZ2dsZTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMzgsMTQzLDI1NSwuNSl9LmJ0bi1zZWNvbmRhcnl7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM2Yzc1N2Q7Ym9yZGVyLWNvbG9yOiM2Yzc1N2R9LmJ0bi1zZWNvbmRhcnk6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM1YTYyNjg7Ym9yZGVyLWNvbG9yOiM1NDViNjJ9LmJ0bi1zZWNvbmRhcnkuZm9jdXMsLmJ0bi1zZWNvbmRhcnk6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM1YTYyNjg7Ym9yZGVyLWNvbG9yOiM1NDViNjI7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDEzMCwxMzgsMTQ1LC41KX0uYnRuLXNlY29uZGFyeS5kaXNhYmxlZCwuYnRuLXNlY29uZGFyeTpkaXNhYmxlZHtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzZjNzU3ZDtib3JkZXItY29sb3I6IzZjNzU3ZH0uYnRuLXNlY29uZGFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmUsLmJ0bi1zZWNvbmRhcnk6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlLC5zaG93Pi5idG4tc2Vjb25kYXJ5LmRyb3Bkb3duLXRvZ2dsZXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzU0NWI2Mjtib3JkZXItY29sb3I6IzRlNTU1Yn0uYnRuLXNlY29uZGFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmU6Zm9jdXMsLmJ0bi1zZWNvbmRhcnk6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlOmZvY3VzLC5zaG93Pi5idG4tc2Vjb25kYXJ5LmRyb3Bkb3duLXRvZ2dsZTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMTMwLDEzOCwxNDUsLjUpfS5idG4tc3VjY2Vzc3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzI4YTc0NTtib3JkZXItY29sb3I6IzI4YTc0NX0uYnRuLXN1Y2Nlc3M6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMyMTg4Mzg7Ym9yZGVyLWNvbG9yOiMxZTdlMzR9LmJ0bi1zdWNjZXNzLmZvY3VzLC5idG4tc3VjY2Vzczpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzIxODgzODtib3JkZXItY29sb3I6IzFlN2UzNDtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNzIsMTgwLDk3LC41KX0uYnRuLXN1Y2Nlc3MuZGlzYWJsZWQsLmJ0bi1zdWNjZXNzOmRpc2FibGVke2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMjhhNzQ1O2JvcmRlci1jb2xvcjojMjhhNzQ1fS5idG4tc3VjY2Vzczpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmUsLmJ0bi1zdWNjZXNzOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpOmFjdGl2ZSwuc2hvdz4uYnRuLXN1Y2Nlc3MuZHJvcGRvd24tdG9nZ2xle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMWU3ZTM0O2JvcmRlci1jb2xvcjojMWM3NDMwfS5idG4tc3VjY2Vzczpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmU6Zm9jdXMsLmJ0bi1zdWNjZXNzOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpOmFjdGl2ZTpmb2N1cywuc2hvdz4uYnRuLXN1Y2Nlc3MuZHJvcGRvd24tdG9nZ2xlOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg3MiwxODAsOTcsLjUpfS5idG4taW5mb3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzE3YTJiODtib3JkZXItY29sb3I6IzE3YTJiOH0uYnRuLWluZm86aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMxMzg0OTY7Ym9yZGVyLWNvbG9yOiMxMTdhOGJ9LmJ0bi1pbmZvLmZvY3VzLC5idG4taW5mbzpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzEzODQ5Njtib3JkZXItY29sb3I6IzExN2E4Yjtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNTgsMTc2LDE5NSwuNSl9LmJ0bi1pbmZvLmRpc2FibGVkLC5idG4taW5mbzpkaXNhYmxlZHtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzE3YTJiODtib3JkZXItY29sb3I6IzE3YTJiOH0uYnRuLWluZm86bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlLC5idG4taW5mbzpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmUsLnNob3c+LmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzExN2E4Yjtib3JkZXItY29sb3I6IzEwNzA3Zn0uYnRuLWluZm86bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlOmZvY3VzLC5idG4taW5mbzpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmU6Zm9jdXMsLnNob3c+LmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNTgsMTc2LDE5NSwuNSl9LmJ0bi13YXJuaW5ne2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZmZjMTA3O2JvcmRlci1jb2xvcjojZmZjMTA3fS5idG4td2FybmluZzpob3Zlcntjb2xvcjojMjEyNTI5O2JhY2tncm91bmQtY29sb3I6I2UwYTgwMDtib3JkZXItY29sb3I6I2QzOWUwMH0uYnRuLXdhcm5pbmcuZm9jdXMsLmJ0bi13YXJuaW5nOmZvY3Vze2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZTBhODAwO2JvcmRlci1jb2xvcjojZDM5ZTAwO2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgyMjIsMTcwLDEyLC41KX0uYnRuLXdhcm5pbmcuZGlzYWJsZWQsLmJ0bi13YXJuaW5nOmRpc2FibGVke2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZmZjMTA3O2JvcmRlci1jb2xvcjojZmZjMTA3fS5idG4td2FybmluZzpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmUsLmJ0bi13YXJuaW5nOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpOmFjdGl2ZSwuc2hvdz4uYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xle2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZDM5ZTAwO2JvcmRlci1jb2xvcjojYzY5NTAwfS5idG4td2FybmluZzpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmU6Zm9jdXMsLmJ0bi13YXJuaW5nOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpOmFjdGl2ZTpmb2N1cywuc2hvdz4uYnRuLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgyMjIsMTcwLDEyLC41KX0uYnRuLWRhbmdlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2RjMzU0NTtib3JkZXItY29sb3I6I2RjMzU0NX0uYnRuLWRhbmdlcjpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2M4MjMzMztib3JkZXItY29sb3I6I2JkMjEzMH0uYnRuLWRhbmdlci5mb2N1cywuYnRuLWRhbmdlcjpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2M4MjMzMztib3JkZXItY29sb3I6I2JkMjEzMDtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMjI1LDgzLDk3LC41KX0uYnRuLWRhbmdlci5kaXNhYmxlZCwuYnRuLWRhbmdlcjpkaXNhYmxlZHtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2RjMzU0NTtib3JkZXItY29sb3I6I2RjMzU0NX0uYnRuLWRhbmdlcjpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmUsLmJ0bi1kYW5nZXI6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlLC5zaG93Pi5idG4tZGFuZ2VyLmRyb3Bkb3duLXRvZ2dsZXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2JkMjEzMDtib3JkZXItY29sb3I6I2IyMWYyZH0uYnRuLWRhbmdlcjpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmU6Zm9jdXMsLmJ0bi1kYW5nZXI6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlOmZvY3VzLC5zaG93Pi5idG4tZGFuZ2VyLmRyb3Bkb3duLXRvZ2dsZTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMjI1LDgzLDk3LC41KX0uYnRuLWxpZ2h0e2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZjhmOWZhO2JvcmRlci1jb2xvcjojZjhmOWZhfS5idG4tbGlnaHQ6aG92ZXJ7Y29sb3I6IzIxMjUyOTtiYWNrZ3JvdW5kLWNvbG9yOiNlMmU2ZWE7Ym9yZGVyLWNvbG9yOiNkYWUwZTV9LmJ0bi1saWdodC5mb2N1cywuYnRuLWxpZ2h0OmZvY3Vze2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZTJlNmVhO2JvcmRlci1jb2xvcjojZGFlMGU1O2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgyMTYsMjE3LDIxOSwuNSl9LmJ0bi1saWdodC5kaXNhYmxlZCwuYnRuLWxpZ2h0OmRpc2FibGVke2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZjhmOWZhO2JvcmRlci1jb2xvcjojZjhmOWZhfS5idG4tbGlnaHQ6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlLC5idG4tbGlnaHQ6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlLC5zaG93Pi5idG4tbGlnaHQuZHJvcGRvd24tdG9nZ2xle2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZGFlMGU1O2JvcmRlci1jb2xvcjojZDNkOWRmfS5idG4tbGlnaHQ6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlOmZvY3VzLC5idG4tbGlnaHQ6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlOmZvY3VzLC5zaG93Pi5idG4tbGlnaHQuZHJvcGRvd24tdG9nZ2xlOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgyMTYsMjE3LDIxOSwuNSl9LmJ0bi1kYXJre2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzQzYTQwO2JvcmRlci1jb2xvcjojMzQzYTQwfS5idG4tZGFyazpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzIzMjcyYjtib3JkZXItY29sb3I6IzFkMjEyNH0uYnRuLWRhcmsuZm9jdXMsLmJ0bi1kYXJrOmZvY3Vze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMjMyNzJiO2JvcmRlci1jb2xvcjojMWQyMTI0O2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg4Miw4OCw5MywuNSl9LmJ0bi1kYXJrLmRpc2FibGVkLC5idG4tZGFyazpkaXNhYmxlZHtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzM0M2E0MDtib3JkZXItY29sb3I6IzM0M2E0MH0uYnRuLWRhcms6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlLC5idG4tZGFyazpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmUsLnNob3c+LmJ0bi1kYXJrLmRyb3Bkb3duLXRvZ2dsZXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzFkMjEyNDtib3JkZXItY29sb3I6IzE3MWExZH0uYnRuLWRhcms6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlOmZvY3VzLC5idG4tZGFyazpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmU6Zm9jdXMsLnNob3c+LmJ0bi1kYXJrLmRyb3Bkb3duLXRvZ2dsZTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoODIsODgsOTMsLjUpfS5idG4tb3V0bGluZS1wcmltYXJ5e2NvbG9yOiMwMDdiZmY7Ym9yZGVyLWNvbG9yOiMwMDdiZmZ9LmJ0bi1vdXRsaW5lLXByaW1hcnk6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDdiZmY7Ym9yZGVyLWNvbG9yOiMwMDdiZmZ9LmJ0bi1vdXRsaW5lLXByaW1hcnkuZm9jdXMsLmJ0bi1vdXRsaW5lLXByaW1hcnk6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDAsMTIzLDI1NSwuNSl9LmJ0bi1vdXRsaW5lLXByaW1hcnkuZGlzYWJsZWQsLmJ0bi1vdXRsaW5lLXByaW1hcnk6ZGlzYWJsZWR7Y29sb3I6IzAwN2JmZjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5idG4tb3V0bGluZS1wcmltYXJ5Om5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpLmFjdGl2ZSwuYnRuLW91dGxpbmUtcHJpbWFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmUsLnNob3c+LmJ0bi1vdXRsaW5lLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDA3YmZmO2JvcmRlci1jb2xvcjojMDA3YmZmfS5idG4tb3V0bGluZS1wcmltYXJ5Om5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpLmFjdGl2ZTpmb2N1cywuYnRuLW91dGxpbmUtcHJpbWFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmU6Zm9jdXMsLnNob3c+LmJ0bi1vdXRsaW5lLXByaW1hcnkuZHJvcGRvd24tdG9nZ2xlOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgwLDEyMywyNTUsLjUpfS5idG4tb3V0bGluZS1zZWNvbmRhcnl7Y29sb3I6IzZjNzU3ZDtib3JkZXItY29sb3I6IzZjNzU3ZH0uYnRuLW91dGxpbmUtc2Vjb25kYXJ5OmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNmM3NTdkO2JvcmRlci1jb2xvcjojNmM3NTdkfS5idG4tb3V0bGluZS1zZWNvbmRhcnkuZm9jdXMsLmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMTA4LDExNywxMjUsLjUpfS5idG4tb3V0bGluZS1zZWNvbmRhcnkuZGlzYWJsZWQsLmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpkaXNhYmxlZHtjb2xvcjojNmM3NTdkO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmUsLmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmUsLnNob3c+LmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5kcm9wZG93bi10b2dnbGV7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM2Yzc1N2Q7Ym9yZGVyLWNvbG9yOiM2Yzc1N2R9LmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmU6Zm9jdXMsLmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmU6Zm9jdXMsLnNob3c+LmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5kcm9wZG93bi10b2dnbGU6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDEwOCwxMTcsMTI1LC41KX0uYnRuLW91dGxpbmUtc3VjY2Vzc3tjb2xvcjojMjhhNzQ1O2JvcmRlci1jb2xvcjojMjhhNzQ1fS5idG4tb3V0bGluZS1zdWNjZXNzOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMjhhNzQ1O2JvcmRlci1jb2xvcjojMjhhNzQ1fS5idG4tb3V0bGluZS1zdWNjZXNzLmZvY3VzLC5idG4tb3V0bGluZS1zdWNjZXNzOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg0MCwxNjcsNjksLjUpfS5idG4tb3V0bGluZS1zdWNjZXNzLmRpc2FibGVkLC5idG4tb3V0bGluZS1zdWNjZXNzOmRpc2FibGVke2NvbG9yOiMyOGE3NDU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uYnRuLW91dGxpbmUtc3VjY2Vzczpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmUsLmJ0bi1vdXRsaW5lLXN1Y2Nlc3M6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlLC5zaG93Pi5idG4tb3V0bGluZS1zdWNjZXNzLmRyb3Bkb3duLXRvZ2dsZXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzI4YTc0NTtib3JkZXItY29sb3I6IzI4YTc0NX0uYnRuLW91dGxpbmUtc3VjY2Vzczpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKS5hY3RpdmU6Zm9jdXMsLmJ0bi1vdXRsaW5lLXN1Y2Nlc3M6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlOmZvY3VzLC5zaG93Pi5idG4tb3V0bGluZS1zdWNjZXNzLmRyb3Bkb3duLXRvZ2dsZTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNDAsMTY3LDY5LC41KX0uYnRuLW91dGxpbmUtaW5mb3tjb2xvcjojMTdhMmI4O2JvcmRlci1jb2xvcjojMTdhMmI4fS5idG4tb3V0bGluZS1pbmZvOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMTdhMmI4O2JvcmRlci1jb2xvcjojMTdhMmI4fS5idG4tb3V0bGluZS1pbmZvLmZvY3VzLC5idG4tb3V0bGluZS1pbmZvOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgyMywxNjIsMTg0LC41KX0uYnRuLW91dGxpbmUtaW5mby5kaXNhYmxlZCwuYnRuLW91dGxpbmUtaW5mbzpkaXNhYmxlZHtjb2xvcjojMTdhMmI4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmJ0bi1vdXRsaW5lLWluZm86bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlLC5idG4tb3V0bGluZS1pbmZvOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpOmFjdGl2ZSwuc2hvdz4uYnRuLW91dGxpbmUtaW5mby5kcm9wZG93bi10b2dnbGV7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMxN2EyYjg7Ym9yZGVyLWNvbG9yOiMxN2EyYjh9LmJ0bi1vdXRsaW5lLWluZm86bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlOmZvY3VzLC5idG4tb3V0bGluZS1pbmZvOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpOmFjdGl2ZTpmb2N1cywuc2hvdz4uYnRuLW91dGxpbmUtaW5mby5kcm9wZG93bi10b2dnbGU6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDIzLDE2MiwxODQsLjUpfS5idG4tb3V0bGluZS13YXJuaW5ne2NvbG9yOiNmZmMxMDc7Ym9yZGVyLWNvbG9yOiNmZmMxMDd9LmJ0bi1vdXRsaW5lLXdhcm5pbmc6aG92ZXJ7Y29sb3I6IzIxMjUyOTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmMxMDc7Ym9yZGVyLWNvbG9yOiNmZmMxMDd9LmJ0bi1vdXRsaW5lLXdhcm5pbmcuZm9jdXMsLmJ0bi1vdXRsaW5lLXdhcm5pbmc6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDI1NSwxOTMsNywuNSl9LmJ0bi1vdXRsaW5lLXdhcm5pbmcuZGlzYWJsZWQsLmJ0bi1vdXRsaW5lLXdhcm5pbmc6ZGlzYWJsZWR7Y29sb3I6I2ZmYzEwNztiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5idG4tb3V0bGluZS13YXJuaW5nOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpLmFjdGl2ZSwuYnRuLW91dGxpbmUtd2FybmluZzpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmUsLnNob3c+LmJ0bi1vdXRsaW5lLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xle2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZmZjMTA3O2JvcmRlci1jb2xvcjojZmZjMTA3fS5idG4tb3V0bGluZS13YXJuaW5nOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpLmFjdGl2ZTpmb2N1cywuYnRuLW91dGxpbmUtd2FybmluZzpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmU6Zm9jdXMsLnNob3c+LmJ0bi1vdXRsaW5lLXdhcm5pbmcuZHJvcGRvd24tdG9nZ2xlOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgyNTUsMTkzLDcsLjUpfS5idG4tb3V0bGluZS1kYW5nZXJ7Y29sb3I6I2RjMzU0NTtib3JkZXItY29sb3I6I2RjMzU0NX0uYnRuLW91dGxpbmUtZGFuZ2VyOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojZGMzNTQ1O2JvcmRlci1jb2xvcjojZGMzNTQ1fS5idG4tb3V0bGluZS1kYW5nZXIuZm9jdXMsLmJ0bi1vdXRsaW5lLWRhbmdlcjpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMjIwLDUzLDY5LC41KX0uYnRuLW91dGxpbmUtZGFuZ2VyLmRpc2FibGVkLC5idG4tb3V0bGluZS1kYW5nZXI6ZGlzYWJsZWR7Y29sb3I6I2RjMzU0NTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5idG4tb3V0bGluZS1kYW5nZXI6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlLC5idG4tb3V0bGluZS1kYW5nZXI6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlLC5zaG93Pi5idG4tb3V0bGluZS1kYW5nZXIuZHJvcGRvd24tdG9nZ2xle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojZGMzNTQ1O2JvcmRlci1jb2xvcjojZGMzNTQ1fS5idG4tb3V0bGluZS1kYW5nZXI6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCkuYWN0aXZlOmZvY3VzLC5idG4tb3V0bGluZS1kYW5nZXI6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlOmZvY3VzLC5zaG93Pi5idG4tb3V0bGluZS1kYW5nZXIuZHJvcGRvd24tdG9nZ2xlOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgyMjAsNTMsNjksLjUpfS5idG4tb3V0bGluZS1saWdodHtjb2xvcjojZjhmOWZhO2JvcmRlci1jb2xvcjojZjhmOWZhfS5idG4tb3V0bGluZS1saWdodDpob3Zlcntjb2xvcjojMjEyNTI5O2JhY2tncm91bmQtY29sb3I6I2Y4ZjlmYTtib3JkZXItY29sb3I6I2Y4ZjlmYX0uYnRuLW91dGxpbmUtbGlnaHQuZm9jdXMsLmJ0bi1vdXRsaW5lLWxpZ2h0OmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgyNDgsMjQ5LDI1MCwuNSl9LmJ0bi1vdXRsaW5lLWxpZ2h0LmRpc2FibGVkLC5idG4tb3V0bGluZS1saWdodDpkaXNhYmxlZHtjb2xvcjojZjhmOWZhO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmJ0bi1vdXRsaW5lLWxpZ2h0Om5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpLmFjdGl2ZSwuYnRuLW91dGxpbmUtbGlnaHQ6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlLC5zaG93Pi5idG4tb3V0bGluZS1saWdodC5kcm9wZG93bi10b2dnbGV7Y29sb3I6IzIxMjUyOTtiYWNrZ3JvdW5kLWNvbG9yOiNmOGY5ZmE7Ym9yZGVyLWNvbG9yOiNmOGY5ZmF9LmJ0bi1vdXRsaW5lLWxpZ2h0Om5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpLmFjdGl2ZTpmb2N1cywuYnRuLW91dGxpbmUtbGlnaHQ6bm90KDpkaXNhYmxlZCk6bm90KC5kaXNhYmxlZCk6YWN0aXZlOmZvY3VzLC5zaG93Pi5idG4tb3V0bGluZS1saWdodC5kcm9wZG93bi10b2dnbGU6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDI0OCwyNDksMjUwLC41KX0uYnRuLW91dGxpbmUtZGFya3tjb2xvcjojMzQzYTQwO2JvcmRlci1jb2xvcjojMzQzYTQwfS5idG4tb3V0bGluZS1kYXJrOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzQzYTQwO2JvcmRlci1jb2xvcjojMzQzYTQwfS5idG4tb3V0bGluZS1kYXJrLmZvY3VzLC5idG4tb3V0bGluZS1kYXJrOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg1Miw1OCw2NCwuNSl9LmJ0bi1vdXRsaW5lLWRhcmsuZGlzYWJsZWQsLmJ0bi1vdXRsaW5lLWRhcms6ZGlzYWJsZWR7Y29sb3I6IzM0M2E0MDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5idG4tb3V0bGluZS1kYXJrOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpLmFjdGl2ZSwuYnRuLW91dGxpbmUtZGFyazpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmUsLnNob3c+LmJ0bi1vdXRsaW5lLWRhcmsuZHJvcGRvd24tdG9nZ2xle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzQzYTQwO2JvcmRlci1jb2xvcjojMzQzYTQwfS5idG4tb3V0bGluZS1kYXJrOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpLmFjdGl2ZTpmb2N1cywuYnRuLW91dGxpbmUtZGFyazpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTphY3RpdmU6Zm9jdXMsLnNob3c+LmJ0bi1vdXRsaW5lLWRhcmsuZHJvcGRvd24tdG9nZ2xlOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg1Miw1OCw2NCwuNSl9LmJ0bi1saW5re2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojMDA3YmZmO3RleHQtZGVjb3JhdGlvbjpub25lfS5idG4tbGluazpob3Zlcntjb2xvcjojMDA1NmIzO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9LmJ0bi1saW5rLmZvY3VzLC5idG4tbGluazpmb2N1c3t0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5idG4tbGluay5kaXNhYmxlZCwuYnRuLWxpbms6ZGlzYWJsZWR7Y29sb3I6IzZjNzU3ZDtwb2ludGVyLWV2ZW50czpub25lfS5idG4tZ3JvdXAtbGc+LmJ0biwuYnRuLWxne3BhZGRpbmc6LjVyZW0gMXJlbTtmb250LXNpemU6MS4yNXJlbTtsaW5lLWhlaWdodDoxLjU7Ym9yZGVyLXJhZGl1czouM3JlbX0uYnRuLWdyb3VwLXNtPi5idG4sLmJ0bi1zbXtwYWRkaW5nOi4yNXJlbSAuNXJlbTtmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjU7Ym9yZGVyLXJhZGl1czouMnJlbX0uYnRuLWJsb2Nre2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJX0uYnRuLWJsb2NrKy5idG4tYmxvY2t7bWFyZ2luLXRvcDouNXJlbX1pbnB1dFt0eXBlPWJ1dHRvbl0uYnRuLWJsb2NrLGlucHV0W3R5cGU9cmVzZXRdLmJ0bi1ibG9jayxpbnB1dFt0eXBlPXN1Ym1pdF0uYnRuLWJsb2Nre3dpZHRoOjEwMCV9LmZhZGV7dHJhbnNpdGlvbjpvcGFjaXR5IC4xNXMgbGluZWFyfUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjpyZWR1Y2Upey5mYWRle3RyYW5zaXRpb246bm9uZX19LmZhZGU6bm90KC5zaG93KXtvcGFjaXR5OjB9LmNvbGxhcHNlOm5vdCguc2hvdyl7ZGlzcGxheTpub25lfS5jb2xsYXBzaW5ne3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDowO292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOmhlaWdodCAuMzVzIGVhc2V9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOnJlZHVjZSl7LmNvbGxhcHNpbmd7dHJhbnNpdGlvbjpub25lfX0uZHJvcGRvd24sLmRyb3BsZWZ0LC5kcm9wcmlnaHQsLmRyb3B1cHtwb3NpdGlvbjpyZWxhdGl2ZX0uZHJvcGRvd24tdG9nZ2xle3doaXRlLXNwYWNlOm5vd3JhcH0uZHJvcGRvd24tdG9nZ2xlOjphZnRlcntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDouMjU1ZW07dmVydGljYWwtYWxpZ246LjI1NWVtO2NvbnRlbnQ6IiI7Ym9yZGVyLXRvcDouM2VtIHNvbGlkO2JvcmRlci1yaWdodDouM2VtIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MDtib3JkZXItbGVmdDouM2VtIHNvbGlkIHRyYW5zcGFyZW50fS5kcm9wZG93bi10b2dnbGU6ZW1wdHk6OmFmdGVye21hcmdpbi1sZWZ0OjB9LmRyb3Bkb3duLW1lbnV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEwMCU7bGVmdDowO3otaW5kZXg6MTAwMDtkaXNwbGF5Om5vbmU7ZmxvYXQ6bGVmdDttaW4td2lkdGg6MTByZW07cGFkZGluZzouNXJlbSAwO21hcmdpbjouMTI1cmVtIDAgMDtmb250LXNpemU6MXJlbTtjb2xvcjojMjEyNTI5O3RleHQtYWxpZ246bGVmdDtsaXN0LXN0eWxlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjE1KTtib3JkZXItcmFkaXVzOi4yNXJlbX0uZHJvcGRvd24tbWVudS1sZWZ0e3JpZ2h0OmF1dG87bGVmdDowfS5kcm9wZG93bi1tZW51LXJpZ2h0e3JpZ2h0OjA7bGVmdDphdXRvfUBtZWRpYSAobWluLXdpZHRoOjU3NnB4KXsuZHJvcGRvd24tbWVudS1zbS1sZWZ0e3JpZ2h0OmF1dG87bGVmdDowfS5kcm9wZG93bi1tZW51LXNtLXJpZ2h0e3JpZ2h0OjA7bGVmdDphdXRvfX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmRyb3Bkb3duLW1lbnUtbWQtbGVmdHtyaWdodDphdXRvO2xlZnQ6MH0uZHJvcGRvd24tbWVudS1tZC1yaWdodHtyaWdodDowO2xlZnQ6YXV0b319QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5kcm9wZG93bi1tZW51LWxnLWxlZnR7cmlnaHQ6YXV0bztsZWZ0OjB9LmRyb3Bkb3duLW1lbnUtbGctcmlnaHR7cmlnaHQ6MDtsZWZ0OmF1dG99fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LmRyb3Bkb3duLW1lbnUteGwtbGVmdHtyaWdodDphdXRvO2xlZnQ6MH0uZHJvcGRvd24tbWVudS14bC1yaWdodHtyaWdodDowO2xlZnQ6YXV0b319LmRyb3B1cCAuZHJvcGRvd24tbWVudXt0b3A6YXV0bztib3R0b206MTAwJTttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTouMTI1cmVtfS5kcm9wdXAgLmRyb3Bkb3duLXRvZ2dsZTo6YWZ0ZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWxlZnQ6LjI1NWVtO3ZlcnRpY2FsLWFsaWduOi4yNTVlbTtjb250ZW50OiIiO2JvcmRlci10b3A6MDtib3JkZXItcmlnaHQ6LjNlbSBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOi4zZW0gc29saWQ7Ym9yZGVyLWxlZnQ6LjNlbSBzb2xpZCB0cmFuc3BhcmVudH0uZHJvcHVwIC5kcm9wZG93bi10b2dnbGU6ZW1wdHk6OmFmdGVye21hcmdpbi1sZWZ0OjB9LmRyb3ByaWdodCAuZHJvcGRvd24tbWVudXt0b3A6MDtyaWdodDphdXRvO2xlZnQ6MTAwJTttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6LjEyNXJlbX0uZHJvcHJpZ2h0IC5kcm9wZG93bi10b2dnbGU6OmFmdGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0Oi4yNTVlbTt2ZXJ0aWNhbC1hbGlnbjouMjU1ZW07Y29udGVudDoiIjtib3JkZXItdG9wOi4zZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OjA7Ym9yZGVyLWJvdHRvbTouM2VtIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1sZWZ0Oi4zZW0gc29saWR9LmRyb3ByaWdodCAuZHJvcGRvd24tdG9nZ2xlOmVtcHR5OjphZnRlcnttYXJnaW4tbGVmdDowfS5kcm9wcmlnaHQgLmRyb3Bkb3duLXRvZ2dsZTo6YWZ0ZXJ7dmVydGljYWwtYWxpZ246MH0uZHJvcGxlZnQgLmRyb3Bkb3duLW1lbnV7dG9wOjA7cmlnaHQ6MTAwJTtsZWZ0OmF1dG87bWFyZ2luLXRvcDowO21hcmdpbi1yaWdodDouMTI1cmVtfS5kcm9wbGVmdCAuZHJvcGRvd24tdG9nZ2xlOjphZnRlcntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDouMjU1ZW07dmVydGljYWwtYWxpZ246LjI1NWVtO2NvbnRlbnQ6IiJ9LmRyb3BsZWZ0IC5kcm9wZG93bi10b2dnbGU6OmFmdGVye2Rpc3BsYXk6bm9uZX0uZHJvcGxlZnQgLmRyb3Bkb3duLXRvZ2dsZTo6YmVmb3Jle2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDouMjU1ZW07dmVydGljYWwtYWxpZ246LjI1NWVtO2NvbnRlbnQ6IiI7Ym9yZGVyLXRvcDouM2VtIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDouM2VtIHNvbGlkO2JvcmRlci1ib3R0b206LjNlbSBzb2xpZCB0cmFuc3BhcmVudH0uZHJvcGxlZnQgLmRyb3Bkb3duLXRvZ2dsZTplbXB0eTo6YWZ0ZXJ7bWFyZ2luLWxlZnQ6MH0uZHJvcGxlZnQgLmRyb3Bkb3duLXRvZ2dsZTo6YmVmb3Jle3ZlcnRpY2FsLWFsaWduOjB9LmRyb3Bkb3duLW1lbnVbeC1wbGFjZW1lbnRePWJvdHRvbV0sLmRyb3Bkb3duLW1lbnVbeC1wbGFjZW1lbnRePWxlZnRdLC5kcm9wZG93bi1tZW51W3gtcGxhY2VtZW50Xj1yaWdodF0sLmRyb3Bkb3duLW1lbnVbeC1wbGFjZW1lbnRePXRvcF17cmlnaHQ6YXV0bztib3R0b206YXV0b30uZHJvcGRvd24tZGl2aWRlcntoZWlnaHQ6MDttYXJnaW46LjVyZW0gMDtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLXRvcDoxcHggc29saWQgI2U5ZWNlZn0uZHJvcGRvd24taXRlbXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZzouMjVyZW0gMS41cmVtO2NsZWFyOmJvdGg7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiMyMTI1Mjk7dGV4dC1hbGlnbjppbmhlcml0O3doaXRlLXNwYWNlOm5vd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowfS5kcm9wZG93bi1pdGVtOmZvY3VzLC5kcm9wZG93bi1pdGVtOmhvdmVye2NvbG9yOiMxNjE4MWI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjhmOWZhfS5kcm9wZG93bi1pdGVtLmFjdGl2ZSwuZHJvcGRvd24taXRlbTphY3RpdmV7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiMwMDdiZmZ9LmRyb3Bkb3duLWl0ZW0uZGlzYWJsZWQsLmRyb3Bkb3duLWl0ZW06ZGlzYWJsZWR7Y29sb3I6IzZjNzU3ZDtwb2ludGVyLWV2ZW50czpub25lO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmRyb3Bkb3duLW1lbnUuc2hvd3tkaXNwbGF5OmJsb2NrfS5kcm9wZG93bi1oZWFkZXJ7ZGlzcGxheTpibG9jaztwYWRkaW5nOi41cmVtIDEuNXJlbTttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOi44NzVyZW07Y29sb3I6IzZjNzU3ZDt3aGl0ZS1zcGFjZTpub3dyYXB9LmRyb3Bkb3duLWl0ZW0tdGV4dHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6LjI1cmVtIDEuNXJlbTtjb2xvcjojMjEyNTI5fS5idG4tZ3JvdXAsLmJ0bi1ncm91cC12ZXJ0aWNhbHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Oi1tcy1pbmxpbmUtZmxleGJveDtkaXNwbGF5OmlubGluZS1mbGV4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4sLmJ0bi1ncm91cD4uYnRue3Bvc2l0aW9uOnJlbGF0aXZlOy1tcy1mbGV4OjEgMSBhdXRvO2ZsZXg6MSAxIGF1dG99LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOmhvdmVyLC5idG4tZ3JvdXA+LmJ0bjpob3Zlcnt6LWluZGV4OjF9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLmFjdGl2ZSwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46YWN0aXZlLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjpmb2N1cywuYnRuLWdyb3VwPi5idG4uYWN0aXZlLC5idG4tZ3JvdXA+LmJ0bjphY3RpdmUsLmJ0bi1ncm91cD4uYnRuOmZvY3Vze3otaW5kZXg6MX0uYnRuLXRvb2xiYXJ7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LW1zLWZsZXgtd3JhcDp3cmFwO2ZsZXgtd3JhcDp3cmFwOy1tcy1mbGV4LXBhY2s6c3RhcnQ7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9LmJ0bi10b29sYmFyIC5pbnB1dC1ncm91cHt3aWR0aDphdXRvfS5idG4tZ3JvdXA+LmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKSwuYnRuLWdyb3VwPi5idG46bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0uYnRuLWdyb3VwPi5idG4tZ3JvdXA6bm90KDpsYXN0LWNoaWxkKT4uYnRuLC5idG4tZ3JvdXA+LmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmJ0bi1ncm91cD4uYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpPi5idG4sLmJ0bi1ncm91cD4uYnRuOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LmRyb3Bkb3duLXRvZ2dsZS1zcGxpdHtwYWRkaW5nLXJpZ2h0Oi41NjI1cmVtO3BhZGRpbmctbGVmdDouNTYyNXJlbX0uZHJvcGRvd24tdG9nZ2xlLXNwbGl0OjphZnRlciwuZHJvcHJpZ2h0IC5kcm9wZG93bi10b2dnbGUtc3BsaXQ6OmFmdGVyLC5kcm9wdXAgLmRyb3Bkb3duLXRvZ2dsZS1zcGxpdDo6YWZ0ZXJ7bWFyZ2luLWxlZnQ6MH0uZHJvcGxlZnQgLmRyb3Bkb3duLXRvZ2dsZS1zcGxpdDo6YmVmb3Jle21hcmdpbi1yaWdodDowfS5idG4tZ3JvdXAtc20+LmJ0bisuZHJvcGRvd24tdG9nZ2xlLXNwbGl0LC5idG4tc20rLmRyb3Bkb3duLXRvZ2dsZS1zcGxpdHtwYWRkaW5nLXJpZ2h0Oi4zNzVyZW07cGFkZGluZy1sZWZ0Oi4zNzVyZW19LmJ0bi1ncm91cC1sZz4uYnRuKy5kcm9wZG93bi10b2dnbGUtc3BsaXQsLmJ0bi1sZysuZHJvcGRvd24tdG9nZ2xlLXNwbGl0e3BhZGRpbmctcmlnaHQ6Ljc1cmVtO3BhZGRpbmctbGVmdDouNzVyZW19LmJ0bi1ncm91cC12ZXJ0aWNhbHstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjstbXMtZmxleC1hbGlnbjpzdGFydDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0Oy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cHt3aWR0aDoxMDAlfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKSwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLXRvcDotMXB4fS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpub3QoOmxhc3QtY2hpbGQpPi5idG4sLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpe2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKT4uYnRuLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjpub3QoOmZpcnN0LWNoaWxkKXtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0uYnRuLWdyb3VwLXRvZ2dsZT4uYnRuLC5idG4tZ3JvdXAtdG9nZ2xlPi5idG4tZ3JvdXA+LmJ0bnttYXJnaW4tYm90dG9tOjB9LmJ0bi1ncm91cC10b2dnbGU+LmJ0biBpbnB1dFt0eXBlPWNoZWNrYm94XSwuYnRuLWdyb3VwLXRvZ2dsZT4uYnRuIGlucHV0W3R5cGU9cmFkaW9dLC5idG4tZ3JvdXAtdG9nZ2xlPi5idG4tZ3JvdXA+LmJ0biBpbnB1dFt0eXBlPWNoZWNrYm94XSwuYnRuLWdyb3VwLXRvZ2dsZT4uYnRuLWdyb3VwPi5idG4gaW5wdXRbdHlwZT1yYWRpb117cG9zaXRpb246YWJzb2x1dGU7Y2xpcDpyZWN0KDAsMCwwLDApO3BvaW50ZXItZXZlbnRzOm5vbmV9LmlucHV0LWdyb3Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcDstbXMtZmxleC1hbGlnbjpzdHJldGNoO2FsaWduLWl0ZW1zOnN0cmV0Y2g7d2lkdGg6MTAwJX0uaW5wdXQtZ3JvdXA+LmN1c3RvbS1maWxlLC5pbnB1dC1ncm91cD4uY3VzdG9tLXNlbGVjdCwuaW5wdXQtZ3JvdXA+LmZvcm0tY29udHJvbCwuaW5wdXQtZ3JvdXA+LmZvcm0tY29udHJvbC1wbGFpbnRleHR7cG9zaXRpb246cmVsYXRpdmU7LW1zLWZsZXg6MSAxIGF1dG87ZmxleDoxIDEgYXV0bzt3aWR0aDoxJTttaW4td2lkdGg6MDttYXJnaW4tYm90dG9tOjB9LmlucHV0LWdyb3VwPi5jdXN0b20tZmlsZSsuY3VzdG9tLWZpbGUsLmlucHV0LWdyb3VwPi5jdXN0b20tZmlsZSsuY3VzdG9tLXNlbGVjdCwuaW5wdXQtZ3JvdXA+LmN1c3RvbS1maWxlKy5mb3JtLWNvbnRyb2wsLmlucHV0LWdyb3VwPi5jdXN0b20tc2VsZWN0Ky5jdXN0b20tZmlsZSwuaW5wdXQtZ3JvdXA+LmN1c3RvbS1zZWxlY3QrLmN1c3RvbS1zZWxlY3QsLmlucHV0LWdyb3VwPi5jdXN0b20tc2VsZWN0Ky5mb3JtLWNvbnRyb2wsLmlucHV0LWdyb3VwPi5mb3JtLWNvbnRyb2wrLmN1c3RvbS1maWxlLC5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9sKy5jdXN0b20tc2VsZWN0LC5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9sKy5mb3JtLWNvbnRyb2wsLmlucHV0LWdyb3VwPi5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0Ky5jdXN0b20tZmlsZSwuaW5wdXQtZ3JvdXA+LmZvcm0tY29udHJvbC1wbGFpbnRleHQrLmN1c3RvbS1zZWxlY3QsLmlucHV0LWdyb3VwPi5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0Ky5mb3JtLWNvbnRyb2x7bWFyZ2luLWxlZnQ6LTFweH0uaW5wdXQtZ3JvdXA+LmN1c3RvbS1maWxlIC5jdXN0b20tZmlsZS1pbnB1dDpmb2N1c34uY3VzdG9tLWZpbGUtbGFiZWwsLmlucHV0LWdyb3VwPi5jdXN0b20tc2VsZWN0OmZvY3VzLC5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9sOmZvY3Vze3otaW5kZXg6M30uaW5wdXQtZ3JvdXA+LmN1c3RvbS1maWxlIC5jdXN0b20tZmlsZS1pbnB1dDpmb2N1c3t6LWluZGV4OjR9LmlucHV0LWdyb3VwPi5jdXN0b20tc2VsZWN0Om5vdCg6bGFzdC1jaGlsZCksLmlucHV0LWdyb3VwPi5mb3JtLWNvbnRyb2w6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmlucHV0LWdyb3VwPi5jdXN0b20tc2VsZWN0Om5vdCg6Zmlyc3QtY2hpbGQpLC5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9sOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LmlucHV0LWdyb3VwPi5jdXN0b20tZmlsZXtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS5pbnB1dC1ncm91cD4uY3VzdG9tLWZpbGU6bm90KDpsYXN0LWNoaWxkKSAuY3VzdG9tLWZpbGUtbGFiZWwsLmlucHV0LWdyb3VwPi5jdXN0b20tZmlsZTpub3QoOmxhc3QtY2hpbGQpIC5jdXN0b20tZmlsZS1sYWJlbDo6YWZ0ZXJ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5pbnB1dC1ncm91cD4uY3VzdG9tLWZpbGU6bm90KDpmaXJzdC1jaGlsZCkgLmN1c3RvbS1maWxlLWxhYmVse2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LmlucHV0LWdyb3VwLWFwcGVuZCwuaW5wdXQtZ3JvdXAtcHJlcGVuZHtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleH0uaW5wdXQtZ3JvdXAtYXBwZW5kIC5idG4sLmlucHV0LWdyb3VwLXByZXBlbmQgLmJ0bntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjJ9LmlucHV0LWdyb3VwLWFwcGVuZCAuYnRuOmZvY3VzLC5pbnB1dC1ncm91cC1wcmVwZW5kIC5idG46Zm9jdXN7ei1pbmRleDozfS5pbnB1dC1ncm91cC1hcHBlbmQgLmJ0bisuYnRuLC5pbnB1dC1ncm91cC1hcHBlbmQgLmJ0bisuaW5wdXQtZ3JvdXAtdGV4dCwuaW5wdXQtZ3JvdXAtYXBwZW5kIC5pbnB1dC1ncm91cC10ZXh0Ky5idG4sLmlucHV0LWdyb3VwLWFwcGVuZCAuaW5wdXQtZ3JvdXAtdGV4dCsuaW5wdXQtZ3JvdXAtdGV4dCwuaW5wdXQtZ3JvdXAtcHJlcGVuZCAuYnRuKy5idG4sLmlucHV0LWdyb3VwLXByZXBlbmQgLmJ0bisuaW5wdXQtZ3JvdXAtdGV4dCwuaW5wdXQtZ3JvdXAtcHJlcGVuZCAuaW5wdXQtZ3JvdXAtdGV4dCsuYnRuLC5pbnB1dC1ncm91cC1wcmVwZW5kIC5pbnB1dC1ncm91cC10ZXh0Ky5pbnB1dC1ncm91cC10ZXh0e21hcmdpbi1sZWZ0Oi0xcHh9LmlucHV0LWdyb3VwLXByZXBlbmR7bWFyZ2luLXJpZ2h0Oi0xcHh9LmlucHV0LWdyb3VwLWFwcGVuZHttYXJnaW4tbGVmdDotMXB4fS5pbnB1dC1ncm91cC10ZXh0e2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7cGFkZGluZzouMzc1cmVtIC43NXJlbTttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNTtjb2xvcjojNDk1MDU3O3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOiNlOWVjZWY7Ym9yZGVyOjFweCBzb2xpZCAjY2VkNGRhO2JvcmRlci1yYWRpdXM6LjI1cmVtfS5pbnB1dC1ncm91cC10ZXh0IGlucHV0W3R5cGU9Y2hlY2tib3hdLC5pbnB1dC1ncm91cC10ZXh0IGlucHV0W3R5cGU9cmFkaW9de21hcmdpbi10b3A6MH0uaW5wdXQtZ3JvdXAtbGc+LmN1c3RvbS1zZWxlY3QsLmlucHV0LWdyb3VwLWxnPi5mb3JtLWNvbnRyb2w6bm90KHRleHRhcmVhKXtoZWlnaHQ6Y2FsYygxLjVlbSArIDFyZW0gKyAycHgpfS5pbnB1dC1ncm91cC1sZz4uY3VzdG9tLXNlbGVjdCwuaW5wdXQtZ3JvdXAtbGc+LmZvcm0tY29udHJvbCwuaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWFwcGVuZD4uYnRuLC5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYXBwZW5kPi5pbnB1dC1ncm91cC10ZXh0LC5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtcHJlcGVuZD4uYnRuLC5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtcHJlcGVuZD4uaW5wdXQtZ3JvdXAtdGV4dHtwYWRkaW5nOi41cmVtIDFyZW07Zm9udC1zaXplOjEuMjVyZW07bGluZS1oZWlnaHQ6MS41O2JvcmRlci1yYWRpdXM6LjNyZW19LmlucHV0LWdyb3VwLXNtPi5jdXN0b20tc2VsZWN0LC5pbnB1dC1ncm91cC1zbT4uZm9ybS1jb250cm9sOm5vdCh0ZXh0YXJlYSl7aGVpZ2h0OmNhbGMoMS41ZW0gKyAuNXJlbSArIDJweCl9LmlucHV0LWdyb3VwLXNtPi5jdXN0b20tc2VsZWN0LC5pbnB1dC1ncm91cC1zbT4uZm9ybS1jb250cm9sLC5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYXBwZW5kPi5idG4sLmlucHV0LWdyb3VwLXNtPi5pbnB1dC1ncm91cC1hcHBlbmQ+LmlucHV0LWdyb3VwLXRleHQsLmlucHV0LWdyb3VwLXNtPi5pbnB1dC1ncm91cC1wcmVwZW5kPi5idG4sLmlucHV0LWdyb3VwLXNtPi5pbnB1dC1ncm91cC1wcmVwZW5kPi5pbnB1dC1ncm91cC10ZXh0e3BhZGRpbmc6LjI1cmVtIC41cmVtO2ZvbnQtc2l6ZTouODc1cmVtO2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOi4ycmVtfS5pbnB1dC1ncm91cC1sZz4uY3VzdG9tLXNlbGVjdCwuaW5wdXQtZ3JvdXAtc20+LmN1c3RvbS1zZWxlY3R7cGFkZGluZy1yaWdodDoxLjc1cmVtfS5pbnB1dC1ncm91cD4uaW5wdXQtZ3JvdXAtYXBwZW5kOmxhc3QtY2hpbGQ+LmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKSwuaW5wdXQtZ3JvdXA+LmlucHV0LWdyb3VwLWFwcGVuZDpsYXN0LWNoaWxkPi5pbnB1dC1ncm91cC10ZXh0Om5vdCg6bGFzdC1jaGlsZCksLmlucHV0LWdyb3VwPi5pbnB1dC1ncm91cC1hcHBlbmQ6bm90KDpsYXN0LWNoaWxkKT4uYnRuLC5pbnB1dC1ncm91cD4uaW5wdXQtZ3JvdXAtYXBwZW5kOm5vdCg6bGFzdC1jaGlsZCk+LmlucHV0LWdyb3VwLXRleHQsLmlucHV0LWdyb3VwPi5pbnB1dC1ncm91cC1wcmVwZW5kPi5idG4sLmlucHV0LWdyb3VwPi5pbnB1dC1ncm91cC1wcmVwZW5kPi5pbnB1dC1ncm91cC10ZXh0e2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uaW5wdXQtZ3JvdXA+LmlucHV0LWdyb3VwLWFwcGVuZD4uYnRuLC5pbnB1dC1ncm91cD4uaW5wdXQtZ3JvdXAtYXBwZW5kPi5pbnB1dC1ncm91cC10ZXh0LC5pbnB1dC1ncm91cD4uaW5wdXQtZ3JvdXAtcHJlcGVuZDpmaXJzdC1jaGlsZD4uYnRuOm5vdCg6Zmlyc3QtY2hpbGQpLC5pbnB1dC1ncm91cD4uaW5wdXQtZ3JvdXAtcHJlcGVuZDpmaXJzdC1jaGlsZD4uaW5wdXQtZ3JvdXAtdGV4dDpub3QoOmZpcnN0LWNoaWxkKSwuaW5wdXQtZ3JvdXA+LmlucHV0LWdyb3VwLXByZXBlbmQ6bm90KDpmaXJzdC1jaGlsZCk+LmJ0biwuaW5wdXQtZ3JvdXA+LmlucHV0LWdyb3VwLXByZXBlbmQ6bm90KDpmaXJzdC1jaGlsZCk+LmlucHV0LWdyb3VwLXRleHR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uY3VzdG9tLWNvbnRyb2x7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxO2Rpc3BsYXk6YmxvY2s7bWluLWhlaWdodDoxLjVyZW07cGFkZGluZy1sZWZ0OjEuNXJlbTstd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDpleGFjdDtjb2xvci1hZGp1c3Q6ZXhhY3R9LmN1c3RvbS1jb250cm9sLWlubGluZXtkaXNwbGF5Oi1tcy1pbmxpbmUtZmxleGJveDtkaXNwbGF5OmlubGluZS1mbGV4O21hcmdpbi1yaWdodDoxcmVtfS5jdXN0b20tY29udHJvbC1pbnB1dHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7ei1pbmRleDotMTt3aWR0aDoxcmVtO2hlaWdodDoxLjI1cmVtO29wYWNpdHk6MH0uY3VzdG9tLWNvbnRyb2wtaW5wdXQ6Y2hlY2tlZH4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtjb2xvcjojZmZmO2JvcmRlci1jb2xvcjojMDA3YmZmO2JhY2tncm91bmQtY29sb3I6IzAwN2JmZn0uY3VzdG9tLWNvbnRyb2wtaW5wdXQ6Zm9jdXN+LmN1c3RvbS1jb250cm9sLWxhYmVsOjpiZWZvcmV7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDAsMTIzLDI1NSwuMjUpfS5jdXN0b20tY29udHJvbC1pbnB1dDpmb2N1czpub3QoOmNoZWNrZWQpfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3Jle2JvcmRlci1jb2xvcjojODBiZGZmfS5jdXN0b20tY29udHJvbC1pbnB1dDpub3QoOmRpc2FibGVkKTphY3RpdmV+LmN1c3RvbS1jb250cm9sLWxhYmVsOjpiZWZvcmV7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNiM2Q3ZmY7Ym9yZGVyLWNvbG9yOiNiM2Q3ZmZ9LmN1c3RvbS1jb250cm9sLWlucHV0OmRpc2FibGVkfi5jdXN0b20tY29udHJvbC1sYWJlbCwuY3VzdG9tLWNvbnRyb2wtaW5wdXRbZGlzYWJsZWRdfi5jdXN0b20tY29udHJvbC1sYWJlbHtjb2xvcjojNmM3NTdkfS5jdXN0b20tY29udHJvbC1pbnB1dDpkaXNhYmxlZH4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZSwuY3VzdG9tLWNvbnRyb2wtaW5wdXRbZGlzYWJsZWRdfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2U5ZWNlZn0uY3VzdG9tLWNvbnRyb2wtbGFiZWx7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWJvdHRvbTowO3ZlcnRpY2FsLWFsaWduOnRvcH0uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LjI1cmVtO2xlZnQ6LTEuNXJlbTtkaXNwbGF5OmJsb2NrO3dpZHRoOjFyZW07aGVpZ2h0OjFyZW07cG9pbnRlci1ldmVudHM6bm9uZTtjb250ZW50OiIiO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6I2FkYjViZCBzb2xpZCAxcHh9LmN1c3RvbS1jb250cm9sLWxhYmVsOjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LjI1cmVtO2xlZnQ6LTEuNXJlbTtkaXNwbGF5OmJsb2NrO3dpZHRoOjFyZW07aGVpZ2h0OjFyZW07Y29udGVudDoiIjtiYWNrZ3JvdW5kOm5vLXJlcGVhdCA1MCUvNTAlIDUwJX0uY3VzdG9tLWNoZWNrYm94IC5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3Jle2JvcmRlci1yYWRpdXM6LjI1cmVtfS5jdXN0b20tY2hlY2tib3ggLmN1c3RvbS1jb250cm9sLWlucHV0OmNoZWNrZWR+LmN1c3RvbS1jb250cm9sLWxhYmVsOjphZnRlcntiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc4JyBoZWlnaHQ9JzgnIHZpZXdCb3g9JzAgMCA4IDgnJTNlJTNjcGF0aCBmaWxsPSclMjNmZmYnIGQ9J002LjU2NC43NWwtMy41OSAzLjYxMi0xLjUzOC0xLjU1TDAgNC4yNmwyLjk3NCAyLjk5TDggMi4xOTN6Jy8lM2UlM2Mvc3ZnJTNlIil9LmN1c3RvbS1jaGVja2JveCAuY3VzdG9tLWNvbnRyb2wtaW5wdXQ6aW5kZXRlcm1pbmF0ZX4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtib3JkZXItY29sb3I6IzAwN2JmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDdiZmZ9LmN1c3RvbS1jaGVja2JveCAuY3VzdG9tLWNvbnRyb2wtaW5wdXQ6aW5kZXRlcm1pbmF0ZX4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmFmdGVye2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNjc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzQnIGhlaWdodD0nNCcgdmlld0JveD0nMCAwIDQgNCclM2UlM2NwYXRoIHN0cm9rZT0nJTIzZmZmJyBkPSdNMCAyaDQnLyUzZSUzYy9zdmclM2UiKX0uY3VzdG9tLWNoZWNrYm94IC5jdXN0b20tY29udHJvbC1pbnB1dDpkaXNhYmxlZDpjaGVja2Vkfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDEyMywyNTUsLjUpfS5jdXN0b20tY2hlY2tib3ggLmN1c3RvbS1jb250cm9sLWlucHV0OmRpc2FibGVkOmluZGV0ZXJtaW5hdGV+LmN1c3RvbS1jb250cm9sLWxhYmVsOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMTIzLDI1NSwuNSl9LmN1c3RvbS1yYWRpbyAuY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtib3JkZXItcmFkaXVzOjUwJX0uY3VzdG9tLXJhZGlvIC5jdXN0b20tY29udHJvbC1pbnB1dDpjaGVja2Vkfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YWZ0ZXJ7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTInIGhlaWdodD0nMTInIHZpZXdCb3g9Jy00IC00IDggOCclM2UlM2NjaXJjbGUgcj0nMycgZmlsbD0nJTIzZmZmJy8lM2UlM2Mvc3ZnJTNlIil9LmN1c3RvbS1yYWRpbyAuY3VzdG9tLWNvbnRyb2wtaW5wdXQ6ZGlzYWJsZWQ6Y2hlY2tlZH4uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwxMjMsMjU1LC41KX0uY3VzdG9tLXN3aXRjaHtwYWRkaW5nLWxlZnQ6Mi4yNXJlbX0uY3VzdG9tLXN3aXRjaCAuY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZXtsZWZ0Oi0yLjI1cmVtO3dpZHRoOjEuNzVyZW07cG9pbnRlci1ldmVudHM6YWxsO2JvcmRlci1yYWRpdXM6LjVyZW19LmN1c3RvbS1zd2l0Y2ggLmN1c3RvbS1jb250cm9sLWxhYmVsOjphZnRlcnt0b3A6Y2FsYyguMjVyZW0gKyAycHgpO2xlZnQ6Y2FsYygtMi4yNXJlbSArIDJweCk7d2lkdGg6Y2FsYygxcmVtIC0gNHB4KTtoZWlnaHQ6Y2FsYygxcmVtIC0gNHB4KTtiYWNrZ3JvdW5kLWNvbG9yOiNhZGI1YmQ7Ym9yZGVyLXJhZGl1czouNXJlbTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3JkZXItY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3gtc2hhZG93IC4xNXMgZWFzZS1pbi1vdXQsLXdlYmtpdC10cmFuc2Zvcm0gLjE1cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMTVzIGVhc2UtaW4tb3V0LGJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3JkZXItY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3gtc2hhZG93IC4xNXMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjE1cyBlYXNlLWluLW91dCxiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsYm9yZGVyLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsYm94LXNoYWRvdyAuMTVzIGVhc2UtaW4tb3V0LC13ZWJraXQtdHJhbnNmb3JtIC4xNXMgZWFzZS1pbi1vdXR9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOnJlZHVjZSl7LmN1c3RvbS1zd2l0Y2ggLmN1c3RvbS1jb250cm9sLWxhYmVsOjphZnRlcnt0cmFuc2l0aW9uOm5vbmV9fS5jdXN0b20tc3dpdGNoIC5jdXN0b20tY29udHJvbC1pbnB1dDpjaGVja2Vkfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLjc1cmVtKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCguNzVyZW0pfS5jdXN0b20tc3dpdGNoIC5jdXN0b20tY29udHJvbC1pbnB1dDpkaXNhYmxlZDpjaGVja2Vkfi5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDEyMywyNTUsLjUpfS5jdXN0b20tc2VsZWN0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OmNhbGMoMS41ZW0gKyAuNzVyZW0gKyAycHgpO3BhZGRpbmc6LjM3NXJlbSAxLjc1cmVtIC4zNzVyZW0gLjc1cmVtO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjU7Y29sb3I6IzQ5NTA1Nzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7YmFja2dyb3VuZDojZmZmIHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc0JyBoZWlnaHQ9JzUnIHZpZXdCb3g9JzAgMCA0IDUnJTNlJTNjcGF0aCBmaWxsPSclMjMzNDNhNDAnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLyUzZSUzYy9zdmclM2UiKSBuby1yZXBlYXQgcmlnaHQgLjc1cmVtIGNlbnRlci84cHggMTBweDtib3JkZXI6MXB4IHNvbGlkICNjZWQ0ZGE7Ym9yZGVyLXJhZGl1czouMjVyZW07LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmU7YXBwZWFyYW5jZTpub25lfS5jdXN0b20tc2VsZWN0OmZvY3Vze2JvcmRlci1jb2xvcjojODBiZGZmO291dGxpbmU6MDtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMCwxMjMsMjU1LC4yNSl9LmN1c3RvbS1zZWxlY3Q6Zm9jdXM6Oi1tcy12YWx1ZXtjb2xvcjojNDk1MDU3O2JhY2tncm91bmQtY29sb3I6I2ZmZn0uY3VzdG9tLXNlbGVjdFttdWx0aXBsZV0sLmN1c3RvbS1zZWxlY3Rbc2l6ZV06bm90KFtzaXplPSIxIl0pe2hlaWdodDphdXRvO3BhZGRpbmctcmlnaHQ6Ljc1cmVtO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uY3VzdG9tLXNlbGVjdDpkaXNhYmxlZHtjb2xvcjojNmM3NTdkO2JhY2tncm91bmQtY29sb3I6I2U5ZWNlZn0uY3VzdG9tLXNlbGVjdDo6LW1zLWV4cGFuZHtkaXNwbGF5Om5vbmV9LmN1c3RvbS1zZWxlY3Q6LW1vei1mb2N1c3Jpbmd7Y29sb3I6dHJhbnNwYXJlbnQ7dGV4dC1zaGFkb3c6MCAwIDAgIzQ5NTA1N30uY3VzdG9tLXNlbGVjdC1zbXtoZWlnaHQ6Y2FsYygxLjVlbSArIC41cmVtICsgMnB4KTtwYWRkaW5nLXRvcDouMjVyZW07cGFkZGluZy1ib3R0b206LjI1cmVtO3BhZGRpbmctbGVmdDouNXJlbTtmb250LXNpemU6Ljg3NXJlbX0uY3VzdG9tLXNlbGVjdC1sZ3toZWlnaHQ6Y2FsYygxLjVlbSArIDFyZW0gKyAycHgpO3BhZGRpbmctdG9wOi41cmVtO3BhZGRpbmctYm90dG9tOi41cmVtO3BhZGRpbmctbGVmdDoxcmVtO2ZvbnQtc2l6ZToxLjI1cmVtfS5jdXN0b20tZmlsZXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO2hlaWdodDpjYWxjKDEuNWVtICsgLjc1cmVtICsgMnB4KTttYXJnaW4tYm90dG9tOjB9LmN1c3RvbS1maWxlLWlucHV0e3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Mjt3aWR0aDoxMDAlO2hlaWdodDpjYWxjKDEuNWVtICsgLjc1cmVtICsgMnB4KTttYXJnaW46MDtvcGFjaXR5OjB9LmN1c3RvbS1maWxlLWlucHV0OmZvY3Vzfi5jdXN0b20tZmlsZS1sYWJlbHtib3JkZXItY29sb3I6IzgwYmRmZjtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoMCwxMjMsMjU1LC4yNSl9LmN1c3RvbS1maWxlLWlucHV0OmRpc2FibGVkfi5jdXN0b20tZmlsZS1sYWJlbCwuY3VzdG9tLWZpbGUtaW5wdXRbZGlzYWJsZWRdfi5jdXN0b20tZmlsZS1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNlOWVjZWZ9LmN1c3RvbS1maWxlLWlucHV0OmxhbmcoZW4pfi5jdXN0b20tZmlsZS1sYWJlbDo6YWZ0ZXJ7Y29udGVudDoiQnJvd3NlIn0uY3VzdG9tLWZpbGUtaW5wdXR+LmN1c3RvbS1maWxlLWxhYmVsW2RhdGEtYnJvd3NlXTo6YWZ0ZXJ7Y29udGVudDphdHRyKGRhdGEtYnJvd3NlKX0uY3VzdG9tLWZpbGUtbGFiZWx7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtsZWZ0OjA7ei1pbmRleDoxO2hlaWdodDpjYWxjKDEuNWVtICsgLjc1cmVtICsgMnB4KTtwYWRkaW5nOi4zNzVyZW0gLjc1cmVtO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjU7Y29sb3I6IzQ5NTA1NztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjY2VkNGRhO2JvcmRlci1yYWRpdXM6LjI1cmVtfS5jdXN0b20tZmlsZS1sYWJlbDo6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDt6LWluZGV4OjM7ZGlzcGxheTpibG9jaztoZWlnaHQ6Y2FsYygxLjVlbSArIC43NXJlbSk7cGFkZGluZzouMzc1cmVtIC43NXJlbTtsaW5lLWhlaWdodDoxLjU7Y29sb3I6IzQ5NTA1Nztjb250ZW50OiJCcm93c2UiO2JhY2tncm91bmQtY29sb3I6I2U5ZWNlZjtib3JkZXItbGVmdDppbmhlcml0O2JvcmRlci1yYWRpdXM6MCAuMjVyZW0gLjI1cmVtIDB9LmN1c3RvbS1yYW5nZXt3aWR0aDoxMDAlO2hlaWdodDoxLjRyZW07cGFkZGluZzowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmU7YXBwZWFyYW5jZTpub25lfS5jdXN0b20tcmFuZ2U6Zm9jdXN7b3V0bGluZTowfS5jdXN0b20tcmFuZ2U6Zm9jdXM6Oi13ZWJraXQtc2xpZGVyLXRodW1ie2JveC1zaGFkb3c6MCAwIDAgMXB4ICNmZmYsMCAwIDAgLjJyZW0gcmdiYSgwLDEyMywyNTUsLjI1KX0uY3VzdG9tLXJhbmdlOmZvY3VzOjotbW96LXJhbmdlLXRodW1ie2JveC1zaGFkb3c6MCAwIDAgMXB4ICNmZmYsMCAwIDAgLjJyZW0gcmdiYSgwLDEyMywyNTUsLjI1KX0uY3VzdG9tLXJhbmdlOmZvY3VzOjotbXMtdGh1bWJ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZmZiwwIDAgMCAuMnJlbSByZ2JhKDAsMTIzLDI1NSwuMjUpfS5jdXN0b20tcmFuZ2U6Oi1tb3otZm9jdXMtb3V0ZXJ7Ym9yZGVyOjB9LmN1c3RvbS1yYW5nZTo6LXdlYmtpdC1zbGlkZXItdGh1bWJ7d2lkdGg6MXJlbTtoZWlnaHQ6MXJlbTttYXJnaW4tdG9wOi0uMjVyZW07YmFja2dyb3VuZC1jb2xvcjojMDA3YmZmO2JvcmRlcjowO2JvcmRlci1yYWRpdXM6MXJlbTstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMTVzIGVhc2UtaW4tb3V0LGJvcmRlci1jb2xvciAuMTVzIGVhc2UtaW4tb3V0LGJveC1zaGFkb3cgLjE1cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3JkZXItY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3gtc2hhZG93IC4xNXMgZWFzZS1pbi1vdXQ7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7YXBwZWFyYW5jZTpub25lfUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjpyZWR1Y2Upey5jdXN0b20tcmFuZ2U6Oi13ZWJraXQtc2xpZGVyLXRodW1iey13ZWJraXQtdHJhbnNpdGlvbjpub25lO3RyYW5zaXRpb246bm9uZX19LmN1c3RvbS1yYW5nZTo6LXdlYmtpdC1zbGlkZXItdGh1bWI6YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2IzZDdmZn0uY3VzdG9tLXJhbmdlOjotd2Via2l0LXNsaWRlci1ydW5uYWJsZS10cmFja3t3aWR0aDoxMDAlO2hlaWdodDouNXJlbTtjb2xvcjp0cmFuc3BhcmVudDtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNkZWUyZTY7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MXJlbX0uY3VzdG9tLXJhbmdlOjotbW96LXJhbmdlLXRodW1ie3dpZHRoOjFyZW07aGVpZ2h0OjFyZW07YmFja2dyb3VuZC1jb2xvcjojMDA3YmZmO2JvcmRlcjowO2JvcmRlci1yYWRpdXM6MXJlbTstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMTVzIGVhc2UtaW4tb3V0LGJvcmRlci1jb2xvciAuMTVzIGVhc2UtaW4tb3V0LGJveC1zaGFkb3cgLjE1cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3JkZXItY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3gtc2hhZG93IC4xNXMgZWFzZS1pbi1vdXQ7LW1vei1hcHBlYXJhbmNlOm5vbmU7YXBwZWFyYW5jZTpub25lfUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjpyZWR1Y2Upey5jdXN0b20tcmFuZ2U6Oi1tb3otcmFuZ2UtdGh1bWJ7LW1vei10cmFuc2l0aW9uOm5vbmU7dHJhbnNpdGlvbjpub25lfX0uY3VzdG9tLXJhbmdlOjotbW96LXJhbmdlLXRodW1iOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNiM2Q3ZmZ9LmN1c3RvbS1yYW5nZTo6LW1vei1yYW5nZS10cmFja3t3aWR0aDoxMDAlO2hlaWdodDouNXJlbTtjb2xvcjp0cmFuc3BhcmVudDtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNkZWUyZTY7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MXJlbX0uY3VzdG9tLXJhbmdlOjotbXMtdGh1bWJ7d2lkdGg6MXJlbTtoZWlnaHQ6MXJlbTttYXJnaW4tdG9wOjA7bWFyZ2luLXJpZ2h0Oi4ycmVtO21hcmdpbi1sZWZ0Oi4ycmVtO2JhY2tncm91bmQtY29sb3I6IzAwN2JmZjtib3JkZXI6MDtib3JkZXItcmFkaXVzOjFyZW07LW1zLXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMTVzIGVhc2UtaW4tb3V0LGJvcmRlci1jb2xvciAuMTVzIGVhc2UtaW4tb3V0LGJveC1zaGFkb3cgLjE1cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3JkZXItY29sb3IgLjE1cyBlYXNlLWluLW91dCxib3gtc2hhZG93IC4xNXMgZWFzZS1pbi1vdXQ7YXBwZWFyYW5jZTpub25lfUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjpyZWR1Y2Upey5jdXN0b20tcmFuZ2U6Oi1tcy10aHVtYnstbXMtdHJhbnNpdGlvbjpub25lO3RyYW5zaXRpb246bm9uZX19LmN1c3RvbS1yYW5nZTo6LW1zLXRodW1iOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNiM2Q3ZmZ9LmN1c3RvbS1yYW5nZTo6LW1zLXRyYWNre3dpZHRoOjEwMCU7aGVpZ2h0Oi41cmVtO2NvbG9yOnRyYW5zcGFyZW50O2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci13aWR0aDouNXJlbX0uY3VzdG9tLXJhbmdlOjotbXMtZmlsbC1sb3dlcntiYWNrZ3JvdW5kLWNvbG9yOiNkZWUyZTY7Ym9yZGVyLXJhZGl1czoxcmVtfS5jdXN0b20tcmFuZ2U6Oi1tcy1maWxsLXVwcGVye21hcmdpbi1yaWdodDoxNXB4O2JhY2tncm91bmQtY29sb3I6I2RlZTJlNjtib3JkZXItcmFkaXVzOjFyZW19LmN1c3RvbS1yYW5nZTpkaXNhYmxlZDo6LXdlYmtpdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojYWRiNWJkfS5jdXN0b20tcmFuZ2U6ZGlzYWJsZWQ6Oi13ZWJraXQtc2xpZGVyLXJ1bm5hYmxlLXRyYWNre2N1cnNvcjpkZWZhdWx0fS5jdXN0b20tcmFuZ2U6ZGlzYWJsZWQ6Oi1tb3otcmFuZ2UtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojYWRiNWJkfS5jdXN0b20tcmFuZ2U6ZGlzYWJsZWQ6Oi1tb3otcmFuZ2UtdHJhY2t7Y3Vyc29yOmRlZmF1bHR9LmN1c3RvbS1yYW5nZTpkaXNhYmxlZDo6LW1zLXRodW1ie2JhY2tncm91bmQtY29sb3I6I2FkYjViZH0uY3VzdG9tLWNvbnRyb2wtbGFiZWw6OmJlZm9yZSwuY3VzdG9tLWZpbGUtbGFiZWwsLmN1c3RvbS1zZWxlY3R7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsYm9yZGVyLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsYm94LXNoYWRvdyAuMTVzIGVhc2UtaW4tb3V0fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjpyZWR1Y2Upey5jdXN0b20tY29udHJvbC1sYWJlbDo6YmVmb3JlLC5jdXN0b20tZmlsZS1sYWJlbCwuY3VzdG9tLXNlbGVjdHt0cmFuc2l0aW9uOm5vbmV9fS5uYXZ7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LW1zLWZsZXgtd3JhcDp3cmFwO2ZsZXgtd3JhcDp3cmFwO3BhZGRpbmctbGVmdDowO21hcmdpbi1ib3R0b206MDtsaXN0LXN0eWxlOm5vbmV9Lm5hdi1saW5re2Rpc3BsYXk6YmxvY2s7cGFkZGluZzouNXJlbSAxcmVtfS5uYXYtbGluazpmb2N1cywubmF2LWxpbms6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Lm5hdi1saW5rLmRpc2FibGVke2NvbG9yOiM2Yzc1N2Q7cG9pbnRlci1ldmVudHM6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubmF2LXRhYnN7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RlZTJlNn0ubmF2LXRhYnMgLm5hdi1pdGVte21hcmdpbi1ib3R0b206LTFweH0ubmF2LXRhYnMgLm5hdi1saW5re2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czouMjVyZW07Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6LjI1cmVtfS5uYXYtdGFicyAubmF2LWxpbms6Zm9jdXMsLm5hdi10YWJzIC5uYXYtbGluazpob3Zlcntib3JkZXItY29sb3I6I2U5ZWNlZiAjZTllY2VmICNkZWUyZTZ9Lm5hdi10YWJzIC5uYXYtbGluay5kaXNhYmxlZHtjb2xvcjojNmM3NTdkO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5uYXYtdGFicyAubmF2LWl0ZW0uc2hvdyAubmF2LWxpbmssLm5hdi10YWJzIC5uYXYtbGluay5hY3RpdmV7Y29sb3I6IzQ5NTA1NztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiNkZWUyZTYgI2RlZTJlNiAjZmZmfS5uYXYtdGFicyAuZHJvcGRvd24tbWVudXttYXJnaW4tdG9wOi0xcHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9Lm5hdi1waWxscyAubmF2LWxpbmt7Ym9yZGVyLXJhZGl1czouMjVyZW19Lm5hdi1waWxscyAubmF2LWxpbmsuYWN0aXZlLC5uYXYtcGlsbHMgLnNob3c+Lm5hdi1saW5re2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDA3YmZmfS5uYXYtZmlsbCAubmF2LWl0ZW0sLm5hdi1maWxsPi5uYXYtbGlua3stbXMtZmxleDoxIDEgYXV0bztmbGV4OjEgMSBhdXRvO3RleHQtYWxpZ246Y2VudGVyfS5uYXYtanVzdGlmaWVkIC5uYXYtaXRlbSwubmF2LWp1c3RpZmllZD4ubmF2LWxpbmt7LW1zLWZsZXgtcHJlZmVycmVkLXNpemU6MDtmbGV4LWJhc2lzOjA7LW1zLWZsZXgtcG9zaXRpdmU6MTtmbGV4LWdyb3c6MTt0ZXh0LWFsaWduOmNlbnRlcn0udGFiLWNvbnRlbnQ+LnRhYi1wYW5le2Rpc3BsYXk6bm9uZX0udGFiLWNvbnRlbnQ+LmFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5uYXZiYXJ7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LW1zLWZsZXgtd3JhcDp3cmFwO2ZsZXgtd3JhcDp3cmFwOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7LW1zLWZsZXgtcGFjazpqdXN0aWZ5O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmc6LjVyZW0gMXJlbX0ubmF2YmFyIC5jb250YWluZXIsLm5hdmJhciAuY29udGFpbmVyLWZsdWlkLC5uYXZiYXIgLmNvbnRhaW5lci1sZywubmF2YmFyIC5jb250YWluZXItbWQsLm5hdmJhciAuY29udGFpbmVyLXNtLC5uYXZiYXIgLmNvbnRhaW5lci14bHtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC13cmFwOndyYXA7ZmxleC13cmFwOndyYXA7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1wYWNrOmp1c3RpZnk7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59Lm5hdmJhci1icmFuZHtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nLXRvcDouMzEyNXJlbTtwYWRkaW5nLWJvdHRvbTouMzEyNXJlbTttYXJnaW4tcmlnaHQ6MXJlbTtmb250LXNpemU6MS4yNXJlbTtsaW5lLWhlaWdodDppbmhlcml0O3doaXRlLXNwYWNlOm5vd3JhcH0ubmF2YmFyLWJyYW5kOmZvY3VzLC5uYXZiYXItYnJhbmQ6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Lm5hdmJhci1uYXZ7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47cGFkZGluZy1sZWZ0OjA7bWFyZ2luLWJvdHRvbTowO2xpc3Qtc3R5bGU6bm9uZX0ubmF2YmFyLW5hdiAubmF2LWxpbmt7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDowfS5uYXZiYXItbmF2IC5kcm9wZG93bi1tZW51e3Bvc2l0aW9uOnN0YXRpYztmbG9hdDpub25lfS5uYXZiYXItdGV4dHtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nLXRvcDouNXJlbTtwYWRkaW5nLWJvdHRvbTouNXJlbX0ubmF2YmFyLWNvbGxhcHNley1tcy1mbGV4LXByZWZlcnJlZC1zaXplOjEwMCU7ZmxleC1iYXNpczoxMDAlOy1tcy1mbGV4LXBvc2l0aXZlOjE7ZmxleC1ncm93OjE7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0ubmF2YmFyLXRvZ2dsZXJ7cGFkZGluZzouMjVyZW0gLjc1cmVtO2ZvbnQtc2l6ZToxLjI1cmVtO2xpbmUtaGVpZ2h0OjE7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6LjI1cmVtfS5uYXZiYXItdG9nZ2xlcjpmb2N1cywubmF2YmFyLXRvZ2dsZXI6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Lm5hdmJhci10b2dnbGVyLWljb257ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MS41ZW07aGVpZ2h0OjEuNWVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtjb250ZW50OiIiO2JhY2tncm91bmQ6bm8tcmVwZWF0IGNlbnRlciBjZW50ZXI7YmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJX1AbWVkaWEgKG1heC13aWR0aDo1NzUuOThweCl7Lm5hdmJhci1leHBhbmQtc20+LmNvbnRhaW5lciwubmF2YmFyLWV4cGFuZC1zbT4uY29udGFpbmVyLWZsdWlkLC5uYXZiYXItZXhwYW5kLXNtPi5jb250YWluZXItbGcsLm5hdmJhci1leHBhbmQtc20+LmNvbnRhaW5lci1tZCwubmF2YmFyLWV4cGFuZC1zbT4uY29udGFpbmVyLXNtLC5uYXZiYXItZXhwYW5kLXNtPi5jb250YWluZXIteGx7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDowfX1AbWVkaWEgKG1pbi13aWR0aDo1NzZweCl7Lm5hdmJhci1leHBhbmQtc217LW1zLWZsZXgtZmxvdzpyb3cgbm93cmFwO2ZsZXgtZmxvdzpyb3cgbm93cmFwOy1tcy1mbGV4LXBhY2s6c3RhcnQ7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9Lm5hdmJhci1leHBhbmQtc20gLm5hdmJhci1uYXZ7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LWRpcmVjdGlvbjpyb3d9Lm5hdmJhci1leHBhbmQtc20gLm5hdmJhci1uYXYgLmRyb3Bkb3duLW1lbnV7cG9zaXRpb246YWJzb2x1dGV9Lm5hdmJhci1leHBhbmQtc20gLm5hdmJhci1uYXYgLm5hdi1saW5re3BhZGRpbmctcmlnaHQ6LjVyZW07cGFkZGluZy1sZWZ0Oi41cmVtfS5uYXZiYXItZXhwYW5kLXNtPi5jb250YWluZXIsLm5hdmJhci1leHBhbmQtc20+LmNvbnRhaW5lci1mbHVpZCwubmF2YmFyLWV4cGFuZC1zbT4uY29udGFpbmVyLWxnLC5uYXZiYXItZXhwYW5kLXNtPi5jb250YWluZXItbWQsLm5hdmJhci1leHBhbmQtc20+LmNvbnRhaW5lci1zbSwubmF2YmFyLWV4cGFuZC1zbT4uY29udGFpbmVyLXhsey1tcy1mbGV4LXdyYXA6bm93cmFwO2ZsZXgtd3JhcDpub3dyYXB9Lm5hdmJhci1leHBhbmQtc20gLm5hdmJhci1jb2xsYXBzZXtkaXNwbGF5Oi1tcy1mbGV4Ym94IWltcG9ydGFudDtkaXNwbGF5OmZsZXghaW1wb3J0YW50Oy1tcy1mbGV4LXByZWZlcnJlZC1zaXplOmF1dG87ZmxleC1iYXNpczphdXRvfS5uYXZiYXItZXhwYW5kLXNtIC5uYXZiYXItdG9nZ2xlcntkaXNwbGF5Om5vbmV9fUBtZWRpYSAobWF4LXdpZHRoOjc2Ny45OHB4KXsubmF2YmFyLWV4cGFuZC1tZD4uY29udGFpbmVyLC5uYXZiYXItZXhwYW5kLW1kPi5jb250YWluZXItZmx1aWQsLm5hdmJhci1leHBhbmQtbWQ+LmNvbnRhaW5lci1sZywubmF2YmFyLWV4cGFuZC1tZD4uY29udGFpbmVyLW1kLC5uYXZiYXItZXhwYW5kLW1kPi5jb250YWluZXItc20sLm5hdmJhci1leHBhbmQtbWQ+LmNvbnRhaW5lci14bHtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjB9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLWV4cGFuZC1tZHstbXMtZmxleC1mbG93OnJvdyBub3dyYXA7ZmxleC1mbG93OnJvdyBub3dyYXA7LW1zLWZsZXgtcGFjazpzdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0ubmF2YmFyLWV4cGFuZC1tZCAubmF2YmFyLW5hdnstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvd30ubmF2YmFyLWV4cGFuZC1tZCAubmF2YmFyLW5hdiAuZHJvcGRvd24tbWVudXtwb3NpdGlvbjphYnNvbHV0ZX0ubmF2YmFyLWV4cGFuZC1tZCAubmF2YmFyLW5hdiAubmF2LWxpbmt7cGFkZGluZy1yaWdodDouNXJlbTtwYWRkaW5nLWxlZnQ6LjVyZW19Lm5hdmJhci1leHBhbmQtbWQ+LmNvbnRhaW5lciwubmF2YmFyLWV4cGFuZC1tZD4uY29udGFpbmVyLWZsdWlkLC5uYXZiYXItZXhwYW5kLW1kPi5jb250YWluZXItbGcsLm5hdmJhci1leHBhbmQtbWQ+LmNvbnRhaW5lci1tZCwubmF2YmFyLWV4cGFuZC1tZD4uY29udGFpbmVyLXNtLC5uYXZiYXItZXhwYW5kLW1kPi5jb250YWluZXIteGx7LW1zLWZsZXgtd3JhcDpub3dyYXA7ZmxleC13cmFwOm5vd3JhcH0ubmF2YmFyLWV4cGFuZC1tZCAubmF2YmFyLWNvbGxhcHNle2Rpc3BsYXk6LW1zLWZsZXhib3ghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleCFpbXBvcnRhbnQ7LW1zLWZsZXgtcHJlZmVycmVkLXNpemU6YXV0bztmbGV4LWJhc2lzOmF1dG99Lm5hdmJhci1leHBhbmQtbWQgLm5hdmJhci10b2dnbGVye2Rpc3BsYXk6bm9uZX19QG1lZGlhIChtYXgtd2lkdGg6OTkxLjk4cHgpey5uYXZiYXItZXhwYW5kLWxnPi5jb250YWluZXIsLm5hdmJhci1leHBhbmQtbGc+LmNvbnRhaW5lci1mbHVpZCwubmF2YmFyLWV4cGFuZC1sZz4uY29udGFpbmVyLWxnLC5uYXZiYXItZXhwYW5kLWxnPi5jb250YWluZXItbWQsLm5hdmJhci1leHBhbmQtbGc+LmNvbnRhaW5lci1zbSwubmF2YmFyLWV4cGFuZC1sZz4uY29udGFpbmVyLXhse3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5uYXZiYXItZXhwYW5kLWxney1tcy1mbGV4LWZsb3c6cm93IG5vd3JhcDtmbGV4LWZsb3c6cm93IG5vd3JhcDstbXMtZmxleC1wYWNrOnN0YXJ0O2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5uYXZiYXItZXhwYW5kLWxnIC5uYXZiYXItbmF2ey1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93fS5uYXZiYXItZXhwYW5kLWxnIC5uYXZiYXItbmF2IC5kcm9wZG93bi1tZW51e3Bvc2l0aW9uOmFic29sdXRlfS5uYXZiYXItZXhwYW5kLWxnIC5uYXZiYXItbmF2IC5uYXYtbGlua3twYWRkaW5nLXJpZ2h0Oi41cmVtO3BhZGRpbmctbGVmdDouNXJlbX0ubmF2YmFyLWV4cGFuZC1sZz4uY29udGFpbmVyLC5uYXZiYXItZXhwYW5kLWxnPi5jb250YWluZXItZmx1aWQsLm5hdmJhci1leHBhbmQtbGc+LmNvbnRhaW5lci1sZywubmF2YmFyLWV4cGFuZC1sZz4uY29udGFpbmVyLW1kLC5uYXZiYXItZXhwYW5kLWxnPi5jb250YWluZXItc20sLm5hdmJhci1leHBhbmQtbGc+LmNvbnRhaW5lci14bHstbXMtZmxleC13cmFwOm5vd3JhcDtmbGV4LXdyYXA6bm93cmFwfS5uYXZiYXItZXhwYW5kLWxnIC5uYXZiYXItY29sbGFwc2V7ZGlzcGxheTotbXMtZmxleGJveCFpbXBvcnRhbnQ7ZGlzcGxheTpmbGV4IWltcG9ydGFudDstbXMtZmxleC1wcmVmZXJyZWQtc2l6ZTphdXRvO2ZsZXgtYmFzaXM6YXV0b30ubmF2YmFyLWV4cGFuZC1sZyAubmF2YmFyLXRvZ2dsZXJ7ZGlzcGxheTpub25lfX1AbWVkaWEgKG1heC13aWR0aDoxMTk5Ljk4cHgpey5uYXZiYXItZXhwYW5kLXhsPi5jb250YWluZXIsLm5hdmJhci1leHBhbmQteGw+LmNvbnRhaW5lci1mbHVpZCwubmF2YmFyLWV4cGFuZC14bD4uY29udGFpbmVyLWxnLC5uYXZiYXItZXhwYW5kLXhsPi5jb250YWluZXItbWQsLm5hdmJhci1leHBhbmQteGw+LmNvbnRhaW5lci1zbSwubmF2YmFyLWV4cGFuZC14bD4uY29udGFpbmVyLXhse3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXsubmF2YmFyLWV4cGFuZC14bHstbXMtZmxleC1mbG93OnJvdyBub3dyYXA7ZmxleC1mbG93OnJvdyBub3dyYXA7LW1zLWZsZXgtcGFjazpzdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0ubmF2YmFyLWV4cGFuZC14bCAubmF2YmFyLW5hdnstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvd30ubmF2YmFyLWV4cGFuZC14bCAubmF2YmFyLW5hdiAuZHJvcGRvd24tbWVudXtwb3NpdGlvbjphYnNvbHV0ZX0ubmF2YmFyLWV4cGFuZC14bCAubmF2YmFyLW5hdiAubmF2LWxpbmt7cGFkZGluZy1yaWdodDouNXJlbTtwYWRkaW5nLWxlZnQ6LjVyZW19Lm5hdmJhci1leHBhbmQteGw+LmNvbnRhaW5lciwubmF2YmFyLWV4cGFuZC14bD4uY29udGFpbmVyLWZsdWlkLC5uYXZiYXItZXhwYW5kLXhsPi5jb250YWluZXItbGcsLm5hdmJhci1leHBhbmQteGw+LmNvbnRhaW5lci1tZCwubmF2YmFyLWV4cGFuZC14bD4uY29udGFpbmVyLXNtLC5uYXZiYXItZXhwYW5kLXhsPi5jb250YWluZXIteGx7LW1zLWZsZXgtd3JhcDpub3dyYXA7ZmxleC13cmFwOm5vd3JhcH0ubmF2YmFyLWV4cGFuZC14bCAubmF2YmFyLWNvbGxhcHNle2Rpc3BsYXk6LW1zLWZsZXhib3ghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleCFpbXBvcnRhbnQ7LW1zLWZsZXgtcHJlZmVycmVkLXNpemU6YXV0bztmbGV4LWJhc2lzOmF1dG99Lm5hdmJhci1leHBhbmQteGwgLm5hdmJhci10b2dnbGVye2Rpc3BsYXk6bm9uZX19Lm5hdmJhci1leHBhbmR7LW1zLWZsZXgtZmxvdzpyb3cgbm93cmFwO2ZsZXgtZmxvdzpyb3cgbm93cmFwOy1tcy1mbGV4LXBhY2s6c3RhcnQ7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9Lm5hdmJhci1leHBhbmQ+LmNvbnRhaW5lciwubmF2YmFyLWV4cGFuZD4uY29udGFpbmVyLWZsdWlkLC5uYXZiYXItZXhwYW5kPi5jb250YWluZXItbGcsLm5hdmJhci1leHBhbmQ+LmNvbnRhaW5lci1tZCwubmF2YmFyLWV4cGFuZD4uY29udGFpbmVyLXNtLC5uYXZiYXItZXhwYW5kPi5jb250YWluZXIteGx7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDowfS5uYXZiYXItZXhwYW5kIC5uYXZiYXItbmF2ey1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93fS5uYXZiYXItZXhwYW5kIC5uYXZiYXItbmF2IC5kcm9wZG93bi1tZW51e3Bvc2l0aW9uOmFic29sdXRlfS5uYXZiYXItZXhwYW5kIC5uYXZiYXItbmF2IC5uYXYtbGlua3twYWRkaW5nLXJpZ2h0Oi41cmVtO3BhZGRpbmctbGVmdDouNXJlbX0ubmF2YmFyLWV4cGFuZD4uY29udGFpbmVyLC5uYXZiYXItZXhwYW5kPi5jb250YWluZXItZmx1aWQsLm5hdmJhci1leHBhbmQ+LmNvbnRhaW5lci1sZywubmF2YmFyLWV4cGFuZD4uY29udGFpbmVyLW1kLC5uYXZiYXItZXhwYW5kPi5jb250YWluZXItc20sLm5hdmJhci1leHBhbmQ+LmNvbnRhaW5lci14bHstbXMtZmxleC13cmFwOm5vd3JhcDtmbGV4LXdyYXA6bm93cmFwfS5uYXZiYXItZXhwYW5kIC5uYXZiYXItY29sbGFwc2V7ZGlzcGxheTotbXMtZmxleGJveCFpbXBvcnRhbnQ7ZGlzcGxheTpmbGV4IWltcG9ydGFudDstbXMtZmxleC1wcmVmZXJyZWQtc2l6ZTphdXRvO2ZsZXgtYmFzaXM6YXV0b30ubmF2YmFyLWV4cGFuZCAubmF2YmFyLXRvZ2dsZXJ7ZGlzcGxheTpub25lfS5uYXZiYXItbGlnaHQgLm5hdmJhci1icmFuZHtjb2xvcjpyZ2JhKDAsMCwwLC45KX0ubmF2YmFyLWxpZ2h0IC5uYXZiYXItYnJhbmQ6Zm9jdXMsLm5hdmJhci1saWdodCAubmF2YmFyLWJyYW5kOmhvdmVye2NvbG9yOnJnYmEoMCwwLDAsLjkpfS5uYXZiYXItbGlnaHQgLm5hdmJhci1uYXYgLm5hdi1saW5re2NvbG9yOnJnYmEoMCwwLDAsLjUpfS5uYXZiYXItbGlnaHQgLm5hdmJhci1uYXYgLm5hdi1saW5rOmZvY3VzLC5uYXZiYXItbGlnaHQgLm5hdmJhci1uYXYgLm5hdi1saW5rOmhvdmVye2NvbG9yOnJnYmEoMCwwLDAsLjcpfS5uYXZiYXItbGlnaHQgLm5hdmJhci1uYXYgLm5hdi1saW5rLmRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjMpfS5uYXZiYXItbGlnaHQgLm5hdmJhci1uYXYgLmFjdGl2ZT4ubmF2LWxpbmssLm5hdmJhci1saWdodCAubmF2YmFyLW5hdiAubmF2LWxpbmsuYWN0aXZlLC5uYXZiYXItbGlnaHQgLm5hdmJhci1uYXYgLm5hdi1saW5rLnNob3csLm5hdmJhci1saWdodCAubmF2YmFyLW5hdiAuc2hvdz4ubmF2LWxpbmt7Y29sb3I6cmdiYSgwLDAsMCwuOSl9Lm5hdmJhci1saWdodCAubmF2YmFyLXRvZ2dsZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNSk7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5uYXZiYXItbGlnaHQgLm5hdmJhci10b2dnbGVyLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzAnIGhlaWdodD0nMzAnIHZpZXdCb3g9JzAgMCAzMCAzMCclM2UlM2NwYXRoIHN0cm9rZT0ncmdiYSUyODAsIDAsIDAsIDAuNSUyOScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbWl0ZXJsaW1pdD0nMTAnIHN0cm9rZS13aWR0aD0nMicgZD0nTTQgN2gyMk00IDE1aDIyTTQgMjNoMjInLyUzZSUzYy9zdmclM2UiKX0ubmF2YmFyLWxpZ2h0IC5uYXZiYXItdGV4dHtjb2xvcjpyZ2JhKDAsMCwwLC41KX0ubmF2YmFyLWxpZ2h0IC5uYXZiYXItdGV4dCBhe2NvbG9yOnJnYmEoMCwwLDAsLjkpfS5uYXZiYXItbGlnaHQgLm5hdmJhci10ZXh0IGE6Zm9jdXMsLm5hdmJhci1saWdodCAubmF2YmFyLXRleHQgYTpob3Zlcntjb2xvcjpyZ2JhKDAsMCwwLC45KX0ubmF2YmFyLWRhcmsgLm5hdmJhci1icmFuZHtjb2xvcjojZmZmfS5uYXZiYXItZGFyayAubmF2YmFyLWJyYW5kOmZvY3VzLC5uYXZiYXItZGFyayAubmF2YmFyLWJyYW5kOmhvdmVye2NvbG9yOiNmZmZ9Lm5hdmJhci1kYXJrIC5uYXZiYXItbmF2IC5uYXYtbGlua3tjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX0ubmF2YmFyLWRhcmsgLm5hdmJhci1uYXYgLm5hdi1saW5rOmZvY3VzLC5uYXZiYXItZGFyayAubmF2YmFyLW5hdiAubmF2LWxpbms6aG92ZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNzUpfS5uYXZiYXItZGFyayAubmF2YmFyLW5hdiAubmF2LWxpbmsuZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMjUpfS5uYXZiYXItZGFyayAubmF2YmFyLW5hdiAuYWN0aXZlPi5uYXYtbGluaywubmF2YmFyLWRhcmsgLm5hdmJhci1uYXYgLm5hdi1saW5rLmFjdGl2ZSwubmF2YmFyLWRhcmsgLm5hdmJhci1uYXYgLm5hdi1saW5rLnNob3csLm5hdmJhci1kYXJrIC5uYXZiYXItbmF2IC5zaG93Pi5uYXYtbGlua3tjb2xvcjojZmZmfS5uYXZiYXItZGFyayAubmF2YmFyLXRvZ2dsZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSk7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5uYXZiYXItZGFyayAubmF2YmFyLXRvZ2dsZXItaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMCcgaGVpZ2h0PSczMCcgdmlld0JveD0nMCAwIDMwIDMwJyUzZSUzY3BhdGggc3Ryb2tlPSdyZ2JhJTI4MjU1LCAyNTUsIDI1NSwgMC41JTI5JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1taXRlcmxpbWl0PScxMCcgc3Ryb2tlLXdpZHRoPScyJyBkPSdNNCA3aDIyTTQgMTVoMjJNNCAyM2gyMicvJTNlJTNjL3N2ZyUzZSIpfS5uYXZiYXItZGFyayAubmF2YmFyLXRleHR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Lm5hdmJhci1kYXJrIC5uYXZiYXItdGV4dCBhe2NvbG9yOiNmZmZ9Lm5hdmJhci1kYXJrIC5uYXZiYXItdGV4dCBhOmZvY3VzLC5uYXZiYXItZGFyayAubmF2YmFyLXRleHQgYTpob3Zlcntjb2xvcjojZmZmfS5jYXJke3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDowO3dvcmQtd3JhcDpicmVhay13b3JkO2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNsaXA6Ym9yZGVyLWJveDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyNSk7Ym9yZGVyLXJhZGl1czouMjVyZW19LmNhcmQ+aHJ7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MH0uY2FyZD4ubGlzdC1ncm91cHtib3JkZXItdG9wOmluaGVyaXQ7Ym9yZGVyLWJvdHRvbTppbmhlcml0fS5jYXJkPi5saXN0LWdyb3VwOmZpcnN0LWNoaWxke2JvcmRlci10b3Atd2lkdGg6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOmNhbGMoLjI1cmVtIC0gMXB4KTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKC4yNXJlbSAtIDFweCl9LmNhcmQ+Lmxpc3QtZ3JvdXA6bGFzdC1jaGlsZHtib3JkZXItYm90dG9tLXdpZHRoOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6Y2FsYyguMjVyZW0gLSAxcHgpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6Y2FsYyguMjVyZW0gLSAxcHgpfS5jYXJkPi5jYXJkLWhlYWRlcisubGlzdC1ncm91cCwuY2FyZD4ubGlzdC1ncm91cCsuY2FyZC1mb290ZXJ7Ym9yZGVyLXRvcDowfS5jYXJkLWJvZHl7LW1zLWZsZXg6MSAxIGF1dG87ZmxleDoxIDEgYXV0bzttaW4taGVpZ2h0OjFweDtwYWRkaW5nOjEuMjVyZW19LmNhcmQtdGl0bGV7bWFyZ2luLWJvdHRvbTouNzVyZW19LmNhcmQtc3VidGl0bGV7bWFyZ2luLXRvcDotLjM3NXJlbTttYXJnaW4tYm90dG9tOjB9LmNhcmQtdGV4dDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0uY2FyZC1saW5rOmhvdmVye3RleHQtZGVjb3JhdGlvbjpub25lfS5jYXJkLWxpbmsrLmNhcmQtbGlua3ttYXJnaW4tbGVmdDoxLjI1cmVtfS5jYXJkLWhlYWRlcntwYWRkaW5nOi43NXJlbSAxLjI1cmVtO21hcmdpbi1ib3R0b206MDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAzKTtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMjUpfS5jYXJkLWhlYWRlcjpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOmNhbGMoLjI1cmVtIC0gMXB4KSBjYWxjKC4yNXJlbSAtIDFweCkgMCAwfS5jYXJkLWZvb3RlcntwYWRkaW5nOi43NXJlbSAxLjI1cmVtO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDMpO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyNSl9LmNhcmQtZm9vdGVyOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgY2FsYyguMjVyZW0gLSAxcHgpIGNhbGMoLjI1cmVtIC0gMXB4KX0uY2FyZC1oZWFkZXItdGFic3ttYXJnaW4tcmlnaHQ6LS42MjVyZW07bWFyZ2luLWJvdHRvbTotLjc1cmVtO21hcmdpbi1sZWZ0Oi0uNjI1cmVtO2JvcmRlci1ib3R0b206MH0uY2FyZC1oZWFkZXItcGlsbHN7bWFyZ2luLXJpZ2h0Oi0uNjI1cmVtO21hcmdpbi1sZWZ0Oi0uNjI1cmVtfS5jYXJkLWltZy1vdmVybGF5e3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3BhZGRpbmc6MS4yNXJlbTtib3JkZXItcmFkaXVzOmNhbGMoLjI1cmVtIC0gMXB4KX0uY2FyZC1pbWcsLmNhcmQtaW1nLWJvdHRvbSwuY2FyZC1pbWctdG9wey1tcy1mbGV4LW5lZ2F0aXZlOjA7ZmxleC1zaHJpbms6MDt3aWR0aDoxMDAlfS5jYXJkLWltZywuY2FyZC1pbWctdG9we2JvcmRlci10b3AtbGVmdC1yYWRpdXM6Y2FsYyguMjVyZW0gLSAxcHgpO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOmNhbGMoLjI1cmVtIC0gMXB4KX0uY2FyZC1pbWcsLmNhcmQtaW1nLWJvdHRvbXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czpjYWxjKC4yNXJlbSAtIDFweCk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czpjYWxjKC4yNXJlbSAtIDFweCl9LmNhcmQtZGVjayAuY2FyZHttYXJnaW4tYm90dG9tOjE1cHh9QG1lZGlhIChtaW4td2lkdGg6NTc2cHgpey5jYXJkLWRlY2t7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LW1zLWZsZXgtZmxvdzpyb3cgd3JhcDtmbGV4LWZsb3c6cm93IHdyYXA7bWFyZ2luLXJpZ2h0Oi0xNXB4O21hcmdpbi1sZWZ0Oi0xNXB4fS5jYXJkLWRlY2sgLmNhcmR7LW1zLWZsZXg6MSAwIDAlO2ZsZXg6MSAwIDAlO21hcmdpbi1yaWdodDoxNXB4O21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDoxNXB4fX0uY2FyZC1ncm91cD4uY2FyZHttYXJnaW4tYm90dG9tOjE1cHh9QG1lZGlhIChtaW4td2lkdGg6NTc2cHgpey5jYXJkLWdyb3Vwe2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWZsb3c6cm93IHdyYXA7ZmxleC1mbG93OnJvdyB3cmFwfS5jYXJkLWdyb3VwPi5jYXJkey1tcy1mbGV4OjEgMCAwJTtmbGV4OjEgMCAwJTttYXJnaW4tYm90dG9tOjB9LmNhcmQtZ3JvdXA+LmNhcmQrLmNhcmR7bWFyZ2luLWxlZnQ6MDtib3JkZXItbGVmdDowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6bGFzdC1jaGlsZCl7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6bGFzdC1jaGlsZCkgLmNhcmQtaGVhZGVyLC5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6bGFzdC1jaGlsZCkgLmNhcmQtaW1nLXRvcHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6bGFzdC1jaGlsZCkgLmNhcmQtZm9vdGVyLC5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6bGFzdC1jaGlsZCkgLmNhcmQtaW1nLWJvdHRvbXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LmNhcmQtZ3JvdXA+LmNhcmQ6bm90KDpmaXJzdC1jaGlsZCkgLmNhcmQtaGVhZGVyLC5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6Zmlyc3QtY2hpbGQpIC5jYXJkLWltZy10b3B7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowfS5jYXJkLWdyb3VwPi5jYXJkOm5vdCg6Zmlyc3QtY2hpbGQpIC5jYXJkLWZvb3RlciwuY2FyZC1ncm91cD4uY2FyZDpub3QoOmZpcnN0LWNoaWxkKSAuY2FyZC1pbWctYm90dG9te2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH19LmNhcmQtY29sdW1ucyAuY2FyZHttYXJnaW4tYm90dG9tOi43NXJlbX1AbWVkaWEgKG1pbi13aWR0aDo1NzZweCl7LmNhcmQtY29sdW1uc3std2Via2l0LWNvbHVtbi1jb3VudDozOy1tb3otY29sdW1uLWNvdW50OjM7Y29sdW1uLWNvdW50OjM7LXdlYmtpdC1jb2x1bW4tZ2FwOjEuMjVyZW07LW1vei1jb2x1bW4tZ2FwOjEuMjVyZW07Y29sdW1uLWdhcDoxLjI1cmVtO29ycGhhbnM6MTt3aWRvd3M6MX0uY2FyZC1jb2x1bW5zIC5jYXJke2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCV9fS5hY2NvcmRpb257b3ZlcmZsb3ctYW5jaG9yOm5vbmV9LmFjY29yZGlvbj4uY2FyZHtvdmVyZmxvdzpoaWRkZW59LmFjY29yZGlvbj4uY2FyZDpub3QoOmxhc3Qtb2YtdHlwZSl7Ym9yZGVyLWJvdHRvbTowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5hY2NvcmRpb24+LmNhcmQ6bm90KDpmaXJzdC1vZi10eXBlKXtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0uYWNjb3JkaW9uPi5jYXJkPi5jYXJkLWhlYWRlcntib3JkZXItcmFkaXVzOjA7bWFyZ2luLWJvdHRvbTotMXB4fS5icmVhZGNydW1ie2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcDtwYWRkaW5nOi43NXJlbSAxcmVtO21hcmdpbi1ib3R0b206MXJlbTtsaXN0LXN0eWxlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZTllY2VmO2JvcmRlci1yYWRpdXM6LjI1cmVtfS5icmVhZGNydW1iLWl0ZW17ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXh9LmJyZWFkY3J1bWItaXRlbSsuYnJlYWRjcnVtYi1pdGVte3BhZGRpbmctbGVmdDouNXJlbX0uYnJlYWRjcnVtYi1pdGVtKy5icmVhZGNydW1iLWl0ZW06OmJlZm9yZXtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nLXJpZ2h0Oi41cmVtO2NvbG9yOiM2Yzc1N2Q7Y29udGVudDoiLyJ9LmJyZWFkY3J1bWItaXRlbSsuYnJlYWRjcnVtYi1pdGVtOmhvdmVyOjpiZWZvcmV7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uYnJlYWRjcnVtYi1pdGVtKy5icmVhZGNydW1iLWl0ZW06aG92ZXI6OmJlZm9yZXt0ZXh0LWRlY29yYXRpb246bm9uZX0uYnJlYWRjcnVtYi1pdGVtLmFjdGl2ZXtjb2xvcjojNmM3NTdkfS5wYWdpbmF0aW9ue2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O3BhZGRpbmctbGVmdDowO2xpc3Qtc3R5bGU6bm9uZTtib3JkZXItcmFkaXVzOi4yNXJlbX0ucGFnZS1saW5re3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7cGFkZGluZzouNXJlbSAuNzVyZW07bWFyZ2luLWxlZnQ6LTFweDtsaW5lLWhlaWdodDoxLjI1O2NvbG9yOiMwMDdiZmY7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2RlZTJlNn0ucGFnZS1saW5rOmhvdmVye3otaW5kZXg6Mjtjb2xvcjojMDA1NmIzO3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6I2U5ZWNlZjtib3JkZXItY29sb3I6I2RlZTJlNn0ucGFnZS1saW5rOmZvY3Vze3otaW5kZXg6MztvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDAsMTIzLDI1NSwuMjUpfS5wYWdlLWl0ZW06Zmlyc3QtY2hpbGQgLnBhZ2UtbGlua3ttYXJnaW4tbGVmdDowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6LjI1cmVtO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6LjI1cmVtfS5wYWdlLWl0ZW06bGFzdC1jaGlsZCAucGFnZS1saW5re2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOi4yNXJlbTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czouMjVyZW19LnBhZ2UtaXRlbS5hY3RpdmUgLnBhZ2UtbGlua3t6LWluZGV4OjM7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDdiZmY7Ym9yZGVyLWNvbG9yOiMwMDdiZmZ9LnBhZ2UtaXRlbS5kaXNhYmxlZCAucGFnZS1saW5re2NvbG9yOiM2Yzc1N2Q7cG9pbnRlci1ldmVudHM6bm9uZTtjdXJzb3I6YXV0bztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiNkZWUyZTZ9LnBhZ2luYXRpb24tbGcgLnBhZ2UtbGlua3twYWRkaW5nOi43NXJlbSAxLjVyZW07Zm9udC1zaXplOjEuMjVyZW07bGluZS1oZWlnaHQ6MS41fS5wYWdpbmF0aW9uLWxnIC5wYWdlLWl0ZW06Zmlyc3QtY2hpbGQgLnBhZ2UtbGlua3tib3JkZXItdG9wLWxlZnQtcmFkaXVzOi4zcmVtO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6LjNyZW19LnBhZ2luYXRpb24tbGcgLnBhZ2UtaXRlbTpsYXN0LWNoaWxkIC5wYWdlLWxpbmt7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6LjNyZW07Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6LjNyZW19LnBhZ2luYXRpb24tc20gLnBhZ2UtbGlua3twYWRkaW5nOi4yNXJlbSAuNXJlbTtmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjV9LnBhZ2luYXRpb24tc20gLnBhZ2UtaXRlbTpmaXJzdC1jaGlsZCAucGFnZS1saW5re2JvcmRlci10b3AtbGVmdC1yYWRpdXM6LjJyZW07Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czouMnJlbX0ucGFnaW5hdGlvbi1zbSAucGFnZS1pdGVtOmxhc3QtY2hpbGQgLnBhZ2UtbGlua3tib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouMnJlbTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czouMnJlbX0uYmFkZ2V7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzouMjVlbSAuNGVtO2ZvbnQtc2l6ZTo3NSU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2JvcmRlci1yYWRpdXM6LjI1cmVtO3RyYW5zaXRpb246Y29sb3IgLjE1cyBlYXNlLWluLW91dCxiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsYm9yZGVyLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsYm94LXNoYWRvdyAuMTVzIGVhc2UtaW4tb3V0fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjpyZWR1Y2Upey5iYWRnZXt0cmFuc2l0aW9uOm5vbmV9fWEuYmFkZ2U6Zm9jdXMsYS5iYWRnZTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZX0uYmFkZ2U6ZW1wdHl7ZGlzcGxheTpub25lfS5idG4gLmJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDotMXB4fS5iYWRnZS1waWxse3BhZGRpbmctcmlnaHQ6LjZlbTtwYWRkaW5nLWxlZnQ6LjZlbTtib3JkZXItcmFkaXVzOjEwcmVtfS5iYWRnZS1wcmltYXJ5e2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDA3YmZmfWEuYmFkZ2UtcHJpbWFyeTpmb2N1cyxhLmJhZGdlLXByaW1hcnk6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDYyY2N9YS5iYWRnZS1wcmltYXJ5LmZvY3VzLGEuYmFkZ2UtcHJpbWFyeTpmb2N1c3tvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDAsMTIzLDI1NSwuNSl9LmJhZGdlLXNlY29uZGFyeXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzZjNzU3ZH1hLmJhZGdlLXNlY29uZGFyeTpmb2N1cyxhLmJhZGdlLXNlY29uZGFyeTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzU0NWI2Mn1hLmJhZGdlLXNlY29uZGFyeS5mb2N1cyxhLmJhZGdlLXNlY29uZGFyeTpmb2N1c3tvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDEwOCwxMTcsMTI1LC41KX0uYmFkZ2Utc3VjY2Vzc3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzI4YTc0NX1hLmJhZGdlLXN1Y2Nlc3M6Zm9jdXMsYS5iYWRnZS1zdWNjZXNzOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMWU3ZTM0fWEuYmFkZ2Utc3VjY2Vzcy5mb2N1cyxhLmJhZGdlLXN1Y2Nlc3M6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg0MCwxNjcsNjksLjUpfS5iYWRnZS1pbmZve2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMTdhMmI4fWEuYmFkZ2UtaW5mbzpmb2N1cyxhLmJhZGdlLWluZm86aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMxMTdhOGJ9YS5iYWRnZS1pbmZvLmZvY3VzLGEuYmFkZ2UtaW5mbzpmb2N1c3tvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDIzLDE2MiwxODQsLjUpfS5iYWRnZS13YXJuaW5ne2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZmZjMTA3fWEuYmFkZ2Utd2FybmluZzpmb2N1cyxhLmJhZGdlLXdhcm5pbmc6aG92ZXJ7Y29sb3I6IzIxMjUyOTtiYWNrZ3JvdW5kLWNvbG9yOiNkMzllMDB9YS5iYWRnZS13YXJuaW5nLmZvY3VzLGEuYmFkZ2Utd2FybmluZzpmb2N1c3tvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDI1NSwxOTMsNywuNSl9LmJhZGdlLWRhbmdlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2RjMzU0NX1hLmJhZGdlLWRhbmdlcjpmb2N1cyxhLmJhZGdlLWRhbmdlcjpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2JkMjEzMH1hLmJhZGdlLWRhbmdlci5mb2N1cyxhLmJhZGdlLWRhbmdlcjpmb2N1c3tvdXRsaW5lOjA7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDIyMCw1Myw2OSwuNSl9LmJhZGdlLWxpZ2h0e2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZjhmOWZhfWEuYmFkZ2UtbGlnaHQ6Zm9jdXMsYS5iYWRnZS1saWdodDpob3Zlcntjb2xvcjojMjEyNTI5O2JhY2tncm91bmQtY29sb3I6I2RhZTBlNX1hLmJhZGdlLWxpZ2h0LmZvY3VzLGEuYmFkZ2UtbGlnaHQ6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSgyNDgsMjQ5LDI1MCwuNSl9LmJhZGdlLWRhcmt7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzNDNhNDB9YS5iYWRnZS1kYXJrOmZvY3VzLGEuYmFkZ2UtZGFyazpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzFkMjEyNH1hLmJhZGdlLWRhcmsuZm9jdXMsYS5iYWRnZS1kYXJrOmZvY3Vze291dGxpbmU6MDtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNTIsNTgsNjQsLjUpfS5qdW1ib3Ryb257cGFkZGluZzoycmVtIDFyZW07bWFyZ2luLWJvdHRvbToycmVtO2JhY2tncm91bmQtY29sb3I6I2U5ZWNlZjtib3JkZXItcmFkaXVzOi4zcmVtfUBtZWRpYSAobWluLXdpZHRoOjU3NnB4KXsuanVtYm90cm9ue3BhZGRpbmc6NHJlbSAycmVtfX0uanVtYm90cm9uLWZsdWlke3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MDtib3JkZXItcmFkaXVzOjB9LmFsZXJ0e3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6Ljc1cmVtIDEuMjVyZW07bWFyZ2luLWJvdHRvbToxcmVtO2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czouMjVyZW19LmFsZXJ0LWhlYWRpbmd7Y29sb3I6aW5oZXJpdH0uYWxlcnQtbGlua3tmb250LXdlaWdodDo3MDB9LmFsZXJ0LWRpc21pc3NpYmxle3BhZGRpbmctcmlnaHQ6NHJlbX0uYWxlcnQtZGlzbWlzc2libGUgLmNsb3Nle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7ei1pbmRleDoyO3BhZGRpbmc6Ljc1cmVtIDEuMjVyZW07Y29sb3I6aW5oZXJpdH0uYWxlcnQtcHJpbWFyeXtjb2xvcjojMDA0MDg1O2JhY2tncm91bmQtY29sb3I6I2NjZTVmZjtib3JkZXItY29sb3I6I2I4ZGFmZn0uYWxlcnQtcHJpbWFyeSBocntib3JkZXItdG9wLWNvbG9yOiM5ZmNkZmZ9LmFsZXJ0LXByaW1hcnkgLmFsZXJ0LWxpbmt7Y29sb3I6IzAwMjc1Mn0uYWxlcnQtc2Vjb25kYXJ5e2NvbG9yOiMzODNkNDE7YmFja2dyb3VuZC1jb2xvcjojZTJlM2U1O2JvcmRlci1jb2xvcjojZDZkOGRifS5hbGVydC1zZWNvbmRhcnkgaHJ7Ym9yZGVyLXRvcC1jb2xvcjojYzhjYmNmfS5hbGVydC1zZWNvbmRhcnkgLmFsZXJ0LWxpbmt7Y29sb3I6IzIwMjMyNn0uYWxlcnQtc3VjY2Vzc3tjb2xvcjojMTU1NzI0O2JhY2tncm91bmQtY29sb3I6I2Q0ZWRkYTtib3JkZXItY29sb3I6I2MzZTZjYn0uYWxlcnQtc3VjY2VzcyBocntib3JkZXItdG9wLWNvbG9yOiNiMWRmYmJ9LmFsZXJ0LXN1Y2Nlc3MgLmFsZXJ0LWxpbmt7Y29sb3I6IzBiMmUxM30uYWxlcnQtaW5mb3tjb2xvcjojMGM1NDYwO2JhY2tncm91bmQtY29sb3I6I2QxZWNmMTtib3JkZXItY29sb3I6I2JlZTVlYn0uYWxlcnQtaW5mbyBocntib3JkZXItdG9wLWNvbG9yOiNhYmRkZTV9LmFsZXJ0LWluZm8gLmFsZXJ0LWxpbmt7Y29sb3I6IzA2MmMzM30uYWxlcnQtd2FybmluZ3tjb2xvcjojODU2NDA0O2JhY2tncm91bmQtY29sb3I6I2ZmZjNjZDtib3JkZXItY29sb3I6I2ZmZWViYX0uYWxlcnQtd2FybmluZyBocntib3JkZXItdG9wLWNvbG9yOiNmZmU4YTF9LmFsZXJ0LXdhcm5pbmcgLmFsZXJ0LWxpbmt7Y29sb3I6IzUzM2YwM30uYWxlcnQtZGFuZ2Vye2NvbG9yOiM3MjFjMjQ7YmFja2dyb3VuZC1jb2xvcjojZjhkN2RhO2JvcmRlci1jb2xvcjojZjVjNmNifS5hbGVydC1kYW5nZXIgaHJ7Ym9yZGVyLXRvcC1jb2xvcjojZjFiMGI3fS5hbGVydC1kYW5nZXIgLmFsZXJ0LWxpbmt7Y29sb3I6IzQ5MTIxN30uYWxlcnQtbGlnaHR7Y29sb3I6IzgxODE4MjtiYWNrZ3JvdW5kLWNvbG9yOiNmZWZlZmU7Ym9yZGVyLWNvbG9yOiNmZGZkZmV9LmFsZXJ0LWxpZ2h0IGhye2JvcmRlci10b3AtY29sb3I6I2VjZWNmNn0uYWxlcnQtbGlnaHQgLmFsZXJ0LWxpbmt7Y29sb3I6IzY4Njg2OH0uYWxlcnQtZGFya3tjb2xvcjojMWIxZTIxO2JhY2tncm91bmQtY29sb3I6I2Q2ZDhkOTtib3JkZXItY29sb3I6I2M2YzhjYX0uYWxlcnQtZGFyayBocntib3JkZXItdG9wLWNvbG9yOiNiOWJiYmV9LmFsZXJ0LWRhcmsgLmFsZXJ0LWxpbmt7Y29sb3I6IzA0MDUwNX1ALXdlYmtpdC1rZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXN7ZnJvbXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjFyZW0gMH10b3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH19QGtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlc3tmcm9te2JhY2tncm91bmQtcG9zaXRpb246MXJlbSAwfXRve2JhY2tncm91bmQtcG9zaXRpb246MCAwfX0ucHJvZ3Jlc3N7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7aGVpZ2h0OjFyZW07b3ZlcmZsb3c6aGlkZGVuO2xpbmUtaGVpZ2h0OjA7Zm9udC1zaXplOi43NXJlbTtiYWNrZ3JvdW5kLWNvbG9yOiNlOWVjZWY7Ym9yZGVyLXJhZGl1czouMjVyZW19LnByb2dyZXNzLWJhcntkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjstbXMtZmxleC1wYWNrOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO292ZXJmbG93OmhpZGRlbjtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDdiZmY7dHJhbnNpdGlvbjp3aWR0aCAuNnMgZWFzZX1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246cmVkdWNlKXsucHJvZ3Jlc3MtYmFye3RyYW5zaXRpb246bm9uZX19LnByb2dyZXNzLWJhci1zdHJpcGVke2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLXNpemU6MXJlbSAxcmVtfS5wcm9ncmVzcy1iYXItYW5pbWF0ZWR7LXdlYmtpdC1hbmltYXRpb246cHJvZ3Jlc3MtYmFyLXN0cmlwZXMgMXMgbGluZWFyIGluZmluaXRlO2FuaW1hdGlvbjpwcm9ncmVzcy1iYXItc3RyaXBlcyAxcyBsaW5lYXIgaW5maW5pdGV9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOnJlZHVjZSl7LnByb2dyZXNzLWJhci1hbmltYXRlZHstd2Via2l0LWFuaW1hdGlvbjpub25lO2FuaW1hdGlvbjpub25lfX0ubWVkaWF7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LW1zLWZsZXgtYWxpZ246c3RhcnQ7YWxpZ24taXRlbXM6ZmxleC1zdGFydH0ubWVkaWEtYm9keXstbXMtZmxleDoxO2ZsZXg6MX0ubGlzdC1ncm91cHtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtwYWRkaW5nLWxlZnQ6MDttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXJhZGl1czouMjVyZW19Lmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb257d2lkdGg6MTAwJTtjb2xvcjojNDk1MDU3O3RleHQtYWxpZ246aW5oZXJpdH0ubGlzdC1ncm91cC1pdGVtLWFjdGlvbjpmb2N1cywubGlzdC1ncm91cC1pdGVtLWFjdGlvbjpob3Zlcnt6LWluZGV4OjE7Y29sb3I6IzQ5NTA1Nzt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNmOGY5ZmF9Lmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb246YWN0aXZle2NvbG9yOiMyMTI1Mjk7YmFja2dyb3VuZC1jb2xvcjojZTllY2VmfS5saXN0LWdyb3VwLWl0ZW17cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztwYWRkaW5nOi43NXJlbSAxLjI1cmVtO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyNSl9Lmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOmluaGVyaXQ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6aW5oZXJpdH0ubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6aW5oZXJpdDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOmluaGVyaXR9Lmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZCwubGlzdC1ncm91cC1pdGVtOmRpc2FibGVke2NvbG9yOiM2Yzc1N2Q7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7ei1pbmRleDoyO2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDA3YmZmO2JvcmRlci1jb2xvcjojMDA3YmZmfS5saXN0LWdyb3VwLWl0ZW0rLmxpc3QtZ3JvdXAtaXRlbXtib3JkZXItdG9wLXdpZHRoOjB9Lmxpc3QtZ3JvdXAtaXRlbSsubGlzdC1ncm91cC1pdGVtLmFjdGl2ZXttYXJnaW4tdG9wOi0xcHg7Ym9yZGVyLXRvcC13aWR0aDoxcHh9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbHstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvd30ubGlzdC1ncm91cC1ob3Jpem9udGFsPi5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czouMjVyZW07Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsPi5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouMjVyZW07Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5saXN0LWdyb3VwLWhvcml6b250YWw+Lmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLXRvcDowfS5saXN0LWdyb3VwLWhvcml6b250YWw+Lmxpc3QtZ3JvdXAtaXRlbSsubGlzdC1ncm91cC1pdGVte2JvcmRlci10b3Atd2lkdGg6MXB4O2JvcmRlci1sZWZ0LXdpZHRoOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbD4ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW0uYWN0aXZle21hcmdpbi1sZWZ0Oi0xcHg7Ym9yZGVyLWxlZnQtd2lkdGg6MXB4fUBtZWRpYSAobWluLXdpZHRoOjU3NnB4KXsubGlzdC1ncm91cC1ob3Jpem9udGFsLXNtey1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93fS5saXN0LWdyb3VwLWhvcml6b250YWwtc20+Lmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4yNXJlbTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5saXN0LWdyb3VwLWhvcml6b250YWwtc20+Lmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxke2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOi4yNXJlbTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1zbT4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZXttYXJnaW4tdG9wOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1zbT4ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW17Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLWxlZnQtd2lkdGg6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsLXNtPi5saXN0LWdyb3VwLWl0ZW0rLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLWxlZnQ6LTFweDtib3JkZXItbGVmdC13aWR0aDoxcHh9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubGlzdC1ncm91cC1ob3Jpem9udGFsLW1key1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93fS5saXN0LWdyb3VwLWhvcml6b250YWwtbWQ+Lmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4yNXJlbTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5saXN0LWdyb3VwLWhvcml6b250YWwtbWQ+Lmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxke2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOi4yNXJlbTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1tZD4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZXttYXJnaW4tdG9wOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1tZD4ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW17Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLWxlZnQtd2lkdGg6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsLW1kPi5saXN0LWdyb3VwLWl0ZW0rLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLWxlZnQ6LTFweDtib3JkZXItbGVmdC13aWR0aDoxcHh9fUBtZWRpYSAobWluLXdpZHRoOjk5MnB4KXsubGlzdC1ncm91cC1ob3Jpem9udGFsLWxney1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93fS5saXN0LWdyb3VwLWhvcml6b250YWwtbGc+Lmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4yNXJlbTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5saXN0LWdyb3VwLWhvcml6b250YWwtbGc+Lmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxke2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOi4yNXJlbTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1sZz4ubGlzdC1ncm91cC1pdGVtLmFjdGl2ZXttYXJnaW4tdG9wOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC1sZz4ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW17Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLWxlZnQtd2lkdGg6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsLWxnPi5saXN0LWdyb3VwLWl0ZW0rLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLWxlZnQ6LTFweDtib3JkZXItbGVmdC13aWR0aDoxcHh9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC14bHstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvd30ubGlzdC1ncm91cC1ob3Jpem9udGFsLXhsPi5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czouMjVyZW07Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0ubGlzdC1ncm91cC1ob3Jpem9udGFsLXhsPi5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouMjVyZW07Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5saXN0LWdyb3VwLWhvcml6b250YWwteGw+Lmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmV7bWFyZ2luLXRvcDowfS5saXN0LWdyb3VwLWhvcml6b250YWwteGw+Lmxpc3QtZ3JvdXAtaXRlbSsubGlzdC1ncm91cC1pdGVte2JvcmRlci10b3Atd2lkdGg6MXB4O2JvcmRlci1sZWZ0LXdpZHRoOjB9Lmxpc3QtZ3JvdXAtaG9yaXpvbnRhbC14bD4ubGlzdC1ncm91cC1pdGVtKy5saXN0LWdyb3VwLWl0ZW0uYWN0aXZle21hcmdpbi1sZWZ0Oi0xcHg7Ym9yZGVyLWxlZnQtd2lkdGg6MXB4fX0ubGlzdC1ncm91cC1mbHVzaHtib3JkZXItcmFkaXVzOjB9Lmxpc3QtZ3JvdXAtZmx1c2g+Lmxpc3QtZ3JvdXAtaXRlbXtib3JkZXItd2lkdGg6MCAwIDFweH0ubGlzdC1ncm91cC1mbHVzaD4ubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbS13aWR0aDowfS5saXN0LWdyb3VwLWl0ZW0tcHJpbWFyeXtjb2xvcjojMDA0MDg1O2JhY2tncm91bmQtY29sb3I6I2I4ZGFmZn0ubGlzdC1ncm91cC1pdGVtLXByaW1hcnkubGlzdC1ncm91cC1pdGVtLWFjdGlvbjpmb2N1cywubGlzdC1ncm91cC1pdGVtLXByaW1hcnkubGlzdC1ncm91cC1pdGVtLWFjdGlvbjpob3Zlcntjb2xvcjojMDA0MDg1O2JhY2tncm91bmQtY29sb3I6IzlmY2RmZn0ubGlzdC1ncm91cC1pdGVtLXByaW1hcnkubGlzdC1ncm91cC1pdGVtLWFjdGlvbi5hY3RpdmV7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDQwODU7Ym9yZGVyLWNvbG9yOiMwMDQwODV9Lmxpc3QtZ3JvdXAtaXRlbS1zZWNvbmRhcnl7Y29sb3I6IzM4M2Q0MTtiYWNrZ3JvdW5kLWNvbG9yOiNkNmQ4ZGJ9Lmxpc3QtZ3JvdXAtaXRlbS1zZWNvbmRhcnkubGlzdC1ncm91cC1pdGVtLWFjdGlvbjpmb2N1cywubGlzdC1ncm91cC1pdGVtLXNlY29uZGFyeS5saXN0LWdyb3VwLWl0ZW0tYWN0aW9uOmhvdmVye2NvbG9yOiMzODNkNDE7YmFja2dyb3VuZC1jb2xvcjojYzhjYmNmfS5saXN0LWdyb3VwLWl0ZW0tc2Vjb25kYXJ5Lmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb24uYWN0aXZle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzgzZDQxO2JvcmRlci1jb2xvcjojMzgzZDQxfS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzc3tjb2xvcjojMTU1NzI0O2JhY2tncm91bmQtY29sb3I6I2MzZTZjYn0ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MubGlzdC1ncm91cC1pdGVtLWFjdGlvbjpmb2N1cywubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MubGlzdC1ncm91cC1pdGVtLWFjdGlvbjpob3Zlcntjb2xvcjojMTU1NzI0O2JhY2tncm91bmQtY29sb3I6I2IxZGZiYn0ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MubGlzdC1ncm91cC1pdGVtLWFjdGlvbi5hY3RpdmV7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMxNTU3MjQ7Ym9yZGVyLWNvbG9yOiMxNTU3MjR9Lmxpc3QtZ3JvdXAtaXRlbS1pbmZve2NvbG9yOiMwYzU0NjA7YmFja2dyb3VuZC1jb2xvcjojYmVlNWVifS5saXN0LWdyb3VwLWl0ZW0taW5mby5saXN0LWdyb3VwLWl0ZW0tYWN0aW9uOmZvY3VzLC5saXN0LWdyb3VwLWl0ZW0taW5mby5saXN0LWdyb3VwLWl0ZW0tYWN0aW9uOmhvdmVye2NvbG9yOiMwYzU0NjA7YmFja2dyb3VuZC1jb2xvcjojYWJkZGU1fS5saXN0LWdyb3VwLWl0ZW0taW5mby5saXN0LWdyb3VwLWl0ZW0tYWN0aW9uLmFjdGl2ZXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzBjNTQ2MDtib3JkZXItY29sb3I6IzBjNTQ2MH0ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmd7Y29sb3I6Izg1NjQwNDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmVlYmF9Lmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb246Zm9jdXMsLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb246aG92ZXJ7Y29sb3I6Izg1NjQwNDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmU4YTF9Lmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb24uYWN0aXZle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojODU2NDA0O2JvcmRlci1jb2xvcjojODU2NDA0fS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2Vye2NvbG9yOiM3MjFjMjQ7YmFja2dyb3VuZC1jb2xvcjojZjVjNmNifS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb246Zm9jdXMsLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIubGlzdC1ncm91cC1pdGVtLWFjdGlvbjpob3Zlcntjb2xvcjojNzIxYzI0O2JhY2tncm91bmQtY29sb3I6I2YxYjBiN30ubGlzdC1ncm91cC1pdGVtLWRhbmdlci5saXN0LWdyb3VwLWl0ZW0tYWN0aW9uLmFjdGl2ZXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzcyMWMyNDtib3JkZXItY29sb3I6IzcyMWMyNH0ubGlzdC1ncm91cC1pdGVtLWxpZ2h0e2NvbG9yOiM4MTgxODI7YmFja2dyb3VuZC1jb2xvcjojZmRmZGZlfS5saXN0LWdyb3VwLWl0ZW0tbGlnaHQubGlzdC1ncm91cC1pdGVtLWFjdGlvbjpmb2N1cywubGlzdC1ncm91cC1pdGVtLWxpZ2h0Lmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb246aG92ZXJ7Y29sb3I6IzgxODE4MjtiYWNrZ3JvdW5kLWNvbG9yOiNlY2VjZjZ9Lmxpc3QtZ3JvdXAtaXRlbS1saWdodC5saXN0LWdyb3VwLWl0ZW0tYWN0aW9uLmFjdGl2ZXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzgxODE4Mjtib3JkZXItY29sb3I6IzgxODE4Mn0ubGlzdC1ncm91cC1pdGVtLWRhcmt7Y29sb3I6IzFiMWUyMTtiYWNrZ3JvdW5kLWNvbG9yOiNjNmM4Y2F9Lmxpc3QtZ3JvdXAtaXRlbS1kYXJrLmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb246Zm9jdXMsLmxpc3QtZ3JvdXAtaXRlbS1kYXJrLmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb246aG92ZXJ7Y29sb3I6IzFiMWUyMTtiYWNrZ3JvdW5kLWNvbG9yOiNiOWJiYmV9Lmxpc3QtZ3JvdXAtaXRlbS1kYXJrLmxpc3QtZ3JvdXAtaXRlbS1hY3Rpb24uYWN0aXZle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMWIxZTIxO2JvcmRlci1jb2xvcjojMWIxZTIxfS5jbG9zZXtmbG9hdDpyaWdodDtmb250LXNpemU6MS41cmVtO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxO2NvbG9yOiMwMDA7dGV4dC1zaGFkb3c6MCAxcHggMCAjZmZmO29wYWNpdHk6LjV9LmNsb3NlOmhvdmVye2NvbG9yOiMwMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmNsb3NlOm5vdCg6ZGlzYWJsZWQpOm5vdCguZGlzYWJsZWQpOmZvY3VzLC5jbG9zZTpub3QoOmRpc2FibGVkKTpub3QoLmRpc2FibGVkKTpob3ZlcntvcGFjaXR5Oi43NX1idXR0b24uY2xvc2V7cGFkZGluZzowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjB9YS5jbG9zZS5kaXNhYmxlZHtwb2ludGVyLWV2ZW50czpub25lfS50b2FzdHstbXMtZmxleC1wcmVmZXJyZWQtc2l6ZTozNTBweDtmbGV4LWJhc2lzOjM1MHB4O21heC13aWR0aDozNTBweDtmb250LXNpemU6Ljg3NXJlbTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjg1KTtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xKTtib3gtc2hhZG93OjAgLjI1cmVtIC43NXJlbSByZ2JhKDAsMCwwLC4xKTtvcGFjaXR5OjA7Ym9yZGVyLXJhZGl1czouMjVyZW19LnRvYXN0Om5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWJvdHRvbTouNzVyZW19LnRvYXN0LnNob3dpbmd7b3BhY2l0eToxfS50b2FzdC5zaG93e2Rpc3BsYXk6YmxvY2s7b3BhY2l0eToxfS50b2FzdC5oaWRle2Rpc3BsYXk6bm9uZX0udG9hc3QtaGVhZGVye2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7cGFkZGluZzouMjVyZW0gLjc1cmVtO2NvbG9yOiM2Yzc1N2Q7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC44NSk7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA1KTtib3JkZXItdG9wLWxlZnQtcmFkaXVzOmNhbGMoLjI1cmVtIC0gMXB4KTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKC4yNXJlbSAtIDFweCl9LnRvYXN0LWJvZHl7cGFkZGluZzouNzVyZW19Lm1vZGFsLW9wZW57b3ZlcmZsb3c6aGlkZGVufS5tb2RhbC1vcGVuIC5tb2RhbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG99Lm1vZGFse3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt6LWluZGV4OjEwNTA7ZGlzcGxheTpub25lO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVuO291dGxpbmU6MH0ubW9kYWwtZGlhbG9ne3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOmF1dG87bWFyZ2luOi41cmVtO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1vZGFsLmZhZGUgLm1vZGFsLWRpYWxvZ3t0cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjNzIGVhc2Utb3V0LC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlLW91dDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoMCwtNTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSgwLC01MHB4KX1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246cmVkdWNlKXsubW9kYWwuZmFkZSAubW9kYWwtZGlhbG9ne3RyYW5zaXRpb246bm9uZX19Lm1vZGFsLnNob3cgLm1vZGFsLWRpYWxvZ3std2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfS5tb2RhbC5tb2RhbC1zdGF0aWMgLm1vZGFsLWRpYWxvZ3std2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjAyKTt0cmFuc2Zvcm06c2NhbGUoMS4wMil9Lm1vZGFsLWRpYWxvZy1zY3JvbGxhYmxle2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O21heC1oZWlnaHQ6Y2FsYygxMDAlIC0gMXJlbSl9Lm1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIC5tb2RhbC1jb250ZW50e21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDFyZW0pO292ZXJmbG93OmhpZGRlbn0ubW9kYWwtZGlhbG9nLXNjcm9sbGFibGUgLm1vZGFsLWZvb3RlciwubW9kYWwtZGlhbG9nLXNjcm9sbGFibGUgLm1vZGFsLWhlYWRlcnstbXMtZmxleC1uZWdhdGl2ZTowO2ZsZXgtc2hyaW5rOjB9Lm1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIC5tb2RhbC1ib2R5e292ZXJmbG93LXk6YXV0b30ubW9kYWwtZGlhbG9nLWNlbnRlcmVke2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7bWluLWhlaWdodDpjYWxjKDEwMCUgLSAxcmVtKX0ubW9kYWwtZGlhbG9nLWNlbnRlcmVkOjpiZWZvcmV7ZGlzcGxheTpibG9jaztoZWlnaHQ6Y2FsYygxMDB2aCAtIDFyZW0pO2hlaWdodDotd2Via2l0LW1pbi1jb250ZW50O2hlaWdodDotbW96LW1pbi1jb250ZW50O2hlaWdodDptaW4tY29udGVudDtjb250ZW50OiIifS5tb2RhbC1kaWFsb2ctY2VudGVyZWQubW9kYWwtZGlhbG9nLXNjcm9sbGFibGV7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtoZWlnaHQ6MTAwJX0ubW9kYWwtZGlhbG9nLWNlbnRlcmVkLm1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIC5tb2RhbC1jb250ZW50e21heC1oZWlnaHQ6bm9uZX0ubW9kYWwtZGlhbG9nLWNlbnRlcmVkLm1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlOjpiZWZvcmV7Y29udGVudDpub25lfS5tb2RhbC1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjEwMCU7cG9pbnRlci1ldmVudHM6YXV0bztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMik7Ym9yZGVyLXJhZGl1czouM3JlbTtvdXRsaW5lOjB9Lm1vZGFsLWJhY2tkcm9we3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt6LWluZGV4OjEwNDA7d2lkdGg6MTAwdnc7aGVpZ2h0OjEwMHZoO2JhY2tncm91bmQtY29sb3I6IzAwMH0ubW9kYWwtYmFja2Ryb3AuZmFkZXtvcGFjaXR5OjB9Lm1vZGFsLWJhY2tkcm9wLnNob3d7b3BhY2l0eTouNX0ubW9kYWwtaGVhZGVye2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWFsaWduOnN0YXJ0O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7LW1zLWZsZXgtcGFjazpqdXN0aWZ5O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmc6MXJlbSAxcmVtO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZWUyZTY7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czpjYWxjKC4zcmVtIC0gMXB4KTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKC4zcmVtIC0gMXB4KX0ubW9kYWwtaGVhZGVyIC5jbG9zZXtwYWRkaW5nOjFyZW0gMXJlbTttYXJnaW46LTFyZW0gLTFyZW0gLTFyZW0gYXV0b30ubW9kYWwtdGl0bGV7bWFyZ2luLWJvdHRvbTowO2xpbmUtaGVpZ2h0OjEuNX0ubW9kYWwtYm9keXtwb3NpdGlvbjpyZWxhdGl2ZTstbXMtZmxleDoxIDEgYXV0bztmbGV4OjEgMSBhdXRvO3BhZGRpbmc6MXJlbX0ubW9kYWwtZm9vdGVye2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcDstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LXBhY2s6ZW5kO2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtwYWRkaW5nOi43NXJlbTtib3JkZXItdG9wOjFweCBzb2xpZCAjZGVlMmU2O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOmNhbGMoLjNyZW0gLSAxcHgpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6Y2FsYyguM3JlbSAtIDFweCl9Lm1vZGFsLWZvb3Rlcj4qe21hcmdpbjouMjVyZW19Lm1vZGFsLXNjcm9sbGJhci1tZWFzdXJle3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6c2Nyb2xsfUBtZWRpYSAobWluLXdpZHRoOjU3NnB4KXsubW9kYWwtZGlhbG9ne21heC13aWR0aDo1MDBweDttYXJnaW46MS43NXJlbSBhdXRvfS5tb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZXttYXgtaGVpZ2h0OmNhbGMoMTAwJSAtIDMuNXJlbSl9Lm1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlIC5tb2RhbC1jb250ZW50e21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDMuNXJlbSl9Lm1vZGFsLWRpYWxvZy1jZW50ZXJlZHttaW4taGVpZ2h0OmNhbGMoMTAwJSAtIDMuNXJlbSl9Lm1vZGFsLWRpYWxvZy1jZW50ZXJlZDo6YmVmb3Jle2hlaWdodDpjYWxjKDEwMHZoIC0gMy41cmVtKTtoZWlnaHQ6LXdlYmtpdC1taW4tY29udGVudDtoZWlnaHQ6LW1vei1taW4tY29udGVudDtoZWlnaHQ6bWluLWNvbnRlbnR9Lm1vZGFsLXNte21heC13aWR0aDozMDBweH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5tb2RhbC1sZywubW9kYWwteGx7bWF4LXdpZHRoOjgwMHB4fX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey5tb2RhbC14bHttYXgtd2lkdGg6MTE0MHB4fX0udG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwNzA7ZGlzcGxheTpibG9jazttYXJnaW46MDtmb250LWZhbWlseTotYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwiU2Vnb2UgVUkiLFJvYm90bywiSGVsdmV0aWNhIE5ldWUiLEFyaWFsLCJOb3RvIFNhbnMiLHNhbnMtc2VyaWYsIkFwcGxlIENvbG9yIEVtb2ppIiwiU2Vnb2UgVUkgRW1vamkiLCJTZWdvZSBVSSBTeW1ib2wiLCJOb3RvIENvbG9yIEVtb2ppIjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS41O3RleHQtYWxpZ246bGVmdDt0ZXh0LWFsaWduOnN0YXJ0O3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtc2hhZG93Om5vbmU7dGV4dC10cmFuc2Zvcm06bm9uZTtsZXR0ZXItc3BhY2luZzpub3JtYWw7d29yZC1icmVhazpub3JtYWw7d29yZC1zcGFjaW5nOm5vcm1hbDt3aGl0ZS1zcGFjZTpub3JtYWw7bGluZS1icmVhazphdXRvO2ZvbnQtc2l6ZTouODc1cmVtO3dvcmQtd3JhcDpicmVhay13b3JkO29wYWNpdHk6MH0udG9vbHRpcC5zaG93e29wYWNpdHk6Ljl9LnRvb2x0aXAgLmFycm93e3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7d2lkdGg6LjhyZW07aGVpZ2h0Oi40cmVtfS50b29sdGlwIC5hcnJvdzo6YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6IiI7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1zdHlsZTpzb2xpZH0uYnMtdG9vbHRpcC1hdXRvW3gtcGxhY2VtZW50Xj10b3BdLC5icy10b29sdGlwLXRvcHtwYWRkaW5nOi40cmVtIDB9LmJzLXRvb2x0aXAtYXV0b1t4LXBsYWNlbWVudF49dG9wXSAuYXJyb3csLmJzLXRvb2x0aXAtdG9wIC5hcnJvd3tib3R0b206MH0uYnMtdG9vbHRpcC1hdXRvW3gtcGxhY2VtZW50Xj10b3BdIC5hcnJvdzo6YmVmb3JlLC5icy10b29sdGlwLXRvcCAuYXJyb3c6OmJlZm9yZXt0b3A6MDtib3JkZXItd2lkdGg6LjRyZW0gLjRyZW0gMDtib3JkZXItdG9wLWNvbG9yOiMwMDB9LmJzLXRvb2x0aXAtYXV0b1t4LXBsYWNlbWVudF49cmlnaHRdLC5icy10b29sdGlwLXJpZ2h0e3BhZGRpbmc6MCAuNHJlbX0uYnMtdG9vbHRpcC1hdXRvW3gtcGxhY2VtZW50Xj1yaWdodF0gLmFycm93LC5icy10b29sdGlwLXJpZ2h0IC5hcnJvd3tsZWZ0OjA7d2lkdGg6LjRyZW07aGVpZ2h0Oi44cmVtfS5icy10b29sdGlwLWF1dG9beC1wbGFjZW1lbnRePXJpZ2h0XSAuYXJyb3c6OmJlZm9yZSwuYnMtdG9vbHRpcC1yaWdodCAuYXJyb3c6OmJlZm9yZXtyaWdodDowO2JvcmRlci13aWR0aDouNHJlbSAuNHJlbSAuNHJlbSAwO2JvcmRlci1yaWdodC1jb2xvcjojMDAwfS5icy10b29sdGlwLWF1dG9beC1wbGFjZW1lbnRePWJvdHRvbV0sLmJzLXRvb2x0aXAtYm90dG9te3BhZGRpbmc6LjRyZW0gMH0uYnMtdG9vbHRpcC1hdXRvW3gtcGxhY2VtZW50Xj1ib3R0b21dIC5hcnJvdywuYnMtdG9vbHRpcC1ib3R0b20gLmFycm93e3RvcDowfS5icy10b29sdGlwLWF1dG9beC1wbGFjZW1lbnRePWJvdHRvbV0gLmFycm93OjpiZWZvcmUsLmJzLXRvb2x0aXAtYm90dG9tIC5hcnJvdzo6YmVmb3Jle2JvdHRvbTowO2JvcmRlci13aWR0aDowIC40cmVtIC40cmVtO2JvcmRlci1ib3R0b20tY29sb3I6IzAwMH0uYnMtdG9vbHRpcC1hdXRvW3gtcGxhY2VtZW50Xj1sZWZ0XSwuYnMtdG9vbHRpcC1sZWZ0e3BhZGRpbmc6MCAuNHJlbX0uYnMtdG9vbHRpcC1hdXRvW3gtcGxhY2VtZW50Xj1sZWZ0XSAuYXJyb3csLmJzLXRvb2x0aXAtbGVmdCAuYXJyb3d7cmlnaHQ6MDt3aWR0aDouNHJlbTtoZWlnaHQ6LjhyZW19LmJzLXRvb2x0aXAtYXV0b1t4LXBsYWNlbWVudF49bGVmdF0gLmFycm93OjpiZWZvcmUsLmJzLXRvb2x0aXAtbGVmdCAuYXJyb3c6OmJlZm9yZXtsZWZ0OjA7Ym9yZGVyLXdpZHRoOi40cmVtIDAgLjRyZW0gLjRyZW07Ym9yZGVyLWxlZnQtY29sb3I6IzAwMH0udG9vbHRpcC1pbm5lcnttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzouMjVyZW0gLjVyZW07Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7Ym9yZGVyLXJhZGl1czouMjVyZW19LnBvcG92ZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3otaW5kZXg6MTA2MDtkaXNwbGF5OmJsb2NrO21heC13aWR0aDoyNzZweDtmb250LWZhbWlseTotYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwiU2Vnb2UgVUkiLFJvYm90bywiSGVsdmV0aWNhIE5ldWUiLEFyaWFsLCJOb3RvIFNhbnMiLHNhbnMtc2VyaWYsIkFwcGxlIENvbG9yIEVtb2ppIiwiU2Vnb2UgVUkgRW1vamkiLCJTZWdvZSBVSSBTeW1ib2wiLCJOb3RvIENvbG9yIEVtb2ppIjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS41O3RleHQtYWxpZ246bGVmdDt0ZXh0LWFsaWduOnN0YXJ0O3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtc2hhZG93Om5vbmU7dGV4dC10cmFuc2Zvcm06bm9uZTtsZXR0ZXItc3BhY2luZzpub3JtYWw7d29yZC1icmVhazpub3JtYWw7d29yZC1zcGFjaW5nOm5vcm1hbDt3aGl0ZS1zcGFjZTpub3JtYWw7bGluZS1icmVhazphdXRvO2ZvbnQtc2l6ZTouODc1cmVtO3dvcmQtd3JhcDpicmVhay13b3JkO2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTtib3JkZXItcmFkaXVzOi4zcmVtfS5wb3BvdmVyIC5hcnJvd3twb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO3dpZHRoOjFyZW07aGVpZ2h0Oi41cmVtO21hcmdpbjowIC4zcmVtfS5wb3BvdmVyIC5hcnJvdzo6YWZ0ZXIsLnBvcG92ZXIgLmFycm93OjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jaztjb250ZW50OiIiO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWR9LmJzLXBvcG92ZXItYXV0b1t4LXBsYWNlbWVudF49dG9wXSwuYnMtcG9wb3Zlci10b3B7bWFyZ2luLWJvdHRvbTouNXJlbX0uYnMtcG9wb3Zlci1hdXRvW3gtcGxhY2VtZW50Xj10b3BdPi5hcnJvdywuYnMtcG9wb3Zlci10b3A+LmFycm93e2JvdHRvbTpjYWxjKC0uNXJlbSAtIDFweCl9LmJzLXBvcG92ZXItYXV0b1t4LXBsYWNlbWVudF49dG9wXT4uYXJyb3c6OmJlZm9yZSwuYnMtcG9wb3Zlci10b3A+LmFycm93OjpiZWZvcmV7Ym90dG9tOjA7Ym9yZGVyLXdpZHRoOi41cmVtIC41cmVtIDA7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9LmJzLXBvcG92ZXItYXV0b1t4LXBsYWNlbWVudF49dG9wXT4uYXJyb3c6OmFmdGVyLC5icy1wb3BvdmVyLXRvcD4uYXJyb3c6OmFmdGVye2JvdHRvbToxcHg7Ym9yZGVyLXdpZHRoOi41cmVtIC41cmVtIDA7Ym9yZGVyLXRvcC1jb2xvcjojZmZmfS5icy1wb3BvdmVyLWF1dG9beC1wbGFjZW1lbnRePXJpZ2h0XSwuYnMtcG9wb3Zlci1yaWdodHttYXJnaW4tbGVmdDouNXJlbX0uYnMtcG9wb3Zlci1hdXRvW3gtcGxhY2VtZW50Xj1yaWdodF0+LmFycm93LC5icy1wb3BvdmVyLXJpZ2h0Pi5hcnJvd3tsZWZ0OmNhbGMoLS41cmVtIC0gMXB4KTt3aWR0aDouNXJlbTtoZWlnaHQ6MXJlbTttYXJnaW46LjNyZW0gMH0uYnMtcG9wb3Zlci1hdXRvW3gtcGxhY2VtZW50Xj1yaWdodF0+LmFycm93OjpiZWZvcmUsLmJzLXBvcG92ZXItcmlnaHQ+LmFycm93OjpiZWZvcmV7bGVmdDowO2JvcmRlci13aWR0aDouNXJlbSAuNXJlbSAuNXJlbSAwO2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9LmJzLXBvcG92ZXItYXV0b1t4LXBsYWNlbWVudF49cmlnaHRdPi5hcnJvdzo6YWZ0ZXIsLmJzLXBvcG92ZXItcmlnaHQ+LmFycm93OjphZnRlcntsZWZ0OjFweDtib3JkZXItd2lkdGg6LjVyZW0gLjVyZW0gLjVyZW0gMDtib3JkZXItcmlnaHQtY29sb3I6I2ZmZn0uYnMtcG9wb3Zlci1hdXRvW3gtcGxhY2VtZW50Xj1ib3R0b21dLC5icy1wb3BvdmVyLWJvdHRvbXttYXJnaW4tdG9wOi41cmVtfS5icy1wb3BvdmVyLWF1dG9beC1wbGFjZW1lbnRePWJvdHRvbV0+LmFycm93LC5icy1wb3BvdmVyLWJvdHRvbT4uYXJyb3d7dG9wOmNhbGMoLS41cmVtIC0gMXB4KX0uYnMtcG9wb3Zlci1hdXRvW3gtcGxhY2VtZW50Xj1ib3R0b21dPi5hcnJvdzo6YmVmb3JlLC5icy1wb3BvdmVyLWJvdHRvbT4uYXJyb3c6OmJlZm9yZXt0b3A6MDtib3JkZXItd2lkdGg6MCAuNXJlbSAuNXJlbSAuNXJlbTtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjI1KX0uYnMtcG9wb3Zlci1hdXRvW3gtcGxhY2VtZW50Xj1ib3R0b21dPi5hcnJvdzo6YWZ0ZXIsLmJzLXBvcG92ZXItYm90dG9tPi5hcnJvdzo6YWZ0ZXJ7dG9wOjFweDtib3JkZXItd2lkdGg6MCAuNXJlbSAuNXJlbSAuNXJlbTtib3JkZXItYm90dG9tLWNvbG9yOiNmZmZ9LmJzLXBvcG92ZXItYXV0b1t4LXBsYWNlbWVudF49Ym90dG9tXSAucG9wb3Zlci1oZWFkZXI6OmJlZm9yZSwuYnMtcG9wb3Zlci1ib3R0b20gLnBvcG92ZXItaGVhZGVyOjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDo1MCU7ZGlzcGxheTpibG9jazt3aWR0aDoxcmVtO21hcmdpbi1sZWZ0Oi0uNXJlbTtjb250ZW50OiIiO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmN2Y3Zjd9LmJzLXBvcG92ZXItYXV0b1t4LXBsYWNlbWVudF49bGVmdF0sLmJzLXBvcG92ZXItbGVmdHttYXJnaW4tcmlnaHQ6LjVyZW19LmJzLXBvcG92ZXItYXV0b1t4LXBsYWNlbWVudF49bGVmdF0+LmFycm93LC5icy1wb3BvdmVyLWxlZnQ+LmFycm93e3JpZ2h0OmNhbGMoLS41cmVtIC0gMXB4KTt3aWR0aDouNXJlbTtoZWlnaHQ6MXJlbTttYXJnaW46LjNyZW0gMH0uYnMtcG9wb3Zlci1hdXRvW3gtcGxhY2VtZW50Xj1sZWZ0XT4uYXJyb3c6OmJlZm9yZSwuYnMtcG9wb3Zlci1sZWZ0Pi5hcnJvdzo6YmVmb3Jle3JpZ2h0OjA7Ym9yZGVyLXdpZHRoOi41cmVtIDAgLjVyZW0gLjVyZW07Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMjUpfS5icy1wb3BvdmVyLWF1dG9beC1wbGFjZW1lbnRePWxlZnRdPi5hcnJvdzo6YWZ0ZXIsLmJzLXBvcG92ZXItbGVmdD4uYXJyb3c6OmFmdGVye3JpZ2h0OjFweDtib3JkZXItd2lkdGg6LjVyZW0gMCAuNXJlbSAuNXJlbTtib3JkZXItbGVmdC1jb2xvcjojZmZmfS5wb3BvdmVyLWhlYWRlcntwYWRkaW5nOi41cmVtIC43NXJlbTttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjFyZW07YmFja2dyb3VuZC1jb2xvcjojZjdmN2Y3O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czpjYWxjKC4zcmVtIC0gMXB4KTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKC4zcmVtIC0gMXB4KX0ucG9wb3Zlci1oZWFkZXI6ZW1wdHl7ZGlzcGxheTpub25lfS5wb3BvdmVyLWJvZHl7cGFkZGluZzouNXJlbSAuNzVyZW07Y29sb3I6IzIxMjUyOX0uY2Fyb3VzZWx7cG9zaXRpb246cmVsYXRpdmV9LmNhcm91c2VsLnBvaW50ZXItZXZlbnR7LW1zLXRvdWNoLWFjdGlvbjpwYW4teTt0b3VjaC1hY3Rpb246cGFuLXl9LmNhcm91c2VsLWlubmVye3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVufS5jYXJvdXNlbC1pbm5lcjo6YWZ0ZXJ7ZGlzcGxheTpibG9jaztjbGVhcjpib3RoO2NvbnRlbnQ6IiJ9LmNhcm91c2VsLWl0ZW17cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpub25lO2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJTttYXJnaW4tcmlnaHQ6LTEwMCU7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjt0cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC42cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0LC13ZWJraXQtdHJhbnNmb3JtIC42cyBlYXNlLWluLW91dH1AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246cmVkdWNlKXsuY2Fyb3VzZWwtaXRlbXt0cmFuc2l0aW9uOm5vbmV9fS5jYXJvdXNlbC1pdGVtLW5leHQsLmNhcm91c2VsLWl0ZW0tcHJldiwuY2Fyb3VzZWwtaXRlbS5hY3RpdmV7ZGlzcGxheTpibG9ja30uYWN0aXZlLmNhcm91c2VsLWl0ZW0tcmlnaHQsLmNhcm91c2VsLWl0ZW0tbmV4dDpub3QoLmNhcm91c2VsLWl0ZW0tbGVmdCl7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKX0uYWN0aXZlLmNhcm91c2VsLWl0ZW0tbGVmdCwuY2Fyb3VzZWwtaXRlbS1wcmV2Om5vdCguY2Fyb3VzZWwtaXRlbS1yaWdodCl7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpfS5jYXJvdXNlbC1mYWRlIC5jYXJvdXNlbC1pdGVte29wYWNpdHk6MDt0cmFuc2l0aW9uLXByb3BlcnR5Om9wYWNpdHk7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX0uY2Fyb3VzZWwtZmFkZSAuY2Fyb3VzZWwtaXRlbS1uZXh0LmNhcm91c2VsLWl0ZW0tbGVmdCwuY2Fyb3VzZWwtZmFkZSAuY2Fyb3VzZWwtaXRlbS1wcmV2LmNhcm91c2VsLWl0ZW0tcmlnaHQsLmNhcm91c2VsLWZhZGUgLmNhcm91c2VsLWl0ZW0uYWN0aXZle3otaW5kZXg6MTtvcGFjaXR5OjF9LmNhcm91c2VsLWZhZGUgLmFjdGl2ZS5jYXJvdXNlbC1pdGVtLWxlZnQsLmNhcm91c2VsLWZhZGUgLmFjdGl2ZS5jYXJvdXNlbC1pdGVtLXJpZ2h0e3otaW5kZXg6MDtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDBzIC42c31AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246cmVkdWNlKXsuY2Fyb3VzZWwtZmFkZSAuYWN0aXZlLmNhcm91c2VsLWl0ZW0tbGVmdCwuY2Fyb3VzZWwtZmFkZSAuYWN0aXZlLmNhcm91c2VsLWl0ZW0tcmlnaHR7dHJhbnNpdGlvbjpub25lfX0uY2Fyb3VzZWwtY29udHJvbC1uZXh0LC5jYXJvdXNlbC1jb250cm9sLXByZXZ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7ei1pbmRleDoxO2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoxNSU7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtvcGFjaXR5Oi41O3RyYW5zaXRpb246b3BhY2l0eSAuMTVzIGVhc2V9QG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOnJlZHVjZSl7LmNhcm91c2VsLWNvbnRyb2wtbmV4dCwuY2Fyb3VzZWwtY29udHJvbC1wcmV2e3RyYW5zaXRpb246bm9uZX19LmNhcm91c2VsLWNvbnRyb2wtbmV4dDpmb2N1cywuY2Fyb3VzZWwtY29udHJvbC1uZXh0OmhvdmVyLC5jYXJvdXNlbC1jb250cm9sLXByZXY6Zm9jdXMsLmNhcm91c2VsLWNvbnRyb2wtcHJldjpob3Zlcntjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO291dGxpbmU6MDtvcGFjaXR5Oi45fS5jYXJvdXNlbC1jb250cm9sLXByZXZ7bGVmdDowfS5jYXJvdXNlbC1jb250cm9sLW5leHR7cmlnaHQ6MH0uY2Fyb3VzZWwtY29udHJvbC1uZXh0LWljb24sLmNhcm91c2VsLWNvbnRyb2wtcHJldi1pY29ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7YmFja2dyb3VuZDpuby1yZXBlYXQgNTAlLzEwMCUgMTAwJX0uY2Fyb3VzZWwtY29udHJvbC1wcmV2LWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM2NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyBmaWxsPSclMjNmZmYnIHdpZHRoPSc4JyBoZWlnaHQ9JzgnIHZpZXdCb3g9JzAgMCA4IDgnJTNlJTNjcGF0aCBkPSdNNS4yNSAwbC00IDQgNCA0IDEuNS0xLjVMNC4yNSA0bDIuNS0yLjVMNS4yNSAweicvJTNlJTNjL3N2ZyUzZSIpfS5jYXJvdXNlbC1jb250cm9sLW5leHQtaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzY3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9JyUyM2ZmZicgd2lkdGg9JzgnIGhlaWdodD0nOCcgdmlld0JveD0nMCAwIDggOCclM2UlM2NwYXRoIGQ9J00yLjc1IDBsLTEuNSAxLjVMMy43NSA0bC0yLjUgMi41TDIuNzUgOGw0LTQtNC00eicvJTNlJTNjL3N2ZyUzZSIpfS5jYXJvdXNlbC1pbmRpY2F0b3Jze3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3otaW5kZXg6MTU7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MTUlO21hcmdpbi1sZWZ0OjE1JTtsaXN0LXN0eWxlOm5vbmV9LmNhcm91c2VsLWluZGljYXRvcnMgbGl7Ym94LXNpemluZzpjb250ZW50LWJveDstbXMtZmxleDowIDEgYXV0bztmbGV4OjAgMSBhdXRvO3dpZHRoOjMwcHg7aGVpZ2h0OjNweDttYXJnaW4tcmlnaHQ6M3B4O21hcmdpbi1sZWZ0OjNweDt0ZXh0LWluZGVudDotOTk5cHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtib3JkZXItdG9wOjEwcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbToxMHB4IHNvbGlkIHRyYW5zcGFyZW50O29wYWNpdHk6LjU7dHJhbnNpdGlvbjpvcGFjaXR5IC42cyBlYXNlfUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjpyZWR1Y2Upey5jYXJvdXNlbC1pbmRpY2F0b3JzIGxpe3RyYW5zaXRpb246bm9uZX19LmNhcm91c2VsLWluZGljYXRvcnMgLmFjdGl2ZXtvcGFjaXR5OjF9LmNhcm91c2VsLWNhcHRpb257cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTUlO2JvdHRvbToyMHB4O2xlZnQ6MTUlO3otaW5kZXg6MTA7cGFkZGluZy10b3A6MjBweDtwYWRkaW5nLWJvdHRvbToyMHB4O2NvbG9yOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXJ9QC13ZWJraXQta2V5ZnJhbWVzIHNwaW5uZXItYm9yZGVye3Rvey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBzcGlubmVyLWJvcmRlcnt0b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS5zcGlubmVyLWJvcmRlcntkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoycmVtO2hlaWdodDoycmVtO3ZlcnRpY2FsLWFsaWduOnRleHQtYm90dG9tO2JvcmRlcjouMjVlbSBzb2xpZCBjdXJyZW50Q29sb3I7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NTAlOy13ZWJraXQtYW5pbWF0aW9uOnNwaW5uZXItYm9yZGVyIC43NXMgbGluZWFyIGluZmluaXRlO2FuaW1hdGlvbjpzcGlubmVyLWJvcmRlciAuNzVzIGxpbmVhciBpbmZpbml0ZX0uc3Bpbm5lci1ib3JkZXItc217d2lkdGg6MXJlbTtoZWlnaHQ6MXJlbTtib3JkZXItd2lkdGg6LjJlbX1ALXdlYmtpdC1rZXlmcmFtZXMgc3Bpbm5lci1ncm93ezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX01MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgc3Bpbm5lci1ncm93ezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX01MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5zcGlubmVyLWdyb3d7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MnJlbTtoZWlnaHQ6MnJlbTt2ZXJ0aWNhbC1hbGlnbjp0ZXh0LWJvdHRvbTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcjtib3JkZXItcmFkaXVzOjUwJTtvcGFjaXR5OjA7LXdlYmtpdC1hbmltYXRpb246c3Bpbm5lci1ncm93IC43NXMgbGluZWFyIGluZmluaXRlO2FuaW1hdGlvbjpzcGlubmVyLWdyb3cgLjc1cyBsaW5lYXIgaW5maW5pdGV9LnNwaW5uZXItZ3Jvdy1zbXt3aWR0aDoxcmVtO2hlaWdodDoxcmVtfS5hbGlnbi1iYXNlbGluZXt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZSFpbXBvcnRhbnR9LmFsaWduLXRvcHt2ZXJ0aWNhbC1hbGlnbjp0b3AhaW1wb3J0YW50fS5hbGlnbi1taWRkbGV7dmVydGljYWwtYWxpZ246bWlkZGxlIWltcG9ydGFudH0uYWxpZ24tYm90dG9te3ZlcnRpY2FsLWFsaWduOmJvdHRvbSFpbXBvcnRhbnR9LmFsaWduLXRleHQtYm90dG9te3ZlcnRpY2FsLWFsaWduOnRleHQtYm90dG9tIWltcG9ydGFudH0uYWxpZ24tdGV4dC10b3B7dmVydGljYWwtYWxpZ246dGV4dC10b3AhaW1wb3J0YW50fS5iZy1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6IzAwN2JmZiFpbXBvcnRhbnR9YS5iZy1wcmltYXJ5OmZvY3VzLGEuYmctcHJpbWFyeTpob3ZlcixidXR0b24uYmctcHJpbWFyeTpmb2N1cyxidXR0b24uYmctcHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMDYyY2MhaW1wb3J0YW50fS5iZy1zZWNvbmRhcnl7YmFja2dyb3VuZC1jb2xvcjojNmM3NTdkIWltcG9ydGFudH1hLmJnLXNlY29uZGFyeTpmb2N1cyxhLmJnLXNlY29uZGFyeTpob3ZlcixidXR0b24uYmctc2Vjb25kYXJ5OmZvY3VzLGJ1dHRvbi5iZy1zZWNvbmRhcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNTQ1YjYyIWltcG9ydGFudH0uYmctc3VjY2Vzc3tiYWNrZ3JvdW5kLWNvbG9yOiMyOGE3NDUhaW1wb3J0YW50fWEuYmctc3VjY2Vzczpmb2N1cyxhLmJnLXN1Y2Nlc3M6aG92ZXIsYnV0dG9uLmJnLXN1Y2Nlc3M6Zm9jdXMsYnV0dG9uLmJnLXN1Y2Nlc3M6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMWU3ZTM0IWltcG9ydGFudH0uYmctaW5mb3tiYWNrZ3JvdW5kLWNvbG9yOiMxN2EyYjghaW1wb3J0YW50fWEuYmctaW5mbzpmb2N1cyxhLmJnLWluZm86aG92ZXIsYnV0dG9uLmJnLWluZm86Zm9jdXMsYnV0dG9uLmJnLWluZm86aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMTE3YThiIWltcG9ydGFudH0uYmctd2FybmluZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmZmMxMDchaW1wb3J0YW50fWEuYmctd2FybmluZzpmb2N1cyxhLmJnLXdhcm5pbmc6aG92ZXIsYnV0dG9uLmJnLXdhcm5pbmc6Zm9jdXMsYnV0dG9uLmJnLXdhcm5pbmc6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZDM5ZTAwIWltcG9ydGFudH0uYmctZGFuZ2Vye2JhY2tncm91bmQtY29sb3I6I2RjMzU0NSFpbXBvcnRhbnR9YS5iZy1kYW5nZXI6Zm9jdXMsYS5iZy1kYW5nZXI6aG92ZXIsYnV0dG9uLmJnLWRhbmdlcjpmb2N1cyxidXR0b24uYmctZGFuZ2VyOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2JkMjEzMCFpbXBvcnRhbnR9LmJnLWxpZ2h0e2JhY2tncm91bmQtY29sb3I6I2Y4ZjlmYSFpbXBvcnRhbnR9YS5iZy1saWdodDpmb2N1cyxhLmJnLWxpZ2h0OmhvdmVyLGJ1dHRvbi5iZy1saWdodDpmb2N1cyxidXR0b24uYmctbGlnaHQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZGFlMGU1IWltcG9ydGFudH0uYmctZGFya3tiYWNrZ3JvdW5kLWNvbG9yOiMzNDNhNDAhaW1wb3J0YW50fWEuYmctZGFyazpmb2N1cyxhLmJnLWRhcms6aG92ZXIsYnV0dG9uLmJnLWRhcms6Zm9jdXMsYnV0dG9uLmJnLWRhcms6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMWQyMTI0IWltcG9ydGFudH0uYmctd2hpdGV7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudH0uYmctdHJhbnNwYXJlbnR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LmJvcmRlcntib3JkZXI6MXB4IHNvbGlkICNkZWUyZTYhaW1wb3J0YW50fS5ib3JkZXItdG9we2JvcmRlci10b3A6MXB4IHNvbGlkICNkZWUyZTYhaW1wb3J0YW50fS5ib3JkZXItcmlnaHR7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZGVlMmU2IWltcG9ydGFudH0uYm9yZGVyLWJvdHRvbXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGVlMmU2IWltcG9ydGFudH0uYm9yZGVyLWxlZnR7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZWUyZTYhaW1wb3J0YW50fS5ib3JkZXItMHtib3JkZXI6MCFpbXBvcnRhbnR9LmJvcmRlci10b3AtMHtib3JkZXItdG9wOjAhaW1wb3J0YW50fS5ib3JkZXItcmlnaHQtMHtib3JkZXItcmlnaHQ6MCFpbXBvcnRhbnR9LmJvcmRlci1ib3R0b20tMHtib3JkZXItYm90dG9tOjAhaW1wb3J0YW50fS5ib3JkZXItbGVmdC0we2JvcmRlci1sZWZ0OjAhaW1wb3J0YW50fS5ib3JkZXItcHJpbWFyeXtib3JkZXItY29sb3I6IzAwN2JmZiFpbXBvcnRhbnR9LmJvcmRlci1zZWNvbmRhcnl7Ym9yZGVyLWNvbG9yOiM2Yzc1N2QhaW1wb3J0YW50fS5ib3JkZXItc3VjY2Vzc3tib3JkZXItY29sb3I6IzI4YTc0NSFpbXBvcnRhbnR9LmJvcmRlci1pbmZve2JvcmRlci1jb2xvcjojMTdhMmI4IWltcG9ydGFudH0uYm9yZGVyLXdhcm5pbmd7Ym9yZGVyLWNvbG9yOiNmZmMxMDchaW1wb3J0YW50fS5ib3JkZXItZGFuZ2Vye2JvcmRlci1jb2xvcjojZGMzNTQ1IWltcG9ydGFudH0uYm9yZGVyLWxpZ2h0e2JvcmRlci1jb2xvcjojZjhmOWZhIWltcG9ydGFudH0uYm9yZGVyLWRhcmt7Ym9yZGVyLWNvbG9yOiMzNDNhNDAhaW1wb3J0YW50fS5ib3JkZXItd2hpdGV7Ym9yZGVyLWNvbG9yOiNmZmYhaW1wb3J0YW50fS5yb3VuZGVkLXNte2JvcmRlci1yYWRpdXM6LjJyZW0haW1wb3J0YW50fS5yb3VuZGVke2JvcmRlci1yYWRpdXM6LjI1cmVtIWltcG9ydGFudH0ucm91bmRlZC10b3B7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czouMjVyZW0haW1wb3J0YW50O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOi4yNXJlbSFpbXBvcnRhbnR9LnJvdW5kZWQtcmlnaHR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6LjI1cmVtIWltcG9ydGFudDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czouMjVyZW0haW1wb3J0YW50fS5yb3VuZGVkLWJvdHRvbXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czouMjVyZW0haW1wb3J0YW50O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6LjI1cmVtIWltcG9ydGFudH0ucm91bmRlZC1sZWZ0e2JvcmRlci10b3AtbGVmdC1yYWRpdXM6LjI1cmVtIWltcG9ydGFudDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4yNXJlbSFpbXBvcnRhbnR9LnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czouM3JlbSFpbXBvcnRhbnR9LnJvdW5kZWQtY2lyY2xle2JvcmRlci1yYWRpdXM6NTAlIWltcG9ydGFudH0ucm91bmRlZC1waWxse2JvcmRlci1yYWRpdXM6NTByZW0haW1wb3J0YW50fS5yb3VuZGVkLTB7Ym9yZGVyLXJhZGl1czowIWltcG9ydGFudH0uY2xlYXJmaXg6OmFmdGVye2Rpc3BsYXk6YmxvY2s7Y2xlYXI6Ym90aDtjb250ZW50OiIifS5kLW5vbmV7ZGlzcGxheTpub25lIWltcG9ydGFudH0uZC1pbmxpbmV7ZGlzcGxheTppbmxpbmUhaW1wb3J0YW50fS5kLWlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9jayFpbXBvcnRhbnR9LmQtYmxvY2t7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9LmQtdGFibGV7ZGlzcGxheTp0YWJsZSFpbXBvcnRhbnR9LmQtdGFibGUtcm93e2Rpc3BsYXk6dGFibGUtcm93IWltcG9ydGFudH0uZC10YWJsZS1jZWxse2Rpc3BsYXk6dGFibGUtY2VsbCFpbXBvcnRhbnR9LmQtZmxleHtkaXNwbGF5Oi1tcy1mbGV4Ym94IWltcG9ydGFudDtkaXNwbGF5OmZsZXghaW1wb3J0YW50fS5kLWlubGluZS1mbGV4e2Rpc3BsYXk6LW1zLWlubGluZS1mbGV4Ym94IWltcG9ydGFudDtkaXNwbGF5OmlubGluZS1mbGV4IWltcG9ydGFudH1AbWVkaWEgKG1pbi13aWR0aDo1NzZweCl7LmQtc20tbm9uZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS5kLXNtLWlubGluZXtkaXNwbGF5OmlubGluZSFpbXBvcnRhbnR9LmQtc20taW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudH0uZC1zbS1ibG9ja3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH0uZC1zbS10YWJsZXtkaXNwbGF5OnRhYmxlIWltcG9ydGFudH0uZC1zbS10YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3chaW1wb3J0YW50fS5kLXNtLXRhYmxlLWNlbGx7ZGlzcGxheTp0YWJsZS1jZWxsIWltcG9ydGFudH0uZC1zbS1mbGV4e2Rpc3BsYXk6LW1zLWZsZXhib3ghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleCFpbXBvcnRhbnR9LmQtc20taW5saW5lLWZsZXh7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3ghaW1wb3J0YW50O2Rpc3BsYXk6aW5saW5lLWZsZXghaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmQtbWQtbm9uZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS5kLW1kLWlubGluZXtkaXNwbGF5OmlubGluZSFpbXBvcnRhbnR9LmQtbWQtaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudH0uZC1tZC1ibG9ja3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH0uZC1tZC10YWJsZXtkaXNwbGF5OnRhYmxlIWltcG9ydGFudH0uZC1tZC10YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3chaW1wb3J0YW50fS5kLW1kLXRhYmxlLWNlbGx7ZGlzcGxheTp0YWJsZS1jZWxsIWltcG9ydGFudH0uZC1tZC1mbGV4e2Rpc3BsYXk6LW1zLWZsZXhib3ghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleCFpbXBvcnRhbnR9LmQtbWQtaW5saW5lLWZsZXh7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3ghaW1wb3J0YW50O2Rpc3BsYXk6aW5saW5lLWZsZXghaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7LmQtbGctbm9uZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS5kLWxnLWlubGluZXtkaXNwbGF5OmlubGluZSFpbXBvcnRhbnR9LmQtbGctaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudH0uZC1sZy1ibG9ja3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH0uZC1sZy10YWJsZXtkaXNwbGF5OnRhYmxlIWltcG9ydGFudH0uZC1sZy10YWJsZS1yb3d7ZGlzcGxheTp0YWJsZS1yb3chaW1wb3J0YW50fS5kLWxnLXRhYmxlLWNlbGx7ZGlzcGxheTp0YWJsZS1jZWxsIWltcG9ydGFudH0uZC1sZy1mbGV4e2Rpc3BsYXk6LW1zLWZsZXhib3ghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleCFpbXBvcnRhbnR9LmQtbGctaW5saW5lLWZsZXh7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3ghaW1wb3J0YW50O2Rpc3BsYXk6aW5saW5lLWZsZXghaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey5kLXhsLW5vbmV7ZGlzcGxheTpub25lIWltcG9ydGFudH0uZC14bC1pbmxpbmV7ZGlzcGxheTppbmxpbmUhaW1wb3J0YW50fS5kLXhsLWlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9jayFpbXBvcnRhbnR9LmQteGwtYmxvY2t7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9LmQteGwtdGFibGV7ZGlzcGxheTp0YWJsZSFpbXBvcnRhbnR9LmQteGwtdGFibGUtcm93e2Rpc3BsYXk6dGFibGUtcm93IWltcG9ydGFudH0uZC14bC10YWJsZS1jZWxse2Rpc3BsYXk6dGFibGUtY2VsbCFpbXBvcnRhbnR9LmQteGwtZmxleHtkaXNwbGF5Oi1tcy1mbGV4Ym94IWltcG9ydGFudDtkaXNwbGF5OmZsZXghaW1wb3J0YW50fS5kLXhsLWlubGluZS1mbGV4e2Rpc3BsYXk6LW1zLWlubGluZS1mbGV4Ym94IWltcG9ydGFudDtkaXNwbGF5OmlubGluZS1mbGV4IWltcG9ydGFudH19QG1lZGlhIHByaW50ey5kLXByaW50LW5vbmV7ZGlzcGxheTpub25lIWltcG9ydGFudH0uZC1wcmludC1pbmxpbmV7ZGlzcGxheTppbmxpbmUhaW1wb3J0YW50fS5kLXByaW50LWlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9jayFpbXBvcnRhbnR9LmQtcHJpbnQtYmxvY2t7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9LmQtcHJpbnQtdGFibGV7ZGlzcGxheTp0YWJsZSFpbXBvcnRhbnR9LmQtcHJpbnQtdGFibGUtcm93e2Rpc3BsYXk6dGFibGUtcm93IWltcG9ydGFudH0uZC1wcmludC10YWJsZS1jZWxse2Rpc3BsYXk6dGFibGUtY2VsbCFpbXBvcnRhbnR9LmQtcHJpbnQtZmxleHtkaXNwbGF5Oi1tcy1mbGV4Ym94IWltcG9ydGFudDtkaXNwbGF5OmZsZXghaW1wb3J0YW50fS5kLXByaW50LWlubGluZS1mbGV4e2Rpc3BsYXk6LW1zLWlubGluZS1mbGV4Ym94IWltcG9ydGFudDtkaXNwbGF5OmlubGluZS1mbGV4IWltcG9ydGFudH19LmVtYmVkLXJlc3BvbnNpdmV7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO3BhZGRpbmc6MDtvdmVyZmxvdzpoaWRkZW59LmVtYmVkLXJlc3BvbnNpdmU6OmJlZm9yZXtkaXNwbGF5OmJsb2NrO2NvbnRlbnQ6IiJ9LmVtYmVkLXJlc3BvbnNpdmUgLmVtYmVkLXJlc3BvbnNpdmUtaXRlbSwuZW1iZWQtcmVzcG9uc2l2ZSBlbWJlZCwuZW1iZWQtcmVzcG9uc2l2ZSBpZnJhbWUsLmVtYmVkLXJlc3BvbnNpdmUgb2JqZWN0LC5lbWJlZC1yZXNwb25zaXZlIHZpZGVve3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjowfS5lbWJlZC1yZXNwb25zaXZlLTIxYnk5OjpiZWZvcmV7cGFkZGluZy10b3A6NDIuODU3MTQzJX0uZW1iZWQtcmVzcG9uc2l2ZS0xNmJ5OTo6YmVmb3Jle3BhZGRpbmctdG9wOjU2LjI1JX0uZW1iZWQtcmVzcG9uc2l2ZS00YnkzOjpiZWZvcmV7cGFkZGluZy10b3A6NzUlfS5lbWJlZC1yZXNwb25zaXZlLTFieTE6OmJlZm9yZXtwYWRkaW5nLXRvcDoxMDAlfS5mbGV4LXJvd3stbXMtZmxleC1kaXJlY3Rpb246cm93IWltcG9ydGFudDtmbGV4LWRpcmVjdGlvbjpyb3chaW1wb3J0YW50fS5mbGV4LWNvbHVtbnstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uIWltcG9ydGFudDtmbGV4LWRpcmVjdGlvbjpjb2x1bW4haW1wb3J0YW50fS5mbGV4LXJvdy1yZXZlcnNley1tcy1mbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZSFpbXBvcnRhbnQ7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2UhaW1wb3J0YW50fS5mbGV4LWNvbHVtbi1yZXZlcnNley1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZSFpbXBvcnRhbnQ7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2UhaW1wb3J0YW50fS5mbGV4LXdyYXB7LW1zLWZsZXgtd3JhcDp3cmFwIWltcG9ydGFudDtmbGV4LXdyYXA6d3JhcCFpbXBvcnRhbnR9LmZsZXgtbm93cmFwey1tcy1mbGV4LXdyYXA6bm93cmFwIWltcG9ydGFudDtmbGV4LXdyYXA6bm93cmFwIWltcG9ydGFudH0uZmxleC13cmFwLXJldmVyc2V7LW1zLWZsZXgtd3JhcDp3cmFwLXJldmVyc2UhaW1wb3J0YW50O2ZsZXgtd3JhcDp3cmFwLXJldmVyc2UhaW1wb3J0YW50fS5mbGV4LWZpbGx7LW1zLWZsZXg6MSAxIGF1dG8haW1wb3J0YW50O2ZsZXg6MSAxIGF1dG8haW1wb3J0YW50fS5mbGV4LWdyb3ctMHstbXMtZmxleC1wb3NpdGl2ZTowIWltcG9ydGFudDtmbGV4LWdyb3c6MCFpbXBvcnRhbnR9LmZsZXgtZ3Jvdy0xey1tcy1mbGV4LXBvc2l0aXZlOjEhaW1wb3J0YW50O2ZsZXgtZ3JvdzoxIWltcG9ydGFudH0uZmxleC1zaHJpbmstMHstbXMtZmxleC1uZWdhdGl2ZTowIWltcG9ydGFudDtmbGV4LXNocmluazowIWltcG9ydGFudH0uZmxleC1zaHJpbmstMXstbXMtZmxleC1uZWdhdGl2ZToxIWltcG9ydGFudDtmbGV4LXNocmluazoxIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LXN0YXJ0ey1tcy1mbGV4LXBhY2s6c3RhcnQhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0IWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LWVuZHstbXMtZmxleC1wYWNrOmVuZCFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LWNlbnRlcnstbXMtZmxleC1wYWNrOmNlbnRlciFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OmNlbnRlciFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1iZXR3ZWVuey1tcy1mbGV4LXBhY2s6anVzdGlmeSFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW4haW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtYXJvdW5key1tcy1mbGV4LXBhY2s6ZGlzdHJpYnV0ZSFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZCFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLXN0YXJ0ey1tcy1mbGV4LWFsaWduOnN0YXJ0IWltcG9ydGFudDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0IWltcG9ydGFudH0uYWxpZ24taXRlbXMtZW5key1tcy1mbGV4LWFsaWduOmVuZCFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6ZmxleC1lbmQhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1jZW50ZXJ7LW1zLWZsZXgtYWxpZ246Y2VudGVyIWltcG9ydGFudDthbGlnbi1pdGVtczpjZW50ZXIhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1iYXNlbGluZXstbXMtZmxleC1hbGlnbjpiYXNlbGluZSFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6YmFzZWxpbmUhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1zdHJldGNoey1tcy1mbGV4LWFsaWduOnN0cmV0Y2ghaW1wb3J0YW50O2FsaWduLWl0ZW1zOnN0cmV0Y2ghaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXN0YXJ0ey1tcy1mbGV4LWxpbmUtcGFjazpzdGFydCFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpmbGV4LXN0YXJ0IWltcG9ydGFudH0uYWxpZ24tY29udGVudC1lbmR7LW1zLWZsZXgtbGluZS1wYWNrOmVuZCFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpmbGV4LWVuZCFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtY2VudGVyey1tcy1mbGV4LWxpbmUtcGFjazpjZW50ZXIhaW1wb3J0YW50O2FsaWduLWNvbnRlbnQ6Y2VudGVyIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1iZXR3ZWVuey1tcy1mbGV4LWxpbmUtcGFjazpqdXN0aWZ5IWltcG9ydGFudDthbGlnbi1jb250ZW50OnNwYWNlLWJldHdlZW4haW1wb3J0YW50fS5hbGlnbi1jb250ZW50LWFyb3VuZHstbXMtZmxleC1saW5lLXBhY2s6ZGlzdHJpYnV0ZSFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpzcGFjZS1hcm91bmQhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXN0cmV0Y2h7LW1zLWZsZXgtbGluZS1wYWNrOnN0cmV0Y2ghaW1wb3J0YW50O2FsaWduLWNvbnRlbnQ6c3RyZXRjaCFpbXBvcnRhbnR9LmFsaWduLXNlbGYtYXV0b3stbXMtZmxleC1pdGVtLWFsaWduOmF1dG8haW1wb3J0YW50O2FsaWduLXNlbGY6YXV0byFpbXBvcnRhbnR9LmFsaWduLXNlbGYtc3RhcnR7LW1zLWZsZXgtaXRlbS1hbGlnbjpzdGFydCFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpmbGV4LXN0YXJ0IWltcG9ydGFudH0uYWxpZ24tc2VsZi1lbmR7LW1zLWZsZXgtaXRlbS1hbGlnbjplbmQhaW1wb3J0YW50O2FsaWduLXNlbGY6ZmxleC1lbmQhaW1wb3J0YW50fS5hbGlnbi1zZWxmLWNlbnRlcnstbXMtZmxleC1pdGVtLWFsaWduOmNlbnRlciFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpjZW50ZXIhaW1wb3J0YW50fS5hbGlnbi1zZWxmLWJhc2VsaW5ley1tcy1mbGV4LWl0ZW0tYWxpZ246YmFzZWxpbmUhaW1wb3J0YW50O2FsaWduLXNlbGY6YmFzZWxpbmUhaW1wb3J0YW50fS5hbGlnbi1zZWxmLXN0cmV0Y2h7LW1zLWZsZXgtaXRlbS1hbGlnbjpzdHJldGNoIWltcG9ydGFudDthbGlnbi1zZWxmOnN0cmV0Y2ghaW1wb3J0YW50fUBtZWRpYSAobWluLXdpZHRoOjU3NnB4KXsuZmxleC1zbS1yb3d7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdyFpbXBvcnRhbnQ7ZmxleC1kaXJlY3Rpb246cm93IWltcG9ydGFudH0uZmxleC1zbS1jb2x1bW57LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbiFpbXBvcnRhbnQ7ZmxleC1kaXJlY3Rpb246Y29sdW1uIWltcG9ydGFudH0uZmxleC1zbS1yb3ctcmV2ZXJzZXstbXMtZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2UhaW1wb3J0YW50O2ZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlIWltcG9ydGFudH0uZmxleC1zbS1jb2x1bW4tcmV2ZXJzZXstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2UhaW1wb3J0YW50O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlIWltcG9ydGFudH0uZmxleC1zbS13cmFwey1tcy1mbGV4LXdyYXA6d3JhcCFpbXBvcnRhbnQ7ZmxleC13cmFwOndyYXAhaW1wb3J0YW50fS5mbGV4LXNtLW5vd3JhcHstbXMtZmxleC13cmFwOm5vd3JhcCFpbXBvcnRhbnQ7ZmxleC13cmFwOm5vd3JhcCFpbXBvcnRhbnR9LmZsZXgtc20td3JhcC1yZXZlcnNley1tcy1mbGV4LXdyYXA6d3JhcC1yZXZlcnNlIWltcG9ydGFudDtmbGV4LXdyYXA6d3JhcC1yZXZlcnNlIWltcG9ydGFudH0uZmxleC1zbS1maWxsey1tcy1mbGV4OjEgMSBhdXRvIWltcG9ydGFudDtmbGV4OjEgMSBhdXRvIWltcG9ydGFudH0uZmxleC1zbS1ncm93LTB7LW1zLWZsZXgtcG9zaXRpdmU6MCFpbXBvcnRhbnQ7ZmxleC1ncm93OjAhaW1wb3J0YW50fS5mbGV4LXNtLWdyb3ctMXstbXMtZmxleC1wb3NpdGl2ZToxIWltcG9ydGFudDtmbGV4LWdyb3c6MSFpbXBvcnRhbnR9LmZsZXgtc20tc2hyaW5rLTB7LW1zLWZsZXgtbmVnYXRpdmU6MCFpbXBvcnRhbnQ7ZmxleC1zaHJpbms6MCFpbXBvcnRhbnR9LmZsZXgtc20tc2hyaW5rLTF7LW1zLWZsZXgtbmVnYXRpdmU6MSFpbXBvcnRhbnQ7ZmxleC1zaHJpbms6MSFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1zbS1zdGFydHstbXMtZmxleC1wYWNrOnN0YXJ0IWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydCFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1zbS1lbmR7LW1zLWZsZXgtcGFjazplbmQhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDpmbGV4LWVuZCFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1zbS1jZW50ZXJ7LW1zLWZsZXgtcGFjazpjZW50ZXIhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDpjZW50ZXIhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtc20tYmV0d2VlbnstbXMtZmxleC1wYWNrOmp1c3RpZnkhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LXNtLWFyb3VuZHstbXMtZmxleC1wYWNrOmRpc3RyaWJ1dGUhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDpzcGFjZS1hcm91bmQhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1zbS1zdGFydHstbXMtZmxleC1hbGlnbjpzdGFydCFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6ZmxleC1zdGFydCFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLXNtLWVuZHstbXMtZmxleC1hbGlnbjplbmQhaW1wb3J0YW50O2FsaWduLWl0ZW1zOmZsZXgtZW5kIWltcG9ydGFudH0uYWxpZ24taXRlbXMtc20tY2VudGVyey1tcy1mbGV4LWFsaWduOmNlbnRlciFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6Y2VudGVyIWltcG9ydGFudH0uYWxpZ24taXRlbXMtc20tYmFzZWxpbmV7LW1zLWZsZXgtYWxpZ246YmFzZWxpbmUhaW1wb3J0YW50O2FsaWduLWl0ZW1zOmJhc2VsaW5lIWltcG9ydGFudH0uYWxpZ24taXRlbXMtc20tc3RyZXRjaHstbXMtZmxleC1hbGlnbjpzdHJldGNoIWltcG9ydGFudDthbGlnbi1pdGVtczpzdHJldGNoIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1zbS1zdGFydHstbXMtZmxleC1saW5lLXBhY2s6c3RhcnQhaW1wb3J0YW50O2FsaWduLWNvbnRlbnQ6ZmxleC1zdGFydCFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtc20tZW5key1tcy1mbGV4LWxpbmUtcGFjazplbmQhaW1wb3J0YW50O2FsaWduLWNvbnRlbnQ6ZmxleC1lbmQhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXNtLWNlbnRlcnstbXMtZmxleC1saW5lLXBhY2s6Y2VudGVyIWltcG9ydGFudDthbGlnbi1jb250ZW50OmNlbnRlciFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtc20tYmV0d2VlbnstbXMtZmxleC1saW5lLXBhY2s6anVzdGlmeSFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpzcGFjZS1iZXR3ZWVuIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1zbS1hcm91bmR7LW1zLWZsZXgtbGluZS1wYWNrOmRpc3RyaWJ1dGUhaW1wb3J0YW50O2FsaWduLWNvbnRlbnQ6c3BhY2UtYXJvdW5kIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1zbS1zdHJldGNoey1tcy1mbGV4LWxpbmUtcGFjazpzdHJldGNoIWltcG9ydGFudDthbGlnbi1jb250ZW50OnN0cmV0Y2ghaW1wb3J0YW50fS5hbGlnbi1zZWxmLXNtLWF1dG97LW1zLWZsZXgtaXRlbS1hbGlnbjphdXRvIWltcG9ydGFudDthbGlnbi1zZWxmOmF1dG8haW1wb3J0YW50fS5hbGlnbi1zZWxmLXNtLXN0YXJ0ey1tcy1mbGV4LWl0ZW0tYWxpZ246c3RhcnQhaW1wb3J0YW50O2FsaWduLXNlbGY6ZmxleC1zdGFydCFpbXBvcnRhbnR9LmFsaWduLXNlbGYtc20tZW5key1tcy1mbGV4LWl0ZW0tYWxpZ246ZW5kIWltcG9ydGFudDthbGlnbi1zZWxmOmZsZXgtZW5kIWltcG9ydGFudH0uYWxpZ24tc2VsZi1zbS1jZW50ZXJ7LW1zLWZsZXgtaXRlbS1hbGlnbjpjZW50ZXIhaW1wb3J0YW50O2FsaWduLXNlbGY6Y2VudGVyIWltcG9ydGFudH0uYWxpZ24tc2VsZi1zbS1iYXNlbGluZXstbXMtZmxleC1pdGVtLWFsaWduOmJhc2VsaW5lIWltcG9ydGFudDthbGlnbi1zZWxmOmJhc2VsaW5lIWltcG9ydGFudH0uYWxpZ24tc2VsZi1zbS1zdHJldGNoey1tcy1mbGV4LWl0ZW0tYWxpZ246c3RyZXRjaCFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpzdHJldGNoIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5mbGV4LW1kLXJvd3stbXMtZmxleC1kaXJlY3Rpb246cm93IWltcG9ydGFudDtmbGV4LWRpcmVjdGlvbjpyb3chaW1wb3J0YW50fS5mbGV4LW1kLWNvbHVtbnstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uIWltcG9ydGFudDtmbGV4LWRpcmVjdGlvbjpjb2x1bW4haW1wb3J0YW50fS5mbGV4LW1kLXJvdy1yZXZlcnNley1tcy1mbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZSFpbXBvcnRhbnQ7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2UhaW1wb3J0YW50fS5mbGV4LW1kLWNvbHVtbi1yZXZlcnNley1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZSFpbXBvcnRhbnQ7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2UhaW1wb3J0YW50fS5mbGV4LW1kLXdyYXB7LW1zLWZsZXgtd3JhcDp3cmFwIWltcG9ydGFudDtmbGV4LXdyYXA6d3JhcCFpbXBvcnRhbnR9LmZsZXgtbWQtbm93cmFwey1tcy1mbGV4LXdyYXA6bm93cmFwIWltcG9ydGFudDtmbGV4LXdyYXA6bm93cmFwIWltcG9ydGFudH0uZmxleC1tZC13cmFwLXJldmVyc2V7LW1zLWZsZXgtd3JhcDp3cmFwLXJldmVyc2UhaW1wb3J0YW50O2ZsZXgtd3JhcDp3cmFwLXJldmVyc2UhaW1wb3J0YW50fS5mbGV4LW1kLWZpbGx7LW1zLWZsZXg6MSAxIGF1dG8haW1wb3J0YW50O2ZsZXg6MSAxIGF1dG8haW1wb3J0YW50fS5mbGV4LW1kLWdyb3ctMHstbXMtZmxleC1wb3NpdGl2ZTowIWltcG9ydGFudDtmbGV4LWdyb3c6MCFpbXBvcnRhbnR9LmZsZXgtbWQtZ3Jvdy0xey1tcy1mbGV4LXBvc2l0aXZlOjEhaW1wb3J0YW50O2ZsZXgtZ3JvdzoxIWltcG9ydGFudH0uZmxleC1tZC1zaHJpbmstMHstbXMtZmxleC1uZWdhdGl2ZTowIWltcG9ydGFudDtmbGV4LXNocmluazowIWltcG9ydGFudH0uZmxleC1tZC1zaHJpbmstMXstbXMtZmxleC1uZWdhdGl2ZToxIWltcG9ydGFudDtmbGV4LXNocmluazoxIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LW1kLXN0YXJ0ey1tcy1mbGV4LXBhY2s6c3RhcnQhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0IWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LW1kLWVuZHstbXMtZmxleC1wYWNrOmVuZCFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LW1kLWNlbnRlcnstbXMtZmxleC1wYWNrOmNlbnRlciFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OmNlbnRlciFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1tZC1iZXR3ZWVuey1tcy1mbGV4LXBhY2s6anVzdGlmeSFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW4haW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtbWQtYXJvdW5key1tcy1mbGV4LXBhY2s6ZGlzdHJpYnV0ZSFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZCFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLW1kLXN0YXJ0ey1tcy1mbGV4LWFsaWduOnN0YXJ0IWltcG9ydGFudDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0IWltcG9ydGFudH0uYWxpZ24taXRlbXMtbWQtZW5key1tcy1mbGV4LWFsaWduOmVuZCFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6ZmxleC1lbmQhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1tZC1jZW50ZXJ7LW1zLWZsZXgtYWxpZ246Y2VudGVyIWltcG9ydGFudDthbGlnbi1pdGVtczpjZW50ZXIhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1tZC1iYXNlbGluZXstbXMtZmxleC1hbGlnbjpiYXNlbGluZSFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6YmFzZWxpbmUhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1tZC1zdHJldGNoey1tcy1mbGV4LWFsaWduOnN0cmV0Y2ghaW1wb3J0YW50O2FsaWduLWl0ZW1zOnN0cmV0Y2ghaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LW1kLXN0YXJ0ey1tcy1mbGV4LWxpbmUtcGFjazpzdGFydCFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpmbGV4LXN0YXJ0IWltcG9ydGFudH0uYWxpZ24tY29udGVudC1tZC1lbmR7LW1zLWZsZXgtbGluZS1wYWNrOmVuZCFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpmbGV4LWVuZCFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtbWQtY2VudGVyey1tcy1mbGV4LWxpbmUtcGFjazpjZW50ZXIhaW1wb3J0YW50O2FsaWduLWNvbnRlbnQ6Y2VudGVyIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1tZC1iZXR3ZWVuey1tcy1mbGV4LWxpbmUtcGFjazpqdXN0aWZ5IWltcG9ydGFudDthbGlnbi1jb250ZW50OnNwYWNlLWJldHdlZW4haW1wb3J0YW50fS5hbGlnbi1jb250ZW50LW1kLWFyb3VuZHstbXMtZmxleC1saW5lLXBhY2s6ZGlzdHJpYnV0ZSFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpzcGFjZS1hcm91bmQhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LW1kLXN0cmV0Y2h7LW1zLWZsZXgtbGluZS1wYWNrOnN0cmV0Y2ghaW1wb3J0YW50O2FsaWduLWNvbnRlbnQ6c3RyZXRjaCFpbXBvcnRhbnR9LmFsaWduLXNlbGYtbWQtYXV0b3stbXMtZmxleC1pdGVtLWFsaWduOmF1dG8haW1wb3J0YW50O2FsaWduLXNlbGY6YXV0byFpbXBvcnRhbnR9LmFsaWduLXNlbGYtbWQtc3RhcnR7LW1zLWZsZXgtaXRlbS1hbGlnbjpzdGFydCFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpmbGV4LXN0YXJ0IWltcG9ydGFudH0uYWxpZ24tc2VsZi1tZC1lbmR7LW1zLWZsZXgtaXRlbS1hbGlnbjplbmQhaW1wb3J0YW50O2FsaWduLXNlbGY6ZmxleC1lbmQhaW1wb3J0YW50fS5hbGlnbi1zZWxmLW1kLWNlbnRlcnstbXMtZmxleC1pdGVtLWFsaWduOmNlbnRlciFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpjZW50ZXIhaW1wb3J0YW50fS5hbGlnbi1zZWxmLW1kLWJhc2VsaW5ley1tcy1mbGV4LWl0ZW0tYWxpZ246YmFzZWxpbmUhaW1wb3J0YW50O2FsaWduLXNlbGY6YmFzZWxpbmUhaW1wb3J0YW50fS5hbGlnbi1zZWxmLW1kLXN0cmV0Y2h7LW1zLWZsZXgtaXRlbS1hbGlnbjpzdHJldGNoIWltcG9ydGFudDthbGlnbi1zZWxmOnN0cmV0Y2ghaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7LmZsZXgtbGctcm93ey1tcy1mbGV4LWRpcmVjdGlvbjpyb3chaW1wb3J0YW50O2ZsZXgtZGlyZWN0aW9uOnJvdyFpbXBvcnRhbnR9LmZsZXgtbGctY29sdW1uey1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW4haW1wb3J0YW50O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbiFpbXBvcnRhbnR9LmZsZXgtbGctcm93LXJldmVyc2V7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlIWltcG9ydGFudDtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZSFpbXBvcnRhbnR9LmZsZXgtbGctY29sdW1uLXJldmVyc2V7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlIWltcG9ydGFudDtmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZSFpbXBvcnRhbnR9LmZsZXgtbGctd3JhcHstbXMtZmxleC13cmFwOndyYXAhaW1wb3J0YW50O2ZsZXgtd3JhcDp3cmFwIWltcG9ydGFudH0uZmxleC1sZy1ub3dyYXB7LW1zLWZsZXgtd3JhcDpub3dyYXAhaW1wb3J0YW50O2ZsZXgtd3JhcDpub3dyYXAhaW1wb3J0YW50fS5mbGV4LWxnLXdyYXAtcmV2ZXJzZXstbXMtZmxleC13cmFwOndyYXAtcmV2ZXJzZSFpbXBvcnRhbnQ7ZmxleC13cmFwOndyYXAtcmV2ZXJzZSFpbXBvcnRhbnR9LmZsZXgtbGctZmlsbHstbXMtZmxleDoxIDEgYXV0byFpbXBvcnRhbnQ7ZmxleDoxIDEgYXV0byFpbXBvcnRhbnR9LmZsZXgtbGctZ3Jvdy0wey1tcy1mbGV4LXBvc2l0aXZlOjAhaW1wb3J0YW50O2ZsZXgtZ3JvdzowIWltcG9ydGFudH0uZmxleC1sZy1ncm93LTF7LW1zLWZsZXgtcG9zaXRpdmU6MSFpbXBvcnRhbnQ7ZmxleC1ncm93OjEhaW1wb3J0YW50fS5mbGV4LWxnLXNocmluay0wey1tcy1mbGV4LW5lZ2F0aXZlOjAhaW1wb3J0YW50O2ZsZXgtc2hyaW5rOjAhaW1wb3J0YW50fS5mbGV4LWxnLXNocmluay0xey1tcy1mbGV4LW5lZ2F0aXZlOjEhaW1wb3J0YW50O2ZsZXgtc2hyaW5rOjEhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtbGctc3RhcnR7LW1zLWZsZXgtcGFjazpzdGFydCFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtbGctZW5key1tcy1mbGV4LXBhY2s6ZW5kIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQtbGctY2VudGVyey1tcy1mbGV4LXBhY2s6Y2VudGVyIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LWxnLWJldHdlZW57LW1zLWZsZXgtcGFjazpqdXN0aWZ5IWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbiFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC1sZy1hcm91bmR7LW1zLWZsZXgtcGFjazpkaXN0cmlidXRlIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYXJvdW5kIWltcG9ydGFudH0uYWxpZ24taXRlbXMtbGctc3RhcnR7LW1zLWZsZXgtYWxpZ246c3RhcnQhaW1wb3J0YW50O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy1sZy1lbmR7LW1zLWZsZXgtYWxpZ246ZW5kIWltcG9ydGFudDthbGlnbi1pdGVtczpmbGV4LWVuZCFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLWxnLWNlbnRlcnstbXMtZmxleC1hbGlnbjpjZW50ZXIhaW1wb3J0YW50O2FsaWduLWl0ZW1zOmNlbnRlciFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLWxnLWJhc2VsaW5ley1tcy1mbGV4LWFsaWduOmJhc2VsaW5lIWltcG9ydGFudDthbGlnbi1pdGVtczpiYXNlbGluZSFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLWxnLXN0cmV0Y2h7LW1zLWZsZXgtYWxpZ246c3RyZXRjaCFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6c3RyZXRjaCFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtbGctc3RhcnR7LW1zLWZsZXgtbGluZS1wYWNrOnN0YXJ0IWltcG9ydGFudDthbGlnbi1jb250ZW50OmZsZXgtc3RhcnQhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LWxnLWVuZHstbXMtZmxleC1saW5lLXBhY2s6ZW5kIWltcG9ydGFudDthbGlnbi1jb250ZW50OmZsZXgtZW5kIWltcG9ydGFudH0uYWxpZ24tY29udGVudC1sZy1jZW50ZXJ7LW1zLWZsZXgtbGluZS1wYWNrOmNlbnRlciFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpjZW50ZXIhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LWxnLWJldHdlZW57LW1zLWZsZXgtbGluZS1wYWNrOmp1c3RpZnkhaW1wb3J0YW50O2FsaWduLWNvbnRlbnQ6c3BhY2UtYmV0d2VlbiFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtbGctYXJvdW5key1tcy1mbGV4LWxpbmUtcGFjazpkaXN0cmlidXRlIWltcG9ydGFudDthbGlnbi1jb250ZW50OnNwYWNlLWFyb3VuZCFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQtbGctc3RyZXRjaHstbXMtZmxleC1saW5lLXBhY2s6c3RyZXRjaCFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpzdHJldGNoIWltcG9ydGFudH0uYWxpZ24tc2VsZi1sZy1hdXRvey1tcy1mbGV4LWl0ZW0tYWxpZ246YXV0byFpbXBvcnRhbnQ7YWxpZ24tc2VsZjphdXRvIWltcG9ydGFudH0uYWxpZ24tc2VsZi1sZy1zdGFydHstbXMtZmxleC1pdGVtLWFsaWduOnN0YXJ0IWltcG9ydGFudDthbGlnbi1zZWxmOmZsZXgtc3RhcnQhaW1wb3J0YW50fS5hbGlnbi1zZWxmLWxnLWVuZHstbXMtZmxleC1pdGVtLWFsaWduOmVuZCFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpmbGV4LWVuZCFpbXBvcnRhbnR9LmFsaWduLXNlbGYtbGctY2VudGVyey1tcy1mbGV4LWl0ZW0tYWxpZ246Y2VudGVyIWltcG9ydGFudDthbGlnbi1zZWxmOmNlbnRlciFpbXBvcnRhbnR9LmFsaWduLXNlbGYtbGctYmFzZWxpbmV7LW1zLWZsZXgtaXRlbS1hbGlnbjpiYXNlbGluZSFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpiYXNlbGluZSFpbXBvcnRhbnR9LmFsaWduLXNlbGYtbGctc3RyZXRjaHstbXMtZmxleC1pdGVtLWFsaWduOnN0cmV0Y2ghaW1wb3J0YW50O2FsaWduLXNlbGY6c3RyZXRjaCFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LmZsZXgteGwtcm93ey1tcy1mbGV4LWRpcmVjdGlvbjpyb3chaW1wb3J0YW50O2ZsZXgtZGlyZWN0aW9uOnJvdyFpbXBvcnRhbnR9LmZsZXgteGwtY29sdW1uey1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW4haW1wb3J0YW50O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbiFpbXBvcnRhbnR9LmZsZXgteGwtcm93LXJldmVyc2V7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlIWltcG9ydGFudDtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZSFpbXBvcnRhbnR9LmZsZXgteGwtY29sdW1uLXJldmVyc2V7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlIWltcG9ydGFudDtmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZSFpbXBvcnRhbnR9LmZsZXgteGwtd3JhcHstbXMtZmxleC13cmFwOndyYXAhaW1wb3J0YW50O2ZsZXgtd3JhcDp3cmFwIWltcG9ydGFudH0uZmxleC14bC1ub3dyYXB7LW1zLWZsZXgtd3JhcDpub3dyYXAhaW1wb3J0YW50O2ZsZXgtd3JhcDpub3dyYXAhaW1wb3J0YW50fS5mbGV4LXhsLXdyYXAtcmV2ZXJzZXstbXMtZmxleC13cmFwOndyYXAtcmV2ZXJzZSFpbXBvcnRhbnQ7ZmxleC13cmFwOndyYXAtcmV2ZXJzZSFpbXBvcnRhbnR9LmZsZXgteGwtZmlsbHstbXMtZmxleDoxIDEgYXV0byFpbXBvcnRhbnQ7ZmxleDoxIDEgYXV0byFpbXBvcnRhbnR9LmZsZXgteGwtZ3Jvdy0wey1tcy1mbGV4LXBvc2l0aXZlOjAhaW1wb3J0YW50O2ZsZXgtZ3JvdzowIWltcG9ydGFudH0uZmxleC14bC1ncm93LTF7LW1zLWZsZXgtcG9zaXRpdmU6MSFpbXBvcnRhbnQ7ZmxleC1ncm93OjEhaW1wb3J0YW50fS5mbGV4LXhsLXNocmluay0wey1tcy1mbGV4LW5lZ2F0aXZlOjAhaW1wb3J0YW50O2ZsZXgtc2hyaW5rOjAhaW1wb3J0YW50fS5mbGV4LXhsLXNocmluay0xey1tcy1mbGV4LW5lZ2F0aXZlOjEhaW1wb3J0YW50O2ZsZXgtc2hyaW5rOjEhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQteGwtc3RhcnR7LW1zLWZsZXgtcGFjazpzdGFydCFpbXBvcnRhbnQ7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQteGwtZW5key1tcy1mbGV4LXBhY2s6ZW5kIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQhaW1wb3J0YW50fS5qdXN0aWZ5LWNvbnRlbnQteGwtY2VudGVyey1tcy1mbGV4LXBhY2s6Y2VudGVyIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyIWltcG9ydGFudH0uanVzdGlmeS1jb250ZW50LXhsLWJldHdlZW57LW1zLWZsZXgtcGFjazpqdXN0aWZ5IWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbiFpbXBvcnRhbnR9Lmp1c3RpZnktY29udGVudC14bC1hcm91bmR7LW1zLWZsZXgtcGFjazpkaXN0cmlidXRlIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYXJvdW5kIWltcG9ydGFudH0uYWxpZ24taXRlbXMteGwtc3RhcnR7LW1zLWZsZXgtYWxpZ246c3RhcnQhaW1wb3J0YW50O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQhaW1wb3J0YW50fS5hbGlnbi1pdGVtcy14bC1lbmR7LW1zLWZsZXgtYWxpZ246ZW5kIWltcG9ydGFudDthbGlnbi1pdGVtczpmbGV4LWVuZCFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLXhsLWNlbnRlcnstbXMtZmxleC1hbGlnbjpjZW50ZXIhaW1wb3J0YW50O2FsaWduLWl0ZW1zOmNlbnRlciFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLXhsLWJhc2VsaW5ley1tcy1mbGV4LWFsaWduOmJhc2VsaW5lIWltcG9ydGFudDthbGlnbi1pdGVtczpiYXNlbGluZSFpbXBvcnRhbnR9LmFsaWduLWl0ZW1zLXhsLXN0cmV0Y2h7LW1zLWZsZXgtYWxpZ246c3RyZXRjaCFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6c3RyZXRjaCFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQteGwtc3RhcnR7LW1zLWZsZXgtbGluZS1wYWNrOnN0YXJ0IWltcG9ydGFudDthbGlnbi1jb250ZW50OmZsZXgtc3RhcnQhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXhsLWVuZHstbXMtZmxleC1saW5lLXBhY2s6ZW5kIWltcG9ydGFudDthbGlnbi1jb250ZW50OmZsZXgtZW5kIWltcG9ydGFudH0uYWxpZ24tY29udGVudC14bC1jZW50ZXJ7LW1zLWZsZXgtbGluZS1wYWNrOmNlbnRlciFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpjZW50ZXIhaW1wb3J0YW50fS5hbGlnbi1jb250ZW50LXhsLWJldHdlZW57LW1zLWZsZXgtbGluZS1wYWNrOmp1c3RpZnkhaW1wb3J0YW50O2FsaWduLWNvbnRlbnQ6c3BhY2UtYmV0d2VlbiFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQteGwtYXJvdW5key1tcy1mbGV4LWxpbmUtcGFjazpkaXN0cmlidXRlIWltcG9ydGFudDthbGlnbi1jb250ZW50OnNwYWNlLWFyb3VuZCFpbXBvcnRhbnR9LmFsaWduLWNvbnRlbnQteGwtc3RyZXRjaHstbXMtZmxleC1saW5lLXBhY2s6c3RyZXRjaCFpbXBvcnRhbnQ7YWxpZ24tY29udGVudDpzdHJldGNoIWltcG9ydGFudH0uYWxpZ24tc2VsZi14bC1hdXRvey1tcy1mbGV4LWl0ZW0tYWxpZ246YXV0byFpbXBvcnRhbnQ7YWxpZ24tc2VsZjphdXRvIWltcG9ydGFudH0uYWxpZ24tc2VsZi14bC1zdGFydHstbXMtZmxleC1pdGVtLWFsaWduOnN0YXJ0IWltcG9ydGFudDthbGlnbi1zZWxmOmZsZXgtc3RhcnQhaW1wb3J0YW50fS5hbGlnbi1zZWxmLXhsLWVuZHstbXMtZmxleC1pdGVtLWFsaWduOmVuZCFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpmbGV4LWVuZCFpbXBvcnRhbnR9LmFsaWduLXNlbGYteGwtY2VudGVyey1tcy1mbGV4LWl0ZW0tYWxpZ246Y2VudGVyIWltcG9ydGFudDthbGlnbi1zZWxmOmNlbnRlciFpbXBvcnRhbnR9LmFsaWduLXNlbGYteGwtYmFzZWxpbmV7LW1zLWZsZXgtaXRlbS1hbGlnbjpiYXNlbGluZSFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpiYXNlbGluZSFpbXBvcnRhbnR9LmFsaWduLXNlbGYteGwtc3RyZXRjaHstbXMtZmxleC1pdGVtLWFsaWduOnN0cmV0Y2ghaW1wb3J0YW50O2FsaWduLXNlbGY6c3RyZXRjaCFpbXBvcnRhbnR9fS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnQhaW1wb3J0YW50fS5mbG9hdC1yaWdodHtmbG9hdDpyaWdodCFpbXBvcnRhbnR9LmZsb2F0LW5vbmV7ZmxvYXQ6bm9uZSFpbXBvcnRhbnR9QG1lZGlhIChtaW4td2lkdGg6NTc2cHgpey5mbG9hdC1zbS1sZWZ0e2Zsb2F0OmxlZnQhaW1wb3J0YW50fS5mbG9hdC1zbS1yaWdodHtmbG9hdDpyaWdodCFpbXBvcnRhbnR9LmZsb2F0LXNtLW5vbmV7ZmxvYXQ6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuZmxvYXQtbWQtbGVmdHtmbG9hdDpsZWZ0IWltcG9ydGFudH0uZmxvYXQtbWQtcmlnaHR7ZmxvYXQ6cmlnaHQhaW1wb3J0YW50fS5mbG9hdC1tZC1ub25le2Zsb2F0Om5vbmUhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7LmZsb2F0LWxnLWxlZnR7ZmxvYXQ6bGVmdCFpbXBvcnRhbnR9LmZsb2F0LWxnLXJpZ2h0e2Zsb2F0OnJpZ2h0IWltcG9ydGFudH0uZmxvYXQtbGctbm9uZXtmbG9hdDpub25lIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXsuZmxvYXQteGwtbGVmdHtmbG9hdDpsZWZ0IWltcG9ydGFudH0uZmxvYXQteGwtcmlnaHR7ZmxvYXQ6cmlnaHQhaW1wb3J0YW50fS5mbG9hdC14bC1ub25le2Zsb2F0Om5vbmUhaW1wb3J0YW50fX0udXNlci1zZWxlY3QtYWxsey13ZWJraXQtdXNlci1zZWxlY3Q6YWxsIWltcG9ydGFudDstbW96LXVzZXItc2VsZWN0OmFsbCFpbXBvcnRhbnQ7LW1zLXVzZXItc2VsZWN0OmFsbCFpbXBvcnRhbnQ7dXNlci1zZWxlY3Q6YWxsIWltcG9ydGFudH0udXNlci1zZWxlY3QtYXV0b3std2Via2l0LXVzZXItc2VsZWN0OmF1dG8haW1wb3J0YW50Oy1tb3otdXNlci1zZWxlY3Q6YXV0byFpbXBvcnRhbnQ7LW1zLXVzZXItc2VsZWN0OmF1dG8haW1wb3J0YW50O3VzZXItc2VsZWN0OmF1dG8haW1wb3J0YW50fS51c2VyLXNlbGVjdC1ub25ley13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZSFpbXBvcnRhbnQ7LW1vei11c2VyLXNlbGVjdDpub25lIWltcG9ydGFudDstbXMtdXNlci1zZWxlY3Q6bm9uZSFpbXBvcnRhbnQ7dXNlci1zZWxlY3Q6bm9uZSFpbXBvcnRhbnR9Lm92ZXJmbG93LWF1dG97b3ZlcmZsb3c6YXV0byFpbXBvcnRhbnR9Lm92ZXJmbG93LWhpZGRlbntvdmVyZmxvdzpoaWRkZW4haW1wb3J0YW50fS5wb3NpdGlvbi1zdGF0aWN7cG9zaXRpb246c3RhdGljIWltcG9ydGFudH0ucG9zaXRpb24tcmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmUhaW1wb3J0YW50fS5wb3NpdGlvbi1hYnNvbHV0ZXtwb3NpdGlvbjphYnNvbHV0ZSFpbXBvcnRhbnR9LnBvc2l0aW9uLWZpeGVke3Bvc2l0aW9uOmZpeGVkIWltcG9ydGFudH0ucG9zaXRpb24tc3RpY2t5e3Bvc2l0aW9uOi13ZWJraXQtc3RpY2t5IWltcG9ydGFudDtwb3NpdGlvbjpzdGlja3khaW1wb3J0YW50fS5maXhlZC10b3B7cG9zaXRpb246Zml4ZWQ7dG9wOjA7cmlnaHQ6MDtsZWZ0OjA7ei1pbmRleDoxMDMwfS5maXhlZC1ib3R0b217cG9zaXRpb246Zml4ZWQ7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7ei1pbmRleDoxMDMwfUBzdXBwb3J0cyAoKHBvc2l0aW9uOi13ZWJraXQtc3RpY2t5KSBvciAocG9zaXRpb246c3RpY2t5KSl7LnN0aWNreS10b3B7cG9zaXRpb246LXdlYmtpdC1zdGlja3k7cG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MTAyMH19LnNyLW9ubHl7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7cGFkZGluZzowO21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtjbGlwOnJlY3QoMCwwLDAsMCk7d2hpdGUtc3BhY2U6bm93cmFwO2JvcmRlcjowfS5zci1vbmx5LWZvY3VzYWJsZTphY3RpdmUsLnNyLW9ubHktZm9jdXNhYmxlOmZvY3Vze3Bvc2l0aW9uOnN0YXRpYzt3aWR0aDphdXRvO2hlaWdodDphdXRvO292ZXJmbG93OnZpc2libGU7Y2xpcDphdXRvO3doaXRlLXNwYWNlOm5vcm1hbH0uc2hhZG93LXNte2JveC1zaGFkb3c6MCAuMTI1cmVtIC4yNXJlbSByZ2JhKDAsMCwwLC4wNzUpIWltcG9ydGFudH0uc2hhZG93e2JveC1zaGFkb3c6MCAuNXJlbSAxcmVtIHJnYmEoMCwwLDAsLjE1KSFpbXBvcnRhbnR9LnNoYWRvdy1sZ3tib3gtc2hhZG93OjAgMXJlbSAzcmVtIHJnYmEoMCwwLDAsLjE3NSkhaW1wb3J0YW50fS5zaGFkb3ctbm9uZXtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fS53LTI1e3dpZHRoOjI1JSFpbXBvcnRhbnR9LnctNTB7d2lkdGg6NTAlIWltcG9ydGFudH0udy03NXt3aWR0aDo3NSUhaW1wb3J0YW50fS53LTEwMHt3aWR0aDoxMDAlIWltcG9ydGFudH0udy1hdXRve3dpZHRoOmF1dG8haW1wb3J0YW50fS5oLTI1e2hlaWdodDoyNSUhaW1wb3J0YW50fS5oLTUwe2hlaWdodDo1MCUhaW1wb3J0YW50fS5oLTc1e2hlaWdodDo3NSUhaW1wb3J0YW50fS5oLTEwMHtoZWlnaHQ6MTAwJSFpbXBvcnRhbnR9LmgtYXV0b3toZWlnaHQ6YXV0byFpbXBvcnRhbnR9Lm13LTEwMHttYXgtd2lkdGg6MTAwJSFpbXBvcnRhbnR9Lm1oLTEwMHttYXgtaGVpZ2h0OjEwMCUhaW1wb3J0YW50fS5taW4tdnctMTAwe21pbi13aWR0aDoxMDB2dyFpbXBvcnRhbnR9Lm1pbi12aC0xMDB7bWluLWhlaWdodDoxMDB2aCFpbXBvcnRhbnR9LnZ3LTEwMHt3aWR0aDoxMDB2dyFpbXBvcnRhbnR9LnZoLTEwMHtoZWlnaHQ6MTAwdmghaW1wb3J0YW50fS5tLTB7bWFyZ2luOjAhaW1wb3J0YW50fS5tdC0wLC5teS0we21hcmdpbi10b3A6MCFpbXBvcnRhbnR9Lm1yLTAsLm14LTB7bWFyZ2luLXJpZ2h0OjAhaW1wb3J0YW50fS5tYi0wLC5teS0we21hcmdpbi1ib3R0b206MCFpbXBvcnRhbnR9Lm1sLTAsLm14LTB7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnR9Lm0tMXttYXJnaW46LjI1cmVtIWltcG9ydGFudH0ubXQtMSwubXktMXttYXJnaW4tdG9wOi4yNXJlbSFpbXBvcnRhbnR9Lm1yLTEsLm14LTF7bWFyZ2luLXJpZ2h0Oi4yNXJlbSFpbXBvcnRhbnR9Lm1iLTEsLm15LTF7bWFyZ2luLWJvdHRvbTouMjVyZW0haW1wb3J0YW50fS5tbC0xLC5teC0xe21hcmdpbi1sZWZ0Oi4yNXJlbSFpbXBvcnRhbnR9Lm0tMnttYXJnaW46LjVyZW0haW1wb3J0YW50fS5tdC0yLC5teS0ye21hcmdpbi10b3A6LjVyZW0haW1wb3J0YW50fS5tci0yLC5teC0ye21hcmdpbi1yaWdodDouNXJlbSFpbXBvcnRhbnR9Lm1iLTIsLm15LTJ7bWFyZ2luLWJvdHRvbTouNXJlbSFpbXBvcnRhbnR9Lm1sLTIsLm14LTJ7bWFyZ2luLWxlZnQ6LjVyZW0haW1wb3J0YW50fS5tLTN7bWFyZ2luOjFyZW0haW1wb3J0YW50fS5tdC0zLC5teS0ze21hcmdpbi10b3A6MXJlbSFpbXBvcnRhbnR9Lm1yLTMsLm14LTN7bWFyZ2luLXJpZ2h0OjFyZW0haW1wb3J0YW50fS5tYi0zLC5teS0ze21hcmdpbi1ib3R0b206MXJlbSFpbXBvcnRhbnR9Lm1sLTMsLm14LTN7bWFyZ2luLWxlZnQ6MXJlbSFpbXBvcnRhbnR9Lm0tNHttYXJnaW46MS41cmVtIWltcG9ydGFudH0ubXQtNCwubXktNHttYXJnaW4tdG9wOjEuNXJlbSFpbXBvcnRhbnR9Lm1yLTQsLm14LTR7bWFyZ2luLXJpZ2h0OjEuNXJlbSFpbXBvcnRhbnR9Lm1iLTQsLm15LTR7bWFyZ2luLWJvdHRvbToxLjVyZW0haW1wb3J0YW50fS5tbC00LC5teC00e21hcmdpbi1sZWZ0OjEuNXJlbSFpbXBvcnRhbnR9Lm0tNXttYXJnaW46M3JlbSFpbXBvcnRhbnR9Lm10LTUsLm15LTV7bWFyZ2luLXRvcDozcmVtIWltcG9ydGFudH0ubXItNSwubXgtNXttYXJnaW4tcmlnaHQ6M3JlbSFpbXBvcnRhbnR9Lm1iLTUsLm15LTV7bWFyZ2luLWJvdHRvbTozcmVtIWltcG9ydGFudH0ubWwtNSwubXgtNXttYXJnaW4tbGVmdDozcmVtIWltcG9ydGFudH0ucC0we3BhZGRpbmc6MCFpbXBvcnRhbnR9LnB0LTAsLnB5LTB7cGFkZGluZy10b3A6MCFpbXBvcnRhbnR9LnByLTAsLnB4LTB7cGFkZGluZy1yaWdodDowIWltcG9ydGFudH0ucGItMCwucHktMHtwYWRkaW5nLWJvdHRvbTowIWltcG9ydGFudH0ucGwtMCwucHgtMHtwYWRkaW5nLWxlZnQ6MCFpbXBvcnRhbnR9LnAtMXtwYWRkaW5nOi4yNXJlbSFpbXBvcnRhbnR9LnB0LTEsLnB5LTF7cGFkZGluZy10b3A6LjI1cmVtIWltcG9ydGFudH0ucHItMSwucHgtMXtwYWRkaW5nLXJpZ2h0Oi4yNXJlbSFpbXBvcnRhbnR9LnBiLTEsLnB5LTF7cGFkZGluZy1ib3R0b206LjI1cmVtIWltcG9ydGFudH0ucGwtMSwucHgtMXtwYWRkaW5nLWxlZnQ6LjI1cmVtIWltcG9ydGFudH0ucC0ye3BhZGRpbmc6LjVyZW0haW1wb3J0YW50fS5wdC0yLC5weS0ye3BhZGRpbmctdG9wOi41cmVtIWltcG9ydGFudH0ucHItMiwucHgtMntwYWRkaW5nLXJpZ2h0Oi41cmVtIWltcG9ydGFudH0ucGItMiwucHktMntwYWRkaW5nLWJvdHRvbTouNXJlbSFpbXBvcnRhbnR9LnBsLTIsLnB4LTJ7cGFkZGluZy1sZWZ0Oi41cmVtIWltcG9ydGFudH0ucC0ze3BhZGRpbmc6MXJlbSFpbXBvcnRhbnR9LnB0LTMsLnB5LTN7cGFkZGluZy10b3A6MXJlbSFpbXBvcnRhbnR9LnByLTMsLnB4LTN7cGFkZGluZy1yaWdodDoxcmVtIWltcG9ydGFudH0ucGItMywucHktM3twYWRkaW5nLWJvdHRvbToxcmVtIWltcG9ydGFudH0ucGwtMywucHgtM3twYWRkaW5nLWxlZnQ6MXJlbSFpbXBvcnRhbnR9LnAtNHtwYWRkaW5nOjEuNXJlbSFpbXBvcnRhbnR9LnB0LTQsLnB5LTR7cGFkZGluZy10b3A6MS41cmVtIWltcG9ydGFudH0ucHItNCwucHgtNHtwYWRkaW5nLXJpZ2h0OjEuNXJlbSFpbXBvcnRhbnR9LnBiLTQsLnB5LTR7cGFkZGluZy1ib3R0b206MS41cmVtIWltcG9ydGFudH0ucGwtNCwucHgtNHtwYWRkaW5nLWxlZnQ6MS41cmVtIWltcG9ydGFudH0ucC01e3BhZGRpbmc6M3JlbSFpbXBvcnRhbnR9LnB0LTUsLnB5LTV7cGFkZGluZy10b3A6M3JlbSFpbXBvcnRhbnR9LnByLTUsLnB4LTV7cGFkZGluZy1yaWdodDozcmVtIWltcG9ydGFudH0ucGItNSwucHktNXtwYWRkaW5nLWJvdHRvbTozcmVtIWltcG9ydGFudH0ucGwtNSwucHgtNXtwYWRkaW5nLWxlZnQ6M3JlbSFpbXBvcnRhbnR9Lm0tbjF7bWFyZ2luOi0uMjVyZW0haW1wb3J0YW50fS5tdC1uMSwubXktbjF7bWFyZ2luLXRvcDotLjI1cmVtIWltcG9ydGFudH0ubXItbjEsLm14LW4xe21hcmdpbi1yaWdodDotLjI1cmVtIWltcG9ydGFudH0ubWItbjEsLm15LW4xe21hcmdpbi1ib3R0b206LS4yNXJlbSFpbXBvcnRhbnR9Lm1sLW4xLC5teC1uMXttYXJnaW4tbGVmdDotLjI1cmVtIWltcG9ydGFudH0ubS1uMnttYXJnaW46LS41cmVtIWltcG9ydGFudH0ubXQtbjIsLm15LW4ye21hcmdpbi10b3A6LS41cmVtIWltcG9ydGFudH0ubXItbjIsLm14LW4ye21hcmdpbi1yaWdodDotLjVyZW0haW1wb3J0YW50fS5tYi1uMiwubXktbjJ7bWFyZ2luLWJvdHRvbTotLjVyZW0haW1wb3J0YW50fS5tbC1uMiwubXgtbjJ7bWFyZ2luLWxlZnQ6LS41cmVtIWltcG9ydGFudH0ubS1uM3ttYXJnaW46LTFyZW0haW1wb3J0YW50fS5tdC1uMywubXktbjN7bWFyZ2luLXRvcDotMXJlbSFpbXBvcnRhbnR9Lm1yLW4zLC5teC1uM3ttYXJnaW4tcmlnaHQ6LTFyZW0haW1wb3J0YW50fS5tYi1uMywubXktbjN7bWFyZ2luLWJvdHRvbTotMXJlbSFpbXBvcnRhbnR9Lm1sLW4zLC5teC1uM3ttYXJnaW4tbGVmdDotMXJlbSFpbXBvcnRhbnR9Lm0tbjR7bWFyZ2luOi0xLjVyZW0haW1wb3J0YW50fS5tdC1uNCwubXktbjR7bWFyZ2luLXRvcDotMS41cmVtIWltcG9ydGFudH0ubXItbjQsLm14LW40e21hcmdpbi1yaWdodDotMS41cmVtIWltcG9ydGFudH0ubWItbjQsLm15LW40e21hcmdpbi1ib3R0b206LTEuNXJlbSFpbXBvcnRhbnR9Lm1sLW40LC5teC1uNHttYXJnaW4tbGVmdDotMS41cmVtIWltcG9ydGFudH0ubS1uNXttYXJnaW46LTNyZW0haW1wb3J0YW50fS5tdC1uNSwubXktbjV7bWFyZ2luLXRvcDotM3JlbSFpbXBvcnRhbnR9Lm1yLW41LC5teC1uNXttYXJnaW4tcmlnaHQ6LTNyZW0haW1wb3J0YW50fS5tYi1uNSwubXktbjV7bWFyZ2luLWJvdHRvbTotM3JlbSFpbXBvcnRhbnR9Lm1sLW41LC5teC1uNXttYXJnaW4tbGVmdDotM3JlbSFpbXBvcnRhbnR9Lm0tYXV0b3ttYXJnaW46YXV0byFpbXBvcnRhbnR9Lm10LWF1dG8sLm15LWF1dG97bWFyZ2luLXRvcDphdXRvIWltcG9ydGFudH0ubXItYXV0bywubXgtYXV0b3ttYXJnaW4tcmlnaHQ6YXV0byFpbXBvcnRhbnR9Lm1iLWF1dG8sLm15LWF1dG97bWFyZ2luLWJvdHRvbTphdXRvIWltcG9ydGFudH0ubWwtYXV0bywubXgtYXV0b3ttYXJnaW4tbGVmdDphdXRvIWltcG9ydGFudH1AbWVkaWEgKG1pbi13aWR0aDo1NzZweCl7Lm0tc20tMHttYXJnaW46MCFpbXBvcnRhbnR9Lm10LXNtLTAsLm15LXNtLTB7bWFyZ2luLXRvcDowIWltcG9ydGFudH0ubXItc20tMCwubXgtc20tMHttYXJnaW4tcmlnaHQ6MCFpbXBvcnRhbnR9Lm1iLXNtLTAsLm15LXNtLTB7bWFyZ2luLWJvdHRvbTowIWltcG9ydGFudH0ubWwtc20tMCwubXgtc20tMHttYXJnaW4tbGVmdDowIWltcG9ydGFudH0ubS1zbS0xe21hcmdpbjouMjVyZW0haW1wb3J0YW50fS5tdC1zbS0xLC5teS1zbS0xe21hcmdpbi10b3A6LjI1cmVtIWltcG9ydGFudH0ubXItc20tMSwubXgtc20tMXttYXJnaW4tcmlnaHQ6LjI1cmVtIWltcG9ydGFudH0ubWItc20tMSwubXktc20tMXttYXJnaW4tYm90dG9tOi4yNXJlbSFpbXBvcnRhbnR9Lm1sLXNtLTEsLm14LXNtLTF7bWFyZ2luLWxlZnQ6LjI1cmVtIWltcG9ydGFudH0ubS1zbS0ye21hcmdpbjouNXJlbSFpbXBvcnRhbnR9Lm10LXNtLTIsLm15LXNtLTJ7bWFyZ2luLXRvcDouNXJlbSFpbXBvcnRhbnR9Lm1yLXNtLTIsLm14LXNtLTJ7bWFyZ2luLXJpZ2h0Oi41cmVtIWltcG9ydGFudH0ubWItc20tMiwubXktc20tMnttYXJnaW4tYm90dG9tOi41cmVtIWltcG9ydGFudH0ubWwtc20tMiwubXgtc20tMnttYXJnaW4tbGVmdDouNXJlbSFpbXBvcnRhbnR9Lm0tc20tM3ttYXJnaW46MXJlbSFpbXBvcnRhbnR9Lm10LXNtLTMsLm15LXNtLTN7bWFyZ2luLXRvcDoxcmVtIWltcG9ydGFudH0ubXItc20tMywubXgtc20tM3ttYXJnaW4tcmlnaHQ6MXJlbSFpbXBvcnRhbnR9Lm1iLXNtLTMsLm15LXNtLTN7bWFyZ2luLWJvdHRvbToxcmVtIWltcG9ydGFudH0ubWwtc20tMywubXgtc20tM3ttYXJnaW4tbGVmdDoxcmVtIWltcG9ydGFudH0ubS1zbS00e21hcmdpbjoxLjVyZW0haW1wb3J0YW50fS5tdC1zbS00LC5teS1zbS00e21hcmdpbi10b3A6MS41cmVtIWltcG9ydGFudH0ubXItc20tNCwubXgtc20tNHttYXJnaW4tcmlnaHQ6MS41cmVtIWltcG9ydGFudH0ubWItc20tNCwubXktc20tNHttYXJnaW4tYm90dG9tOjEuNXJlbSFpbXBvcnRhbnR9Lm1sLXNtLTQsLm14LXNtLTR7bWFyZ2luLWxlZnQ6MS41cmVtIWltcG9ydGFudH0ubS1zbS01e21hcmdpbjozcmVtIWltcG9ydGFudH0ubXQtc20tNSwubXktc20tNXttYXJnaW4tdG9wOjNyZW0haW1wb3J0YW50fS5tci1zbS01LC5teC1zbS01e21hcmdpbi1yaWdodDozcmVtIWltcG9ydGFudH0ubWItc20tNSwubXktc20tNXttYXJnaW4tYm90dG9tOjNyZW0haW1wb3J0YW50fS5tbC1zbS01LC5teC1zbS01e21hcmdpbi1sZWZ0OjNyZW0haW1wb3J0YW50fS5wLXNtLTB7cGFkZGluZzowIWltcG9ydGFudH0ucHQtc20tMCwucHktc20tMHtwYWRkaW5nLXRvcDowIWltcG9ydGFudH0ucHItc20tMCwucHgtc20tMHtwYWRkaW5nLXJpZ2h0OjAhaW1wb3J0YW50fS5wYi1zbS0wLC5weS1zbS0we3BhZGRpbmctYm90dG9tOjAhaW1wb3J0YW50fS5wbC1zbS0wLC5weC1zbS0we3BhZGRpbmctbGVmdDowIWltcG9ydGFudH0ucC1zbS0xe3BhZGRpbmc6LjI1cmVtIWltcG9ydGFudH0ucHQtc20tMSwucHktc20tMXtwYWRkaW5nLXRvcDouMjVyZW0haW1wb3J0YW50fS5wci1zbS0xLC5weC1zbS0xe3BhZGRpbmctcmlnaHQ6LjI1cmVtIWltcG9ydGFudH0ucGItc20tMSwucHktc20tMXtwYWRkaW5nLWJvdHRvbTouMjVyZW0haW1wb3J0YW50fS5wbC1zbS0xLC5weC1zbS0xe3BhZGRpbmctbGVmdDouMjVyZW0haW1wb3J0YW50fS5wLXNtLTJ7cGFkZGluZzouNXJlbSFpbXBvcnRhbnR9LnB0LXNtLTIsLnB5LXNtLTJ7cGFkZGluZy10b3A6LjVyZW0haW1wb3J0YW50fS5wci1zbS0yLC5weC1zbS0ye3BhZGRpbmctcmlnaHQ6LjVyZW0haW1wb3J0YW50fS5wYi1zbS0yLC5weS1zbS0ye3BhZGRpbmctYm90dG9tOi41cmVtIWltcG9ydGFudH0ucGwtc20tMiwucHgtc20tMntwYWRkaW5nLWxlZnQ6LjVyZW0haW1wb3J0YW50fS5wLXNtLTN7cGFkZGluZzoxcmVtIWltcG9ydGFudH0ucHQtc20tMywucHktc20tM3twYWRkaW5nLXRvcDoxcmVtIWltcG9ydGFudH0ucHItc20tMywucHgtc20tM3twYWRkaW5nLXJpZ2h0OjFyZW0haW1wb3J0YW50fS5wYi1zbS0zLC5weS1zbS0ze3BhZGRpbmctYm90dG9tOjFyZW0haW1wb3J0YW50fS5wbC1zbS0zLC5weC1zbS0ze3BhZGRpbmctbGVmdDoxcmVtIWltcG9ydGFudH0ucC1zbS00e3BhZGRpbmc6MS41cmVtIWltcG9ydGFudH0ucHQtc20tNCwucHktc20tNHtwYWRkaW5nLXRvcDoxLjVyZW0haW1wb3J0YW50fS5wci1zbS00LC5weC1zbS00e3BhZGRpbmctcmlnaHQ6MS41cmVtIWltcG9ydGFudH0ucGItc20tNCwucHktc20tNHtwYWRkaW5nLWJvdHRvbToxLjVyZW0haW1wb3J0YW50fS5wbC1zbS00LC5weC1zbS00e3BhZGRpbmctbGVmdDoxLjVyZW0haW1wb3J0YW50fS5wLXNtLTV7cGFkZGluZzozcmVtIWltcG9ydGFudH0ucHQtc20tNSwucHktc20tNXtwYWRkaW5nLXRvcDozcmVtIWltcG9ydGFudH0ucHItc20tNSwucHgtc20tNXtwYWRkaW5nLXJpZ2h0OjNyZW0haW1wb3J0YW50fS5wYi1zbS01LC5weS1zbS01e3BhZGRpbmctYm90dG9tOjNyZW0haW1wb3J0YW50fS5wbC1zbS01LC5weC1zbS01e3BhZGRpbmctbGVmdDozcmVtIWltcG9ydGFudH0ubS1zbS1uMXttYXJnaW46LS4yNXJlbSFpbXBvcnRhbnR9Lm10LXNtLW4xLC5teS1zbS1uMXttYXJnaW4tdG9wOi0uMjVyZW0haW1wb3J0YW50fS5tci1zbS1uMSwubXgtc20tbjF7bWFyZ2luLXJpZ2h0Oi0uMjVyZW0haW1wb3J0YW50fS5tYi1zbS1uMSwubXktc20tbjF7bWFyZ2luLWJvdHRvbTotLjI1cmVtIWltcG9ydGFudH0ubWwtc20tbjEsLm14LXNtLW4xe21hcmdpbi1sZWZ0Oi0uMjVyZW0haW1wb3J0YW50fS5tLXNtLW4ye21hcmdpbjotLjVyZW0haW1wb3J0YW50fS5tdC1zbS1uMiwubXktc20tbjJ7bWFyZ2luLXRvcDotLjVyZW0haW1wb3J0YW50fS5tci1zbS1uMiwubXgtc20tbjJ7bWFyZ2luLXJpZ2h0Oi0uNXJlbSFpbXBvcnRhbnR9Lm1iLXNtLW4yLC5teS1zbS1uMnttYXJnaW4tYm90dG9tOi0uNXJlbSFpbXBvcnRhbnR9Lm1sLXNtLW4yLC5teC1zbS1uMnttYXJnaW4tbGVmdDotLjVyZW0haW1wb3J0YW50fS5tLXNtLW4ze21hcmdpbjotMXJlbSFpbXBvcnRhbnR9Lm10LXNtLW4zLC5teS1zbS1uM3ttYXJnaW4tdG9wOi0xcmVtIWltcG9ydGFudH0ubXItc20tbjMsLm14LXNtLW4ze21hcmdpbi1yaWdodDotMXJlbSFpbXBvcnRhbnR9Lm1iLXNtLW4zLC5teS1zbS1uM3ttYXJnaW4tYm90dG9tOi0xcmVtIWltcG9ydGFudH0ubWwtc20tbjMsLm14LXNtLW4ze21hcmdpbi1sZWZ0Oi0xcmVtIWltcG9ydGFudH0ubS1zbS1uNHttYXJnaW46LTEuNXJlbSFpbXBvcnRhbnR9Lm10LXNtLW40LC5teS1zbS1uNHttYXJnaW4tdG9wOi0xLjVyZW0haW1wb3J0YW50fS5tci1zbS1uNCwubXgtc20tbjR7bWFyZ2luLXJpZ2h0Oi0xLjVyZW0haW1wb3J0YW50fS5tYi1zbS1uNCwubXktc20tbjR7bWFyZ2luLWJvdHRvbTotMS41cmVtIWltcG9ydGFudH0ubWwtc20tbjQsLm14LXNtLW40e21hcmdpbi1sZWZ0Oi0xLjVyZW0haW1wb3J0YW50fS5tLXNtLW41e21hcmdpbjotM3JlbSFpbXBvcnRhbnR9Lm10LXNtLW41LC5teS1zbS1uNXttYXJnaW4tdG9wOi0zcmVtIWltcG9ydGFudH0ubXItc20tbjUsLm14LXNtLW41e21hcmdpbi1yaWdodDotM3JlbSFpbXBvcnRhbnR9Lm1iLXNtLW41LC5teS1zbS1uNXttYXJnaW4tYm90dG9tOi0zcmVtIWltcG9ydGFudH0ubWwtc20tbjUsLm14LXNtLW41e21hcmdpbi1sZWZ0Oi0zcmVtIWltcG9ydGFudH0ubS1zbS1hdXRve21hcmdpbjphdXRvIWltcG9ydGFudH0ubXQtc20tYXV0bywubXktc20tYXV0b3ttYXJnaW4tdG9wOmF1dG8haW1wb3J0YW50fS5tci1zbS1hdXRvLC5teC1zbS1hdXRve21hcmdpbi1yaWdodDphdXRvIWltcG9ydGFudH0ubWItc20tYXV0bywubXktc20tYXV0b3ttYXJnaW4tYm90dG9tOmF1dG8haW1wb3J0YW50fS5tbC1zbS1hdXRvLC5teC1zbS1hdXRve21hcmdpbi1sZWZ0OmF1dG8haW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm0tbWQtMHttYXJnaW46MCFpbXBvcnRhbnR9Lm10LW1kLTAsLm15LW1kLTB7bWFyZ2luLXRvcDowIWltcG9ydGFudH0ubXItbWQtMCwubXgtbWQtMHttYXJnaW4tcmlnaHQ6MCFpbXBvcnRhbnR9Lm1iLW1kLTAsLm15LW1kLTB7bWFyZ2luLWJvdHRvbTowIWltcG9ydGFudH0ubWwtbWQtMCwubXgtbWQtMHttYXJnaW4tbGVmdDowIWltcG9ydGFudH0ubS1tZC0xe21hcmdpbjouMjVyZW0haW1wb3J0YW50fS5tdC1tZC0xLC5teS1tZC0xe21hcmdpbi10b3A6LjI1cmVtIWltcG9ydGFudH0ubXItbWQtMSwubXgtbWQtMXttYXJnaW4tcmlnaHQ6LjI1cmVtIWltcG9ydGFudH0ubWItbWQtMSwubXktbWQtMXttYXJnaW4tYm90dG9tOi4yNXJlbSFpbXBvcnRhbnR9Lm1sLW1kLTEsLm14LW1kLTF7bWFyZ2luLWxlZnQ6LjI1cmVtIWltcG9ydGFudH0ubS1tZC0ye21hcmdpbjouNXJlbSFpbXBvcnRhbnR9Lm10LW1kLTIsLm15LW1kLTJ7bWFyZ2luLXRvcDouNXJlbSFpbXBvcnRhbnR9Lm1yLW1kLTIsLm14LW1kLTJ7bWFyZ2luLXJpZ2h0Oi41cmVtIWltcG9ydGFudH0ubWItbWQtMiwubXktbWQtMnttYXJnaW4tYm90dG9tOi41cmVtIWltcG9ydGFudH0ubWwtbWQtMiwubXgtbWQtMnttYXJnaW4tbGVmdDouNXJlbSFpbXBvcnRhbnR9Lm0tbWQtM3ttYXJnaW46MXJlbSFpbXBvcnRhbnR9Lm10LW1kLTMsLm15LW1kLTN7bWFyZ2luLXRvcDoxcmVtIWltcG9ydGFudH0ubXItbWQtMywubXgtbWQtM3ttYXJnaW4tcmlnaHQ6MXJlbSFpbXBvcnRhbnR9Lm1iLW1kLTMsLm15LW1kLTN7bWFyZ2luLWJvdHRvbToxcmVtIWltcG9ydGFudH0ubWwtbWQtMywubXgtbWQtM3ttYXJnaW4tbGVmdDoxcmVtIWltcG9ydGFudH0ubS1tZC00e21hcmdpbjoxLjVyZW0haW1wb3J0YW50fS5tdC1tZC00LC5teS1tZC00e21hcmdpbi10b3A6MS41cmVtIWltcG9ydGFudH0ubXItbWQtNCwubXgtbWQtNHttYXJnaW4tcmlnaHQ6MS41cmVtIWltcG9ydGFudH0ubWItbWQtNCwubXktbWQtNHttYXJnaW4tYm90dG9tOjEuNXJlbSFpbXBvcnRhbnR9Lm1sLW1kLTQsLm14LW1kLTR7bWFyZ2luLWxlZnQ6MS41cmVtIWltcG9ydGFudH0ubS1tZC01e21hcmdpbjozcmVtIWltcG9ydGFudH0ubXQtbWQtNSwubXktbWQtNXttYXJnaW4tdG9wOjNyZW0haW1wb3J0YW50fS5tci1tZC01LC5teC1tZC01e21hcmdpbi1yaWdodDozcmVtIWltcG9ydGFudH0ubWItbWQtNSwubXktbWQtNXttYXJnaW4tYm90dG9tOjNyZW0haW1wb3J0YW50fS5tbC1tZC01LC5teC1tZC01e21hcmdpbi1sZWZ0OjNyZW0haW1wb3J0YW50fS5wLW1kLTB7cGFkZGluZzowIWltcG9ydGFudH0ucHQtbWQtMCwucHktbWQtMHtwYWRkaW5nLXRvcDowIWltcG9ydGFudH0ucHItbWQtMCwucHgtbWQtMHtwYWRkaW5nLXJpZ2h0OjAhaW1wb3J0YW50fS5wYi1tZC0wLC5weS1tZC0we3BhZGRpbmctYm90dG9tOjAhaW1wb3J0YW50fS5wbC1tZC0wLC5weC1tZC0we3BhZGRpbmctbGVmdDowIWltcG9ydGFudH0ucC1tZC0xe3BhZGRpbmc6LjI1cmVtIWltcG9ydGFudH0ucHQtbWQtMSwucHktbWQtMXtwYWRkaW5nLXRvcDouMjVyZW0haW1wb3J0YW50fS5wci1tZC0xLC5weC1tZC0xe3BhZGRpbmctcmlnaHQ6LjI1cmVtIWltcG9ydGFudH0ucGItbWQtMSwucHktbWQtMXtwYWRkaW5nLWJvdHRvbTouMjVyZW0haW1wb3J0YW50fS5wbC1tZC0xLC5weC1tZC0xe3BhZGRpbmctbGVmdDouMjVyZW0haW1wb3J0YW50fS5wLW1kLTJ7cGFkZGluZzouNXJlbSFpbXBvcnRhbnR9LnB0LW1kLTIsLnB5LW1kLTJ7cGFkZGluZy10b3A6LjVyZW0haW1wb3J0YW50fS5wci1tZC0yLC5weC1tZC0ye3BhZGRpbmctcmlnaHQ6LjVyZW0haW1wb3J0YW50fS5wYi1tZC0yLC5weS1tZC0ye3BhZGRpbmctYm90dG9tOi41cmVtIWltcG9ydGFudH0ucGwtbWQtMiwucHgtbWQtMntwYWRkaW5nLWxlZnQ6LjVyZW0haW1wb3J0YW50fS5wLW1kLTN7cGFkZGluZzoxcmVtIWltcG9ydGFudH0ucHQtbWQtMywucHktbWQtM3twYWRkaW5nLXRvcDoxcmVtIWltcG9ydGFudH0ucHItbWQtMywucHgtbWQtM3twYWRkaW5nLXJpZ2h0OjFyZW0haW1wb3J0YW50fS5wYi1tZC0zLC5weS1tZC0ze3BhZGRpbmctYm90dG9tOjFyZW0haW1wb3J0YW50fS5wbC1tZC0zLC5weC1tZC0ze3BhZGRpbmctbGVmdDoxcmVtIWltcG9ydGFudH0ucC1tZC00e3BhZGRpbmc6MS41cmVtIWltcG9ydGFudH0ucHQtbWQtNCwucHktbWQtNHtwYWRkaW5nLXRvcDoxLjVyZW0haW1wb3J0YW50fS5wci1tZC00LC5weC1tZC00e3BhZGRpbmctcmlnaHQ6MS41cmVtIWltcG9ydGFudH0ucGItbWQtNCwucHktbWQtNHtwYWRkaW5nLWJvdHRvbToxLjVyZW0haW1wb3J0YW50fS5wbC1tZC00LC5weC1tZC00e3BhZGRpbmctbGVmdDoxLjVyZW0haW1wb3J0YW50fS5wLW1kLTV7cGFkZGluZzozcmVtIWltcG9ydGFudH0ucHQtbWQtNSwucHktbWQtNXtwYWRkaW5nLXRvcDozcmVtIWltcG9ydGFudH0ucHItbWQtNSwucHgtbWQtNXtwYWRkaW5nLXJpZ2h0OjNyZW0haW1wb3J0YW50fS5wYi1tZC01LC5weS1tZC01e3BhZGRpbmctYm90dG9tOjNyZW0haW1wb3J0YW50fS5wbC1tZC01LC5weC1tZC01e3BhZGRpbmctbGVmdDozcmVtIWltcG9ydGFudH0ubS1tZC1uMXttYXJnaW46LS4yNXJlbSFpbXBvcnRhbnR9Lm10LW1kLW4xLC5teS1tZC1uMXttYXJnaW4tdG9wOi0uMjVyZW0haW1wb3J0YW50fS5tci1tZC1uMSwubXgtbWQtbjF7bWFyZ2luLXJpZ2h0Oi0uMjVyZW0haW1wb3J0YW50fS5tYi1tZC1uMSwubXktbWQtbjF7bWFyZ2luLWJvdHRvbTotLjI1cmVtIWltcG9ydGFudH0ubWwtbWQtbjEsLm14LW1kLW4xe21hcmdpbi1sZWZ0Oi0uMjVyZW0haW1wb3J0YW50fS5tLW1kLW4ye21hcmdpbjotLjVyZW0haW1wb3J0YW50fS5tdC1tZC1uMiwubXktbWQtbjJ7bWFyZ2luLXRvcDotLjVyZW0haW1wb3J0YW50fS5tci1tZC1uMiwubXgtbWQtbjJ7bWFyZ2luLXJpZ2h0Oi0uNXJlbSFpbXBvcnRhbnR9Lm1iLW1kLW4yLC5teS1tZC1uMnttYXJnaW4tYm90dG9tOi0uNXJlbSFpbXBvcnRhbnR9Lm1sLW1kLW4yLC5teC1tZC1uMnttYXJnaW4tbGVmdDotLjVyZW0haW1wb3J0YW50fS5tLW1kLW4ze21hcmdpbjotMXJlbSFpbXBvcnRhbnR9Lm10LW1kLW4zLC5teS1tZC1uM3ttYXJnaW4tdG9wOi0xcmVtIWltcG9ydGFudH0ubXItbWQtbjMsLm14LW1kLW4ze21hcmdpbi1yaWdodDotMXJlbSFpbXBvcnRhbnR9Lm1iLW1kLW4zLC5teS1tZC1uM3ttYXJnaW4tYm90dG9tOi0xcmVtIWltcG9ydGFudH0ubWwtbWQtbjMsLm14LW1kLW4ze21hcmdpbi1sZWZ0Oi0xcmVtIWltcG9ydGFudH0ubS1tZC1uNHttYXJnaW46LTEuNXJlbSFpbXBvcnRhbnR9Lm10LW1kLW40LC5teS1tZC1uNHttYXJnaW4tdG9wOi0xLjVyZW0haW1wb3J0YW50fS5tci1tZC1uNCwubXgtbWQtbjR7bWFyZ2luLXJpZ2h0Oi0xLjVyZW0haW1wb3J0YW50fS5tYi1tZC1uNCwubXktbWQtbjR7bWFyZ2luLWJvdHRvbTotMS41cmVtIWltcG9ydGFudH0ubWwtbWQtbjQsLm14LW1kLW40e21hcmdpbi1sZWZ0Oi0xLjVyZW0haW1wb3J0YW50fS5tLW1kLW41e21hcmdpbjotM3JlbSFpbXBvcnRhbnR9Lm10LW1kLW41LC5teS1tZC1uNXttYXJnaW4tdG9wOi0zcmVtIWltcG9ydGFudH0ubXItbWQtbjUsLm14LW1kLW41e21hcmdpbi1yaWdodDotM3JlbSFpbXBvcnRhbnR9Lm1iLW1kLW41LC5teS1tZC1uNXttYXJnaW4tYm90dG9tOi0zcmVtIWltcG9ydGFudH0ubWwtbWQtbjUsLm14LW1kLW41e21hcmdpbi1sZWZ0Oi0zcmVtIWltcG9ydGFudH0ubS1tZC1hdXRve21hcmdpbjphdXRvIWltcG9ydGFudH0ubXQtbWQtYXV0bywubXktbWQtYXV0b3ttYXJnaW4tdG9wOmF1dG8haW1wb3J0YW50fS5tci1tZC1hdXRvLC5teC1tZC1hdXRve21hcmdpbi1yaWdodDphdXRvIWltcG9ydGFudH0ubWItbWQtYXV0bywubXktbWQtYXV0b3ttYXJnaW4tYm90dG9tOmF1dG8haW1wb3J0YW50fS5tbC1tZC1hdXRvLC5teC1tZC1hdXRve21hcmdpbi1sZWZ0OmF1dG8haW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7Lm0tbGctMHttYXJnaW46MCFpbXBvcnRhbnR9Lm10LWxnLTAsLm15LWxnLTB7bWFyZ2luLXRvcDowIWltcG9ydGFudH0ubXItbGctMCwubXgtbGctMHttYXJnaW4tcmlnaHQ6MCFpbXBvcnRhbnR9Lm1iLWxnLTAsLm15LWxnLTB7bWFyZ2luLWJvdHRvbTowIWltcG9ydGFudH0ubWwtbGctMCwubXgtbGctMHttYXJnaW4tbGVmdDowIWltcG9ydGFudH0ubS1sZy0xe21hcmdpbjouMjVyZW0haW1wb3J0YW50fS5tdC1sZy0xLC5teS1sZy0xe21hcmdpbi10b3A6LjI1cmVtIWltcG9ydGFudH0ubXItbGctMSwubXgtbGctMXttYXJnaW4tcmlnaHQ6LjI1cmVtIWltcG9ydGFudH0ubWItbGctMSwubXktbGctMXttYXJnaW4tYm90dG9tOi4yNXJlbSFpbXBvcnRhbnR9Lm1sLWxnLTEsLm14LWxnLTF7bWFyZ2luLWxlZnQ6LjI1cmVtIWltcG9ydGFudH0ubS1sZy0ye21hcmdpbjouNXJlbSFpbXBvcnRhbnR9Lm10LWxnLTIsLm15LWxnLTJ7bWFyZ2luLXRvcDouNXJlbSFpbXBvcnRhbnR9Lm1yLWxnLTIsLm14LWxnLTJ7bWFyZ2luLXJpZ2h0Oi41cmVtIWltcG9ydGFudH0ubWItbGctMiwubXktbGctMnttYXJnaW4tYm90dG9tOi41cmVtIWltcG9ydGFudH0ubWwtbGctMiwubXgtbGctMnttYXJnaW4tbGVmdDouNXJlbSFpbXBvcnRhbnR9Lm0tbGctM3ttYXJnaW46MXJlbSFpbXBvcnRhbnR9Lm10LWxnLTMsLm15LWxnLTN7bWFyZ2luLXRvcDoxcmVtIWltcG9ydGFudH0ubXItbGctMywubXgtbGctM3ttYXJnaW4tcmlnaHQ6MXJlbSFpbXBvcnRhbnR9Lm1iLWxnLTMsLm15LWxnLTN7bWFyZ2luLWJvdHRvbToxcmVtIWltcG9ydGFudH0ubWwtbGctMywubXgtbGctM3ttYXJnaW4tbGVmdDoxcmVtIWltcG9ydGFudH0ubS1sZy00e21hcmdpbjoxLjVyZW0haW1wb3J0YW50fS5tdC1sZy00LC5teS1sZy00e21hcmdpbi10b3A6MS41cmVtIWltcG9ydGFudH0ubXItbGctNCwubXgtbGctNHttYXJnaW4tcmlnaHQ6MS41cmVtIWltcG9ydGFudH0ubWItbGctNCwubXktbGctNHttYXJnaW4tYm90dG9tOjEuNXJlbSFpbXBvcnRhbnR9Lm1sLWxnLTQsLm14LWxnLTR7bWFyZ2luLWxlZnQ6MS41cmVtIWltcG9ydGFudH0ubS1sZy01e21hcmdpbjozcmVtIWltcG9ydGFudH0ubXQtbGctNSwubXktbGctNXttYXJnaW4tdG9wOjNyZW0haW1wb3J0YW50fS5tci1sZy01LC5teC1sZy01e21hcmdpbi1yaWdodDozcmVtIWltcG9ydGFudH0ubWItbGctNSwubXktbGctNXttYXJnaW4tYm90dG9tOjNyZW0haW1wb3J0YW50fS5tbC1sZy01LC5teC1sZy01e21hcmdpbi1sZWZ0OjNyZW0haW1wb3J0YW50fS5wLWxnLTB7cGFkZGluZzowIWltcG9ydGFudH0ucHQtbGctMCwucHktbGctMHtwYWRkaW5nLXRvcDowIWltcG9ydGFudH0ucHItbGctMCwucHgtbGctMHtwYWRkaW5nLXJpZ2h0OjAhaW1wb3J0YW50fS5wYi1sZy0wLC5weS1sZy0we3BhZGRpbmctYm90dG9tOjAhaW1wb3J0YW50fS5wbC1sZy0wLC5weC1sZy0we3BhZGRpbmctbGVmdDowIWltcG9ydGFudH0ucC1sZy0xe3BhZGRpbmc6LjI1cmVtIWltcG9ydGFudH0ucHQtbGctMSwucHktbGctMXtwYWRkaW5nLXRvcDouMjVyZW0haW1wb3J0YW50fS5wci1sZy0xLC5weC1sZy0xe3BhZGRpbmctcmlnaHQ6LjI1cmVtIWltcG9ydGFudH0ucGItbGctMSwucHktbGctMXtwYWRkaW5nLWJvdHRvbTouMjVyZW0haW1wb3J0YW50fS5wbC1sZy0xLC5weC1sZy0xe3BhZGRpbmctbGVmdDouMjVyZW0haW1wb3J0YW50fS5wLWxnLTJ7cGFkZGluZzouNXJlbSFpbXBvcnRhbnR9LnB0LWxnLTIsLnB5LWxnLTJ7cGFkZGluZy10b3A6LjVyZW0haW1wb3J0YW50fS5wci1sZy0yLC5weC1sZy0ye3BhZGRpbmctcmlnaHQ6LjVyZW0haW1wb3J0YW50fS5wYi1sZy0yLC5weS1sZy0ye3BhZGRpbmctYm90dG9tOi41cmVtIWltcG9ydGFudH0ucGwtbGctMiwucHgtbGctMntwYWRkaW5nLWxlZnQ6LjVyZW0haW1wb3J0YW50fS5wLWxnLTN7cGFkZGluZzoxcmVtIWltcG9ydGFudH0ucHQtbGctMywucHktbGctM3twYWRkaW5nLXRvcDoxcmVtIWltcG9ydGFudH0ucHItbGctMywucHgtbGctM3twYWRkaW5nLXJpZ2h0OjFyZW0haW1wb3J0YW50fS5wYi1sZy0zLC5weS1sZy0ze3BhZGRpbmctYm90dG9tOjFyZW0haW1wb3J0YW50fS5wbC1sZy0zLC5weC1sZy0ze3BhZGRpbmctbGVmdDoxcmVtIWltcG9ydGFudH0ucC1sZy00e3BhZGRpbmc6MS41cmVtIWltcG9ydGFudH0ucHQtbGctNCwucHktbGctNHtwYWRkaW5nLXRvcDoxLjVyZW0haW1wb3J0YW50fS5wci1sZy00LC5weC1sZy00e3BhZGRpbmctcmlnaHQ6MS41cmVtIWltcG9ydGFudH0ucGItbGctNCwucHktbGctNHtwYWRkaW5nLWJvdHRvbToxLjVyZW0haW1wb3J0YW50fS5wbC1sZy00LC5weC1sZy00e3BhZGRpbmctbGVmdDoxLjVyZW0haW1wb3J0YW50fS5wLWxnLTV7cGFkZGluZzozcmVtIWltcG9ydGFudH0ucHQtbGctNSwucHktbGctNXtwYWRkaW5nLXRvcDozcmVtIWltcG9ydGFudH0ucHItbGctNSwucHgtbGctNXtwYWRkaW5nLXJpZ2h0OjNyZW0haW1wb3J0YW50fS5wYi1sZy01LC5weS1sZy01e3BhZGRpbmctYm90dG9tOjNyZW0haW1wb3J0YW50fS5wbC1sZy01LC5weC1sZy01e3BhZGRpbmctbGVmdDozcmVtIWltcG9ydGFudH0ubS1sZy1uMXttYXJnaW46LS4yNXJlbSFpbXBvcnRhbnR9Lm10LWxnLW4xLC5teS1sZy1uMXttYXJnaW4tdG9wOi0uMjVyZW0haW1wb3J0YW50fS5tci1sZy1uMSwubXgtbGctbjF7bWFyZ2luLXJpZ2h0Oi0uMjVyZW0haW1wb3J0YW50fS5tYi1sZy1uMSwubXktbGctbjF7bWFyZ2luLWJvdHRvbTotLjI1cmVtIWltcG9ydGFudH0ubWwtbGctbjEsLm14LWxnLW4xe21hcmdpbi1sZWZ0Oi0uMjVyZW0haW1wb3J0YW50fS5tLWxnLW4ye21hcmdpbjotLjVyZW0haW1wb3J0YW50fS5tdC1sZy1uMiwubXktbGctbjJ7bWFyZ2luLXRvcDotLjVyZW0haW1wb3J0YW50fS5tci1sZy1uMiwubXgtbGctbjJ7bWFyZ2luLXJpZ2h0Oi0uNXJlbSFpbXBvcnRhbnR9Lm1iLWxnLW4yLC5teS1sZy1uMnttYXJnaW4tYm90dG9tOi0uNXJlbSFpbXBvcnRhbnR9Lm1sLWxnLW4yLC5teC1sZy1uMnttYXJnaW4tbGVmdDotLjVyZW0haW1wb3J0YW50fS5tLWxnLW4ze21hcmdpbjotMXJlbSFpbXBvcnRhbnR9Lm10LWxnLW4zLC5teS1sZy1uM3ttYXJnaW4tdG9wOi0xcmVtIWltcG9ydGFudH0ubXItbGctbjMsLm14LWxnLW4ze21hcmdpbi1yaWdodDotMXJlbSFpbXBvcnRhbnR9Lm1iLWxnLW4zLC5teS1sZy1uM3ttYXJnaW4tYm90dG9tOi0xcmVtIWltcG9ydGFudH0ubWwtbGctbjMsLm14LWxnLW4ze21hcmdpbi1sZWZ0Oi0xcmVtIWltcG9ydGFudH0ubS1sZy1uNHttYXJnaW46LTEuNXJlbSFpbXBvcnRhbnR9Lm10LWxnLW40LC5teS1sZy1uNHttYXJnaW4tdG9wOi0xLjVyZW0haW1wb3J0YW50fS5tci1sZy1uNCwubXgtbGctbjR7bWFyZ2luLXJpZ2h0Oi0xLjVyZW0haW1wb3J0YW50fS5tYi1sZy1uNCwubXktbGctbjR7bWFyZ2luLWJvdHRvbTotMS41cmVtIWltcG9ydGFudH0ubWwtbGctbjQsLm14LWxnLW40e21hcmdpbi1sZWZ0Oi0xLjVyZW0haW1wb3J0YW50fS5tLWxnLW41e21hcmdpbjotM3JlbSFpbXBvcnRhbnR9Lm10LWxnLW41LC5teS1sZy1uNXttYXJnaW4tdG9wOi0zcmVtIWltcG9ydGFudH0ubXItbGctbjUsLm14LWxnLW41e21hcmdpbi1yaWdodDotM3JlbSFpbXBvcnRhbnR9Lm1iLWxnLW41LC5teS1sZy1uNXttYXJnaW4tYm90dG9tOi0zcmVtIWltcG9ydGFudH0ubWwtbGctbjUsLm14LWxnLW41e21hcmdpbi1sZWZ0Oi0zcmVtIWltcG9ydGFudH0ubS1sZy1hdXRve21hcmdpbjphdXRvIWltcG9ydGFudH0ubXQtbGctYXV0bywubXktbGctYXV0b3ttYXJnaW4tdG9wOmF1dG8haW1wb3J0YW50fS5tci1sZy1hdXRvLC5teC1sZy1hdXRve21hcmdpbi1yaWdodDphdXRvIWltcG9ydGFudH0ubWItbGctYXV0bywubXktbGctYXV0b3ttYXJnaW4tYm90dG9tOmF1dG8haW1wb3J0YW50fS5tbC1sZy1hdXRvLC5teC1sZy1hdXRve21hcmdpbi1sZWZ0OmF1dG8haW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey5tLXhsLTB7bWFyZ2luOjAhaW1wb3J0YW50fS5tdC14bC0wLC5teS14bC0we21hcmdpbi10b3A6MCFpbXBvcnRhbnR9Lm1yLXhsLTAsLm14LXhsLTB7bWFyZ2luLXJpZ2h0OjAhaW1wb3J0YW50fS5tYi14bC0wLC5teS14bC0we21hcmdpbi1ib3R0b206MCFpbXBvcnRhbnR9Lm1sLXhsLTAsLm14LXhsLTB7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnR9Lm0teGwtMXttYXJnaW46LjI1cmVtIWltcG9ydGFudH0ubXQteGwtMSwubXkteGwtMXttYXJnaW4tdG9wOi4yNXJlbSFpbXBvcnRhbnR9Lm1yLXhsLTEsLm14LXhsLTF7bWFyZ2luLXJpZ2h0Oi4yNXJlbSFpbXBvcnRhbnR9Lm1iLXhsLTEsLm15LXhsLTF7bWFyZ2luLWJvdHRvbTouMjVyZW0haW1wb3J0YW50fS5tbC14bC0xLC5teC14bC0xe21hcmdpbi1sZWZ0Oi4yNXJlbSFpbXBvcnRhbnR9Lm0teGwtMnttYXJnaW46LjVyZW0haW1wb3J0YW50fS5tdC14bC0yLC5teS14bC0ye21hcmdpbi10b3A6LjVyZW0haW1wb3J0YW50fS5tci14bC0yLC5teC14bC0ye21hcmdpbi1yaWdodDouNXJlbSFpbXBvcnRhbnR9Lm1iLXhsLTIsLm15LXhsLTJ7bWFyZ2luLWJvdHRvbTouNXJlbSFpbXBvcnRhbnR9Lm1sLXhsLTIsLm14LXhsLTJ7bWFyZ2luLWxlZnQ6LjVyZW0haW1wb3J0YW50fS5tLXhsLTN7bWFyZ2luOjFyZW0haW1wb3J0YW50fS5tdC14bC0zLC5teS14bC0ze21hcmdpbi10b3A6MXJlbSFpbXBvcnRhbnR9Lm1yLXhsLTMsLm14LXhsLTN7bWFyZ2luLXJpZ2h0OjFyZW0haW1wb3J0YW50fS5tYi14bC0zLC5teS14bC0ze21hcmdpbi1ib3R0b206MXJlbSFpbXBvcnRhbnR9Lm1sLXhsLTMsLm14LXhsLTN7bWFyZ2luLWxlZnQ6MXJlbSFpbXBvcnRhbnR9Lm0teGwtNHttYXJnaW46MS41cmVtIWltcG9ydGFudH0ubXQteGwtNCwubXkteGwtNHttYXJnaW4tdG9wOjEuNXJlbSFpbXBvcnRhbnR9Lm1yLXhsLTQsLm14LXhsLTR7bWFyZ2luLXJpZ2h0OjEuNXJlbSFpbXBvcnRhbnR9Lm1iLXhsLTQsLm15LXhsLTR7bWFyZ2luLWJvdHRvbToxLjVyZW0haW1wb3J0YW50fS5tbC14bC00LC5teC14bC00e21hcmdpbi1sZWZ0OjEuNXJlbSFpbXBvcnRhbnR9Lm0teGwtNXttYXJnaW46M3JlbSFpbXBvcnRhbnR9Lm10LXhsLTUsLm15LXhsLTV7bWFyZ2luLXRvcDozcmVtIWltcG9ydGFudH0ubXIteGwtNSwubXgteGwtNXttYXJnaW4tcmlnaHQ6M3JlbSFpbXBvcnRhbnR9Lm1iLXhsLTUsLm15LXhsLTV7bWFyZ2luLWJvdHRvbTozcmVtIWltcG9ydGFudH0ubWwteGwtNSwubXgteGwtNXttYXJnaW4tbGVmdDozcmVtIWltcG9ydGFudH0ucC14bC0we3BhZGRpbmc6MCFpbXBvcnRhbnR9LnB0LXhsLTAsLnB5LXhsLTB7cGFkZGluZy10b3A6MCFpbXBvcnRhbnR9LnByLXhsLTAsLnB4LXhsLTB7cGFkZGluZy1yaWdodDowIWltcG9ydGFudH0ucGIteGwtMCwucHkteGwtMHtwYWRkaW5nLWJvdHRvbTowIWltcG9ydGFudH0ucGwteGwtMCwucHgteGwtMHtwYWRkaW5nLWxlZnQ6MCFpbXBvcnRhbnR9LnAteGwtMXtwYWRkaW5nOi4yNXJlbSFpbXBvcnRhbnR9LnB0LXhsLTEsLnB5LXhsLTF7cGFkZGluZy10b3A6LjI1cmVtIWltcG9ydGFudH0ucHIteGwtMSwucHgteGwtMXtwYWRkaW5nLXJpZ2h0Oi4yNXJlbSFpbXBvcnRhbnR9LnBiLXhsLTEsLnB5LXhsLTF7cGFkZGluZy1ib3R0b206LjI1cmVtIWltcG9ydGFudH0ucGwteGwtMSwucHgteGwtMXtwYWRkaW5nLWxlZnQ6LjI1cmVtIWltcG9ydGFudH0ucC14bC0ye3BhZGRpbmc6LjVyZW0haW1wb3J0YW50fS5wdC14bC0yLC5weS14bC0ye3BhZGRpbmctdG9wOi41cmVtIWltcG9ydGFudH0ucHIteGwtMiwucHgteGwtMntwYWRkaW5nLXJpZ2h0Oi41cmVtIWltcG9ydGFudH0ucGIteGwtMiwucHkteGwtMntwYWRkaW5nLWJvdHRvbTouNXJlbSFpbXBvcnRhbnR9LnBsLXhsLTIsLnB4LXhsLTJ7cGFkZGluZy1sZWZ0Oi41cmVtIWltcG9ydGFudH0ucC14bC0ze3BhZGRpbmc6MXJlbSFpbXBvcnRhbnR9LnB0LXhsLTMsLnB5LXhsLTN7cGFkZGluZy10b3A6MXJlbSFpbXBvcnRhbnR9LnByLXhsLTMsLnB4LXhsLTN7cGFkZGluZy1yaWdodDoxcmVtIWltcG9ydGFudH0ucGIteGwtMywucHkteGwtM3twYWRkaW5nLWJvdHRvbToxcmVtIWltcG9ydGFudH0ucGwteGwtMywucHgteGwtM3twYWRkaW5nLWxlZnQ6MXJlbSFpbXBvcnRhbnR9LnAteGwtNHtwYWRkaW5nOjEuNXJlbSFpbXBvcnRhbnR9LnB0LXhsLTQsLnB5LXhsLTR7cGFkZGluZy10b3A6MS41cmVtIWltcG9ydGFudH0ucHIteGwtNCwucHgteGwtNHtwYWRkaW5nLXJpZ2h0OjEuNXJlbSFpbXBvcnRhbnR9LnBiLXhsLTQsLnB5LXhsLTR7cGFkZGluZy1ib3R0b206MS41cmVtIWltcG9ydGFudH0ucGwteGwtNCwucHgteGwtNHtwYWRkaW5nLWxlZnQ6MS41cmVtIWltcG9ydGFudH0ucC14bC01e3BhZGRpbmc6M3JlbSFpbXBvcnRhbnR9LnB0LXhsLTUsLnB5LXhsLTV7cGFkZGluZy10b3A6M3JlbSFpbXBvcnRhbnR9LnByLXhsLTUsLnB4LXhsLTV7cGFkZGluZy1yaWdodDozcmVtIWltcG9ydGFudH0ucGIteGwtNSwucHkteGwtNXtwYWRkaW5nLWJvdHRvbTozcmVtIWltcG9ydGFudH0ucGwteGwtNSwucHgteGwtNXtwYWRkaW5nLWxlZnQ6M3JlbSFpbXBvcnRhbnR9Lm0teGwtbjF7bWFyZ2luOi0uMjVyZW0haW1wb3J0YW50fS5tdC14bC1uMSwubXkteGwtbjF7bWFyZ2luLXRvcDotLjI1cmVtIWltcG9ydGFudH0ubXIteGwtbjEsLm14LXhsLW4xe21hcmdpbi1yaWdodDotLjI1cmVtIWltcG9ydGFudH0ubWIteGwtbjEsLm15LXhsLW4xe21hcmdpbi1ib3R0b206LS4yNXJlbSFpbXBvcnRhbnR9Lm1sLXhsLW4xLC5teC14bC1uMXttYXJnaW4tbGVmdDotLjI1cmVtIWltcG9ydGFudH0ubS14bC1uMnttYXJnaW46LS41cmVtIWltcG9ydGFudH0ubXQteGwtbjIsLm15LXhsLW4ye21hcmdpbi10b3A6LS41cmVtIWltcG9ydGFudH0ubXIteGwtbjIsLm14LXhsLW4ye21hcmdpbi1yaWdodDotLjVyZW0haW1wb3J0YW50fS5tYi14bC1uMiwubXkteGwtbjJ7bWFyZ2luLWJvdHRvbTotLjVyZW0haW1wb3J0YW50fS5tbC14bC1uMiwubXgteGwtbjJ7bWFyZ2luLWxlZnQ6LS41cmVtIWltcG9ydGFudH0ubS14bC1uM3ttYXJnaW46LTFyZW0haW1wb3J0YW50fS5tdC14bC1uMywubXkteGwtbjN7bWFyZ2luLXRvcDotMXJlbSFpbXBvcnRhbnR9Lm1yLXhsLW4zLC5teC14bC1uM3ttYXJnaW4tcmlnaHQ6LTFyZW0haW1wb3J0YW50fS5tYi14bC1uMywubXkteGwtbjN7bWFyZ2luLWJvdHRvbTotMXJlbSFpbXBvcnRhbnR9Lm1sLXhsLW4zLC5teC14bC1uM3ttYXJnaW4tbGVmdDotMXJlbSFpbXBvcnRhbnR9Lm0teGwtbjR7bWFyZ2luOi0xLjVyZW0haW1wb3J0YW50fS5tdC14bC1uNCwubXkteGwtbjR7bWFyZ2luLXRvcDotMS41cmVtIWltcG9ydGFudH0ubXIteGwtbjQsLm14LXhsLW40e21hcmdpbi1yaWdodDotMS41cmVtIWltcG9ydGFudH0ubWIteGwtbjQsLm15LXhsLW40e21hcmdpbi1ib3R0b206LTEuNXJlbSFpbXBvcnRhbnR9Lm1sLXhsLW40LC5teC14bC1uNHttYXJnaW4tbGVmdDotMS41cmVtIWltcG9ydGFudH0ubS14bC1uNXttYXJnaW46LTNyZW0haW1wb3J0YW50fS5tdC14bC1uNSwubXkteGwtbjV7bWFyZ2luLXRvcDotM3JlbSFpbXBvcnRhbnR9Lm1yLXhsLW41LC5teC14bC1uNXttYXJnaW4tcmlnaHQ6LTNyZW0haW1wb3J0YW50fS5tYi14bC1uNSwubXkteGwtbjV7bWFyZ2luLWJvdHRvbTotM3JlbSFpbXBvcnRhbnR9Lm1sLXhsLW41LC5teC14bC1uNXttYXJnaW4tbGVmdDotM3JlbSFpbXBvcnRhbnR9Lm0teGwtYXV0b3ttYXJnaW46YXV0byFpbXBvcnRhbnR9Lm10LXhsLWF1dG8sLm15LXhsLWF1dG97bWFyZ2luLXRvcDphdXRvIWltcG9ydGFudH0ubXIteGwtYXV0bywubXgteGwtYXV0b3ttYXJnaW4tcmlnaHQ6YXV0byFpbXBvcnRhbnR9Lm1iLXhsLWF1dG8sLm15LXhsLWF1dG97bWFyZ2luLWJvdHRvbTphdXRvIWltcG9ydGFudH0ubWwteGwtYXV0bywubXgteGwtYXV0b3ttYXJnaW4tbGVmdDphdXRvIWltcG9ydGFudH19LnN0cmV0Y2hlZC1saW5rOjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDt6LWluZGV4OjE7cG9pbnRlci1ldmVudHM6YXV0bztjb250ZW50OiIiO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKX0udGV4dC1tb25vc3BhY2V7Zm9udC1mYW1pbHk6U0ZNb25vLVJlZ3VsYXIsTWVubG8sTW9uYWNvLENvbnNvbGFzLCJMaWJlcmF0aW9uIE1vbm8iLCJDb3VyaWVyIE5ldyIsbW9ub3NwYWNlIWltcG9ydGFudH0udGV4dC1qdXN0aWZ5e3RleHQtYWxpZ246anVzdGlmeSFpbXBvcnRhbnR9LnRleHQtd3JhcHt3aGl0ZS1zcGFjZTpub3JtYWwhaW1wb3J0YW50fS50ZXh0LW5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXAhaW1wb3J0YW50fS50ZXh0LXRydW5jYXRle292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdCFpbXBvcnRhbnR9LnRleHQtcmlnaHR7dGV4dC1hbGlnbjpyaWdodCFpbXBvcnRhbnR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyIWltcG9ydGFudH1AbWVkaWEgKG1pbi13aWR0aDo1NzZweCl7LnRleHQtc20tbGVmdHt0ZXh0LWFsaWduOmxlZnQhaW1wb3J0YW50fS50ZXh0LXNtLXJpZ2h0e3RleHQtYWxpZ246cmlnaHQhaW1wb3J0YW50fS50ZXh0LXNtLWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlciFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsudGV4dC1tZC1sZWZ0e3RleHQtYWxpZ246bGVmdCFpbXBvcnRhbnR9LnRleHQtbWQtcmlnaHR7dGV4dC1hbGlnbjpyaWdodCFpbXBvcnRhbnR9LnRleHQtbWQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey50ZXh0LWxnLWxlZnR7dGV4dC1hbGlnbjpsZWZ0IWltcG9ydGFudH0udGV4dC1sZy1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0IWltcG9ydGFudH0udGV4dC1sZy1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXIhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey50ZXh0LXhsLWxlZnR7dGV4dC1hbGlnbjpsZWZ0IWltcG9ydGFudH0udGV4dC14bC1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0IWltcG9ydGFudH0udGV4dC14bC1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXIhaW1wb3J0YW50fX0udGV4dC1sb3dlcmNhc2V7dGV4dC10cmFuc2Zvcm06bG93ZXJjYXNlIWltcG9ydGFudH0udGV4dC11cHBlcmNhc2V7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlIWltcG9ydGFudH0udGV4dC1jYXBpdGFsaXple3RleHQtdHJhbnNmb3JtOmNhcGl0YWxpemUhaW1wb3J0YW50fS5mb250LXdlaWdodC1saWdodHtmb250LXdlaWdodDozMDAhaW1wb3J0YW50fS5mb250LXdlaWdodC1saWdodGVye2ZvbnQtd2VpZ2h0OmxpZ2h0ZXIhaW1wb3J0YW50fS5mb250LXdlaWdodC1ub3JtYWx7Zm9udC13ZWlnaHQ6NDAwIWltcG9ydGFudH0uZm9udC13ZWlnaHQtYm9sZHtmb250LXdlaWdodDo3MDAhaW1wb3J0YW50fS5mb250LXdlaWdodC1ib2xkZXJ7Zm9udC13ZWlnaHQ6Ym9sZGVyIWltcG9ydGFudH0uZm9udC1pdGFsaWN7Zm9udC1zdHlsZTppdGFsaWMhaW1wb3J0YW50fS50ZXh0LXdoaXRle2NvbG9yOiNmZmYhaW1wb3J0YW50fS50ZXh0LXByaW1hcnl7Y29sb3I6IzAwN2JmZiFpbXBvcnRhbnR9YS50ZXh0LXByaW1hcnk6Zm9jdXMsYS50ZXh0LXByaW1hcnk6aG92ZXJ7Y29sb3I6IzAwNTZiMyFpbXBvcnRhbnR9LnRleHQtc2Vjb25kYXJ5e2NvbG9yOiM2Yzc1N2QhaW1wb3J0YW50fWEudGV4dC1zZWNvbmRhcnk6Zm9jdXMsYS50ZXh0LXNlY29uZGFyeTpob3Zlcntjb2xvcjojNDk0ZjU0IWltcG9ydGFudH0udGV4dC1zdWNjZXNze2NvbG9yOiMyOGE3NDUhaW1wb3J0YW50fWEudGV4dC1zdWNjZXNzOmZvY3VzLGEudGV4dC1zdWNjZXNzOmhvdmVye2NvbG9yOiMxOTY5MmMhaW1wb3J0YW50fS50ZXh0LWluZm97Y29sb3I6IzE3YTJiOCFpbXBvcnRhbnR9YS50ZXh0LWluZm86Zm9jdXMsYS50ZXh0LWluZm86aG92ZXJ7Y29sb3I6IzBmNjY3NCFpbXBvcnRhbnR9LnRleHQtd2FybmluZ3tjb2xvcjojZmZjMTA3IWltcG9ydGFudH1hLnRleHQtd2FybmluZzpmb2N1cyxhLnRleHQtd2FybmluZzpob3Zlcntjb2xvcjojYmE4YjAwIWltcG9ydGFudH0udGV4dC1kYW5nZXJ7Y29sb3I6I2RjMzU0NSFpbXBvcnRhbnR9YS50ZXh0LWRhbmdlcjpmb2N1cyxhLnRleHQtZGFuZ2VyOmhvdmVye2NvbG9yOiNhNzFkMmEhaW1wb3J0YW50fS50ZXh0LWxpZ2h0e2NvbG9yOiNmOGY5ZmEhaW1wb3J0YW50fWEudGV4dC1saWdodDpmb2N1cyxhLnRleHQtbGlnaHQ6aG92ZXJ7Y29sb3I6I2NiZDNkYSFpbXBvcnRhbnR9LnRleHQtZGFya3tjb2xvcjojMzQzYTQwIWltcG9ydGFudH1hLnRleHQtZGFyazpmb2N1cyxhLnRleHQtZGFyazpob3Zlcntjb2xvcjojMTIxNDE2IWltcG9ydGFudH0udGV4dC1ib2R5e2NvbG9yOiMyMTI1MjkhaW1wb3J0YW50fS50ZXh0LW11dGVke2NvbG9yOiM2Yzc1N2QhaW1wb3J0YW50fS50ZXh0LWJsYWNrLTUwe2NvbG9yOnJnYmEoMCwwLDAsLjUpIWltcG9ydGFudH0udGV4dC13aGl0ZS01MHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KSFpbXBvcnRhbnR9LnRleHQtaGlkZXtmb250OjAvMCBhO2NvbG9yOnRyYW5zcGFyZW50O3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MH0udGV4dC1kZWNvcmF0aW9uLW5vbmV7dGV4dC1kZWNvcmF0aW9uOm5vbmUhaW1wb3J0YW50fS50ZXh0LWJyZWFre3dvcmQtYnJlYWs6YnJlYWstd29yZCFpbXBvcnRhbnQ7d29yZC13cmFwOmJyZWFrLXdvcmQhaW1wb3J0YW50fS50ZXh0LXJlc2V0e2NvbG9yOmluaGVyaXQhaW1wb3J0YW50fS52aXNpYmxle3Zpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnR9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbiFpbXBvcnRhbnR9QG1lZGlhIHByaW50eyosOjphZnRlciw6OmJlZm9yZXt0ZXh0LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fWE6bm90KC5idG4pe3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9YWJiclt0aXRsZV06OmFmdGVye2NvbnRlbnQ6IiAoIiBhdHRyKHRpdGxlKSAiKSJ9cHJle3doaXRlLXNwYWNlOnByZS13cmFwIWltcG9ydGFudH1ibG9ja3F1b3RlLHByZXtib3JkZXI6MXB4IHNvbGlkICNhZGI1YmQ7cGFnZS1icmVhay1pbnNpZGU6YXZvaWR9dGhlYWR7ZGlzcGxheTp0YWJsZS1oZWFkZXItZ3JvdXB9aW1nLHRye3BhZ2UtYnJlYWstaW5zaWRlOmF2b2lkfWgyLGgzLHB7b3JwaGFuczozO3dpZG93czozfWgyLGgze3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWR9QHBhZ2V7c2l6ZTphM31ib2R5e21pbi13aWR0aDo5OTJweCFpbXBvcnRhbnR9LmNvbnRhaW5lcnttaW4td2lkdGg6OTkycHghaW1wb3J0YW50fS5uYXZiYXJ7ZGlzcGxheTpub25lfS5iYWRnZXtib3JkZXI6MXB4IHNvbGlkICMwMDB9LnRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZSFpbXBvcnRhbnR9LnRhYmxlIHRkLC50YWJsZSB0aHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50fS50YWJsZS1ib3JkZXJlZCB0ZCwudGFibGUtYm9yZGVyZWQgdGh7Ym9yZGVyOjFweCBzb2xpZCAjZGVlMmU2IWltcG9ydGFudH0udGFibGUtZGFya3tjb2xvcjppbmhlcml0fS50YWJsZS1kYXJrIHRib2R5K3Rib2R5LC50YWJsZS1kYXJrIHRkLC50YWJsZS1kYXJrIHRoLC50YWJsZS1kYXJrIHRoZWFkIHRoe2JvcmRlci1jb2xvcjojZGVlMmU2fS50YWJsZSAudGhlYWQtZGFyayB0aHtjb2xvcjppbmhlcml0O2JvcmRlci1jb2xvcjojZGVlMmU2fX0KLyojIHNvdXJjZU1hcHBpbmdVUkw9Ym9vdHN0cmFwLm1pbi5jc3MubWFwICov\"") - packr.PackJSONBytes("../../web/public", "build/bundle.js", "\"CihmdW5jdGlvbihsLCByKSB7IGlmIChsLmdldEVsZW1lbnRCeUlkKCdsaXZlcmVsb2Fkc2NyaXB0JykpIHJldHVybjsgciA9IGwuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IHIuYXN5bmMgPSAxOyByLnNyYyA9ICcvLycgKyAod2luZG93LmxvY2F0aW9uLmhvc3QgfHwgJ2xvY2FsaG9zdCcpLnNwbGl0KCc6JylbMF0gKyAnOjM1NzI5L2xpdmVyZWxvYWQuanM/c25pcHZlcj0xJzsgci5pZCA9ICdsaXZlcmVsb2Fkc2NyaXB0JzsgbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHIpIH0pKHdpbmRvdy5kb2N1bWVudCk7CnZhciBhcHAgPSAoZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGZ1bmN0aW9uIG5vb3AoKSB7IH0KICAgIGZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykgewogICAgICAgIC8vIEB0cy1pZ25vcmUKICAgICAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKQogICAgICAgICAgICB0YXJba10gPSBzcmNba107CiAgICAgICAgcmV0dXJuIHRhcjsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHsKICAgICAgICBlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7CiAgICAgICAgICAgIGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBydW4oZm4pIHsKICAgICAgICByZXR1cm4gZm4oKTsKICAgIH0KICAgIGZ1bmN0aW9uIGJsYW5rX29iamVjdCgpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJ1bl9hbGwoZm5zKSB7CiAgICAgICAgZm5zLmZvckVhY2gocnVuKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJzsKICAgIH0KICAgIGZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHsKICAgICAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYiB8fCAoKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyk7CiAgICB9CiAgICBmdW5jdGlvbiBpc19lbXB0eShvYmopIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVfc2xvdChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7CiAgICAgICAgaWYgKGRlZmluaXRpb24pIHsKICAgICAgICAgICAgY29uc3Qgc2xvdF9jdHggPSBnZXRfc2xvdF9jb250ZXh0KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pOwogICAgICAgICAgICByZXR1cm4gZGVmaW5pdGlvblswXShzbG90X2N0eCk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7CiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25bMV0gJiYgZm4KICAgICAgICAgICAgPyBhc3NpZ24oJCRzY29wZS5jdHguc2xpY2UoKSwgZGVmaW5pdGlvblsxXShmbihjdHgpKSkKICAgICAgICAgICAgOiAkJHNjb3BlLmN0eDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldF9zbG90X2NoYW5nZXMoZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGZuKSB7CiAgICAgICAgaWYgKGRlZmluaXRpb25bMl0gJiYgZm4pIHsKICAgICAgICAgICAgY29uc3QgbGV0cyA9IGRlZmluaXRpb25bMl0oZm4oZGlydHkpKTsKICAgICAgICAgICAgaWYgKCQkc2NvcGUuZGlydHkgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxldHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBsZXRzID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gW107CiAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1heCgkJHNjb3BlLmRpcnR5Lmxlbmd0aCwgbGV0cy5sZW5ndGgpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkgewogICAgICAgICAgICAgICAgICAgIG1lcmdlZFtpXSA9ICQkc2NvcGUuZGlydHlbaV0gfCBsZXRzW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCRzY29wZS5kaXJ0eSB8IGxldHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkJHNjb3BlLmRpcnR5OwogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlX3Nsb3Qoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuLCBnZXRfc2xvdF9jb250ZXh0X2ZuKSB7CiAgICAgICAgY29uc3Qgc2xvdF9jaGFuZ2VzID0gZ2V0X3Nsb3RfY2hhbmdlcyhzbG90X2RlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuKTsKICAgICAgICBpZiAoc2xvdF9jaGFuZ2VzKSB7CiAgICAgICAgICAgIGNvbnN0IHNsb3RfY29udGV4dCA9IGdldF9zbG90X2NvbnRleHQoc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGdldF9zbG90X2NvbnRleHRfZm4pOwogICAgICAgICAgICBzbG90LnAoc2xvdF9jb250ZXh0LCBzbG90X2NoYW5nZXMpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMocHJvcHMpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpCiAgICAgICAgICAgIGlmIChrWzBdICE9PSAnJCcpCiAgICAgICAgICAgICAgICByZXN1bHRba10gPSBwcm9wc1trXTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gY29tcHV0ZV9yZXN0X3Byb3BzKHByb3BzLCBrZXlzKSB7CiAgICAgICAgY29uc3QgcmVzdCA9IHt9OwogICAgICAgIGtleXMgPSBuZXcgU2V0KGtleXMpOwogICAgICAgIGZvciAoY29uc3QgayBpbiBwcm9wcykKICAgICAgICAgICAgaWYgKCFrZXlzLmhhcyhrKSAmJiBrWzBdICE9PSAnJCcpCiAgICAgICAgICAgICAgICByZXN0W2tdID0gcHJvcHNba107CiAgICAgICAgcmV0dXJuIHJlc3Q7CiAgICB9CgogICAgZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkgewogICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcikgewogICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpOwogICAgfQogICAgZnVuY3Rpb24gZGV0YWNoKG5vZGUpIHsKICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICB9CiAgICBmdW5jdGlvbiBkZXN0cm95X2VhY2goaXRlcmF0aW9ucywgZGV0YWNoaW5nKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgIGlmIChpdGVyYXRpb25zW2ldKQogICAgICAgICAgICAgICAgaXRlcmF0aW9uc1tpXS5kKGRldGFjaGluZyk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZWxlbWVudChuYW1lKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7CiAgICB9CiAgICBmdW5jdGlvbiB0ZXh0KGRhdGEpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSk7CiAgICB9CiAgICBmdW5jdGlvbiBzcGFjZSgpIHsKICAgICAgICByZXR1cm4gdGV4dCgnICcpOwogICAgfQogICAgZnVuY3Rpb24gZW1wdHkoKSB7CiAgICAgICAgcmV0dXJuIHRleHQoJycpOwogICAgfQogICAgZnVuY3Rpb24gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7CiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTsKICAgICAgICByZXR1cm4gKCkgPT4gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTsKICAgIH0KICAgIGZ1bmN0aW9uIGF0dHIobm9kZSwgYXR0cmlidXRlLCB2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwogICAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkgIT09IHZhbHVlKQogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNldF9hdHRyaWJ1dGVzKG5vZGUsIGF0dHJpYnV0ZXMpIHsKICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhub2RlLl9fcHJvdG9fXyk7CiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykgewogICAgICAgICAgICBpZiAoYXR0cmlidXRlc1trZXldID09IG51bGwpIHsKICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAnc3R5bGUnKSB7CiAgICAgICAgICAgICAgICBub2RlLnN0eWxlLmNzc1RleHQgPSBhdHRyaWJ1dGVzW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAnX192YWx1ZScpIHsKICAgICAgICAgICAgICAgIG5vZGUudmFsdWUgPSBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGVzY3JpcHRvcnNba2V5XSAmJiBkZXNjcmlwdG9yc1trZXldLnNldCkgewogICAgICAgICAgICAgICAgbm9kZVtrZXldID0gYXR0cmlidXRlc1trZXldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYXR0cihub2RlLCBrZXksIGF0dHJpYnV0ZXNba2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgPT09ICcnID8gbnVsbCA6ICt2YWx1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkcmVuKGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LmNoaWxkTm9kZXMpOwogICAgfQogICAgZnVuY3Rpb24gc2V0X2lucHV0X3ZhbHVlKGlucHV0LCB2YWx1ZSkgewogICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7CiAgICB9CiAgICBmdW5jdGlvbiBzZWxlY3Rfb3B0aW9uKHNlbGVjdCwgdmFsdWUpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHNlbGVjdC5vcHRpb25zW2ldOwogICAgICAgICAgICBpZiAob3B0aW9uLl9fdmFsdWUgPT09IHZhbHVlKSB7CiAgICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2VsZWN0X29wdGlvbnMoc2VsZWN0LCB2YWx1ZSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gc2VsZWN0Lm9wdGlvbnNbaV07CiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IH52YWx1ZS5pbmRleE9mKG9wdGlvbi5fX3ZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzZWxlY3RfdmFsdWUoc2VsZWN0KSB7CiAgICAgICAgY29uc3Qgc2VsZWN0ZWRfb3B0aW9uID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJzpjaGVja2VkJykgfHwgc2VsZWN0Lm9wdGlvbnNbMF07CiAgICAgICAgcmV0dXJuIHNlbGVjdGVkX29wdGlvbiAmJiBzZWxlY3RlZF9vcHRpb24uX192YWx1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwpIHsKICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7CiAgICAgICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCBkZXRhaWwpOwogICAgICAgIHJldHVybiBlOwogICAgfQoKICAgIGxldCBjdXJyZW50X2NvbXBvbmVudDsKICAgIGZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHsKICAgICAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHsKICAgICAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbicpOwogICAgICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIG9uTW91bnQoZm4pIHsKICAgICAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5vbl9tb3VudC5wdXNoKGZuKTsKICAgIH0KICAgIC8vIFRPRE8gZmlndXJlIG91dCBpZiB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnQKICAgIC8vIHNob3J0aGFuZCBldmVudHMsIG9yIGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50CiAgICAvLyBhIHJlYWwgYnViYmxpbmcgbWVjaGFuaXNtCiAgICBmdW5jdGlvbiBidWJibGUoY29tcG9uZW50LCBldmVudCkgewogICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbZXZlbnQudHlwZV07CiAgICAgICAgaWYgKGNhbGxiYWNrcykgewogICAgICAgICAgICBjYWxsYmFja3Muc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKGV2ZW50KSk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IGRpcnR5X2NvbXBvbmVudHMgPSBbXTsKICAgIGNvbnN0IGJpbmRpbmdfY2FsbGJhY2tzID0gW107CiAgICBjb25zdCByZW5kZXJfY2FsbGJhY2tzID0gW107CiAgICBjb25zdCBmbHVzaF9jYWxsYmFja3MgPSBbXTsKICAgIGNvbnN0IHJlc29sdmVkX3Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgIGxldCB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7CiAgICBmdW5jdGlvbiBzY2hlZHVsZV91cGRhdGUoKSB7CiAgICAgICAgaWYgKCF1cGRhdGVfc2NoZWR1bGVkKSB7CiAgICAgICAgICAgIHVwZGF0ZV9zY2hlZHVsZWQgPSB0cnVlOwogICAgICAgICAgICByZXNvbHZlZF9wcm9taXNlLnRoZW4oZmx1c2gpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFkZF9yZW5kZXJfY2FsbGJhY2soZm4pIHsKICAgICAgICByZW5kZXJfY2FsbGJhY2tzLnB1c2goZm4pOwogICAgfQogICAgZnVuY3Rpb24gYWRkX2ZsdXNoX2NhbGxiYWNrKGZuKSB7CiAgICAgICAgZmx1c2hfY2FsbGJhY2tzLnB1c2goZm4pOwogICAgfQogICAgbGV0IGZsdXNoaW5nID0gZmFsc2U7CiAgICBjb25zdCBzZWVuX2NhbGxiYWNrcyA9IG5ldyBTZXQoKTsKICAgIGZ1bmN0aW9uIGZsdXNoKCkgewogICAgICAgIGlmIChmbHVzaGluZykKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGZsdXNoaW5nID0gdHJ1ZTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIC8vIGZpcnN0LCBjYWxsIGJlZm9yZVVwZGF0ZSBmdW5jdGlvbnMKICAgICAgICAgICAgLy8gYW5kIHVwZGF0ZSBjb21wb25lbnRzCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlydHlfY29tcG9uZW50cy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZGlydHlfY29tcG9uZW50c1tpXTsKICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpOwogICAgICAgICAgICAgICAgdXBkYXRlKGNvbXBvbmVudC4kJCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpOwogICAgICAgICAgICBkaXJ0eV9jb21wb25lbnRzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIHdoaWxlIChiaW5kaW5nX2NhbGxiYWNrcy5sZW5ndGgpCiAgICAgICAgICAgICAgICBiaW5kaW5nX2NhbGxiYWNrcy5wb3AoKSgpOwogICAgICAgICAgICAvLyB0aGVuLCBvbmNlIGNvbXBvbmVudHMgYXJlIHVwZGF0ZWQsIGNhbGwKICAgICAgICAgICAgLy8gYWZ0ZXJVcGRhdGUgZnVuY3Rpb25zLiBUaGlzIG1heSBjYXVzZQogICAgICAgICAgICAvLyBzdWJzZXF1ZW50IHVwZGF0ZXMuLi4KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW5kZXJfY2FsbGJhY2tzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHJlbmRlcl9jYWxsYmFja3NbaV07CiAgICAgICAgICAgICAgICBpZiAoIXNlZW5fY2FsbGJhY2tzLmhhcyhjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAvLyAuLi5zbyBndWFyZCBhZ2FpbnN0IGluZmluaXRlIGxvb3BzCiAgICAgICAgICAgICAgICAgICAgc2Vlbl9jYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoID0gMDsKICAgICAgICB9IHdoaWxlIChkaXJ0eV9jb21wb25lbnRzLmxlbmd0aCk7CiAgICAgICAgd2hpbGUgKGZsdXNoX2NhbGxiYWNrcy5sZW5ndGgpIHsKICAgICAgICAgICAgZmx1c2hfY2FsbGJhY2tzLnBvcCgpKCk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZV9zY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICBmbHVzaGluZyA9IGZhbHNlOwogICAgICAgIHNlZW5fY2FsbGJhY2tzLmNsZWFyKCk7CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGUoJCQpIHsKICAgICAgICBpZiAoJCQuZnJhZ21lbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgJCQudXBkYXRlKCk7CiAgICAgICAgICAgIHJ1bl9hbGwoJCQuYmVmb3JlX3VwZGF0ZSk7CiAgICAgICAgICAgIGNvbnN0IGRpcnR5ID0gJCQuZGlydHk7CiAgICAgICAgICAgICQkLmRpcnR5ID0gWy0xXTsKICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQucCgkJC5jdHgsIGRpcnR5KTsKICAgICAgICAgICAgJCQuYWZ0ZXJfdXBkYXRlLmZvckVhY2goYWRkX3JlbmRlcl9jYWxsYmFjayk7CiAgICAgICAgfQogICAgfQogICAgY29uc3Qgb3V0cm9pbmcgPSBuZXcgU2V0KCk7CiAgICBsZXQgb3V0cm9zOwogICAgZnVuY3Rpb24gZ3JvdXBfb3V0cm9zKCkgewogICAgICAgIG91dHJvcyA9IHsKICAgICAgICAgICAgcjogMCwKICAgICAgICAgICAgYzogW10sCiAgICAgICAgICAgIHA6IG91dHJvcyAvLyBwYXJlbnQgZ3JvdXAKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tfb3V0cm9zKCkgewogICAgICAgIGlmICghb3V0cm9zLnIpIHsKICAgICAgICAgICAgcnVuX2FsbChvdXRyb3MuYyk7CiAgICAgICAgfQogICAgICAgIG91dHJvcyA9IG91dHJvcy5wOwogICAgfQogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9pbihibG9jaywgbG9jYWwpIHsKICAgICAgICBpZiAoYmxvY2sgJiYgYmxvY2suaSkgewogICAgICAgICAgICBvdXRyb2luZy5kZWxldGUoYmxvY2spOwogICAgICAgICAgICBibG9jay5pKGxvY2FsKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX291dChibG9jaywgbG9jYWwsIGRldGFjaCwgY2FsbGJhY2spIHsKICAgICAgICBpZiAoYmxvY2sgJiYgYmxvY2subykgewogICAgICAgICAgICBpZiAob3V0cm9pbmcuaGFzKGJsb2NrKSkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgb3V0cm9pbmcuYWRkKGJsb2NrKTsKICAgICAgICAgICAgb3V0cm9zLmMucHVzaCgoKSA9PiB7CiAgICAgICAgICAgICAgICBvdXRyb2luZy5kZWxldGUoYmxvY2spOwogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRldGFjaCkKICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suZCgxKTsKICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYmxvY2subyhsb2NhbCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IGdsb2JhbHMgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcKICAgICAgICA/IHdpbmRvdwogICAgICAgIDogdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnCiAgICAgICAgICAgID8gZ2xvYmFsVGhpcwogICAgICAgICAgICA6IGdsb2JhbCk7CgogICAgZnVuY3Rpb24gZ2V0X3NwcmVhZF91cGRhdGUobGV2ZWxzLCB1cGRhdGVzKSB7CiAgICAgICAgY29uc3QgdXBkYXRlID0ge307CiAgICAgICAgY29uc3QgdG9fbnVsbF9vdXQgPSB7fTsKICAgICAgICBjb25zdCBhY2NvdW50ZWRfZm9yID0geyAkJHNjb3BlOiAxIH07CiAgICAgICAgbGV0IGkgPSBsZXZlbHMubGVuZ3RoOwogICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgICAgY29uc3QgbyA9IGxldmVsc1tpXTsKICAgICAgICAgICAgY29uc3QgbiA9IHVwZGF0ZXNbaV07CiAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIG4pKQogICAgICAgICAgICAgICAgICAgICAgICB0b19udWxsX291dFtrZXldID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFjY291bnRlZF9mb3Jba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVba2V5XSA9IG5ba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudGVkX2ZvcltrZXldID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXZlbHNbaV0gPSBuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykgewogICAgICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdG9fbnVsbF9vdXQpIHsKICAgICAgICAgICAgaWYgKCEoa2V5IGluIHVwZGF0ZSkpCiAgICAgICAgICAgICAgICB1cGRhdGVba2V5XSA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVwZGF0ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBiaW5kKGNvbXBvbmVudCwgbmFtZSwgY2FsbGJhY2spIHsKICAgICAgICBjb25zdCBpbmRleCA9IGNvbXBvbmVudC4kJC5wcm9wc1tuYW1lXTsKICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb21wb25lbnQuJCQuYm91bmRbaW5kZXhdID0gY2FsbGJhY2s7CiAgICAgICAgICAgIGNhbGxiYWNrKGNvbXBvbmVudC4kJC5jdHhbaW5kZXhdKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVfY29tcG9uZW50KGJsb2NrKSB7CiAgICAgICAgYmxvY2sgJiYgYmxvY2suYygpOwogICAgfQogICAgZnVuY3Rpb24gbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgdGFyZ2V0LCBhbmNob3IpIHsKICAgICAgICBjb25zdCB7IGZyYWdtZW50LCBvbl9tb3VudCwgb25fZGVzdHJveSwgYWZ0ZXJfdXBkYXRlIH0gPSBjb21wb25lbnQuJCQ7CiAgICAgICAgZnJhZ21lbnQgJiYgZnJhZ21lbnQubSh0YXJnZXQsIGFuY2hvcik7CiAgICAgICAgLy8gb25Nb3VudCBoYXBwZW5zIGJlZm9yZSB0aGUgaW5pdGlhbCBhZnRlclVwZGF0ZQogICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gewogICAgICAgICAgICBjb25zdCBuZXdfb25fZGVzdHJveSA9IG9uX21vdW50Lm1hcChydW4pLmZpbHRlcihpc19mdW5jdGlvbik7CiAgICAgICAgICAgIGlmIChvbl9kZXN0cm95KSB7CiAgICAgICAgICAgICAgICBvbl9kZXN0cm95LnB1c2goLi4ubmV3X29uX2Rlc3Ryb3kpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gRWRnZSBjYXNlIC0gY29tcG9uZW50IHdhcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHksCiAgICAgICAgICAgICAgICAvLyBtb3N0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBhIGJpbmRpbmcgaW5pdGlhbGlzaW5nCiAgICAgICAgICAgICAgICBydW5fYWxsKG5ld19vbl9kZXN0cm95KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb21wb25lbnQuJCQub25fbW91bnQgPSBbXTsKICAgICAgICB9KTsKICAgICAgICBhZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRlc3Ryb3lfY29tcG9uZW50KGNvbXBvbmVudCwgZGV0YWNoaW5nKSB7CiAgICAgICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQ7CiAgICAgICAgaWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJ1bl9hbGwoJCQub25fZGVzdHJveSk7CiAgICAgICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmQoZGV0YWNoaW5nKTsKICAgICAgICAgICAgLy8gVE9ETyBudWxsIG91dCBvdGhlciByZWZzLCBpbmNsdWRpbmcgY29tcG9uZW50LiQkIChidXQgbmVlZCB0bwogICAgICAgICAgICAvLyBwcmVzZXJ2ZSBmaW5hbCBzdGF0ZT8pCiAgICAgICAgICAgICQkLm9uX2Rlc3Ryb3kgPSAkJC5mcmFnbWVudCA9IG51bGw7CiAgICAgICAgICAgICQkLmN0eCA9IFtdOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKSB7CiAgICAgICAgaWYgKGNvbXBvbmVudC4kJC5kaXJ0eVswXSA9PT0gLTEpIHsKICAgICAgICAgICAgZGlydHlfY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7CiAgICAgICAgICAgIHNjaGVkdWxlX3VwZGF0ZSgpOwogICAgICAgICAgICBjb21wb25lbnQuJCQuZGlydHkuZmlsbCgwKTsKICAgICAgICB9CiAgICAgICAgY29tcG9uZW50LiQkLmRpcnR5WyhpIC8gMzEpIHwgMF0gfD0gKDEgPDwgKGkgJSAzMSkpOwogICAgfQogICAgZnVuY3Rpb24gaW5pdChjb21wb25lbnQsIG9wdGlvbnMsIGluc3RhbmNlLCBjcmVhdGVfZnJhZ21lbnQsIG5vdF9lcXVhbCwgcHJvcHMsIGRpcnR5ID0gWy0xXSkgewogICAgICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDsKICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTsKICAgICAgICBjb25zdCBwcm9wX3ZhbHVlcyA9IG9wdGlvbnMucHJvcHMgfHwge307CiAgICAgICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQgPSB7CiAgICAgICAgICAgIGZyYWdtZW50OiBudWxsLAogICAgICAgICAgICBjdHg6IG51bGwsCiAgICAgICAgICAgIC8vIHN0YXRlCiAgICAgICAgICAgIHByb3BzLAogICAgICAgICAgICB1cGRhdGU6IG5vb3AsCiAgICAgICAgICAgIG5vdF9lcXVhbCwKICAgICAgICAgICAgYm91bmQ6IGJsYW5rX29iamVjdCgpLAogICAgICAgICAgICAvLyBsaWZlY3ljbGUKICAgICAgICAgICAgb25fbW91bnQ6IFtdLAogICAgICAgICAgICBvbl9kZXN0cm95OiBbXSwKICAgICAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sCiAgICAgICAgICAgIGFmdGVyX3VwZGF0ZTogW10sCiAgICAgICAgICAgIGNvbnRleHQ6IG5ldyBNYXAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSwKICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBlbHNlCiAgICAgICAgICAgIGNhbGxiYWNrczogYmxhbmtfb2JqZWN0KCksCiAgICAgICAgICAgIGRpcnR5LAogICAgICAgICAgICBza2lwX2JvdW5kOiBmYWxzZQogICAgICAgIH07CiAgICAgICAgbGV0IHJlYWR5ID0gZmFsc2U7CiAgICAgICAgJCQuY3R4ID0gaW5zdGFuY2UKICAgICAgICAgICAgPyBpbnN0YW5jZShjb21wb25lbnQsIHByb3BfdmFsdWVzLCAoaSwgcmV0LCAuLi5yZXN0KSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3QubGVuZ3RoID8gcmVzdFswXSA6IHJldDsKICAgICAgICAgICAgICAgIGlmICgkJC5jdHggJiYgbm90X2VxdWFsKCQkLmN0eFtpXSwgJCQuY3R4W2ldID0gdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkJC5za2lwX2JvdW5kICYmICQkLmJvdW5kW2ldKQogICAgICAgICAgICAgICAgICAgICAgICAkJC5ib3VuZFtpXSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWR5KQogICAgICAgICAgICAgICAgICAgICAgICBtYWtlX2RpcnR5KGNvbXBvbmVudCwgaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICB9KQogICAgICAgICAgICA6IFtdOwogICAgICAgICQkLnVwZGF0ZSgpOwogICAgICAgIHJlYWR5ID0gdHJ1ZTsKICAgICAgICBydW5fYWxsKCQkLmJlZm9yZV91cGRhdGUpOwogICAgICAgIC8vIGBmYWxzZWAgYXMgYSBzcGVjaWFsIGNhc2Ugb2Ygbm8gRE9NIGNvbXBvbmVudAogICAgICAgICQkLmZyYWdtZW50ID0gY3JlYXRlX2ZyYWdtZW50ID8gY3JlYXRlX2ZyYWdtZW50KCQkLmN0eCkgOiBmYWxzZTsKICAgICAgICBpZiAob3B0aW9ucy50YXJnZXQpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZHJlbihvcHRpb25zLnRhcmdldCk7CiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbgogICAgICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQubChub2Rlcyk7CiAgICAgICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGRldGFjaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbgogICAgICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuYygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLmludHJvKQogICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihjb21wb25lbnQuJCQuZnJhZ21lbnQpOwogICAgICAgICAgICBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5hbmNob3IpOwogICAgICAgICAgICBmbHVzaCgpOwogICAgICAgIH0KICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQocGFyZW50X2NvbXBvbmVudCk7CiAgICB9CiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzLiBVc2VkIHdoZW4gZGV2PWZhbHNlLgogICAgICovCiAgICBjbGFzcyBTdmVsdGVDb21wb25lbnQgewogICAgICAgICRkZXN0cm95KCkgewogICAgICAgICAgICBkZXN0cm95X2NvbXBvbmVudCh0aGlzLCAxKTsKICAgICAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7CiAgICAgICAgfQogICAgICAgICRvbih0eXBlLCBjYWxsYmFjaykgewogICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTsKICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAkc2V0KCQkcHJvcHMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuJCRzZXQgJiYgIWlzX2VtcHR5KCQkcHJvcHMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy4kJHNldCgkJHByb3BzKTsKICAgICAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoX2Rldih0eXBlLCBkZXRhaWwpIHsKICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudCh0eXBlLCBPYmplY3QuYXNzaWduKHsgdmVyc2lvbjogJzMuMzEuMicgfSwgZGV0YWlsKSkpOwogICAgfQogICAgZnVuY3Rpb24gYXBwZW5kX2Rldih0YXJnZXQsIG5vZGUpIHsKICAgICAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlIH0pOwogICAgICAgIGFwcGVuZCh0YXJnZXQsIG5vZGUpOwogICAgfQogICAgZnVuY3Rpb24gaW5zZXJ0X2Rldih0YXJnZXQsIG5vZGUsIGFuY2hvcikgewogICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUsIGFuY2hvciB9KTsKICAgICAgICBpbnNlcnQodGFyZ2V0LCBub2RlLCBhbmNob3IpOwogICAgfQogICAgZnVuY3Rpb24gZGV0YWNoX2Rldihub2RlKSB7CiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmUnLCB7IG5vZGUgfSk7CiAgICAgICAgZGV0YWNoKG5vZGUpOwogICAgfQogICAgZnVuY3Rpb24gbGlzdGVuX2Rldihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucywgaGFzX3ByZXZlbnRfZGVmYXVsdCwgaGFzX3N0b3BfcHJvcGFnYXRpb24pIHsKICAgICAgICBjb25zdCBtb2RpZmllcnMgPSBvcHRpb25zID09PSB0cnVlID8gWydjYXB0dXJlJ10gOiBvcHRpb25zID8gQXJyYXkuZnJvbShPYmplY3Qua2V5cyhvcHRpb25zKSkgOiBbXTsKICAgICAgICBpZiAoaGFzX3ByZXZlbnRfZGVmYXVsdCkKICAgICAgICAgICAgbW9kaWZpZXJzLnB1c2goJ3ByZXZlbnREZWZhdWx0Jyk7CiAgICAgICAgaWYgKGhhc19zdG9wX3Byb3BhZ2F0aW9uKQogICAgICAgICAgICBtb2RpZmllcnMucHVzaCgnc3RvcFByb3BhZ2F0aW9uJyk7CiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01BZGRFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pOwogICAgICAgIGNvbnN0IGRpc3Bvc2UgPSBsaXN0ZW4obm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpOwogICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTsKICAgICAgICAgICAgZGlzcG9zZSgpOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyX2Rldihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKTsKICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKICAgICAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSB9KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0QXR0cmlidXRlJywgeyBub2RlLCBhdHRyaWJ1dGUsIHZhbHVlIH0pOwogICAgfQogICAgZnVuY3Rpb24gcHJvcF9kZXYobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgbm9kZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldFByb3BlcnR5JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRfZGF0YV9kZXYodGV4dCwgZGF0YSkgewogICAgICAgIGRhdGEgPSAnJyArIGRhdGE7CiAgICAgICAgaWYgKHRleHQud2hvbGVUZXh0ID09PSBkYXRhKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhJywgeyBub2RlOiB0ZXh0LCBkYXRhIH0pOwogICAgICAgIHRleHQuZGF0YSA9IGRhdGE7CiAgICB9CiAgICBmdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50KGFyZykgewogICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyAmJiAhKGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBhcmcpKSB7CiAgICAgICAgICAgIGxldCBtc2cgPSAneyNlYWNofSBvbmx5IGl0ZXJhdGVzIG92ZXIgYXJyYXktbGlrZSBvYmplY3RzLic7CiAgICAgICAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIGFyZyAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gYXJnKSB7CiAgICAgICAgICAgICAgICBtc2cgKz0gJyBZb3UgY2FuIHVzZSBhIHNwcmVhZCB0byBjb252ZXJ0IHRoaXMgaXRlcmFibGUgaW50byBhbiBhcnJheS4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlX3Nsb3RzKG5hbWUsIHNsb3QsIGtleXMpIHsKICAgICAgICBmb3IgKGNvbnN0IHNsb3Rfa2V5IG9mIE9iamVjdC5rZXlzKHNsb3QpKSB7CiAgICAgICAgICAgIGlmICghfmtleXMuaW5kZXhPZihzbG90X2tleSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgPCR7bmFtZX0+IHJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgc2xvdCAiJHtzbG90X2tleX0iLmApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBCYXNlIGNsYXNzIGZvciBTdmVsdGUgY29tcG9uZW50cyB3aXRoIHNvbWUgbWlub3IgZGV2LWVuaGFuY2VtZW50cy4gVXNlZCB3aGVuIGRldj10cnVlLgogICAgICovCiAgICBjbGFzcyBTdmVsdGVDb21wb25lbnREZXYgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCFvcHRpb25zIHx8ICghb3B0aW9ucy50YXJnZXQgJiYgIW9wdGlvbnMuJCRpbmxpbmUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIid0YXJnZXQnIGlzIGEgcmVxdWlyZWQgb3B0aW9uIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICB9CiAgICAgICAgJGRlc3Ryb3koKSB7CiAgICAgICAgICAgIHN1cGVyLiRkZXN0cm95KCk7CiAgICAgICAgICAgIHRoaXMuJGRlc3Ryb3kgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbXBvbmVudCB3YXMgYWxyZWFkeSBkZXN0cm95ZWQnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgICRjYXB0dXJlX3N0YXRlKCkgeyB9CiAgICAgICAgJGluamVjdF9zdGF0ZSgpIHsgfQogICAgfQoKICAgIGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7CiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7CiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0Q29sdW1uU2l6ZUNsYXNzKGlzWHMsIGNvbFdpZHRoLCBjb2xTaXplKSB7CiAgICAgIGlmIChjb2xTaXplID09PSB0cnVlIHx8IGNvbFNpemUgPT09ICcnKSB7CiAgICAgICAgcmV0dXJuIGlzWHMgPyAnY29sJyA6IGBjb2wtJHtjb2xXaWR0aH1gOwogICAgICB9IGVsc2UgaWYgKGNvbFNpemUgPT09ICdhdXRvJykgewogICAgICAgIHJldHVybiBpc1hzID8gJ2NvbC1hdXRvJyA6IGBjb2wtJHtjb2xXaWR0aH0tYXV0b2A7CiAgICAgIH0KCiAgICAgIHJldHVybiBpc1hzID8gYGNvbC0ke2NvbFNpemV9YCA6IGBjb2wtJHtjb2xXaWR0aH0tJHtjb2xTaXplfWA7CiAgICB9CgogICAgZnVuY3Rpb24gdG9DbGFzc05hbWUodmFsdWUpIHsKICAgICAgbGV0IHJlc3VsdCA9ICcnOwoKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgewogICAgICAgIHJlc3VsdCArPSB2YWx1ZTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICByZXN1bHQgPSB2YWx1ZS5tYXAodG9DbGFzc05hbWUpLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAobGV0IGtleSBpbiB2YWx1ZSkgewogICAgICAgICAgICBpZiAodmFsdWVba2V5XSkgewogICAgICAgICAgICAgIHJlc3VsdCAmJiAocmVzdWx0ICs9ICcgJyk7CiAgICAgICAgICAgICAgcmVzdWx0ICs9IGtleTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc25hbWVzKC4uLmFyZ3MpIHsKICAgICAgcmV0dXJuIGFyZ3MubWFwKHRvQ2xhc3NOYW1lKS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpOwogICAgfQoKICAgIC8qIG5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvQnV0dG9uLnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjMxLjIgKi8KICAgIGNvbnN0IGZpbGUgPSAibm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9CdXR0b24uc3ZlbHRlIjsKCiAgICAvLyAoNDg6MCkgezplbHNlfQogICAgZnVuY3Rpb24gY3JlYXRlX2Vsc2VfYmxvY2tfMShjdHgpIHsKICAgIAlsZXQgYnV0dG9uOwogICAgCWxldCBidXR0b25fYXJpYV9sYWJlbF92YWx1ZTsKICAgIAlsZXQgY3VycmVudDsKICAgIAlsZXQgbW91bnRlZDsKICAgIAlsZXQgZGlzcG9zZTsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUgPSAvKiNzbG90cyovIGN0eFsxN10uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzE2XSwgbnVsbCk7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X29yX2ZhbGxiYWNrID0gZGVmYXVsdF9zbG90IHx8IGZhbGxiYWNrX2Jsb2NrKGN0eCk7CgogICAgCWxldCBidXR0b25fbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzldLAogICAgCQl7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbN10gfSwKICAgIAkJeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFsyXSB9LAogICAgCQl7IHZhbHVlOiAvKnZhbHVlKi8gY3R4WzVdIH0sCiAgICAJCXsKICAgIAkJCSJhcmlhLWxhYmVsIjogYnV0dG9uX2FyaWFfbGFiZWxfdmFsdWUgPSAvKmFyaWFMYWJlbCovIGN0eFs2XSB8fCAvKmRlZmF1bHRBcmlhTGFiZWwqLyBjdHhbOF0KICAgIAkJfSwKICAgIAkJeyBzdHlsZTogLypzdHlsZSovIGN0eFs0XSB9CiAgICAJXTsKCiAgICAJbGV0IGJ1dHRvbl9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgYnV0dG9uX2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlidXR0b25fZGF0YSA9IGFzc2lnbihidXR0b25fZGF0YSwgYnV0dG9uX2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9ja18xID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlidXR0b24gPSBlbGVtZW50KCJidXR0b24iKTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3Rfb3JfZmFsbGJhY2spIGRlZmF1bHRfc2xvdF9vcl9mYWxsYmFjay5jKCk7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhidXR0b24sIGJ1dHRvbl9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbihidXR0b24sIGZpbGUsIDQ4LCAyLCA5ODUpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGJ1dHRvbiwgYW5jaG9yKTsKCiAgICAJCQlpZiAoZGVmYXVsdF9zbG90X29yX2ZhbGxiYWNrKSB7CiAgICAJCQkJZGVmYXVsdF9zbG90X29yX2ZhbGxiYWNrLm0oYnV0dG9uLCBudWxsKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gbGlzdGVuX2RldihidXR0b24sICJjbGljayIsIC8qY2xpY2tfaGFuZGxlcl8xKi8gY3R4WzE5XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJaWYgKGRlZmF1bHRfc2xvdC5wICYmIGRpcnR5ICYgLyokJHNjb3BlKi8gNjU1MzYpIHsKICAgIAkJCQkJdXBkYXRlX3Nsb3QoZGVmYXVsdF9zbG90LCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzE2XSwgZGlydHksIG51bGwsIG51bGwpOwogICAgCQkJCX0KICAgIAkJCX0gZWxzZSB7CiAgICAJCQkJaWYgKGRlZmF1bHRfc2xvdF9vcl9mYWxsYmFjayAmJiBkZWZhdWx0X3Nsb3Rfb3JfZmFsbGJhY2sucCAmJiBkaXJ0eSAmIC8qY2xvc2UsIGNoaWxkcmVuLCAkJHNjb3BlKi8gNjU1MzkpIHsKICAgIAkJCQkJZGVmYXVsdF9zbG90X29yX2ZhbGxiYWNrLnAoY3R4LCBkaXJ0eSk7CiAgICAJCQkJfQogICAgCQkJfQoKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGJ1dHRvbiwgYnV0dG9uX2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShidXR0b25fbGV2ZWxzLCBbCiAgICAJCQkJZGlydHkgJiAvKiQkcmVzdFByb3BzKi8gNTEyICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbOV0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gMTI4KSAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbN10gfSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmRpc2FibGVkKi8gNCkgJiYgeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFsyXSB9LAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qdmFsdWUqLyAzMikgJiYgeyB2YWx1ZTogLyp2YWx1ZSovIGN0eFs1XSB9LAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qYXJpYUxhYmVsLCBkZWZhdWx0QXJpYUxhYmVsKi8gMzIwICYmIGJ1dHRvbl9hcmlhX2xhYmVsX3ZhbHVlICE9PSAoYnV0dG9uX2FyaWFfbGFiZWxfdmFsdWUgPSAvKmFyaWFMYWJlbCovIGN0eFs2XSB8fCAvKmRlZmF1bHRBcmlhTGFiZWwqLyBjdHhbOF0pKSAmJiB7ICJhcmlhLWxhYmVsIjogYnV0dG9uX2FyaWFfbGFiZWxfdmFsdWUgfSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKnN0eWxlKi8gMTYpICYmIHsgc3R5bGU6IC8qc3R5bGUqLyBjdHhbNF0gfQogICAgCQkJXSkpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oZGVmYXVsdF9zbG90X29yX2ZhbGxiYWNrLCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGRlZmF1bHRfc2xvdF9vcl9mYWxsYmFjaywgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihidXR0b24pOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdF9vcl9mYWxsYmFjaykgZGVmYXVsdF9zbG90X29yX2ZhbGxiYWNrLmQoZGV0YWNoaW5nKTsKICAgIAkJCW1vdW50ZWQgPSBmYWxzZTsKICAgIAkJCWRpc3Bvc2UoKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2s6IGJsb2NrXzEsCiAgICAJCWlkOiBjcmVhdGVfZWxzZV9ibG9ja18xLm5hbWUsCiAgICAJCXR5cGU6ICJlbHNlIiwKICAgIAkJc291cmNlOiAiKDQ4OjApIHs6ZWxzZX0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrXzE7CiAgICB9CgogICAgLy8gKDMzOjApIHsjaWYgaHJlZn0KICAgIGZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9jayhjdHgpIHsKICAgIAlsZXQgYTsKICAgIAlsZXQgY3VycmVudF9ibG9ja190eXBlX2luZGV4OwogICAgCWxldCBpZl9ibG9jazsKICAgIAlsZXQgYV9hcmlhX2xhYmVsX3ZhbHVlOwogICAgCWxldCBjdXJyZW50OwogICAgCWxldCBtb3VudGVkOwogICAgCWxldCBkaXNwb3NlOwogICAgCWNvbnN0IGlmX2Jsb2NrX2NyZWF0b3JzID0gW2NyZWF0ZV9pZl9ibG9ja18xLCBjcmVhdGVfZWxzZV9ibG9ja107CiAgICAJY29uc3QgaWZfYmxvY2tzID0gW107CgogICAgCWZ1bmN0aW9uIHNlbGVjdF9ibG9ja190eXBlXzEoY3R4LCBkaXJ0eSkgewogICAgCQlpZiAoLypjaGlsZHJlbiovIGN0eFswXSkgcmV0dXJuIDA7CiAgICAJCXJldHVybiAxOwogICAgCX0KCiAgICAJY3VycmVudF9ibG9ja190eXBlX2luZGV4ID0gc2VsZWN0X2Jsb2NrX3R5cGVfMShjdHgpOwogICAgCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0gPSBpZl9ibG9ja19jcmVhdG9yc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdKGN0eCk7CgogICAgCWxldCBhX2xldmVscyA9IFsKICAgIAkJLyokJHJlc3RQcm9wcyovIGN0eFs5XSwKICAgIAkJeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzddIH0sCiAgICAJCXsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbMl0gfSwKICAgIAkJeyBocmVmOiAvKmhyZWYqLyBjdHhbM10gfSwKICAgIAkJewogICAgCQkJImFyaWEtbGFiZWwiOiBhX2FyaWFfbGFiZWxfdmFsdWUgPSAvKmFyaWFMYWJlbCovIGN0eFs2XSB8fCAvKmRlZmF1bHRBcmlhTGFiZWwqLyBjdHhbOF0KICAgIAkJfSwKICAgIAkJeyBzdHlsZTogLypzdHlsZSovIGN0eFs0XSB9CiAgICAJXTsKCiAgICAJbGV0IGFfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGFfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWFfZGF0YSA9IGFzc2lnbihhX2RhdGEsIGFfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrXzEgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWEgPSBlbGVtZW50KCJhIik7CiAgICAJCQlpZl9ibG9jay5jKCk7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhhLCBhX2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGEsIGZpbGUsIDMzLCAyLCA3NTIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGEsIGFuY2hvcik7CiAgICAJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5tKGEsIG51bGwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CgogICAgCQkJaWYgKCFtb3VudGVkKSB7CiAgICAJCQkJZGlzcG9zZSA9IGxpc3Rlbl9kZXYoYSwgImNsaWNrIiwgLypjbGlja19oYW5kbGVyKi8gY3R4WzE4XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlsZXQgcHJldmlvdXNfYmxvY2tfaW5kZXggPSBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7CiAgICAJCQljdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZV8xKGN0eCk7CgogICAgCQkJaWYgKGN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleCA9PT0gcHJldmlvdXNfYmxvY2tfaW5kZXgpIHsKICAgIAkJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5wKGN0eCwgZGlydHkpOwogICAgCQkJfSBlbHNlIHsKICAgIAkJCQlncm91cF9vdXRyb3MoKTsKCiAgICAJCQkJdHJhbnNpdGlvbl9vdXQoaWZfYmxvY2tzW3ByZXZpb3VzX2Jsb2NrX2luZGV4XSwgMSwgMSwgKCkgPT4gewogICAgCQkJCQlpZl9ibG9ja3NbcHJldmlvdXNfYmxvY2tfaW5kZXhdID0gbnVsbDsKICAgIAkJCQl9KTsKCiAgICAJCQkJY2hlY2tfb3V0cm9zKCk7CiAgICAJCQkJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XTsKCiAgICAJCQkJaWYgKCFpZl9ibG9jaykgewogICAgCQkJCQlpZl9ibG9jayA9IGlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdID0gaWZfYmxvY2tfY3JlYXRvcnNbY3VycmVudF9ibG9ja190eXBlX2luZGV4XShjdHgpOwogICAgCQkJCQlpZl9ibG9jay5jKCk7CiAgICAJCQkJfSBlbHNlIHsKICAgIAkJCQkJaWZfYmxvY2sucChjdHgsIGRpcnR5KTsKICAgIAkJCQl9CgogICAgCQkJCXRyYW5zaXRpb25faW4oaWZfYmxvY2ssIDEpOwogICAgCQkJCWlmX2Jsb2NrLm0oYSwgbnVsbCk7CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMoYSwgYV9kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoYV9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyA1MTIgJiYgLyokJHJlc3RQcm9wcyovIGN0eFs5XSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmNsYXNzZXMqLyAxMjgpICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs3XSB9LAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qZGlzYWJsZWQqLyA0KSAmJiB7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzJdIH0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypocmVmKi8gOCkgJiYgeyBocmVmOiAvKmhyZWYqLyBjdHhbM10gfSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmFyaWFMYWJlbCwgZGVmYXVsdEFyaWFMYWJlbCovIDMyMCAmJiBhX2FyaWFfbGFiZWxfdmFsdWUgIT09IChhX2FyaWFfbGFiZWxfdmFsdWUgPSAvKmFyaWFMYWJlbCovIGN0eFs2XSB8fCAvKmRlZmF1bHRBcmlhTGFiZWwqLyBjdHhbOF0pKSAmJiB7ICJhcmlhLWxhYmVsIjogYV9hcmlhX2xhYmVsX3ZhbHVlIH0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypzdHlsZSovIDE2KSAmJiB7IHN0eWxlOiAvKnN0eWxlKi8gY3R4WzRdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGlmX2Jsb2NrKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoaWZfYmxvY2spOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihhKTsKICAgIAkJCWlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdLmQoKTsKICAgIAkJCW1vdW50ZWQgPSBmYWxzZTsKICAgIAkJCWRpc3Bvc2UoKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2s6IGJsb2NrXzEsCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2submFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDMzOjApIHsjaWYgaHJlZn0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrXzE7CiAgICB9CgogICAgLy8gKDYyOjYpIHs6ZWxzZX0KICAgIGZ1bmN0aW9uIGNyZWF0ZV9lbHNlX2Jsb2NrXzIoY3R4KSB7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbMTddLmRlZmF1bHQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90ID0gY3JlYXRlX3Nsb3QoZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFsxNl0sIG51bGwpOwoKICAgIAljb25zdCBibG9ja18xID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWRlZmF1bHRfc2xvdC5tKHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlpZiAoZGVmYXVsdF9zbG90LnAgJiYgZGlydHkgJiAvKiQkc2NvcGUqLyA2NTUzNikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbMTZdLCBkaXJ0eSwgbnVsbCwgbnVsbCk7CiAgICAJCQkJfQogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2s6IGJsb2NrXzEsCiAgICAJCWlkOiBjcmVhdGVfZWxzZV9ibG9ja18yLm5hbWUsCiAgICAJCXR5cGU6ICJlbHNlIiwKICAgIAkJc291cmNlOiAiKDYyOjYpIHs6ZWxzZX0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrXzE7CiAgICB9CgogICAgLy8gKDYwOjI1KSAKICAgIGZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9ja18zKGN0eCkgewogICAgCWxldCB0OwoKICAgIAljb25zdCBibG9ja18xID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl0ID0gdGV4dCgvKmNoaWxkcmVuKi8gY3R4WzBdKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0LCBhbmNob3IpOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJaWYgKGRpcnR5ICYgLypjaGlsZHJlbiovIDEpIHNldF9kYXRhX2Rldih0LCAvKmNoaWxkcmVuKi8gY3R4WzBdKTsKICAgIAkJfSwKICAgIAkJaTogbm9vcCwKICAgIAkJbzogbm9vcCwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodCk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrOiBibG9ja18xLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzMubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDYwOjI1KSAiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrXzE7CiAgICB9CgogICAgLy8gKDU4OjYpIHsjaWYgY2xvc2V9CiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMihjdHgpIHsKICAgIAlsZXQgc3BhbjsKCiAgICAJY29uc3QgYmxvY2tfMSA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJc3BhbiA9IGVsZW1lbnQoInNwYW4iKTsKICAgIAkJCXNwYW4udGV4dENvbnRlbnQgPSAiw5ciOwogICAgCQkJYXR0cl9kZXYoc3BhbiwgImFyaWEtaGlkZGVuIiwgInRydWUiKTsKICAgIAkJCWFkZF9sb2NhdGlvbihzcGFuLCBmaWxlLCA1OCwgOCwgMTE3MSk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgc3BhbiwgYW5jaG9yKTsKICAgIAkJfSwKICAgIAkJcDogbm9vcCwKICAgIAkJaTogbm9vcCwKICAgIAkJbzogbm9vcCwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoc3Bhbik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrOiBibG9ja18xLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzIubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDU4OjYpIHsjaWYgY2xvc2V9IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9ja18xOwogICAgfQoKICAgIC8vICg1NzoxMCkgICAgICAgIAogICAgZnVuY3Rpb24gZmFsbGJhY2tfYmxvY2soY3R4KSB7CiAgICAJbGV0IGN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleDsKICAgIAlsZXQgaWZfYmxvY2s7CiAgICAJbGV0IGlmX2Jsb2NrX2FuY2hvcjsKICAgIAlsZXQgY3VycmVudDsKICAgIAljb25zdCBpZl9ibG9ja19jcmVhdG9ycyA9IFtjcmVhdGVfaWZfYmxvY2tfMiwgY3JlYXRlX2lmX2Jsb2NrXzMsIGNyZWF0ZV9lbHNlX2Jsb2NrXzJdOwogICAgCWNvbnN0IGlmX2Jsb2NrcyA9IFtdOwoKICAgIAlmdW5jdGlvbiBzZWxlY3RfYmxvY2tfdHlwZV8yKGN0eCwgZGlydHkpIHsKICAgIAkJaWYgKC8qY2xvc2UqLyBjdHhbMV0pIHJldHVybiAwOwogICAgCQlpZiAoLypjaGlsZHJlbiovIGN0eFswXSkgcmV0dXJuIDE7CiAgICAJCXJldHVybiAyOwogICAgCX0KCiAgICAJY3VycmVudF9ibG9ja190eXBlX2luZGV4ID0gc2VsZWN0X2Jsb2NrX3R5cGVfMihjdHgpOwogICAgCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0gPSBpZl9ibG9ja19jcmVhdG9yc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdKGN0eCk7CgogICAgCWNvbnN0IGJsb2NrXzEgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlmX2Jsb2NrLmMoKTsKICAgIAkJCWlmX2Jsb2NrX2FuY2hvciA9IGVtcHR5KCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5tKHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpZl9ibG9ja19hbmNob3IsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWxldCBwcmV2aW91c19ibG9ja19pbmRleCA9IGN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleDsKICAgIAkJCWN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleCA9IHNlbGVjdF9ibG9ja190eXBlXzIoY3R4KTsKCiAgICAJCQlpZiAoY3VycmVudF9ibG9ja190eXBlX2luZGV4ID09PSBwcmV2aW91c19ibG9ja19pbmRleCkgewogICAgCQkJCWlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdLnAoY3R4LCBkaXJ0eSk7CiAgICAJCQl9IGVsc2UgewogICAgCQkJCWdyb3VwX291dHJvcygpOwoKICAgIAkJCQl0cmFuc2l0aW9uX291dChpZl9ibG9ja3NbcHJldmlvdXNfYmxvY2tfaW5kZXhdLCAxLCAxLCAoKSA9PiB7CiAgICAJCQkJCWlmX2Jsb2Nrc1twcmV2aW91c19ibG9ja19pbmRleF0gPSBudWxsOwogICAgCQkJCX0pOwoKICAgIAkJCQljaGVja19vdXRyb3MoKTsKICAgIAkJCQlpZl9ibG9jayA9IGlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdOwoKICAgIAkJCQlpZiAoIWlmX2Jsb2NrKSB7CiAgICAJCQkJCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0gPSBpZl9ibG9ja19jcmVhdG9yc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdKGN0eCk7CiAgICAJCQkJCWlmX2Jsb2NrLmMoKTsKICAgIAkJCQl9IGVsc2UgewogICAgCQkJCQlpZl9ibG9jay5wKGN0eCwgZGlydHkpOwogICAgCQkJCX0KCiAgICAJCQkJdHJhbnNpdGlvbl9pbihpZl9ibG9jaywgMSk7CiAgICAJCQkJaWZfYmxvY2subShpZl9ibG9ja19hbmNob3IucGFyZW50Tm9kZSwgaWZfYmxvY2tfYW5jaG9yKTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGlmX2Jsb2NrKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoaWZfYmxvY2spOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0uZChkZXRhY2hpbmcpOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihpZl9ibG9ja19hbmNob3IpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jazogYmxvY2tfMSwKICAgIAkJaWQ6IGZhbGxiYWNrX2Jsb2NrLm5hbWUsCiAgICAJCXR5cGU6ICJmYWxsYmFjayIsCiAgICAJCXNvdXJjZTogIig1NzoxMCkgICAgICAgICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2tfMTsKICAgIH0KCiAgICAvLyAoNDQ6NCkgezplbHNlfQogICAgZnVuY3Rpb24gY3JlYXRlX2Vsc2VfYmxvY2soY3R4KSB7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbMTddLmRlZmF1bHQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90ID0gY3JlYXRlX3Nsb3QoZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFsxNl0sIG51bGwpOwoKICAgIAljb25zdCBibG9ja18xID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWRlZmF1bHRfc2xvdC5tKHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlpZiAoZGVmYXVsdF9zbG90LnAgJiYgZGlydHkgJiAvKiQkc2NvcGUqLyA2NTUzNikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbMTZdLCBkaXJ0eSwgbnVsbCwgbnVsbCk7CiAgICAJCQkJfQogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2s6IGJsb2NrXzEsCiAgICAJCWlkOiBjcmVhdGVfZWxzZV9ibG9jay5uYW1lLAogICAgCQl0eXBlOiAiZWxzZSIsCiAgICAJCXNvdXJjZTogIig0NDo0KSB7OmVsc2V9IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9ja18xOwogICAgfQoKICAgIC8vICg0Mjo0KSB7I2lmIGNoaWxkcmVufQogICAgZnVuY3Rpb24gY3JlYXRlX2lmX2Jsb2NrXzEoY3R4KSB7CiAgICAJbGV0IHQ7CgogICAgCWNvbnN0IGJsb2NrXzEgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCXQgPSB0ZXh0KC8qY2hpbGRyZW4qLyBjdHhbMF0pOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGlydHkgJiAvKmNoaWxkcmVuKi8gMSkgc2V0X2RhdGFfZGV2KHQsIC8qY2hpbGRyZW4qLyBjdHhbMF0pOwogICAgCQl9LAogICAgCQlpOiBub29wLAogICAgCQlvOiBub29wLAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0KTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2s6IGJsb2NrXzEsCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2tfMS5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoNDI6NCkgeyNpZiBjaGlsZHJlbn0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrXzE7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlX2ZyYWdtZW50KGN0eCkgewogICAgCWxldCBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7CiAgICAJbGV0IGlmX2Jsb2NrOwogICAgCWxldCBpZl9ibG9ja19hbmNob3I7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgaWZfYmxvY2tfY3JlYXRvcnMgPSBbY3JlYXRlX2lmX2Jsb2NrLCBjcmVhdGVfZWxzZV9ibG9ja18xXTsKICAgIAljb25zdCBpZl9ibG9ja3MgPSBbXTsKCiAgICAJZnVuY3Rpb24gc2VsZWN0X2Jsb2NrX3R5cGUoY3R4LCBkaXJ0eSkgewogICAgCQlpZiAoLypocmVmKi8gY3R4WzNdKSByZXR1cm4gMDsKICAgIAkJcmV0dXJuIDE7CiAgICAJfQoKICAgIAljdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZShjdHgpOwogICAgCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0gPSBpZl9ibG9ja19jcmVhdG9yc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdKGN0eCk7CgogICAgCWNvbnN0IGJsb2NrXzEgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlmX2Jsb2NrLmMoKTsKICAgIAkJCWlmX2Jsb2NrX2FuY2hvciA9IGVtcHR5KCk7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdLm0odGFyZ2V0LCBhbmNob3IpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGlmX2Jsb2NrX2FuY2hvciwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBbZGlydHldKSB7CiAgICAJCQlsZXQgcHJldmlvdXNfYmxvY2tfaW5kZXggPSBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7CiAgICAJCQljdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZShjdHgpOwoKICAgIAkJCWlmIChjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPT09IHByZXZpb3VzX2Jsb2NrX2luZGV4KSB7CiAgICAJCQkJaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0ucChjdHgsIGRpcnR5KTsKICAgIAkJCX0gZWxzZSB7CiAgICAJCQkJZ3JvdXBfb3V0cm9zKCk7CgogICAgCQkJCXRyYW5zaXRpb25fb3V0KGlmX2Jsb2Nrc1twcmV2aW91c19ibG9ja19pbmRleF0sIDEsIDEsICgpID0+IHsKICAgIAkJCQkJaWZfYmxvY2tzW3ByZXZpb3VzX2Jsb2NrX2luZGV4XSA9IG51bGw7CiAgICAJCQkJfSk7CgogICAgCQkJCWNoZWNrX291dHJvcygpOwogICAgCQkJCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF07CgogICAgCQkJCWlmICghaWZfYmxvY2spIHsKICAgIAkJCQkJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTsKICAgIAkJCQkJaWZfYmxvY2suYygpOwogICAgCQkJCX0gZWxzZSB7CiAgICAJCQkJCWlmX2Jsb2NrLnAoY3R4LCBkaXJ0eSk7CiAgICAJCQkJfQoKICAgIAkJCQl0cmFuc2l0aW9uX2luKGlmX2Jsb2NrLCAxKTsKICAgIAkJCQlpZl9ibG9jay5tKGlmX2Jsb2NrX2FuY2hvci5wYXJlbnROb2RlLCBpZl9ibG9ja19hbmNob3IpOwogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oaWZfYmxvY2spOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChpZl9ibG9jayk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5kKGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlmX2Jsb2NrX2FuY2hvcik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrOiBibG9ja18xLAogICAgCQlpZDogY3JlYXRlX2ZyYWdtZW50Lm5hbWUsCiAgICAJCXR5cGU6ICJjb21wb25lbnQiLAogICAgCQlzb3VyY2U6ICIiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrXzE7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2UoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHsKICAgIAlsZXQgYXJpYUxhYmVsOwogICAgCWxldCBjbGFzc2VzOwogICAgCWxldCBkZWZhdWx0QXJpYUxhYmVsOwoKICAgIAljb25zdCBvbWl0X3Byb3BzX25hbWVzID0gWwogICAgCQkiY2xhc3MiLCJhY3RpdmUiLCJibG9jayIsImNoaWxkcmVuIiwiY2xvc2UiLCJjb2xvciIsImRpc2FibGVkIiwiaHJlZiIsIm91dGxpbmUiLCJzaXplIiwic3R5bGUiLCJ2YWx1ZSIKICAgIAldOwoKICAgIAlsZXQgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcyk7CiAgICAJbGV0IHsgJCRzbG90czogc2xvdHMgPSB7fSwgJCRzY29wZSB9ID0gJCRwcm9wczsKICAgIAl2YWxpZGF0ZV9zbG90cygiQnV0dG9uIiwgc2xvdHMsIFsnZGVmYXVsdCddKTsKICAgIAlsZXQgeyBjbGFzczogY2xhc3NOYW1lID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgYWN0aXZlID0gZmFsc2UgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgYmxvY2sgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBjaGlsZHJlbiA9IHVuZGVmaW5lZCB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBjbG9zZSA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGNvbG9yID0gInNlY29uZGFyeSIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgZGlzYWJsZWQgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBocmVmID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgb3V0bGluZSA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHNpemUgPSBudWxsIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHN0eWxlID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgdmFsdWUgPSAiIiB9ID0gJCRwcm9wczsKCiAgICAJZnVuY3Rpb24gY2xpY2tfaGFuZGxlcihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjbGlja19oYW5kbGVyXzEoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJJCRzZWxmLiQkc2V0ID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQkkJGludmFsaWRhdGUoMjAsICQkcHJvcHMgPSBhc3NpZ24oYXNzaWduKHt9LCAkJHByb3BzKSwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcygkJG5ld19wcm9wcykpKTsKICAgIAkJJCRpbnZhbGlkYXRlKDksICQkcmVzdFByb3BzID0gY29tcHV0ZV9yZXN0X3Byb3BzKCQkcHJvcHMsIG9taXRfcHJvcHNfbmFtZXMpKTsKICAgIAkJaWYgKCJjbGFzcyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgxMCwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3MpOwogICAgCQlpZiAoImFjdGl2ZSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgxMSwgYWN0aXZlID0gJCRuZXdfcHJvcHMuYWN0aXZlKTsKICAgIAkJaWYgKCJibG9jayIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgxMiwgYmxvY2sgPSAkJG5ld19wcm9wcy5ibG9jayk7CiAgICAJCWlmICgiY2hpbGRyZW4iIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMCwgY2hpbGRyZW4gPSAkJG5ld19wcm9wcy5jaGlsZHJlbik7CiAgICAJCWlmICgiY2xvc2UiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMSwgY2xvc2UgPSAkJG5ld19wcm9wcy5jbG9zZSk7CiAgICAJCWlmICgiY29sb3IiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTMsIGNvbG9yID0gJCRuZXdfcHJvcHMuY29sb3IpOwogICAgCQlpZiAoImRpc2FibGVkIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDIsIGRpc2FibGVkID0gJCRuZXdfcHJvcHMuZGlzYWJsZWQpOwogICAgCQlpZiAoImhyZWYiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMywgaHJlZiA9ICQkbmV3X3Byb3BzLmhyZWYpOwogICAgCQlpZiAoIm91dGxpbmUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTQsIG91dGxpbmUgPSAkJG5ld19wcm9wcy5vdXRsaW5lKTsKICAgIAkJaWYgKCJzaXplIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDE1LCBzaXplID0gJCRuZXdfcHJvcHMuc2l6ZSk7CiAgICAJCWlmICgic3R5bGUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNCwgc3R5bGUgPSAkJG5ld19wcm9wcy5zdHlsZSk7CiAgICAJCWlmICgidmFsdWUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNSwgdmFsdWUgPSAkJG5ld19wcm9wcy52YWx1ZSk7CiAgICAJCWlmICgiJCRzY29wZSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgxNiwgJCRzY29wZSA9ICQkbmV3X3Byb3BzLiQkc2NvcGUpOwogICAgCX07CgogICAgCSQkc2VsZi4kY2FwdHVyZV9zdGF0ZSA9ICgpID0+ICh7CiAgICAJCWNsYXNzbmFtZXMsCiAgICAJCWNsYXNzTmFtZSwKICAgIAkJYWN0aXZlLAogICAgCQlibG9jaywKICAgIAkJY2hpbGRyZW4sCiAgICAJCWNsb3NlLAogICAgCQljb2xvciwKICAgIAkJZGlzYWJsZWQsCiAgICAJCWhyZWYsCiAgICAJCW91dGxpbmUsCiAgICAJCXNpemUsCiAgICAJCXN0eWxlLAogICAgCQl2YWx1ZSwKICAgIAkJYXJpYUxhYmVsLAogICAgCQljbGFzc2VzLAogICAgCQlkZWZhdWx0QXJpYUxhYmVsCiAgICAJfSk7CgogICAgCSQkc2VsZi4kaW5qZWN0X3N0YXRlID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQkkJGludmFsaWRhdGUoMjAsICQkcHJvcHMgPSBhc3NpZ24oYXNzaWduKHt9LCAkJHByb3BzKSwgJCRuZXdfcHJvcHMpKTsKICAgIAkJaWYgKCJjbGFzc05hbWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxMCwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3NOYW1lKTsKICAgIAkJaWYgKCJhY3RpdmUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxMSwgYWN0aXZlID0gJCRuZXdfcHJvcHMuYWN0aXZlKTsKICAgIAkJaWYgKCJibG9jayIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEyLCBibG9jayA9ICQkbmV3X3Byb3BzLmJsb2NrKTsKICAgIAkJaWYgKCJjaGlsZHJlbiIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIGNoaWxkcmVuID0gJCRuZXdfcHJvcHMuY2hpbGRyZW4pOwogICAgCQlpZiAoImNsb3NlIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMSwgY2xvc2UgPSAkJG5ld19wcm9wcy5jbG9zZSk7CiAgICAJCWlmICgiY29sb3IiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxMywgY29sb3IgPSAkJG5ld19wcm9wcy5jb2xvcik7CiAgICAJCWlmICgiZGlzYWJsZWQiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgyLCBkaXNhYmxlZCA9ICQkbmV3X3Byb3BzLmRpc2FibGVkKTsKICAgIAkJaWYgKCJocmVmIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMywgaHJlZiA9ICQkbmV3X3Byb3BzLmhyZWYpOwogICAgCQlpZiAoIm91dGxpbmUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxNCwgb3V0bGluZSA9ICQkbmV3X3Byb3BzLm91dGxpbmUpOwogICAgCQlpZiAoInNpemUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxNSwgc2l6ZSA9ICQkbmV3X3Byb3BzLnNpemUpOwogICAgCQlpZiAoInN0eWxlIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNCwgc3R5bGUgPSAkJG5ld19wcm9wcy5zdHlsZSk7CiAgICAJCWlmICgidmFsdWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg1LCB2YWx1ZSA9ICQkbmV3X3Byb3BzLnZhbHVlKTsKICAgIAkJaWYgKCJhcmlhTGFiZWwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg2LCBhcmlhTGFiZWwgPSAkJG5ld19wcm9wcy5hcmlhTGFiZWwpOwogICAgCQlpZiAoImNsYXNzZXMiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg3LCBjbGFzc2VzID0gJCRuZXdfcHJvcHMuY2xhc3Nlcyk7CiAgICAJCWlmICgiZGVmYXVsdEFyaWFMYWJlbCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDgsIGRlZmF1bHRBcmlhTGFiZWwgPSAkJG5ld19wcm9wcy5kZWZhdWx0QXJpYUxhYmVsKTsKICAgIAl9OwoKICAgIAlpZiAoJCRwcm9wcyAmJiAiJCRpbmplY3QiIGluICQkcHJvcHMpIHsKICAgIAkJJCRzZWxmLiRpbmplY3Rfc3RhdGUoJCRwcm9wcy4kJGluamVjdCk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCQudXBkYXRlID0gKCkgPT4gewogICAgCQkgJCRpbnZhbGlkYXRlKDYsIGFyaWFMYWJlbCA9ICQkcHJvcHNbImFyaWEtbGFiZWwiXSk7CgogICAgCQlpZiAoJCRzZWxmLiQkLmRpcnR5ICYgLypjbGFzc05hbWUsIGNsb3NlLCBvdXRsaW5lLCBjb2xvciwgc2l6ZSwgYmxvY2ssIGFjdGl2ZSovIDY0NTE0KSB7CiAgICAJCQkgJCRpbnZhbGlkYXRlKDcsIGNsYXNzZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgeyBjbG9zZSB9LCBjbG9zZSB8fCAiYnRuIiwgY2xvc2UgfHwgYGJ0biR7b3V0bGluZSA/ICItb3V0bGluZSIgOiAiIn0tJHtjb2xvcn1gLCBzaXplID8gYGJ0bi0ke3NpemV9YCA6IGZhbHNlLCBibG9jayA/ICJidG4tYmxvY2siIDogZmFsc2UsIHsgYWN0aXZlIH0pKTsKICAgIAkJfQoKICAgIAkJaWYgKCQkc2VsZi4kJC5kaXJ0eSAmIC8qY2xvc2UqLyAyKSB7CiAgICAJCQkgJCRpbnZhbGlkYXRlKDgsIGRlZmF1bHRBcmlhTGFiZWwgPSBjbG9zZSA/ICJDbG9zZSIgOiBudWxsKTsKICAgIAkJfQogICAgCX07CgogICAgCSQkcHJvcHMgPSBleGNsdWRlX2ludGVybmFsX3Byb3BzKCQkcHJvcHMpOwoKICAgIAlyZXR1cm4gWwogICAgCQljaGlsZHJlbiwKICAgIAkJY2xvc2UsCiAgICAJCWRpc2FibGVkLAogICAgCQlocmVmLAogICAgCQlzdHlsZSwKICAgIAkJdmFsdWUsCiAgICAJCWFyaWFMYWJlbCwKICAgIAkJY2xhc3NlcywKICAgIAkJZGVmYXVsdEFyaWFMYWJlbCwKICAgIAkJJCRyZXN0UHJvcHMsCiAgICAJCWNsYXNzTmFtZSwKICAgIAkJYWN0aXZlLAogICAgCQlibG9jaywKICAgIAkJY29sb3IsCiAgICAJCW91dGxpbmUsCiAgICAJCXNpemUsCiAgICAJCSQkc2NvcGUsCiAgICAJCXNsb3RzLAogICAgCQljbGlja19oYW5kbGVyLAogICAgCQljbGlja19oYW5kbGVyXzEKICAgIAldOwogICAgfQoKICAgIGNsYXNzIEJ1dHRvbiBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudERldiB7CiAgICAJY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgCQlzdXBlcihvcHRpb25zKTsKCiAgICAJCWluaXQodGhpcywgb3B0aW9ucywgaW5zdGFuY2UsIGNyZWF0ZV9mcmFnbWVudCwgc2FmZV9ub3RfZXF1YWwsIHsKICAgIAkJCWNsYXNzOiAxMCwKICAgIAkJCWFjdGl2ZTogMTEsCiAgICAJCQlibG9jazogMTIsCiAgICAJCQljaGlsZHJlbjogMCwKICAgIAkJCWNsb3NlOiAxLAogICAgCQkJY29sb3I6IDEzLAogICAgCQkJZGlzYWJsZWQ6IDIsCiAgICAJCQlocmVmOiAzLAogICAgCQkJb3V0bGluZTogMTQsCiAgICAJCQlzaXplOiAxNSwKICAgIAkJCXN0eWxlOiA0LAogICAgCQkJdmFsdWU6IDUKICAgIAkJfSk7CgogICAgCQlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQ29tcG9uZW50IiwgewogICAgCQkJY29tcG9uZW50OiB0aGlzLAogICAgCQkJdGFnTmFtZTogIkJ1dHRvbiIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudC5uYW1lCiAgICAJCX0pOwogICAgCX0KCiAgICAJZ2V0IGNsYXNzKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgY2xhc3ModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8QnV0dG9uPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGFjdGl2ZSgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8QnV0dG9uPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGFjdGl2ZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgYmxvY2soKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBibG9jayh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgY2hpbGRyZW4oKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjaGlsZHJlbih2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgY2xvc2UoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjbG9zZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgY29sb3IoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjb2xvcih2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgZGlzYWJsZWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBkaXNhYmxlZCh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgaHJlZigpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8QnV0dG9uPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGhyZWYodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8QnV0dG9uPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IG91dGxpbmUoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBvdXRsaW5lKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbj46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBzaXplKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgc2l6ZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgc3R5bGUoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBzdHlsZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgdmFsdWUoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCB2YWx1ZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b24+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQogICAgfQoKICAgIGNvbnN0IHN1YnNjcmliZXJfcXVldWUgPSBbXTsKICAgIC8qKgogICAgICogQ3JlYXRlIGEgYFdyaXRhYmxlYCBzdG9yZSB0aGF0IGFsbG93cyBib3RoIHVwZGF0aW5nIGFuZCByZWFkaW5nIGJ5IHN1YnNjcmlwdGlvbi4KICAgICAqIEBwYXJhbSB7Kj19dmFsdWUgaW5pdGlhbCB2YWx1ZQogICAgICogQHBhcmFtIHtTdGFydFN0b3BOb3RpZmllcj19c3RhcnQgc3RhcnQgYW5kIHN0b3Agbm90aWZpY2F0aW9ucyBmb3Igc3Vic2NyaXB0aW9ucwogICAgICovCiAgICBmdW5jdGlvbiB3cml0YWJsZSh2YWx1ZSwgc3RhcnQgPSBub29wKSB7CiAgICAgICAgbGV0IHN0b3A7CiAgICAgICAgY29uc3Qgc3Vic2NyaWJlcnMgPSBbXTsKICAgICAgICBmdW5jdGlvbiBzZXQobmV3X3ZhbHVlKSB7CiAgICAgICAgICAgIGlmIChzYWZlX25vdF9lcXVhbCh2YWx1ZSwgbmV3X3ZhbHVlKSkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdfdmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoc3RvcCkgeyAvLyBzdG9yZSBpcyByZWFkeQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bl9xdWV1ZSA9ICFzdWJzY3JpYmVyX3F1ZXVlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBzdWJzY3JpYmVyc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgc1sxXSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX3F1ZXVlLnB1c2gocywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocnVuX3F1ZXVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3Vic2NyaWJlcl9xdWV1ZS5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9xdWV1ZVtpXVswXShzdWJzY3JpYmVyX3F1ZXVlW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9xdWV1ZS5sZW5ndGggPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB1cGRhdGUoZm4pIHsKICAgICAgICAgICAgc2V0KGZuKHZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHN1YnNjcmliZShydW4sIGludmFsaWRhdGUgPSBub29wKSB7CiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBbcnVuLCBpbnZhbGlkYXRlXTsKICAgICAgICAgICAgc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTsKICAgICAgICAgICAgaWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgc3RvcCA9IHN0YXJ0KHNldCkgfHwgbm9vcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBydW4odmFsdWUpOwogICAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdWJzY3JpYmVycy5pbmRleE9mKHN1YnNjcmliZXIpOwogICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgICAgICAgIHN0b3AgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBzZXQsIHVwZGF0ZSwgc3Vic2NyaWJlIH07CiAgICB9CgogICAgLyogbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9CdXR0b25Hcm91cC5zdmVsdGUgZ2VuZXJhdGVkIGJ5IFN2ZWx0ZSB2My4zMS4yICovCiAgICBjb25zdCBmaWxlJDEgPSAibm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9CdXR0b25Hcm91cC5zdmVsdGUiOwoKICAgIGZ1bmN0aW9uIGNyZWF0ZV9mcmFnbWVudCQxKGN0eCkgewogICAgCWxldCBkaXY7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbNl0uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzVdLCBudWxsKTsKICAgIAlsZXQgZGl2X2xldmVscyA9IFsvKiQkcmVzdFByb3BzKi8gY3R4WzFdLCB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbMF0gfV07CiAgICAJbGV0IGRpdl9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgZGl2X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlkaXZfZGF0YSA9IGFzc2lnbihkaXZfZGF0YSwgZGl2X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJZGl2ID0gZWxlbWVudCgiZGl2Iik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZGl2LCBkaXZfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oZGl2LCBmaWxlJDEsIDE1LCAwLCAzMDUpOwogICAgCQl9LAogICAgCQlsOiBmdW5jdGlvbiBjbGFpbShub2RlcykgewogICAgCQkJdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zLmh5ZHJhdGUgb25seSB3b3JrcyBpZiB0aGUgY29tcG9uZW50IHdhcyBjb21waWxlZCB3aXRoIHRoZSBgaHlkcmF0YWJsZTogdHJ1ZWAgb3B0aW9uIik7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgZGl2LCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubShkaXYsIG51bGwpOwogICAgCQkJfQoKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBbZGlydHldKSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJaWYgKGRlZmF1bHRfc2xvdC5wICYmIGRpcnR5ICYgLyokJHNjb3BlKi8gMzIpIHsKICAgIAkJCQkJdXBkYXRlX3Nsb3QoZGVmYXVsdF9zbG90LCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzVdLCBkaXJ0eSwgbnVsbCwgbnVsbCk7CiAgICAJCQkJfQogICAgCQkJfQoKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGRpdiwgZGl2X2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShkaXZfbGV2ZWxzLCBbCiAgICAJCQkJZGlydHkgJiAvKiQkcmVzdFByb3BzKi8gMiAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzFdLAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qY2xhc3NlcyovIDEpICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFswXSB9CiAgICAJCQldKSk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGRpdik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuZChkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9mcmFnbWVudCQxLm5hbWUsCiAgICAJCXR5cGU6ICJjb21wb25lbnQiLAogICAgCQlzb3VyY2U6ICIiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RhbmNlJDEoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHsKICAgIAlsZXQgY2xhc3NlczsKICAgIAljb25zdCBvbWl0X3Byb3BzX25hbWVzID0gWyJjbGFzcyIsInNpemUiLCJ2ZXJ0aWNhbCJdOwogICAgCWxldCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKTsKICAgIAlsZXQgeyAkJHNsb3RzOiBzbG90cyA9IHt9LCAkJHNjb3BlIH0gPSAkJHByb3BzOwogICAgCXZhbGlkYXRlX3Nsb3RzKCJCdXR0b25Hcm91cCIsIHNsb3RzLCBbJ2RlZmF1bHQnXSk7CiAgICAJbGV0IHsgY2xhc3M6IGNsYXNzTmFtZSA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHNpemUgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyB2ZXJ0aWNhbCA9IGZhbHNlIH0gPSAkJHByb3BzOwoKICAgIAkkJHNlbGYuJCRzZXQgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCSQkcHJvcHMgPSBhc3NpZ24oYXNzaWduKHt9LCAkJHByb3BzKSwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcygkJG5ld19wcm9wcykpOwogICAgCQkkJGludmFsaWRhdGUoMSwgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcykpOwogICAgCQlpZiAoImNsYXNzIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzKTsKICAgIAkJaWYgKCJzaXplIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDMsIHNpemUgPSAkJG5ld19wcm9wcy5zaXplKTsKICAgIAkJaWYgKCJ2ZXJ0aWNhbCIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg0LCB2ZXJ0aWNhbCA9ICQkbmV3X3Byb3BzLnZlcnRpY2FsKTsKICAgIAkJaWYgKCIkJHNjb3BlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDUsICQkc2NvcGUgPSAkJG5ld19wcm9wcy4kJHNjb3BlKTsKICAgIAl9OwoKICAgIAkkJHNlbGYuJGNhcHR1cmVfc3RhdGUgPSAoKSA9PiAoewogICAgCQljbGFzc25hbWVzLAogICAgCQljbGFzc05hbWUsCiAgICAJCXNpemUsCiAgICAJCXZlcnRpY2FsLAogICAgCQljbGFzc2VzCiAgICAJfSk7CgogICAgCSQkc2VsZi4kaW5qZWN0X3N0YXRlID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQlpZiAoImNsYXNzTmFtZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzTmFtZSk7CiAgICAJCWlmICgic2l6ZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIHNpemUgPSAkJG5ld19wcm9wcy5zaXplKTsKICAgIAkJaWYgKCJ2ZXJ0aWNhbCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDQsIHZlcnRpY2FsID0gJCRuZXdfcHJvcHMudmVydGljYWwpOwogICAgCQlpZiAoImNsYXNzZXMiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBjbGFzc2VzID0gJCRuZXdfcHJvcHMuY2xhc3Nlcyk7CiAgICAJfTsKCiAgICAJaWYgKCQkcHJvcHMgJiYgIiQkaW5qZWN0IiBpbiAkJHByb3BzKSB7CiAgICAJCSQkc2VsZi4kaW5qZWN0X3N0YXRlKCQkcHJvcHMuJCRpbmplY3QpOwogICAgCX0KCiAgICAJJCRzZWxmLiQkLnVwZGF0ZSA9ICgpID0+IHsKICAgIAkJaWYgKCQkc2VsZi4kJC5kaXJ0eSAmIC8qY2xhc3NOYW1lLCBzaXplLCB2ZXJ0aWNhbCovIDI4KSB7CiAgICAJCQkgJCRpbnZhbGlkYXRlKDAsIGNsYXNzZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgc2l6ZSA/IGBidG4tZ3JvdXAtJHtzaXplfWAgOiBmYWxzZSwgdmVydGljYWwgPyAiYnRuLWdyb3VwLXZlcnRpY2FsIiA6ICJidG4tZ3JvdXAiKSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlyZXR1cm4gW2NsYXNzZXMsICQkcmVzdFByb3BzLCBjbGFzc05hbWUsIHNpemUsIHZlcnRpY2FsLCAkJHNjb3BlLCBzbG90c107CiAgICB9CgogICAgY2xhc3MgQnV0dG9uR3JvdXAgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CiAgICAJCWluaXQodGhpcywgb3B0aW9ucywgaW5zdGFuY2UkMSwgY3JlYXRlX2ZyYWdtZW50JDEsIHNhZmVfbm90X2VxdWFsLCB7IGNsYXNzOiAyLCBzaXplOiAzLCB2ZXJ0aWNhbDogNCB9KTsKCiAgICAJCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJDb21wb25lbnQiLCB7CiAgICAJCQljb21wb25lbnQ6IHRoaXMsCiAgICAJCQl0YWdOYW1lOiAiQnV0dG9uR3JvdXAiLAogICAgCQkJb3B0aW9ucywKICAgIAkJCWlkOiBjcmVhdGVfZnJhZ21lbnQkMS5uYW1lCiAgICAJCX0pOwogICAgCX0KCiAgICAJZ2V0IGNsYXNzKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b25Hcm91cD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjbGFzcyh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b25Hcm91cD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBzaXplKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b25Hcm91cD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBzaXplKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEJ1dHRvbkdyb3VwPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IHZlcnRpY2FsKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b25Hcm91cD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCB2ZXJ0aWNhbCh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxCdXR0b25Hcm91cD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CiAgICB9CgogICAgLyogbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Db2wuc3ZlbHRlIGdlbmVyYXRlZCBieSBTdmVsdGUgdjMuMzEuMiAqLwogICAgY29uc3QgZmlsZSQyID0gIm5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvQ29sLnN2ZWx0ZSI7CgogICAgZnVuY3Rpb24gY3JlYXRlX2ZyYWdtZW50JDIoY3R4KSB7CiAgICAJbGV0IGRpdjsKICAgIAlsZXQgZGl2X2NsYXNzX3ZhbHVlOwogICAgCWxldCBjdXJyZW50OwogICAgCWNvbnN0IGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSA9IC8qI3Nsb3RzKi8gY3R4WzldLmRlZmF1bHQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90ID0gY3JlYXRlX3Nsb3QoZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFs4XSwgbnVsbCk7CgogICAgCWxldCBkaXZfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzFdLAogICAgCQl7CiAgICAJCQljbGFzczogZGl2X2NsYXNzX3ZhbHVlID0gLypjb2xDbGFzc2VzKi8gY3R4WzBdLmpvaW4oIiAiKQogICAgCQl9CiAgICAJXTsKCiAgICAJbGV0IGRpdl9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgZGl2X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlkaXZfZGF0YSA9IGFzc2lnbihkaXZfZGF0YSwgZGl2X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJZGl2ID0gZWxlbWVudCgiZGl2Iik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZGl2LCBkaXZfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oZGl2LCBmaWxlJDIsIDU4LCAwLCAxMzg4KTsKICAgIAkJfSwKICAgIAkJbDogZnVuY3Rpb24gY2xhaW0obm9kZXMpIHsKICAgIAkJCXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5oeWRyYXRlIG9ubHkgd29ya3MgaWYgdGhlIGNvbXBvbmVudCB3YXMgY29tcGlsZWQgd2l0aCB0aGUgYGh5ZHJhdGFibGU6IHRydWVgIG9wdGlvbiIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGRpdiwgYW5jaG9yKTsKCiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJZGVmYXVsdF9zbG90Lm0oZGl2LCBudWxsKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgW2RpcnR5XSkgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDI1NikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbOF0sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZGl2LCBkaXZfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGRpdl9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyAyICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMV0sCiAgICAJCQkJeyBjbGFzczogZGl2X2NsYXNzX3ZhbHVlIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoZGl2KTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5kKGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2ZyYWdtZW50JDIubmFtZSwKICAgIAkJdHlwZTogImNvbXBvbmVudCIsCiAgICAJCXNvdXJjZTogIiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2UkMigkJHNlbGYsICQkcHJvcHMsICQkaW52YWxpZGF0ZSkgewogICAgCWNvbnN0IG9taXRfcHJvcHNfbmFtZXMgPSBbImNsYXNzIiwieHMiLCJzbSIsIm1kIiwibGciLCJ4bCJdOwogICAgCWxldCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKTsKICAgIAlsZXQgeyAkJHNsb3RzOiBzbG90cyA9IHt9LCAkJHNjb3BlIH0gPSAkJHByb3BzOwogICAgCXZhbGlkYXRlX3Nsb3RzKCJDb2wiLCBzbG90cywgWydkZWZhdWx0J10pOwogICAgCWxldCB7IGNsYXNzOiBjbGFzc05hbWUgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyB4cyA9IHVuZGVmaW5lZCB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBzbSA9IHVuZGVmaW5lZCB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBtZCA9IHVuZGVmaW5lZCB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBsZyA9IHVuZGVmaW5lZCB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyB4bCA9IHVuZGVmaW5lZCB9ID0gJCRwcm9wczsKICAgIAljb25zdCBjb2xDbGFzc2VzID0gW107CiAgICAJY29uc3QgbG9va3VwID0geyB4cywgc20sIG1kLCBsZywgeGwgfTsKCiAgICAJT2JqZWN0LmtleXMobG9va3VwKS5mb3JFYWNoKGNvbFdpZHRoID0+IHsKICAgIAkJY29uc3QgY29sdW1uUHJvcCA9IGxvb2t1cFtjb2xXaWR0aF07CgogICAgCQlpZiAoIWNvbHVtblByb3AgJiYgY29sdW1uUHJvcCAhPT0gIiIpIHsKICAgIAkJCXJldHVybjsgLy9ubyB2YWx1ZSBmb3IgdGhpcyB3aWR0aAogICAgCQl9CgogICAgCQljb25zdCBpc1hzID0gY29sV2lkdGggPT09ICJ4cyI7CgogICAgCQlpZiAoaXNPYmplY3QoY29sdW1uUHJvcCkpIHsKICAgIAkJCWNvbnN0IGNvbFNpemVJbnRlcmZpeCA9IGlzWHMgPyAiLSIgOiBgLSR7Y29sV2lkdGh9LWA7CiAgICAJCQljb25zdCBjb2xDbGFzcyA9IGdldENvbHVtblNpemVDbGFzcyhpc1hzLCBjb2xXaWR0aCwgY29sdW1uUHJvcC5zaXplKTsKCiAgICAJCQlpZiAoY29sdW1uUHJvcC5zaXplIHx8IGNvbHVtblByb3Auc2l6ZSA9PT0gIiIpIHsKICAgIAkJCQljb2xDbGFzc2VzLnB1c2goY29sQ2xhc3MpOwogICAgCQkJfQoKICAgIAkJCWlmIChjb2x1bW5Qcm9wLnB1c2gpIHsKICAgIAkJCQljb2xDbGFzc2VzLnB1c2goYHB1c2gke2NvbFNpemVJbnRlcmZpeH0ke2NvbHVtblByb3AucHVzaH1gKTsKICAgIAkJCX0KCiAgICAJCQlpZiAoY29sdW1uUHJvcC5wdWxsKSB7CiAgICAJCQkJY29sQ2xhc3Nlcy5wdXNoKGBwdWxsJHtjb2xTaXplSW50ZXJmaXh9JHtjb2x1bW5Qcm9wLnB1bGx9YCk7CiAgICAJCQl9CgogICAgCQkJaWYgKGNvbHVtblByb3Aub2Zmc2V0KSB7CiAgICAJCQkJY29sQ2xhc3Nlcy5wdXNoKGBvZmZzZXQke2NvbFNpemVJbnRlcmZpeH0ke2NvbHVtblByb3Aub2Zmc2V0fWApOwogICAgCQkJfQogICAgCQl9IGVsc2UgewogICAgCQkJY29sQ2xhc3Nlcy5wdXNoKGdldENvbHVtblNpemVDbGFzcyhpc1hzLCBjb2xXaWR0aCwgY29sdW1uUHJvcCkpOwogICAgCQl9CiAgICAJfSk7CgogICAgCWlmICghY29sQ2xhc3Nlcy5sZW5ndGgpIHsKICAgIAkJY29sQ2xhc3Nlcy5wdXNoKCJjb2wiKTsKICAgIAl9CgogICAgCWlmIChjbGFzc05hbWUpIHsKICAgIAkJY29sQ2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCRzZXQgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCSQkcHJvcHMgPSBhc3NpZ24oYXNzaWduKHt9LCAkJHByb3BzKSwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcygkJG5ld19wcm9wcykpOwogICAgCQkkJGludmFsaWRhdGUoMSwgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcykpOwogICAgCQlpZiAoImNsYXNzIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzKTsKICAgIAkJaWYgKCJ4cyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgzLCB4cyA9ICQkbmV3X3Byb3BzLnhzKTsKICAgIAkJaWYgKCJzbSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg0LCBzbSA9ICQkbmV3X3Byb3BzLnNtKTsKICAgIAkJaWYgKCJtZCIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg1LCBtZCA9ICQkbmV3X3Byb3BzLm1kKTsKICAgIAkJaWYgKCJsZyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg2LCBsZyA9ICQkbmV3X3Byb3BzLmxnKTsKICAgIAkJaWYgKCJ4bCIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg3LCB4bCA9ICQkbmV3X3Byb3BzLnhsKTsKICAgIAkJaWYgKCIkJHNjb3BlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDgsICQkc2NvcGUgPSAkJG5ld19wcm9wcy4kJHNjb3BlKTsKICAgIAl9OwoKICAgIAkkJHNlbGYuJGNhcHR1cmVfc3RhdGUgPSAoKSA9PiAoewogICAgCQlnZXRDb2x1bW5TaXplQ2xhc3MsCiAgICAJCWlzT2JqZWN0LAogICAgCQljbGFzc05hbWUsCiAgICAJCXhzLAogICAgCQlzbSwKICAgIAkJbWQsCiAgICAJCWxnLAogICAgCQl4bCwKICAgIAkJY29sQ2xhc3NlcywKICAgIAkJbG9va3VwCiAgICAJfSk7CgogICAgCSQkc2VsZi4kaW5qZWN0X3N0YXRlID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQlpZiAoImNsYXNzTmFtZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzTmFtZSk7CiAgICAJCWlmICgieHMiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgzLCB4cyA9ICQkbmV3X3Byb3BzLnhzKTsKICAgIAkJaWYgKCJzbSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDQsIHNtID0gJCRuZXdfcHJvcHMuc20pOwogICAgCQlpZiAoIm1kIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNSwgbWQgPSAkJG5ld19wcm9wcy5tZCk7CiAgICAJCWlmICgibGciIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg2LCBsZyA9ICQkbmV3X3Byb3BzLmxnKTsKICAgIAkJaWYgKCJ4bCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDcsIHhsID0gJCRuZXdfcHJvcHMueGwpOwogICAgCX07CgogICAgCWlmICgkJHByb3BzICYmICIkJGluamVjdCIgaW4gJCRwcm9wcykgewogICAgCQkkJHNlbGYuJGluamVjdF9zdGF0ZSgkJHByb3BzLiQkaW5qZWN0KTsKICAgIAl9CgogICAgCXJldHVybiBbY29sQ2xhc3NlcywgJCRyZXN0UHJvcHMsIGNsYXNzTmFtZSwgeHMsIHNtLCBtZCwgbGcsIHhsLCAkJHNjb3BlLCBzbG90c107CiAgICB9CgogICAgY2xhc3MgQ29sIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHsKICAgIAljb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAJCXN1cGVyKG9wdGlvbnMpOwoKICAgIAkJaW5pdCh0aGlzLCBvcHRpb25zLCBpbnN0YW5jZSQyLCBjcmVhdGVfZnJhZ21lbnQkMiwgc2FmZV9ub3RfZXF1YWwsIHsKICAgIAkJCWNsYXNzOiAyLAogICAgCQkJeHM6IDMsCiAgICAJCQlzbTogNCwKICAgIAkJCW1kOiA1LAogICAgCQkJbGc6IDYsCiAgICAJCQl4bDogNwogICAgCQl9KTsKCiAgICAJCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJDb21wb25lbnQiLCB7CiAgICAJCQljb21wb25lbnQ6IHRoaXMsCiAgICAJCQl0YWdOYW1lOiAiQ29sIiwKICAgIAkJCW9wdGlvbnMsCiAgICAJCQlpZDogY3JlYXRlX2ZyYWdtZW50JDIubmFtZQogICAgCQl9KTsKICAgIAl9CgogICAgCWdldCBjbGFzcygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Q29sPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGNsYXNzKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPENvbD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCB4cygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Q29sPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHhzKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPENvbD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBzbSgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Q29sPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHNtKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPENvbD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBtZCgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Q29sPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IG1kKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPENvbD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBsZygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Q29sPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGxnKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPENvbD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCB4bCgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Q29sPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHhsKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPENvbD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CiAgICB9CgogICAgLyogbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Db250YWluZXIuc3ZlbHRlIGdlbmVyYXRlZCBieSBTdmVsdGUgdjMuMzEuMiAqLwogICAgY29uc3QgZmlsZSQzID0gIm5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvQ29udGFpbmVyLnN2ZWx0ZSI7CgogICAgZnVuY3Rpb24gY3JlYXRlX2ZyYWdtZW50JDMoY3R4KSB7CiAgICAJbGV0IGRpdjsKICAgIAlsZXQgY3VycmVudDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUgPSAvKiNzbG90cyovIGN0eFs1XS5kZWZhdWx0OwogICAgCWNvbnN0IGRlZmF1bHRfc2xvdCA9IGNyZWF0ZV9zbG90KGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbNF0sIG51bGwpOwogICAgCWxldCBkaXZfbGV2ZWxzID0gWy8qJCRyZXN0UHJvcHMqLyBjdHhbMV0sIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFswXSB9XTsKICAgIAlsZXQgZGl2X2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBkaXZfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWRpdl9kYXRhID0gYXNzaWduKGRpdl9kYXRhLCBkaXZfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlkaXYgPSBlbGVtZW50KCJkaXYiKTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5jKCk7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhkaXYsIGRpdl9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbihkaXYsIGZpbGUkMywgMTAsIDAsIDIyMCk7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBkaXYsIGFuY2hvcik7CgogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWRlZmF1bHRfc2xvdC5tKGRpdiwgbnVsbCk7CiAgICAJCQl9CgogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIFtkaXJ0eV0pIHsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlpZiAoZGVmYXVsdF9zbG90LnAgJiYgZGlydHkgJiAvKiQkc2NvcGUqLyAxNikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbNF0sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZGl2LCBkaXZfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGRpdl9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyAyICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMV0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gMSkgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzBdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoZGl2KTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5kKGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2ZyYWdtZW50JDMubmFtZSwKICAgIAkJdHlwZTogImNvbXBvbmVudCIsCiAgICAJCXNvdXJjZTogIiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2UkMygkJHNlbGYsICQkcHJvcHMsICQkaW52YWxpZGF0ZSkgewogICAgCWxldCBjbGFzc2VzOwogICAgCWNvbnN0IG9taXRfcHJvcHNfbmFtZXMgPSBbImNsYXNzIiwiZmx1aWQiXTsKICAgIAlsZXQgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcyk7CiAgICAJbGV0IHsgJCRzbG90czogc2xvdHMgPSB7fSwgJCRzY29wZSB9ID0gJCRwcm9wczsKICAgIAl2YWxpZGF0ZV9zbG90cygiQ29udGFpbmVyIiwgc2xvdHMsIFsnZGVmYXVsdCddKTsKICAgIAlsZXQgeyBjbGFzczogY2xhc3NOYW1lID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgZmx1aWQgPSBmYWxzZSB9ID0gJCRwcm9wczsKCiAgICAJJCRzZWxmLiQkc2V0ID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQkkJHByb3BzID0gYXNzaWduKGFzc2lnbih7fSwgJCRwcm9wcyksIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMoJCRuZXdfcHJvcHMpKTsKICAgIAkJJCRpbnZhbGlkYXRlKDEsICQkcmVzdFByb3BzID0gY29tcHV0ZV9yZXN0X3Byb3BzKCQkcHJvcHMsIG9taXRfcHJvcHNfbmFtZXMpKTsKICAgIAkJaWYgKCJjbGFzcyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgyLCBjbGFzc05hbWUgPSAkJG5ld19wcm9wcy5jbGFzcyk7CiAgICAJCWlmICgiZmx1aWQiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMywgZmx1aWQgPSAkJG5ld19wcm9wcy5mbHVpZCk7CiAgICAJCWlmICgiJCRzY29wZSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg0LCAkJHNjb3BlID0gJCRuZXdfcHJvcHMuJCRzY29wZSk7CiAgICAJfTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsgY2xhc3NuYW1lcywgY2xhc3NOYW1lLCBmbHVpZCwgY2xhc3NlcyB9KTsKCiAgICAJJCRzZWxmLiRpbmplY3Rfc3RhdGUgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCWlmICgiY2xhc3NOYW1lIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMiwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3NOYW1lKTsKICAgIAkJaWYgKCJmbHVpZCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIGZsdWlkID0gJCRuZXdfcHJvcHMuZmx1aWQpOwogICAgCQlpZiAoImNsYXNzZXMiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBjbGFzc2VzID0gJCRuZXdfcHJvcHMuY2xhc3Nlcyk7CiAgICAJfTsKCiAgICAJaWYgKCQkcHJvcHMgJiYgIiQkaW5qZWN0IiBpbiAkJHByb3BzKSB7CiAgICAJCSQkc2VsZi4kaW5qZWN0X3N0YXRlKCQkcHJvcHMuJCRpbmplY3QpOwogICAgCX0KCiAgICAJJCRzZWxmLiQkLnVwZGF0ZSA9ICgpID0+IHsKICAgIAkJaWYgKCQkc2VsZi4kJC5kaXJ0eSAmIC8qY2xhc3NOYW1lLCBmbHVpZCovIDEyKSB7CiAgICAJCQkgJCRpbnZhbGlkYXRlKDAsIGNsYXNzZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgZmx1aWQgPyAiY29udGFpbmVyLWZsdWlkIiA6ICJjb250YWluZXIiKSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlyZXR1cm4gW2NsYXNzZXMsICQkcmVzdFByb3BzLCBjbGFzc05hbWUsIGZsdWlkLCAkJHNjb3BlLCBzbG90c107CiAgICB9CgogICAgY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHsKICAgIAljb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAJCXN1cGVyKG9wdGlvbnMpOwogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJDMsIGNyZWF0ZV9mcmFnbWVudCQzLCBzYWZlX25vdF9lcXVhbCwgeyBjbGFzczogMiwgZmx1aWQ6IDMgfSk7CgogICAgCQlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQ29tcG9uZW50IiwgewogICAgCQkJY29tcG9uZW50OiB0aGlzLAogICAgCQkJdGFnTmFtZTogIkNvbnRhaW5lciIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudCQzLm5hbWUKICAgIAkJfSk7CiAgICAJfQoKICAgIAlnZXQgY2xhc3MoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPENvbnRhaW5lcj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjbGFzcyh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxDb250YWluZXI+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgZmx1aWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPENvbnRhaW5lcj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBmbHVpZCh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxDb250YWluZXI+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQogICAgfQoKICAgIC8qIG5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvRm9ybS5zdmVsdGUgZ2VuZXJhdGVkIGJ5IFN2ZWx0ZSB2My4zMS4yICovCiAgICBjb25zdCBmaWxlJDQgPSAibm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Gb3JtLnN2ZWx0ZSI7CgogICAgZnVuY3Rpb24gY3JlYXRlX2ZyYWdtZW50JDQoY3R4KSB7CiAgICAJbGV0IGZvcm07CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJbGV0IG1vdW50ZWQ7CiAgICAJbGV0IGRpc3Bvc2U7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbNV0uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzRdLCBudWxsKTsKICAgIAlsZXQgZm9ybV9sZXZlbHMgPSBbLyokJHJlc3RQcm9wcyovIGN0eFsxXSwgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzBdIH1dOwogICAgCWxldCBmb3JtX2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtX2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlmb3JtX2RhdGEgPSBhc3NpZ24oZm9ybV9kYXRhLCBmb3JtX2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJZm9ybSA9IGVsZW1lbnQoImZvcm0iKTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5jKCk7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhmb3JtLCBmb3JtX2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGZvcm0sIGZpbGUkNCwgMTAsIDAsIDIxMik7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBmb3JtLCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubShmb3JtLCBudWxsKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gbGlzdGVuX2Rldihmb3JtLCAic3VibWl0IiwgLypzdWJtaXRfaGFuZGxlciovIGN0eFs2XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIFtkaXJ0eV0pIHsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlpZiAoZGVmYXVsdF9zbG90LnAgJiYgZGlydHkgJiAvKiQkc2NvcGUqLyAxNikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbNF0sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZm9ybSwgZm9ybV9kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoZm9ybV9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyAyICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMV0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gMSkgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzBdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoZm9ybSk7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuZChkZXRhY2hpbmcpOwogICAgCQkJbW91bnRlZCA9IGZhbHNlOwogICAgCQkJZGlzcG9zZSgpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9mcmFnbWVudCQ0Lm5hbWUsCiAgICAJCXR5cGU6ICJjb21wb25lbnQiLAogICAgCQlzb3VyY2U6ICIiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RhbmNlJDQoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHsKICAgIAlsZXQgY2xhc3NlczsKICAgIAljb25zdCBvbWl0X3Byb3BzX25hbWVzID0gWyJjbGFzcyIsImlubGluZSJdOwogICAgCWxldCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKTsKICAgIAlsZXQgeyAkJHNsb3RzOiBzbG90cyA9IHt9LCAkJHNjb3BlIH0gPSAkJHByb3BzOwogICAgCXZhbGlkYXRlX3Nsb3RzKCJGb3JtIiwgc2xvdHMsIFsnZGVmYXVsdCddKTsKICAgIAlsZXQgeyBjbGFzczogY2xhc3NOYW1lID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgaW5saW5lID0gZmFsc2UgfSA9ICQkcHJvcHM7CgogICAgCWZ1bmN0aW9uIHN1Ym1pdF9oYW5kbGVyKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCSQkc2VsZi4kJHNldCA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJJCRwcm9wcyA9IGFzc2lnbihhc3NpZ24oe30sICQkcHJvcHMpLCBleGNsdWRlX2ludGVybmFsX3Byb3BzKCQkbmV3X3Byb3BzKSk7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKSk7CiAgICAJCWlmICgiY2xhc3MiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMiwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3MpOwogICAgCQlpZiAoImlubGluZSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgzLCBpbmxpbmUgPSAkJG5ld19wcm9wcy5pbmxpbmUpOwogICAgCQlpZiAoIiQkc2NvcGUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNCwgJCRzY29wZSA9ICQkbmV3X3Byb3BzLiQkc2NvcGUpOwogICAgCX07CgogICAgCSQkc2VsZi4kY2FwdHVyZV9zdGF0ZSA9ICgpID0+ICh7IGNsYXNzbmFtZXMsIGNsYXNzTmFtZSwgaW5saW5lLCBjbGFzc2VzIH0pOwoKICAgIAkkJHNlbGYuJGluamVjdF9zdGF0ZSA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJaWYgKCJjbGFzc05hbWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgyLCBjbGFzc05hbWUgPSAkJG5ld19wcm9wcy5jbGFzc05hbWUpOwogICAgCQlpZiAoImlubGluZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIGlubGluZSA9ICQkbmV3X3Byb3BzLmlubGluZSk7CiAgICAJCWlmICgiY2xhc3NlcyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIGNsYXNzZXMgPSAkJG5ld19wcm9wcy5jbGFzc2VzKTsKICAgIAl9OwoKICAgIAlpZiAoJCRwcm9wcyAmJiAiJCRpbmplY3QiIGluICQkcHJvcHMpIHsKICAgIAkJJCRzZWxmLiRpbmplY3Rfc3RhdGUoJCRwcm9wcy4kJGluamVjdCk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCQudXBkYXRlID0gKCkgPT4gewogICAgCQlpZiAoJCRzZWxmLiQkLmRpcnR5ICYgLypjbGFzc05hbWUsIGlubGluZSovIDEyKSB7CiAgICAJCQkgJCRpbnZhbGlkYXRlKDAsIGNsYXNzZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgaW5saW5lID8gImZvcm0taW5saW5lIiA6IGZhbHNlKSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlyZXR1cm4gW2NsYXNzZXMsICQkcmVzdFByb3BzLCBjbGFzc05hbWUsIGlubGluZSwgJCRzY29wZSwgc2xvdHMsIHN1Ym1pdF9oYW5kbGVyXTsKICAgIH0KCiAgICBjbGFzcyBGb3JtIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHsKICAgIAljb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAJCXN1cGVyKG9wdGlvbnMpOwogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJDQsIGNyZWF0ZV9mcmFnbWVudCQ0LCBzYWZlX25vdF9lcXVhbCwgeyBjbGFzczogMiwgaW5saW5lOiAzIH0pOwoKICAgIAkJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckNvbXBvbmVudCIsIHsKICAgIAkJCWNvbXBvbmVudDogdGhpcywKICAgIAkJCXRhZ05hbWU6ICJGb3JtIiwKICAgIAkJCW9wdGlvbnMsCiAgICAJCQlpZDogY3JlYXRlX2ZyYWdtZW50JDQubmFtZQogICAgCQl9KTsKICAgIAl9CgogICAgCWdldCBjbGFzcygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Rm9ybT46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjbGFzcyh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxGb3JtPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGlubGluZSgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Rm9ybT46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBpbmxpbmUodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Rm9ybT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CiAgICB9CgogICAgLyogbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Gb3JtR3JvdXAuc3ZlbHRlIGdlbmVyYXRlZCBieSBTdmVsdGUgdjMuMzEuMiAqLwogICAgY29uc3QgZmlsZSQ1ID0gIm5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvRm9ybUdyb3VwLnN2ZWx0ZSI7CgogICAgLy8gKDI1OjApIHs6ZWxzZX0KICAgIGZ1bmN0aW9uIGNyZWF0ZV9lbHNlX2Jsb2NrJDEoY3R4KSB7CiAgICAJbGV0IGRpdjsKICAgIAlsZXQgY3VycmVudDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUgPSAvKiNzbG90cyovIGN0eFs5XS5kZWZhdWx0OwogICAgCWNvbnN0IGRlZmF1bHRfc2xvdCA9IGNyZWF0ZV9zbG90KGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbOF0sIG51bGwpOwogICAgCWxldCBkaXZfbGV2ZWxzID0gWy8qJCRyZXN0UHJvcHMqLyBjdHhbMl0sIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFsxXSB9XTsKICAgIAlsZXQgZGl2X2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBkaXZfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWRpdl9kYXRhID0gYXNzaWduKGRpdl9kYXRhLCBkaXZfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlkaXYgPSBlbGVtZW50KCJkaXYiKTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5jKCk7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhkaXYsIGRpdl9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbihkaXYsIGZpbGUkNSwgMjUsIDIsIDU3NCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgZGl2LCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubShkaXYsIG51bGwpOwogICAgCQkJfQoKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDI1NikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbOF0sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZGl2LCBkaXZfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGRpdl9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyA0ICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMl0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gMikgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzFdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoZGl2KTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5kKGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2Vsc2VfYmxvY2skMS5uYW1lLAogICAgCQl0eXBlOiAiZWxzZSIsCiAgICAJCXNvdXJjZTogIigyNTowKSB7OmVsc2V9IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoMjE6MCkgeyNpZiB0YWcgPT09ICdmaWVsZHNldCd9CiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2skMShjdHgpIHsKICAgIAlsZXQgZmllbGRzZXQ7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbOV0uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzhdLCBudWxsKTsKICAgIAlsZXQgZmllbGRzZXRfbGV2ZWxzID0gWy8qJCRyZXN0UHJvcHMqLyBjdHhbMl0sIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFsxXSB9XTsKICAgIAlsZXQgZmllbGRzZXRfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkc2V0X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlmaWVsZHNldF9kYXRhID0gYXNzaWduKGZpZWxkc2V0X2RhdGEsIGZpZWxkc2V0X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJZmllbGRzZXQgPSBlbGVtZW50KCJmaWVsZHNldCIpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmMoKTsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGZpZWxkc2V0LCBmaWVsZHNldF9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbihmaWVsZHNldCwgZmlsZSQ1LCAyMSwgMiwgNDkzKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBmaWVsZHNldCwgYW5jaG9yKTsKCiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJZGVmYXVsdF9zbG90Lm0oZmllbGRzZXQsIG51bGwpOwogICAgCQkJfQoKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDI1NikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbOF0sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZmllbGRzZXQsIGZpZWxkc2V0X2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShmaWVsZHNldF9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyA0ICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMl0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gMikgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzFdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoZmllbGRzZXQpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2skMS5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoMjE6MCkgeyNpZiB0YWcgPT09ICdmaWVsZHNldCd9IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkNShjdHgpIHsKICAgIAlsZXQgY3VycmVudF9ibG9ja190eXBlX2luZGV4OwogICAgCWxldCBpZl9ibG9jazsKICAgIAlsZXQgaWZfYmxvY2tfYW5jaG9yOwogICAgCWxldCBjdXJyZW50OwogICAgCWNvbnN0IGlmX2Jsb2NrX2NyZWF0b3JzID0gW2NyZWF0ZV9pZl9ibG9jayQxLCBjcmVhdGVfZWxzZV9ibG9jayQxXTsKICAgIAljb25zdCBpZl9ibG9ja3MgPSBbXTsKCiAgICAJZnVuY3Rpb24gc2VsZWN0X2Jsb2NrX3R5cGUoY3R4LCBkaXJ0eSkgewogICAgCQlpZiAoLyp0YWcqLyBjdHhbMF0gPT09ICJmaWVsZHNldCIpIHJldHVybiAwOwogICAgCQlyZXR1cm4gMTsKICAgIAl9CgogICAgCWN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleCA9IHNlbGVjdF9ibG9ja190eXBlKGN0eCk7CiAgICAJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlmX2Jsb2NrLmMoKTsKICAgIAkJCWlmX2Jsb2NrX2FuY2hvciA9IGVtcHR5KCk7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdLm0odGFyZ2V0LCBhbmNob3IpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGlmX2Jsb2NrX2FuY2hvciwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBbZGlydHldKSB7CiAgICAJCQlsZXQgcHJldmlvdXNfYmxvY2tfaW5kZXggPSBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7CiAgICAJCQljdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZShjdHgpOwoKICAgIAkJCWlmIChjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPT09IHByZXZpb3VzX2Jsb2NrX2luZGV4KSB7CiAgICAJCQkJaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0ucChjdHgsIGRpcnR5KTsKICAgIAkJCX0gZWxzZSB7CiAgICAJCQkJZ3JvdXBfb3V0cm9zKCk7CgogICAgCQkJCXRyYW5zaXRpb25fb3V0KGlmX2Jsb2Nrc1twcmV2aW91c19ibG9ja19pbmRleF0sIDEsIDEsICgpID0+IHsKICAgIAkJCQkJaWZfYmxvY2tzW3ByZXZpb3VzX2Jsb2NrX2luZGV4XSA9IG51bGw7CiAgICAJCQkJfSk7CgogICAgCQkJCWNoZWNrX291dHJvcygpOwogICAgCQkJCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF07CgogICAgCQkJCWlmICghaWZfYmxvY2spIHsKICAgIAkJCQkJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTsKICAgIAkJCQkJaWZfYmxvY2suYygpOwogICAgCQkJCX0gZWxzZSB7CiAgICAJCQkJCWlmX2Jsb2NrLnAoY3R4LCBkaXJ0eSk7CiAgICAJCQkJfQoKICAgIAkJCQl0cmFuc2l0aW9uX2luKGlmX2Jsb2NrLCAxKTsKICAgIAkJCQlpZl9ibG9jay5tKGlmX2Jsb2NrX2FuY2hvci5wYXJlbnROb2RlLCBpZl9ibG9ja19hbmNob3IpOwogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oaWZfYmxvY2spOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChpZl9ibG9jayk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5kKGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlmX2Jsb2NrX2FuY2hvcik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2ZyYWdtZW50JDUubmFtZSwKICAgIAkJdHlwZTogImNvbXBvbmVudCIsCiAgICAJCXNvdXJjZTogIiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2UkNSgkJHNlbGYsICQkcHJvcHMsICQkaW52YWxpZGF0ZSkgewogICAgCWxldCBjbGFzc2VzOwogICAgCWNvbnN0IG9taXRfcHJvcHNfbmFtZXMgPSBbImNsYXNzIiwicm93IiwiY2hlY2siLCJpbmxpbmUiLCJkaXNhYmxlZCIsInRhZyJdOwogICAgCWxldCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKTsKICAgIAlsZXQgeyAkJHNsb3RzOiBzbG90cyA9IHt9LCAkJHNjb3BlIH0gPSAkJHByb3BzOwogICAgCXZhbGlkYXRlX3Nsb3RzKCJGb3JtR3JvdXAiLCBzbG90cywgWydkZWZhdWx0J10pOwogICAgCWxldCB7IGNsYXNzOiBjbGFzc05hbWUgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyByb3cgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBjaGVjayA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGlubGluZSA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGRpc2FibGVkID0gZmFsc2UgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgdGFnID0gbnVsbCB9ID0gJCRwcm9wczsKCiAgICAJJCRzZWxmLiQkc2V0ID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQkkJHByb3BzID0gYXNzaWduKGFzc2lnbih7fSwgJCRwcm9wcyksIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMoJCRuZXdfcHJvcHMpKTsKICAgIAkJJCRpbnZhbGlkYXRlKDIsICQkcmVzdFByb3BzID0gY29tcHV0ZV9yZXN0X3Byb3BzKCQkcHJvcHMsIG9taXRfcHJvcHNfbmFtZXMpKTsKICAgIAkJaWYgKCJjbGFzcyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgzLCBjbGFzc05hbWUgPSAkJG5ld19wcm9wcy5jbGFzcyk7CiAgICAJCWlmICgicm93IiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDQsIHJvdyA9ICQkbmV3X3Byb3BzLnJvdyk7CiAgICAJCWlmICgiY2hlY2siIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNSwgY2hlY2sgPSAkJG5ld19wcm9wcy5jaGVjayk7CiAgICAJCWlmICgiaW5saW5lIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDYsIGlubGluZSA9ICQkbmV3X3Byb3BzLmlubGluZSk7CiAgICAJCWlmICgiZGlzYWJsZWQiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNywgZGlzYWJsZWQgPSAkJG5ld19wcm9wcy5kaXNhYmxlZCk7CiAgICAJCWlmICgidGFnIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDAsIHRhZyA9ICQkbmV3X3Byb3BzLnRhZyk7CiAgICAJCWlmICgiJCRzY29wZSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg4LCAkJHNjb3BlID0gJCRuZXdfcHJvcHMuJCRzY29wZSk7CiAgICAJfTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsKICAgIAkJY2xhc3NuYW1lcywKICAgIAkJY2xhc3NOYW1lLAogICAgCQlyb3csCiAgICAJCWNoZWNrLAogICAgCQlpbmxpbmUsCiAgICAJCWRpc2FibGVkLAogICAgCQl0YWcsCiAgICAJCWNsYXNzZXMKICAgIAl9KTsKCiAgICAJJCRzZWxmLiRpbmplY3Rfc3RhdGUgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCWlmICgiY2xhc3NOYW1lIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMywgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3NOYW1lKTsKICAgIAkJaWYgKCJyb3ciIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg0LCByb3cgPSAkJG5ld19wcm9wcy5yb3cpOwogICAgCQlpZiAoImNoZWNrIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNSwgY2hlY2sgPSAkJG5ld19wcm9wcy5jaGVjayk7CiAgICAJCWlmICgiaW5saW5lIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNiwgaW5saW5lID0gJCRuZXdfcHJvcHMuaW5saW5lKTsKICAgIAkJaWYgKCJkaXNhYmxlZCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDcsIGRpc2FibGVkID0gJCRuZXdfcHJvcHMuZGlzYWJsZWQpOwogICAgCQlpZiAoInRhZyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIHRhZyA9ICQkbmV3X3Byb3BzLnRhZyk7CiAgICAJCWlmICgiY2xhc3NlcyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEsIGNsYXNzZXMgPSAkJG5ld19wcm9wcy5jbGFzc2VzKTsKICAgIAl9OwoKICAgIAlpZiAoJCRwcm9wcyAmJiAiJCRpbmplY3QiIGluICQkcHJvcHMpIHsKICAgIAkJJCRzZWxmLiRpbmplY3Rfc3RhdGUoJCRwcm9wcy4kJGluamVjdCk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCQudXBkYXRlID0gKCkgPT4gewogICAgCQlpZiAoJCRzZWxmLiQkLmRpcnR5ICYgLypjbGFzc05hbWUsIHJvdywgY2hlY2ssIGlubGluZSwgZGlzYWJsZWQqLyAyNDgpIHsKICAgIAkJCSAkJGludmFsaWRhdGUoMSwgY2xhc3NlcyA9IGNsYXNzbmFtZXMoY2xhc3NOYW1lLCByb3cgPyAicm93IiA6IGZhbHNlLCBjaGVjayA/ICJmb3JtLWNoZWNrIiA6ICJmb3JtLWdyb3VwIiwgY2hlY2sgJiYgaW5saW5lID8gImZvcm0tY2hlY2staW5saW5lIiA6IGZhbHNlLCBjaGVjayAmJiBkaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiBmYWxzZSkpOwogICAgCQl9CiAgICAJfTsKCiAgICAJcmV0dXJuIFsKICAgIAkJdGFnLAogICAgCQljbGFzc2VzLAogICAgCQkkJHJlc3RQcm9wcywKICAgIAkJY2xhc3NOYW1lLAogICAgCQlyb3csCiAgICAJCWNoZWNrLAogICAgCQlpbmxpbmUsCiAgICAJCWRpc2FibGVkLAogICAgCQkkJHNjb3BlLAogICAgCQlzbG90cwogICAgCV07CiAgICB9CgogICAgY2xhc3MgRm9ybUdyb3VwIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHsKICAgIAljb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAJCXN1cGVyKG9wdGlvbnMpOwoKICAgIAkJaW5pdCh0aGlzLCBvcHRpb25zLCBpbnN0YW5jZSQ1LCBjcmVhdGVfZnJhZ21lbnQkNSwgc2FmZV9ub3RfZXF1YWwsIHsKICAgIAkJCWNsYXNzOiAzLAogICAgCQkJcm93OiA0LAogICAgCQkJY2hlY2s6IDUsCiAgICAJCQlpbmxpbmU6IDYsCiAgICAJCQlkaXNhYmxlZDogNywKICAgIAkJCXRhZzogMAogICAgCQl9KTsKCiAgICAJCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJDb21wb25lbnQiLCB7CiAgICAJCQljb21wb25lbnQ6IHRoaXMsCiAgICAJCQl0YWdOYW1lOiAiRm9ybUdyb3VwIiwKICAgIAkJCW9wdGlvbnMsCiAgICAJCQlpZDogY3JlYXRlX2ZyYWdtZW50JDUubmFtZQogICAgCQl9KTsKICAgIAl9CgogICAgCWdldCBjbGFzcygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Rm9ybUdyb3VwPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGNsYXNzKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEZvcm1Hcm91cD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCByb3coKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEZvcm1Hcm91cD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCByb3codmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Rm9ybUdyb3VwPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGNoZWNrKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxGb3JtR3JvdXA+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgY2hlY2sodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Rm9ybUdyb3VwPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGlubGluZSgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Rm9ybUdyb3VwPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGlubGluZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxGb3JtR3JvdXA+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgZGlzYWJsZWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEZvcm1Hcm91cD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBkaXNhYmxlZCh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxGb3JtR3JvdXA+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgdGFnKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxGb3JtR3JvdXA+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgdGFnKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPEZvcm1Hcm91cD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CiAgICB9CgogICAgLyogbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9JbnB1dC5zdmVsdGUgZ2VuZXJhdGVkIGJ5IFN2ZWx0ZSB2My4zMS4yICovCiAgICBjb25zdCBmaWxlJDYgPSAibm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9JbnB1dC5zdmVsdGUiOwoKICAgIC8vICgzNTY6NDApIAogICAgZnVuY3Rpb24gY3JlYXRlX2lmX2Jsb2NrXzE2KGN0eCkgewogICAgCWxldCBzZWxlY3Q7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJbGV0IG1vdW50ZWQ7CiAgICAJbGV0IGRpc3Bvc2U7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbMjJdLmRlZmF1bHQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90ID0gY3JlYXRlX3Nsb3QoZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFsyMV0sIG51bGwpOwoKICAgIAlsZXQgc2VsZWN0X2xldmVscyA9IFsKICAgIAkJLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCXsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQl7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQl7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCXsgcmVhZG9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfQogICAgCV07CgogICAgCWxldCBzZWxlY3RfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdF9sZXZlbHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJc2VsZWN0X2RhdGEgPSBhc3NpZ24oc2VsZWN0X2RhdGEsIHNlbGVjdF9sZXZlbHNbaV0pOwogICAgCX0KCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCXNlbGVjdCA9IGVsZW1lbnQoInNlbGVjdCIpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmMoKTsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKHNlbGVjdCwgc2VsZWN0X2RhdGEpOwogICAgCQkJaWYgKC8qdmFsdWUqLyBjdHhbMV0gPT09IHZvaWQgMCkgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiAvKnNlbGVjdF9jaGFuZ2VfaGFuZGxlciovIGN0eFsxNTJdLmNhbGwoc2VsZWN0KSk7CiAgICAJCQlhZGRfbG9jYXRpb24oc2VsZWN0LCBmaWxlJDYsIDM1NiwgMiwgNzA5Nyk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgc2VsZWN0LCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubShzZWxlY3QsIG51bGwpOwogICAgCQkJfQoKICAgIAkJCWlmIChzZWxlY3RfZGF0YS5tdWx0aXBsZSkgc2VsZWN0X29wdGlvbnMoc2VsZWN0LCBzZWxlY3RfZGF0YS52YWx1ZSk7CiAgICAJCQlzZWxlY3Rfb3B0aW9uKHNlbGVjdCwgLyp2YWx1ZSovIGN0eFsxXSk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gWwogICAgCQkJCQlsaXN0ZW5fZGV2KHNlbGVjdCwgImJsdXIiLCAvKmJsdXJfaGFuZGxlcl8xNiovIGN0eFsxMzNdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihzZWxlY3QsICJmb2N1cyIsIC8qZm9jdXNfaGFuZGxlcl8xNiovIGN0eFsxMzRdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihzZWxlY3QsICJjaGFuZ2UiLCAvKmNoYW5nZV9oYW5kbGVyXzE1Ki8gY3R4WzEzNV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KHNlbGVjdCwgImlucHV0IiwgLyppbnB1dF9oYW5kbGVyXzE1Ki8gY3R4WzEzNl0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KHNlbGVjdCwgImNoYW5nZSIsIC8qc2VsZWN0X2NoYW5nZV9oYW5kbGVyKi8gY3R4WzE1Ml0pCiAgICAJCQkJXTsKCiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJaWYgKGRlZmF1bHRfc2xvdC5wICYmIGRpcnR5WzBdICYgLyokJHNjb3BlKi8gMjA5NzE1MikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbMjFdLCBkaXJ0eSwgbnVsbCwgbnVsbCk7CiAgICAJCQkJfQogICAgCQkJfQoKICAgIAkJCXNldF9hdHRyaWJ1dGVzKHNlbGVjdCwgc2VsZWN0X2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShzZWxlY3RfbGV2ZWxzLCBbCiAgICAJCQkJZGlydHlbMF0gJiAvKiQkcmVzdFByb3BzKi8gNDA5NiAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHlbMF0gJiAvKmNsYXNzZXMqLyA1MTIpICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eVswXSAmIC8qbmFtZSovIDY0KSAmJiB7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eVswXSAmIC8qZGlzYWJsZWQqLyAyNTYpICYmIHsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbOF0gfSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHlbMF0gJiAvKnJlYWRvbmx5Ki8gMTYpICYmIHsgcmVhZG9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfQogICAgCQkJXSkpOwoKICAgIAkJCWlmIChkaXJ0eVswXSAmIC8qJCRyZXN0UHJvcHMsIGNsYXNzZXMsIG5hbWUsIGRpc2FibGVkLCByZWFkb25seSovIDQ5NDQgJiYgc2VsZWN0X2RhdGEubXVsdGlwbGUpIHNlbGVjdF9vcHRpb25zKHNlbGVjdCwgc2VsZWN0X2RhdGEudmFsdWUpOwoKICAgIAkJCWlmIChkaXJ0eVswXSAmIC8qdmFsdWUqLyAyKSB7CiAgICAJCQkJc2VsZWN0X29wdGlvbihzZWxlY3QsIC8qdmFsdWUqLyBjdHhbMV0pOwogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihzZWxlY3QpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJCW1vdW50ZWQgPSBmYWxzZTsKICAgIAkJCXJ1bl9hbGwoZGlzcG9zZSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzE2Lm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIigzNTY6NDApICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDM0MDoyOSkgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMTUoY3R4KSB7CiAgICAJbGV0IHRleHRhcmVhOwogICAgCWxldCBtb3VudGVkOwogICAgCWxldCBkaXNwb3NlOwoKICAgIAlsZXQgdGV4dGFyZWFfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCXsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfSwKICAgIAkJeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQl7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0KICAgIAldOwoKICAgIAlsZXQgdGV4dGFyZWFfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IHRleHRhcmVhX2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQl0ZXh0YXJlYV9kYXRhID0gYXNzaWduKHRleHRhcmVhX2RhdGEsIHRleHRhcmVhX2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJdGV4dGFyZWEgPSBlbGVtZW50KCJ0ZXh0YXJlYSIpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXModGV4dGFyZWEsIHRleHRhcmVhX2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKHRleHRhcmVhLCBmaWxlJDYsIDM0MCwgMiwgNjgzMCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdGV4dGFyZWEsIGFuY2hvcik7CiAgICAJCQlzZXRfaW5wdXRfdmFsdWUodGV4dGFyZWEsIC8qdmFsdWUqLyBjdHhbMV0pOwoKICAgIAkJCWlmICghbW91bnRlZCkgewogICAgCQkJCWRpc3Bvc2UgPSBbCiAgICAJCQkJCWxpc3Rlbl9kZXYodGV4dGFyZWEsICJibHVyIiwgLypibHVyX2hhbmRsZXJfMTUqLyBjdHhbMTI3XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYodGV4dGFyZWEsICJmb2N1cyIsIC8qZm9jdXNfaGFuZGxlcl8xNSovIGN0eFsxMjhdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2Rldih0ZXh0YXJlYSwgImtleWRvd24iLCAvKmtleWRvd25faGFuZGxlcl8xNSovIGN0eFsxMjldLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2Rldih0ZXh0YXJlYSwgImtleXByZXNzIiwgLyprZXlwcmVzc19oYW5kbGVyXzE1Ki8gY3R4WzEzMF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KHRleHRhcmVhLCAia2V5dXAiLCAvKmtleXVwX2hhbmRsZXJfMTUqLyBjdHhbMTMxXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYodGV4dGFyZWEsICJjaGFuZ2UiLCAvKmNoYW5nZV9oYW5kbGVyXzE0Ki8gY3R4WzEyNl0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KHRleHRhcmVhLCAiaW5wdXQiLCAvKmlucHV0X2hhbmRsZXJfMTQqLyBjdHhbMTMyXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYodGV4dGFyZWEsICJpbnB1dCIsIC8qdGV4dGFyZWFfaW5wdXRfaGFuZGxlciovIGN0eFsxNTFdKQogICAgCQkJCV07CgogICAgCQkJCW1vdW50ZWQgPSB0cnVlOwogICAgCQkJfQogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJc2V0X2F0dHJpYnV0ZXModGV4dGFyZWEsIHRleHRhcmVhX2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZSh0ZXh0YXJlYV9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eVswXSAmIC8qJCRyZXN0UHJvcHMqLyA0MDk2ICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMTJdLAogICAgCQkJCWRpcnR5WzBdICYgLypjbGFzc2VzKi8gNTEyICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypwbGFjZWhvbGRlciovIDEyOCAmJiB7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKm5hbWUqLyA2NCAmJiB7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypkaXNhYmxlZCovIDI1NiAmJiB7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnJlYWRvbmx5Ki8gMTYgJiYgeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9CiAgICAJCQldKSk7CgogICAgCQkJaWYgKGRpcnR5WzBdICYgLyp2YWx1ZSovIDIpIHsKICAgIAkJCQlzZXRfaW5wdXRfdmFsdWUodGV4dGFyZWEsIC8qdmFsdWUqLyBjdHhbMV0pOwogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBub29wLAogICAgCQlvOiBub29wLAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0ZXh0YXJlYSk7CiAgICAJCQltb3VudGVkID0gZmFsc2U7CiAgICAJCQlydW5fYWxsKGRpc3Bvc2UpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9ja18xNS5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoMzQwOjI5KSAiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg4MjowKSB7I2lmIHRhZyA9PT0gJ2lucHV0J30KICAgIGZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9jayQyKGN0eCkgewogICAgCWxldCBpZl9ibG9ja19hbmNob3I7CgogICAgCWZ1bmN0aW9uIHNlbGVjdF9ibG9ja190eXBlXzEoY3R4LCBkaXJ0eSkgewogICAgCQlpZiAoLyp0eXBlKi8gY3R4WzNdID09PSAidGV4dCIpIHJldHVybiBjcmVhdGVfaWZfYmxvY2tfMSQxOwogICAgCQlpZiAoLyp0eXBlKi8gY3R4WzNdID09PSAicGFzc3dvcmQiKSByZXR1cm4gY3JlYXRlX2lmX2Jsb2NrXzIkMTsKICAgIAkJaWYgKC8qdHlwZSovIGN0eFszXSA9PT0gImVtYWlsIikgcmV0dXJuIGNyZWF0ZV9pZl9ibG9ja18zJDE7CiAgICAJCWlmICgvKnR5cGUqLyBjdHhbM10gPT09ICJmaWxlIikgcmV0dXJuIGNyZWF0ZV9pZl9ibG9ja180OwogICAgCQlpZiAoLyp0eXBlKi8gY3R4WzNdID09PSAiY2hlY2tib3giKSByZXR1cm4gY3JlYXRlX2lmX2Jsb2NrXzU7CiAgICAJCWlmICgvKnR5cGUqLyBjdHhbM10gPT09ICJyYWRpbyIpIHJldHVybiBjcmVhdGVfaWZfYmxvY2tfNjsKICAgIAkJaWYgKC8qdHlwZSovIGN0eFszXSA9PT0gInVybCIpIHJldHVybiBjcmVhdGVfaWZfYmxvY2tfNzsKICAgIAkJaWYgKC8qdHlwZSovIGN0eFszXSA9PT0gIm51bWJlciIpIHJldHVybiBjcmVhdGVfaWZfYmxvY2tfODsKICAgIAkJaWYgKC8qdHlwZSovIGN0eFszXSA9PT0gImRhdGUiKSByZXR1cm4gY3JlYXRlX2lmX2Jsb2NrXzk7CiAgICAJCWlmICgvKnR5cGUqLyBjdHhbM10gPT09ICJ0aW1lIikgcmV0dXJuIGNyZWF0ZV9pZl9ibG9ja18xMDsKICAgIAkJaWYgKC8qdHlwZSovIGN0eFszXSA9PT0gImRhdGV0aW1lIikgcmV0dXJuIGNyZWF0ZV9pZl9ibG9ja18xMTsKICAgIAkJaWYgKC8qdHlwZSovIGN0eFszXSA9PT0gImNvbG9yIikgcmV0dXJuIGNyZWF0ZV9pZl9ibG9ja18xMjsKICAgIAkJaWYgKC8qdHlwZSovIGN0eFszXSA9PT0gInJhbmdlIikgcmV0dXJuIGNyZWF0ZV9pZl9ibG9ja18xMzsKICAgIAkJaWYgKC8qdHlwZSovIGN0eFszXSA9PT0gInNlYXJjaCIpIHJldHVybiBjcmVhdGVfaWZfYmxvY2tfMTQ7CiAgICAJCXJldHVybiBjcmVhdGVfZWxzZV9ibG9jayQyOwogICAgCX0KCiAgICAJbGV0IGN1cnJlbnRfYmxvY2tfdHlwZSA9IHNlbGVjdF9ibG9ja190eXBlXzEoY3R4KTsKICAgIAlsZXQgaWZfYmxvY2sgPSBjdXJyZW50X2Jsb2NrX3R5cGUoY3R4KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlmX2Jsb2NrLmMoKTsKICAgIAkJCWlmX2Jsb2NrX2FuY2hvciA9IGVtcHR5KCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpZl9ibG9jay5tKHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpZl9ibG9ja19hbmNob3IsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoY3VycmVudF9ibG9ja190eXBlID09PSAoY3VycmVudF9ibG9ja190eXBlID0gc2VsZWN0X2Jsb2NrX3R5cGVfMShjdHgpKSAmJiBpZl9ibG9jaykgewogICAgCQkJCWlmX2Jsb2NrLnAoY3R4LCBkaXJ0eSk7CiAgICAJCQl9IGVsc2UgewogICAgCQkJCWlmX2Jsb2NrLmQoMSk7CiAgICAJCQkJaWZfYmxvY2sgPSBjdXJyZW50X2Jsb2NrX3R5cGUoY3R4KTsKCiAgICAJCQkJaWYgKGlmX2Jsb2NrKSB7CiAgICAJCQkJCWlmX2Jsb2NrLmMoKTsKICAgIAkJCQkJaWZfYmxvY2subShpZl9ibG9ja19hbmNob3IucGFyZW50Tm9kZSwgaWZfYmxvY2tfYW5jaG9yKTsKICAgIAkJCQl9CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWk6IG5vb3AsCiAgICAJCW86IG5vb3AsCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZl9ibG9jay5kKGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlmX2Jsb2NrX2FuY2hvcik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrJDIubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDgyOjApIHsjaWYgdGFnID09PSAnaW5wdXQnfSIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDMyMjoyKSB7OmVsc2V9CiAgICBmdW5jdGlvbiBjcmVhdGVfZWxzZV9ibG9jayQyKGN0eCkgewogICAgCWxldCBpbnB1dDsKICAgIAlsZXQgbW91bnRlZDsKICAgIAlsZXQgZGlzcG9zZTsKCiAgICAJbGV0IGlucHV0X2xldmVscyA9IFsKICAgIAkJLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCXsgdHlwZTogLyp0eXBlKi8gY3R4WzNdIH0sCiAgICAJCXsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCXsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCXsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbOF0gfSwKICAgIAkJeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9LAogICAgCQl7IHZhbHVlOiAvKnZhbHVlKi8gY3R4WzFdIH0KICAgIAldOwoKICAgIAlsZXQgaW5wdXRfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlpbnB1dF9kYXRhID0gYXNzaWduKGlucHV0X2RhdGEsIGlucHV0X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaW5wdXQgPSBlbGVtZW50KCJpbnB1dCIpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGlucHV0LCBmaWxlJDYsIDMyMiwgNCwgNjUwMyk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgaW5wdXQsIGFuY2hvcik7CiAgICAJCQlpbnB1dC52YWx1ZSA9IGlucHV0X2RhdGEudmFsdWU7CgogICAgCQkJaWYgKCFtb3VudGVkKSB7CiAgICAJCQkJZGlzcG9zZSA9IFsKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImJsdXIiLCAvKmJsdXJfaGFuZGxlcl8xNCovIGN0eFsxMjFdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImZvY3VzIiwgLypmb2N1c19oYW5kbGVyXzE0Ki8gY3R4WzEyMl0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5ZG93biIsIC8qa2V5ZG93bl9oYW5kbGVyXzE0Ki8gY3R4WzEyM10sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5cHJlc3MiLCAvKmtleXByZXNzX2hhbmRsZXJfMTQqLyBjdHhbMTI0XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXl1cCIsIC8qa2V5dXBfaGFuZGxlcl8xNCovIGN0eFsxMjVdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImlucHV0IiwgLypoYW5kbGVJbnB1dCovIGN0eFsxMV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiY2hhbmdlIiwgLypoYW5kbGVJbnB1dCovIGN0eFsxMV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpCiAgICAJCQkJXTsKCiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGlucHV0X2xldmVscywgWwogICAgCQkJCWRpcnR5WzBdICYgLyokJHJlc3RQcm9wcyovIDQwOTYgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnR5cGUqLyA4ICYmIHsgdHlwZTogLyp0eXBlKi8gY3R4WzNdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnJlYWRvbmx5Ki8gMTYgJiYgeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypjbGFzc2VzKi8gNTEyICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypuYW1lKi8gNjQgJiYgeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qZGlzYWJsZWQqLyAyNTYgJiYgeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypwbGFjZWhvbGRlciovIDEyOCAmJiB7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnZhbHVlKi8gMiAmJiBpbnB1dC52YWx1ZSAhPT0gLyp2YWx1ZSovIGN0eFsxXSAmJiB7IHZhbHVlOiAvKnZhbHVlKi8gY3R4WzFdIH0KICAgIAkJCV0pKTsKCiAgICAJCQlpZiAoInZhbHVlIiBpbiBpbnB1dF9kYXRhKSB7CiAgICAJCQkJaW5wdXQudmFsdWUgPSBpbnB1dF9kYXRhLnZhbHVlOwogICAgCQkJfQogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihpbnB1dCk7CiAgICAJCQltb3VudGVkID0gZmFsc2U7CiAgICAJCQlydW5fYWxsKGRpc3Bvc2UpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9lbHNlX2Jsb2NrJDIubmFtZSwKICAgIAkJdHlwZTogImVsc2UiLAogICAgCQlzb3VyY2U6ICIoMzIyOjIpIHs6ZWxzZX0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgzMDU6MzApIAogICAgZnVuY3Rpb24gY3JlYXRlX2lmX2Jsb2NrXzE0KGN0eCkgewogICAgCWxldCBpbnB1dDsKICAgIAlsZXQgbW91bnRlZDsKICAgIAlsZXQgZGlzcG9zZTsKCiAgICAJbGV0IGlucHV0X2xldmVscyA9IFsKICAgIAkJLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCXsgdHlwZTogInNlYXJjaCIgfSwKICAgIAkJeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQl7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCXsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQl7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQl7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAldOwoKICAgIAlsZXQgaW5wdXRfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlpbnB1dF9kYXRhID0gYXNzaWduKGlucHV0X2RhdGEsIGlucHV0X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaW5wdXQgPSBlbGVtZW50KCJpbnB1dCIpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGlucHV0LCBmaWxlJDYsIDMwNSwgNCwgNjIyMCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgaW5wdXQsIGFuY2hvcik7CiAgICAJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIC8qdmFsdWUqLyBjdHhbMV0pOwoKICAgIAkJCWlmICghbW91bnRlZCkgewogICAgCQkJCWRpc3Bvc2UgPSBbCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJibHVyIiwgLypibHVyX2hhbmRsZXJfMTMqLyBjdHhbMTE1XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJmb2N1cyIsIC8qZm9jdXNfaGFuZGxlcl8xMyovIGN0eFsxMTZdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleWRvd24iLCAvKmtleWRvd25faGFuZGxlcl8xMyovIGN0eFsxMTddLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleXByZXNzIiwgLyprZXlwcmVzc19oYW5kbGVyXzEzKi8gY3R4WzExOF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5dXAiLCAvKmtleXVwX2hhbmRsZXJfMTMqLyBjdHhbMTE5XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJjaGFuZ2UiLCAvKmNoYW5nZV9oYW5kbGVyXzEzKi8gY3R4WzExNF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiaW5wdXQiLCAvKmlucHV0X2hhbmRsZXJfMTMqLyBjdHhbMTIwXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaW5wdXRfaGFuZGxlcl85Ki8gY3R4WzE1MF0pCiAgICAJCQkJXTsKCiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGlucHV0X2xldmVscywgWwogICAgCQkJCWRpcnR5WzBdICYgLyokJHJlc3RQcm9wcyovIDQwOTYgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCQkJeyB0eXBlOiAic2VhcmNoIiB9LAogICAgCQkJCWRpcnR5WzBdICYgLypkaXNhYmxlZCovIDI1NiAmJiB7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnJlYWRvbmx5Ki8gMTYgJiYgeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypjbGFzc2VzKi8gNTEyICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypuYW1lKi8gNjQgJiYgeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcGxhY2Vob2xkZXIqLyAxMjggJiYgeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9CiAgICAJCQldKSk7CgogICAgCQkJaWYgKGRpcnR5WzBdICYgLyp2YWx1ZSovIDIpIHsKICAgIAkJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIC8qdmFsdWUqLyBjdHhbMV0pOwogICAgCQkJfQogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihpbnB1dCk7CiAgICAJCQltb3VudGVkID0gZmFsc2U7CiAgICAJCQlydW5fYWxsKGRpc3Bvc2UpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9ja18xNC5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoMzA1OjMwKSAiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgyODg6MjkpIAogICAgZnVuY3Rpb24gY3JlYXRlX2lmX2Jsb2NrXzEzKGN0eCkgewogICAgCWxldCBpbnB1dDsKICAgIAlsZXQgbW91bnRlZDsKICAgIAlsZXQgZGlzcG9zZTsKCiAgICAJbGV0IGlucHV0X2xldmVscyA9IFsKICAgIAkJLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCXsgdHlwZTogInJhbmdlIiB9LAogICAgCQl7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCXsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCXsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCXsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfQogICAgCV07CgogICAgCWxldCBpbnB1dF9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWlucHV0X2RhdGEgPSBhc3NpZ24oaW5wdXRfZGF0YSwgaW5wdXRfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlpbnB1dCA9IGVsZW1lbnQoImlucHV0Iik7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oaW5wdXQsIGZpbGUkNiwgMjg4LCA0LCA1OTE3KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpbnB1dCwgYW5jaG9yKTsKICAgIAkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CgogICAgCQkJaWYgKCFtb3VudGVkKSB7CiAgICAJCQkJZGlzcG9zZSA9IFsKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImJsdXIiLCAvKmJsdXJfaGFuZGxlcl8xMiovIGN0eFsxMDhdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImZvY3VzIiwgLypmb2N1c19oYW5kbGVyXzEyKi8gY3R4WzEwOV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5ZG93biIsIC8qa2V5ZG93bl9oYW5kbGVyXzEyKi8gY3R4WzExMF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5cHJlc3MiLCAvKmtleXByZXNzX2hhbmRsZXJfMTIqLyBjdHhbMTExXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXl1cCIsIC8qa2V5dXBfaGFuZGxlcl8xMiovIGN0eFsxMTJdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImNoYW5nZSIsIC8qY2hhbmdlX2hhbmRsZXJfMTIqLyBjdHhbMTA3XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaGFuZGxlcl8xMiovIGN0eFsxMTNdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImNoYW5nZSIsIC8qaW5wdXRfY2hhbmdlX2lucHV0X2hhbmRsZXIqLyBjdHhbMTQ5XSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfY2hhbmdlX2lucHV0X2hhbmRsZXIqLyBjdHhbMTQ5XSkKICAgIAkJCQldOwoKICAgIAkJCQltb3VudGVkID0gdHJ1ZTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGlucHV0LCBpbnB1dF9kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoaW5wdXRfbGV2ZWxzLCBbCiAgICAJCQkJZGlydHlbMF0gJiAvKiQkcmVzdFByb3BzKi8gNDA5NiAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJCQl7IHR5cGU6ICJyYW5nZSIgfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qZGlzYWJsZWQqLyAyNTYgJiYgeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypyZWFkb25seSovIDE2ICYmIHsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qY2xhc3NlcyovIDUxMiAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbOV0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qbmFtZSovIDY0ICYmIHsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnBsYWNlaG9sZGVyKi8gMTI4ICYmIHsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfQogICAgCQkJXSkpOwoKICAgIAkJCWlmIChkaXJ0eVswXSAmIC8qdmFsdWUqLyAyKSB7CiAgICAJCQkJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCAvKnZhbHVlKi8gY3R4WzFdKTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoaW5wdXQpOwogICAgCQkJbW91bnRlZCA9IGZhbHNlOwogICAgCQkJcnVuX2FsbChkaXNwb3NlKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2tfMTMubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDI4ODoyOSkgIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoMjcxOjI5KSAKICAgIGZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9ja18xMihjdHgpIHsKICAgIAlsZXQgaW5wdXQ7CiAgICAJbGV0IG1vdW50ZWQ7CiAgICAJbGV0IGRpc3Bvc2U7CgogICAgCWxldCBpbnB1dF9sZXZlbHMgPSBbCiAgICAJCS8qJCRyZXN0UHJvcHMqLyBjdHhbMTJdLAogICAgCQl7IHR5cGU6ICJjb2xvciIgfSwKICAgIAkJeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQl7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCXsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQl7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQl7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAldOwoKICAgIAlsZXQgaW5wdXRfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlpbnB1dF9kYXRhID0gYXNzaWduKGlucHV0X2RhdGEsIGlucHV0X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaW5wdXQgPSBlbGVtZW50KCJpbnB1dCIpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGlucHV0LCBmaWxlJDYsIDI3MSwgNCwgNTYxNSk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgaW5wdXQsIGFuY2hvcik7CiAgICAJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIC8qdmFsdWUqLyBjdHhbMV0pOwoKICAgIAkJCWlmICghbW91bnRlZCkgewogICAgCQkJCWRpc3Bvc2UgPSBbCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJibHVyIiwgLypibHVyX2hhbmRsZXJfMTEqLyBjdHhbMTAxXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJmb2N1cyIsIC8qZm9jdXNfaGFuZGxlcl8xMSovIGN0eFsxMDJdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleWRvd24iLCAvKmtleWRvd25faGFuZGxlcl8xMSovIGN0eFsxMDNdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleXByZXNzIiwgLyprZXlwcmVzc19oYW5kbGVyXzExKi8gY3R4WzEwNF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5dXAiLCAvKmtleXVwX2hhbmRsZXJfMTEqLyBjdHhbMTA1XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJjaGFuZ2UiLCAvKmNoYW5nZV9oYW5kbGVyXzExKi8gY3R4WzEwMF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiaW5wdXQiLCAvKmlucHV0X2hhbmRsZXJfMTEqLyBjdHhbMTA2XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaW5wdXRfaGFuZGxlcl84Ki8gY3R4WzE0OF0pCiAgICAJCQkJXTsKCiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGlucHV0X2xldmVscywgWwogICAgCQkJCWRpcnR5WzBdICYgLyokJHJlc3RQcm9wcyovIDQwOTYgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCQkJeyB0eXBlOiAiY29sb3IiIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKmRpc2FibGVkKi8gMjU2ICYmIHsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbOF0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcmVhZG9ubHkqLyAxNiAmJiB7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKmNsYXNzZXMqLyA1MTIgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKm5hbWUqLyA2NCAmJiB7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypwbGFjZWhvbGRlciovIDEyOCAmJiB7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAkJCV0pKTsKCiAgICAJCQlpZiAoZGlydHlbMF0gJiAvKnZhbHVlKi8gMikgewogICAgCQkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlucHV0KTsKICAgIAkJCW1vdW50ZWQgPSBmYWxzZTsKICAgIAkJCXJ1bl9hbGwoZGlzcG9zZSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzEyLm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIigyNzE6MjkpICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDI1NDozMikgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMTEoY3R4KSB7CiAgICAJbGV0IGlucHV0OwogICAgCWxldCBtb3VudGVkOwogICAgCWxldCBkaXNwb3NlOwoKICAgIAlsZXQgaW5wdXRfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJeyB0eXBlOiAiZGF0ZXRpbWUiIH0sCiAgICAJCXsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbOF0gfSwKICAgIAkJeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9LAogICAgCQl7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbOV0gfSwKICAgIAkJeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9CiAgICAJXTsKCiAgICAJbGV0IGlucHV0X2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dF9sZXZlbHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJaW5wdXRfZGF0YSA9IGFzc2lnbihpbnB1dF9kYXRhLCBpbnB1dF9sZXZlbHNbaV0pOwogICAgCX0KCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlucHV0ID0gZWxlbWVudCgiaW5wdXQiKTsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGlucHV0LCBpbnB1dF9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbihpbnB1dCwgZmlsZSQ2LCAyNTQsIDQsIDUzMTApOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGlucHV0LCBhbmNob3IpOwogICAgCQkJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCAvKnZhbHVlKi8gY3R4WzFdKTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gWwogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiYmx1ciIsIC8qYmx1cl9oYW5kbGVyXzEwKi8gY3R4Wzk0XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJmb2N1cyIsIC8qZm9jdXNfaGFuZGxlcl8xMCovIGN0eFs5NV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5ZG93biIsIC8qa2V5ZG93bl9oYW5kbGVyXzEwKi8gY3R4Wzk2XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXlwcmVzcyIsIC8qa2V5cHJlc3NfaGFuZGxlcl8xMCovIGN0eFs5N10sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5dXAiLCAvKmtleXVwX2hhbmRsZXJfMTAqLyBjdHhbOThdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImNoYW5nZSIsIC8qY2hhbmdlX2hhbmRsZXJfMTAqLyBjdHhbOTNdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImlucHV0IiwgLyppbnB1dF9oYW5kbGVyXzEwKi8gY3R4Wzk5XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaW5wdXRfaGFuZGxlcl83Ki8gY3R4WzE0N10pCiAgICAJCQkJXTsKCiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGlucHV0X2xldmVscywgWwogICAgCQkJCWRpcnR5WzBdICYgLyokJHJlc3RQcm9wcyovIDQwOTYgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCQkJeyB0eXBlOiAiZGF0ZXRpbWUiIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKmRpc2FibGVkKi8gMjU2ICYmIHsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbOF0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcmVhZG9ubHkqLyAxNiAmJiB7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKmNsYXNzZXMqLyA1MTIgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKm5hbWUqLyA2NCAmJiB7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypwbGFjZWhvbGRlciovIDEyOCAmJiB7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAkJCV0pKTsKCiAgICAJCQlpZiAoZGlydHlbMF0gJiAvKnZhbHVlKi8gMikgewogICAgCQkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlucHV0KTsKICAgIAkJCW1vdW50ZWQgPSBmYWxzZTsKICAgIAkJCXJ1bl9hbGwoZGlzcG9zZSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzExLm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIigyNTQ6MzIpICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDIzNzoyOCkgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMTAoY3R4KSB7CiAgICAJbGV0IGlucHV0OwogICAgCWxldCBtb3VudGVkOwogICAgCWxldCBkaXNwb3NlOwoKICAgIAlsZXQgaW5wdXRfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJeyB0eXBlOiAidGltZSIgfSwKICAgIAkJeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQl7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCXsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQl7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQl7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAldOwoKICAgIAlsZXQgaW5wdXRfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlpbnB1dF9kYXRhID0gYXNzaWduKGlucHV0X2RhdGEsIGlucHV0X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaW5wdXQgPSBlbGVtZW50KCJpbnB1dCIpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGlucHV0LCBmaWxlJDYsIDIzNywgNCwgNTAwNik7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgaW5wdXQsIGFuY2hvcik7CiAgICAJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIC8qdmFsdWUqLyBjdHhbMV0pOwoKICAgIAkJCWlmICghbW91bnRlZCkgewogICAgCQkJCWRpc3Bvc2UgPSBbCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJibHVyIiwgLypibHVyX2hhbmRsZXJfOSovIGN0eFs4N10sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiZm9jdXMiLCAvKmZvY3VzX2hhbmRsZXJfOSovIGN0eFs4OF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5ZG93biIsIC8qa2V5ZG93bl9oYW5kbGVyXzkqLyBjdHhbODldLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleXByZXNzIiwgLyprZXlwcmVzc19oYW5kbGVyXzkqLyBjdHhbOTBdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleXVwIiwgLyprZXl1cF9oYW5kbGVyXzkqLyBjdHhbOTFdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImNoYW5nZSIsIC8qY2hhbmdlX2hhbmRsZXJfOSovIGN0eFs4Nl0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiaW5wdXQiLCAvKmlucHV0X2hhbmRsZXJfOSovIGN0eFs5Ml0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiaW5wdXQiLCAvKmlucHV0X2lucHV0X2hhbmRsZXJfNiovIGN0eFsxNDZdKQogICAgCQkJCV07CgogICAgCQkJCW1vdW50ZWQgPSB0cnVlOwogICAgCQkJfQogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShpbnB1dF9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eVswXSAmIC8qJCRyZXN0UHJvcHMqLyA0MDk2ICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMTJdLAogICAgCQkJCXsgdHlwZTogInRpbWUiIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKmRpc2FibGVkKi8gMjU2ICYmIHsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbOF0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcmVhZG9ubHkqLyAxNiAmJiB7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKmNsYXNzZXMqLyA1MTIgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKm5hbWUqLyA2NCAmJiB7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypwbGFjZWhvbGRlciovIDEyOCAmJiB7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAkJCV0pKTsKCiAgICAJCQlpZiAoZGlydHlbMF0gJiAvKnZhbHVlKi8gMikgewogICAgCQkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlucHV0KTsKICAgIAkJCW1vdW50ZWQgPSBmYWxzZTsKICAgIAkJCXJ1bl9hbGwoZGlzcG9zZSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzEwLm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIigyMzc6MjgpICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDIyMDoyOCkgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfOShjdHgpIHsKICAgIAlsZXQgaW5wdXQ7CiAgICAJbGV0IG1vdW50ZWQ7CiAgICAJbGV0IGRpc3Bvc2U7CgogICAgCWxldCBpbnB1dF9sZXZlbHMgPSBbCiAgICAJCS8qJCRyZXN0UHJvcHMqLyBjdHhbMTJdLAogICAgCQl7IHR5cGU6ICJkYXRlIiB9LAogICAgCQl7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCXsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCXsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCXsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfQogICAgCV07CgogICAgCWxldCBpbnB1dF9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWlucHV0X2RhdGEgPSBhc3NpZ24oaW5wdXRfZGF0YSwgaW5wdXRfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlpbnB1dCA9IGVsZW1lbnQoImlucHV0Iik7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oaW5wdXQsIGZpbGUkNiwgMjIwLCA0LCA0NzA2KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpbnB1dCwgYW5jaG9yKTsKICAgIAkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CgogICAgCQkJaWYgKCFtb3VudGVkKSB7CiAgICAJCQkJZGlzcG9zZSA9IFsKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImJsdXIiLCAvKmJsdXJfaGFuZGxlcl84Ki8gY3R4WzgwXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJmb2N1cyIsIC8qZm9jdXNfaGFuZGxlcl84Ki8gY3R4WzgxXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXlkb3duIiwgLyprZXlkb3duX2hhbmRsZXJfOCovIGN0eFs4Ml0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5cHJlc3MiLCAvKmtleXByZXNzX2hhbmRsZXJfOCovIGN0eFs4M10sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5dXAiLCAvKmtleXVwX2hhbmRsZXJfOCovIGN0eFs4NF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiY2hhbmdlIiwgLypjaGFuZ2VfaGFuZGxlcl84Ki8gY3R4Wzc5XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaGFuZGxlcl84Ki8gY3R4Wzg1XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaW5wdXRfaGFuZGxlcl81Ki8gY3R4WzE0NV0pCiAgICAJCQkJXTsKCiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGlucHV0X2xldmVscywgWwogICAgCQkJCWRpcnR5WzBdICYgLyokJHJlc3RQcm9wcyovIDQwOTYgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCQkJeyB0eXBlOiAiZGF0ZSIgfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qZGlzYWJsZWQqLyAyNTYgJiYgeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypyZWFkb25seSovIDE2ICYmIHsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qY2xhc3NlcyovIDUxMiAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbOV0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qbmFtZSovIDY0ICYmIHsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnBsYWNlaG9sZGVyKi8gMTI4ICYmIHsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfQogICAgCQkJXSkpOwoKICAgIAkJCWlmIChkaXJ0eVswXSAmIC8qdmFsdWUqLyAyKSB7CiAgICAJCQkJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCAvKnZhbHVlKi8gY3R4WzFdKTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoaW5wdXQpOwogICAgCQkJbW91bnRlZCA9IGZhbHNlOwogICAgCQkJcnVuX2FsbChkaXNwb3NlKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2tfOS5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoMjIwOjI4KSAiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgyMDM6MzApIAogICAgZnVuY3Rpb24gY3JlYXRlX2lmX2Jsb2NrXzgoY3R4KSB7CiAgICAJbGV0IGlucHV0OwogICAgCWxldCBtb3VudGVkOwogICAgCWxldCBkaXNwb3NlOwoKICAgIAlsZXQgaW5wdXRfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJeyB0eXBlOiAibnVtYmVyIiB9LAogICAgCQl7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCXsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCXsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCXsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfQogICAgCV07CgogICAgCWxldCBpbnB1dF9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWlucHV0X2RhdGEgPSBhc3NpZ24oaW5wdXRfZGF0YSwgaW5wdXRfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlpbnB1dCA9IGVsZW1lbnQoImlucHV0Iik7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oaW5wdXQsIGZpbGUkNiwgMjAzLCA0LCA0NDA0KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpbnB1dCwgYW5jaG9yKTsKICAgIAkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CgogICAgCQkJaWYgKCFtb3VudGVkKSB7CiAgICAJCQkJZGlzcG9zZSA9IFsKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImJsdXIiLCAvKmJsdXJfaGFuZGxlcl83Ki8gY3R4WzczXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJmb2N1cyIsIC8qZm9jdXNfaGFuZGxlcl83Ki8gY3R4Wzc0XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXlkb3duIiwgLyprZXlkb3duX2hhbmRsZXJfNyovIGN0eFs3NV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5cHJlc3MiLCAvKmtleXByZXNzX2hhbmRsZXJfNyovIGN0eFs3Nl0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5dXAiLCAvKmtleXVwX2hhbmRsZXJfNyovIGN0eFs3N10sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiY2hhbmdlIiwgLypjaGFuZ2VfaGFuZGxlcl83Ki8gY3R4WzcyXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaGFuZGxlcl83Ki8gY3R4Wzc4XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaW5wdXRfaGFuZGxlcl80Ki8gY3R4WzE0NF0pCiAgICAJCQkJXTsKCiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGlucHV0X2xldmVscywgWwogICAgCQkJCWRpcnR5WzBdICYgLyokJHJlc3RQcm9wcyovIDQwOTYgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCQkJeyB0eXBlOiAibnVtYmVyIiB9LAogICAgCQkJCWRpcnR5WzBdICYgLypkaXNhYmxlZCovIDI1NiAmJiB7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnJlYWRvbmx5Ki8gMTYgJiYgeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypjbGFzc2VzKi8gNTEyICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypuYW1lKi8gNjQgJiYgeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcGxhY2Vob2xkZXIqLyAxMjggJiYgeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9CiAgICAJCQldKSk7CgogICAgCQkJaWYgKGRpcnR5WzBdICYgLyp2YWx1ZSovIDIgJiYgdG9fbnVtYmVyKGlucHV0LnZhbHVlKSAhPT0gLyp2YWx1ZSovIGN0eFsxXSkgewogICAgCQkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlucHV0KTsKICAgIAkJCW1vdW50ZWQgPSBmYWxzZTsKICAgIAkJCXJ1bl9hbGwoZGlzcG9zZSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzgubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDIwMzozMCkgIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoMTg2OjI3KSAKICAgIGZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9ja183KGN0eCkgewogICAgCWxldCBpbnB1dDsKICAgIAlsZXQgbW91bnRlZDsKICAgIAlsZXQgZGlzcG9zZTsKCiAgICAJbGV0IGlucHV0X2xldmVscyA9IFsKICAgIAkJLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCXsgdHlwZTogInVybCIgfSwKICAgIAkJeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQl7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCXsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQl7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQl7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAldOwoKICAgIAlsZXQgaW5wdXRfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlpbnB1dF9kYXRhID0gYXNzaWduKGlucHV0X2RhdGEsIGlucHV0X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaW5wdXQgPSBlbGVtZW50KCJpbnB1dCIpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGlucHV0LCBmaWxlJDYsIDE4NiwgNCwgNDEwMyk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgaW5wdXQsIGFuY2hvcik7CiAgICAJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIC8qdmFsdWUqLyBjdHhbMV0pOwoKICAgIAkJCWlmICghbW91bnRlZCkgewogICAgCQkJCWRpc3Bvc2UgPSBbCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJibHVyIiwgLypibHVyX2hhbmRsZXJfNiovIGN0eFs2Nl0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiZm9jdXMiLCAvKmZvY3VzX2hhbmRsZXJfNiovIGN0eFs2N10sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5ZG93biIsIC8qa2V5ZG93bl9oYW5kbGVyXzYqLyBjdHhbNjhdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleXByZXNzIiwgLyprZXlwcmVzc19oYW5kbGVyXzYqLyBjdHhbNjldLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleXVwIiwgLyprZXl1cF9oYW5kbGVyXzYqLyBjdHhbNzBdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImNoYW5nZSIsIC8qY2hhbmdlX2hhbmRsZXJfNiovIGN0eFs2NV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiaW5wdXQiLCAvKmlucHV0X2hhbmRsZXJfNiovIGN0eFs3MV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiaW5wdXQiLCAvKmlucHV0X2lucHV0X2hhbmRsZXJfMyovIGN0eFsxNDNdKQogICAgCQkJCV07CgogICAgCQkJCW1vdW50ZWQgPSB0cnVlOwogICAgCQkJfQogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShpbnB1dF9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eVswXSAmIC8qJCRyZXN0UHJvcHMqLyA0MDk2ICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMTJdLAogICAgCQkJCXsgdHlwZTogInVybCIgfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qZGlzYWJsZWQqLyAyNTYgJiYgeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypyZWFkb25seSovIDE2ICYmIHsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qY2xhc3NlcyovIDUxMiAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbOV0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qbmFtZSovIDY0ICYmIHsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnBsYWNlaG9sZGVyKi8gMTI4ICYmIHsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfQogICAgCQkJXSkpOwoKICAgIAkJCWlmIChkaXJ0eVswXSAmIC8qdmFsdWUqLyAyKSB7CiAgICAJCQkJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCAvKnZhbHVlKi8gY3R4WzFdKTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoaW5wdXQpOwogICAgCQkJbW91bnRlZCA9IGZhbHNlOwogICAgCQkJcnVuX2FsbChkaXNwb3NlKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2tfNy5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoMTg2OjI3KSAiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgxNjk6MjkpIAogICAgZnVuY3Rpb24gY3JlYXRlX2lmX2Jsb2NrXzYoY3R4KSB7CiAgICAJbGV0IGlucHV0OwogICAgCWxldCBtb3VudGVkOwogICAgCWxldCBkaXNwb3NlOwoKICAgIAlsZXQgaW5wdXRfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJeyB0eXBlOiAicmFkaW8iIH0sCiAgICAJCXsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbOF0gfSwKICAgIAkJeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9LAogICAgCQl7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbOV0gfSwKICAgIAkJeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9CiAgICAJXTsKCiAgICAJbGV0IGlucHV0X2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dF9sZXZlbHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJaW5wdXRfZGF0YSA9IGFzc2lnbihpbnB1dF9kYXRhLCBpbnB1dF9sZXZlbHNbaV0pOwogICAgCX0KCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlucHV0ID0gZWxlbWVudCgiaW5wdXQiKTsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGlucHV0LCBpbnB1dF9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbihpbnB1dCwgZmlsZSQ2LCAxNjksIDQsIDM4MDMpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGlucHV0LCBhbmNob3IpOwogICAgCQkJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCAvKnZhbHVlKi8gY3R4WzFdKTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gWwogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiYmx1ciIsIC8qYmx1cl9oYW5kbGVyXzUqLyBjdHhbNTldLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImZvY3VzIiwgLypmb2N1c19oYW5kbGVyXzUqLyBjdHhbNjBdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleWRvd24iLCAvKmtleWRvd25faGFuZGxlcl81Ki8gY3R4WzYxXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXlwcmVzcyIsIC8qa2V5cHJlc3NfaGFuZGxlcl81Ki8gY3R4WzYyXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXl1cCIsIC8qa2V5dXBfaGFuZGxlcl81Ki8gY3R4WzYzXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJjaGFuZ2UiLCAvKmNoYW5nZV9oYW5kbGVyXzUqLyBjdHhbNThdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImlucHV0IiwgLyppbnB1dF9oYW5kbGVyXzUqLyBjdHhbNjRdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImNoYW5nZSIsIC8qaW5wdXRfY2hhbmdlX2hhbmRsZXJfMiovIGN0eFsxNDJdKQogICAgCQkJCV07CgogICAgCQkJCW1vdW50ZWQgPSB0cnVlOwogICAgCQkJfQogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShpbnB1dF9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eVswXSAmIC8qJCRyZXN0UHJvcHMqLyA0MDk2ICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMTJdLAogICAgCQkJCXsgdHlwZTogInJhZGlvIiB9LAogICAgCQkJCWRpcnR5WzBdICYgLypkaXNhYmxlZCovIDI1NiAmJiB7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnJlYWRvbmx5Ki8gMTYgJiYgeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypjbGFzc2VzKi8gNTEyICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypuYW1lKi8gNjQgJiYgeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcGxhY2Vob2xkZXIqLyAxMjggJiYgeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9CiAgICAJCQldKSk7CgogICAgCQkJaWYgKGRpcnR5WzBdICYgLyp2YWx1ZSovIDIpIHsKICAgIAkJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIC8qdmFsdWUqLyBjdHhbMV0pOwogICAgCQkJfQogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihpbnB1dCk7CiAgICAJCQltb3VudGVkID0gZmFsc2U7CiAgICAJCQlydW5fYWxsKGRpc3Bvc2UpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9ja182Lm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIigxNjk6MjkpICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDE1MTozMikgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfNShjdHgpIHsKICAgIAlsZXQgaW5wdXQ7CiAgICAJbGV0IG1vdW50ZWQ7CiAgICAJbGV0IGRpc3Bvc2U7CgogICAgCWxldCBpbnB1dF9sZXZlbHMgPSBbCiAgICAJCS8qJCRyZXN0UHJvcHMqLyBjdHhbMTJdLAogICAgCQl7IHR5cGU6ICJjaGVja2JveCIgfSwKICAgIAkJeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQl7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQl7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCXsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQl7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAldOwoKICAgIAlsZXQgaW5wdXRfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlpbnB1dF9kYXRhID0gYXNzaWduKGlucHV0X2RhdGEsIGlucHV0X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaW5wdXQgPSBlbGVtZW50KCJpbnB1dCIpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGlucHV0LCBmaWxlJDYsIDE1MSwgNCwgMzQ3OSk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgaW5wdXQsIGFuY2hvcik7CiAgICAJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIC8qdmFsdWUqLyBjdHhbMV0pOwogICAgCQkJaW5wdXQuY2hlY2tlZCA9IC8qY2hlY2tlZCovIGN0eFswXTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gWwogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiYmx1ciIsIC8qYmx1cl9oYW5kbGVyXzQqLyBjdHhbNTJdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImZvY3VzIiwgLypmb2N1c19oYW5kbGVyXzQqLyBjdHhbNTNdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleWRvd24iLCAvKmtleWRvd25faGFuZGxlcl80Ki8gY3R4WzU0XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXlwcmVzcyIsIC8qa2V5cHJlc3NfaGFuZGxlcl80Ki8gY3R4WzU1XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXl1cCIsIC8qa2V5dXBfaGFuZGxlcl80Ki8gY3R4WzU2XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJjaGFuZ2UiLCAvKmNoYW5nZV9oYW5kbGVyXzQqLyBjdHhbNTddLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImlucHV0IiwgLyppbnB1dF9oYW5kbGVyXzQqLyBjdHhbNTFdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImNoYW5nZSIsIC8qaW5wdXRfY2hhbmdlX2hhbmRsZXJfMSovIGN0eFsxNDFdKQogICAgCQkJCV07CgogICAgCQkJCW1vdW50ZWQgPSB0cnVlOwogICAgCQkJfQogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShpbnB1dF9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eVswXSAmIC8qJCRyZXN0UHJvcHMqLyA0MDk2ICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMTJdLAogICAgCQkJCXsgdHlwZTogImNoZWNrYm94IiB9LAogICAgCQkJCWRpcnR5WzBdICYgLypkaXNhYmxlZCovIDI1NiAmJiB7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKm5hbWUqLyA2NCAmJiB7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypyZWFkb25seSovIDE2ICYmIHsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qY2xhc3NlcyovIDUxMiAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbOV0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcGxhY2Vob2xkZXIqLyAxMjggJiYgeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9CiAgICAJCQldKSk7CgogICAgCQkJaWYgKGRpcnR5WzBdICYgLyp2YWx1ZSovIDIpIHsKICAgIAkJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIC8qdmFsdWUqLyBjdHhbMV0pOwogICAgCQkJfQoKICAgIAkJCWlmIChkaXJ0eVswXSAmIC8qY2hlY2tlZCovIDEpIHsKICAgIAkJCQlpbnB1dC5jaGVja2VkID0gLypjaGVja2VkKi8gY3R4WzBdOwogICAgCQkJfQogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihpbnB1dCk7CiAgICAJCQltb3VudGVkID0gZmFsc2U7CiAgICAJCQlydW5fYWxsKGRpc3Bvc2UpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9ja181Lm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIigxNTE6MzIpICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDEzNDoyOCkgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfNChjdHgpIHsKICAgIAlsZXQgaW5wdXQ7CiAgICAJbGV0IG1vdW50ZWQ7CiAgICAJbGV0IGRpc3Bvc2U7CgogICAgCWxldCBpbnB1dF9sZXZlbHMgPSBbCiAgICAJCS8qJCRyZXN0UHJvcHMqLyBjdHhbMTJdLAogICAgCQl7IHR5cGU6ICJmaWxlIiB9LAogICAgCQl7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCXsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCXsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCXsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfQogICAgCV07CgogICAgCWxldCBpbnB1dF9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWlucHV0X2RhdGEgPSBhc3NpZ24oaW5wdXRfZGF0YSwgaW5wdXRfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlpbnB1dCA9IGVsZW1lbnQoImlucHV0Iik7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oaW5wdXQsIGZpbGUkNiwgMTM0LCA0LCAzMTc1KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpbnB1dCwgYW5jaG9yKTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gWwogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiYmx1ciIsIC8qYmx1cl9oYW5kbGVyXzMqLyBjdHhbNDVdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImZvY3VzIiwgLypmb2N1c19oYW5kbGVyXzMqLyBjdHhbNDZdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleWRvd24iLCAvKmtleWRvd25faGFuZGxlcl8zKi8gY3R4WzQ3XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXlwcmVzcyIsIC8qa2V5cHJlc3NfaGFuZGxlcl8zKi8gY3R4WzQ4XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXl1cCIsIC8qa2V5dXBfaGFuZGxlcl8zKi8gY3R4WzQ5XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJjaGFuZ2UiLCAvKmNoYW5nZV9oYW5kbGVyXzMqLyBjdHhbNDRdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImlucHV0IiwgLyppbnB1dF9oYW5kbGVyXzMqLyBjdHhbNTBdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImNoYW5nZSIsIC8qaW5wdXRfY2hhbmdlX2hhbmRsZXIqLyBjdHhbMTQwXSkKICAgIAkJCQldOwoKICAgIAkJCQltb3VudGVkID0gdHJ1ZTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGlucHV0LCBpbnB1dF9kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoaW5wdXRfbGV2ZWxzLCBbCiAgICAJCQkJZGlydHlbMF0gJiAvKiQkcmVzdFByb3BzKi8gNDA5NiAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJCQl7IHR5cGU6ICJmaWxlIiB9LAogICAgCQkJCWRpcnR5WzBdICYgLypkaXNhYmxlZCovIDI1NiAmJiB7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnJlYWRvbmx5Ki8gMTYgJiYgeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypjbGFzc2VzKi8gNTEyICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypuYW1lKi8gNjQgJiYgeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcGxhY2Vob2xkZXIqLyAxMjggJiYgeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9CiAgICAJCQldKSk7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlucHV0KTsKICAgIAkJCW1vdW50ZWQgPSBmYWxzZTsKICAgIAkJCXJ1bl9hbGwoZGlzcG9zZSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzQubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDEzNDoyOCkgIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoMTE3OjI5KSAKICAgIGZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9ja18zJDEoY3R4KSB7CiAgICAJbGV0IGlucHV0OwogICAgCWxldCBtb3VudGVkOwogICAgCWxldCBkaXNwb3NlOwoKICAgIAlsZXQgaW5wdXRfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJeyB0eXBlOiAiZW1haWwiIH0sCiAgICAJCXsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbOF0gfSwKICAgIAkJeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9LAogICAgCQl7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbOV0gfSwKICAgIAkJeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9CiAgICAJXTsKCiAgICAJbGV0IGlucHV0X2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dF9sZXZlbHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJaW5wdXRfZGF0YSA9IGFzc2lnbihpbnB1dF9kYXRhLCBpbnB1dF9sZXZlbHNbaV0pOwogICAgCX0KCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlucHV0ID0gZWxlbWVudCgiaW5wdXQiKTsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGlucHV0LCBpbnB1dF9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbihpbnB1dCwgZmlsZSQ2LCAxMTcsIDQsIDI4NzQpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGlucHV0LCBhbmNob3IpOwogICAgCQkJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCAvKnZhbHVlKi8gY3R4WzFdKTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gWwogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiYmx1ciIsIC8qYmx1cl9oYW5kbGVyXzIqLyBjdHhbMzhdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImZvY3VzIiwgLypmb2N1c19oYW5kbGVyXzIqLyBjdHhbMzldLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleWRvd24iLCAvKmtleWRvd25faGFuZGxlcl8yKi8gY3R4WzQwXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXlwcmVzcyIsIC8qa2V5cHJlc3NfaGFuZGxlcl8yKi8gY3R4WzQxXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXl1cCIsIC8qa2V5dXBfaGFuZGxlcl8yKi8gY3R4WzQyXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJjaGFuZ2UiLCAvKmNoYW5nZV9oYW5kbGVyXzIqLyBjdHhbMzddLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImlucHV0IiwgLyppbnB1dF9oYW5kbGVyXzIqLyBjdHhbNDNdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImlucHV0IiwgLyppbnB1dF9pbnB1dF9oYW5kbGVyXzIqLyBjdHhbMTM5XSkKICAgIAkJCQldOwoKICAgIAkJCQltb3VudGVkID0gdHJ1ZTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGlucHV0LCBpbnB1dF9kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoaW5wdXRfbGV2ZWxzLCBbCiAgICAJCQkJZGlydHlbMF0gJiAvKiQkcmVzdFByb3BzKi8gNDA5NiAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJCQl7IHR5cGU6ICJlbWFpbCIgfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qZGlzYWJsZWQqLyAyNTYgJiYgeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypyZWFkb25seSovIDE2ICYmIHsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qY2xhc3NlcyovIDUxMiAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbOV0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qbmFtZSovIDY0ICYmIHsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnBsYWNlaG9sZGVyKi8gMTI4ICYmIHsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfQogICAgCQkJXSkpOwoKICAgIAkJCWlmIChkaXJ0eVswXSAmIC8qdmFsdWUqLyAyICYmIGlucHV0LnZhbHVlICE9PSAvKnZhbHVlKi8gY3R4WzFdKSB7CiAgICAJCQkJc2V0X2lucHV0X3ZhbHVlKGlucHV0LCAvKnZhbHVlKi8gY3R4WzFdKTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoaW5wdXQpOwogICAgCQkJbW91bnRlZCA9IGZhbHNlOwogICAgCQkJcnVuX2FsbChkaXNwb3NlKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2tfMyQxLm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIigxMTc6MjkpICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDEwMDozMikgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMiQxKGN0eCkgewogICAgCWxldCBpbnB1dDsKICAgIAlsZXQgbW91bnRlZDsKICAgIAlsZXQgZGlzcG9zZTsKCiAgICAJbGV0IGlucHV0X2xldmVscyA9IFsKICAgIAkJLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCXsgdHlwZTogInBhc3N3b3JkIiB9LAogICAgCQl7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCXsgcmVhZE9ubHk6IC8qcmVhZG9ubHkqLyBjdHhbNF0gfSwKICAgIAkJeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCXsgbmFtZTogLypuYW1lKi8gY3R4WzZdIH0sCiAgICAJCXsgcGxhY2Vob2xkZXI6IC8qcGxhY2Vob2xkZXIqLyBjdHhbN10gfQogICAgCV07CgogICAgCWxldCBpbnB1dF9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWlucHV0X2RhdGEgPSBhc3NpZ24oaW5wdXRfZGF0YSwgaW5wdXRfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlpbnB1dCA9IGVsZW1lbnQoImlucHV0Iik7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oaW5wdXQsIGZpbGUkNiwgMTAwLCA0LCAyNTY5KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpbnB1dCwgYW5jaG9yKTsKICAgIAkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CgogICAgCQkJaWYgKCFtb3VudGVkKSB7CiAgICAJCQkJZGlzcG9zZSA9IFsKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImJsdXIiLCAvKmJsdXJfaGFuZGxlcl8xKi8gY3R4WzMxXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJmb2N1cyIsIC8qZm9jdXNfaGFuZGxlcl8xKi8gY3R4WzMyXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJrZXlkb3duIiwgLyprZXlkb3duX2hhbmRsZXJfMSovIGN0eFszM10sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5cHJlc3MiLCAvKmtleXByZXNzX2hhbmRsZXJfMSovIGN0eFszNF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5dXAiLCAvKmtleXVwX2hhbmRsZXJfMSovIGN0eFszNV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiY2hhbmdlIiwgLypjaGFuZ2VfaGFuZGxlcl8xKi8gY3R4WzMwXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaGFuZGxlcl8xKi8gY3R4WzM2XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaW5wdXRfaGFuZGxlcl8xKi8gY3R4WzEzOF0pCiAgICAJCQkJXTsKCiAgICAJCQkJbW91bnRlZCA9IHRydWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbnB1dCwgaW5wdXRfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGlucHV0X2xldmVscywgWwogICAgCQkJCWRpcnR5WzBdICYgLyokJHJlc3RQcm9wcyovIDQwOTYgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsxMl0sCiAgICAJCQkJeyB0eXBlOiAicGFzc3dvcmQiIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKmRpc2FibGVkKi8gMjU2ICYmIHsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbOF0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcmVhZG9ubHkqLyAxNiAmJiB7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKmNsYXNzZXMqLyA1MTIgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzldIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKm5hbWUqLyA2NCAmJiB7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypwbGFjZWhvbGRlciovIDEyOCAmJiB7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAkJCV0pKTsKCiAgICAJCQlpZiAoZGlydHlbMF0gJiAvKnZhbHVlKi8gMiAmJiBpbnB1dC52YWx1ZSAhPT0gLyp2YWx1ZSovIGN0eFsxXSkgewogICAgCQkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlucHV0KTsKICAgIAkJCW1vdW50ZWQgPSBmYWxzZTsKICAgIAkJCXJ1bl9hbGwoZGlzcG9zZSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzIkMS5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoMTAwOjMyKSAiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg4MzoyKSB7I2lmIHR5cGUgPT09ICd0ZXh0J30KICAgIGZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9ja18xJDEoY3R4KSB7CiAgICAJbGV0IGlucHV0OwogICAgCWxldCBtb3VudGVkOwogICAgCWxldCBkaXNwb3NlOwoKICAgIAlsZXQgaW5wdXRfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJeyB0eXBlOiAidGV4dCIgfSwKICAgIAkJeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFs4XSB9LAogICAgCQl7IHJlYWRPbmx5OiAvKnJlYWRvbmx5Ki8gY3R4WzRdIH0sCiAgICAJCXsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQl7IG5hbWU6IC8qbmFtZSovIGN0eFs2XSB9LAogICAgCQl7IHBsYWNlaG9sZGVyOiAvKnBsYWNlaG9sZGVyKi8gY3R4WzddIH0KICAgIAldOwoKICAgIAlsZXQgaW5wdXRfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlpbnB1dF9kYXRhID0gYXNzaWduKGlucHV0X2RhdGEsIGlucHV0X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaW5wdXQgPSBlbGVtZW50KCJpbnB1dCIpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW5wdXQsIGlucHV0X2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGlucHV0LCBmaWxlJDYsIDgzLCA0LCAyMjY1KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpbnB1dCwgYW5jaG9yKTsKICAgIAkJCXNldF9pbnB1dF92YWx1ZShpbnB1dCwgLyp2YWx1ZSovIGN0eFsxXSk7CgogICAgCQkJaWYgKCFtb3VudGVkKSB7CiAgICAJCQkJZGlzcG9zZSA9IFsKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImJsdXIiLCAvKmJsdXJfaGFuZGxlciovIGN0eFsyNF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiZm9jdXMiLCAvKmZvY3VzX2hhbmRsZXIqLyBjdHhbMjVdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleWRvd24iLCAvKmtleWRvd25faGFuZGxlciovIGN0eFsyNl0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAia2V5cHJlc3MiLCAvKmtleXByZXNzX2hhbmRsZXIqLyBjdHhbMjddLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKICAgIAkJCQkJbGlzdGVuX2RldihpbnB1dCwgImtleXVwIiwgLyprZXl1cF9oYW5kbGVyKi8gY3R4WzI4XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJjaGFuZ2UiLCAvKmNoYW5nZV9oYW5kbGVyKi8gY3R4WzIzXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoaW5wdXQsICJpbnB1dCIsIC8qaW5wdXRfaGFuZGxlciovIGN0eFsyOV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAogICAgCQkJCQlsaXN0ZW5fZGV2KGlucHV0LCAiaW5wdXQiLCAvKmlucHV0X2lucHV0X2hhbmRsZXIqLyBjdHhbMTM3XSkKICAgIAkJCQldOwoKICAgIAkJCQltb3VudGVkID0gdHJ1ZTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGlucHV0LCBpbnB1dF9kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoaW5wdXRfbGV2ZWxzLCBbCiAgICAJCQkJZGlydHlbMF0gJiAvKiQkcmVzdFByb3BzKi8gNDA5NiAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzEyXSwKICAgIAkJCQl7IHR5cGU6ICJ0ZXh0IiB9LAogICAgCQkJCWRpcnR5WzBdICYgLypkaXNhYmxlZCovIDI1NiAmJiB7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzhdIH0sCiAgICAJCQkJZGlydHlbMF0gJiAvKnJlYWRvbmx5Ki8gMTYgJiYgeyByZWFkT25seTogLypyZWFkb25seSovIGN0eFs0XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypjbGFzc2VzKi8gNTEyICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs5XSB9LAogICAgCQkJCWRpcnR5WzBdICYgLypuYW1lKi8gNjQgJiYgeyBuYW1lOiAvKm5hbWUqLyBjdHhbNl0gfSwKICAgIAkJCQlkaXJ0eVswXSAmIC8qcGxhY2Vob2xkZXIqLyAxMjggJiYgeyBwbGFjZWhvbGRlcjogLypwbGFjZWhvbGRlciovIGN0eFs3XSB9CiAgICAJCQldKSk7CgogICAgCQkJaWYgKGRpcnR5WzBdICYgLyp2YWx1ZSovIDIgJiYgaW5wdXQudmFsdWUgIT09IC8qdmFsdWUqLyBjdHhbMV0pIHsKICAgIAkJCQlzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIC8qdmFsdWUqLyBjdHhbMV0pOwogICAgCQkJfQogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihpbnB1dCk7CiAgICAJCQltb3VudGVkID0gZmFsc2U7CiAgICAJCQlydW5fYWxsKGRpc3Bvc2UpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9ja18xJDEubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDgzOjIpIHsjaWYgdHlwZSA9PT0gJ3RleHQnfSIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlX2ZyYWdtZW50JDYoY3R4KSB7CiAgICAJbGV0IGN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleDsKICAgIAlsZXQgaWZfYmxvY2s7CiAgICAJbGV0IGlmX2Jsb2NrX2FuY2hvcjsKICAgIAlsZXQgY3VycmVudDsKICAgIAljb25zdCBpZl9ibG9ja19jcmVhdG9ycyA9IFtjcmVhdGVfaWZfYmxvY2skMiwgY3JlYXRlX2lmX2Jsb2NrXzE1LCBjcmVhdGVfaWZfYmxvY2tfMTZdOwogICAgCWNvbnN0IGlmX2Jsb2NrcyA9IFtdOwoKICAgIAlmdW5jdGlvbiBzZWxlY3RfYmxvY2tfdHlwZShjdHgsIGRpcnR5KSB7CiAgICAJCWlmICgvKnRhZyovIGN0eFsxMF0gPT09ICJpbnB1dCIpIHJldHVybiAwOwogICAgCQlpZiAoLyp0YWcqLyBjdHhbMTBdID09PSAidGV4dGFyZWEiKSByZXR1cm4gMTsKICAgIAkJaWYgKC8qdGFnKi8gY3R4WzEwXSA9PT0gInNlbGVjdCIgJiYgIS8qbXVsdGlwbGUqLyBjdHhbNV0pIHJldHVybiAyOwogICAgCQlyZXR1cm4gLTE7CiAgICAJfQoKICAgIAlpZiAofihjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZShjdHgpKSkgewogICAgCQlpZl9ibG9jayA9IGlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdID0gaWZfYmxvY2tfY3JlYXRvcnNbY3VycmVudF9ibG9ja190eXBlX2luZGV4XShjdHgpOwogICAgCX0KCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlmIChpZl9ibG9jaykgaWZfYmxvY2suYygpOwogICAgCQkJaWZfYmxvY2tfYW5jaG9yID0gZW1wdHkoKTsKICAgIAkJfSwKICAgIAkJbDogZnVuY3Rpb24gY2xhaW0obm9kZXMpIHsKICAgIAkJCXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5oeWRyYXRlIG9ubHkgd29ya3MgaWYgdGhlIGNvbXBvbmVudCB3YXMgY29tcGlsZWQgd2l0aCB0aGUgYGh5ZHJhdGFibGU6IHRydWVgIG9wdGlvbiIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaWYgKH5jdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXgpIHsKICAgIAkJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5tKHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCX0KCiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgaWZfYmxvY2tfYW5jaG9yLCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlsZXQgcHJldmlvdXNfYmxvY2tfaW5kZXggPSBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7CiAgICAJCQljdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZShjdHgpOwoKICAgIAkJCWlmIChjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPT09IHByZXZpb3VzX2Jsb2NrX2luZGV4KSB7CiAgICAJCQkJaWYgKH5jdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXgpIHsKICAgIAkJCQkJaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0ucChjdHgsIGRpcnR5KTsKICAgIAkJCQl9CiAgICAJCQl9IGVsc2UgewogICAgCQkJCWlmIChpZl9ibG9jaykgewogICAgCQkJCQlncm91cF9vdXRyb3MoKTsKCiAgICAJCQkJCXRyYW5zaXRpb25fb3V0KGlmX2Jsb2Nrc1twcmV2aW91c19ibG9ja19pbmRleF0sIDEsIDEsICgpID0+IHsKICAgIAkJCQkJCWlmX2Jsb2Nrc1twcmV2aW91c19ibG9ja19pbmRleF0gPSBudWxsOwogICAgCQkJCQl9KTsKCiAgICAJCQkJCWNoZWNrX291dHJvcygpOwogICAgCQkJCX0KCiAgICAJCQkJaWYgKH5jdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXgpIHsKICAgIAkJCQkJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XTsKCiAgICAJCQkJCWlmICghaWZfYmxvY2spIHsKICAgIAkJCQkJCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0gPSBpZl9ibG9ja19jcmVhdG9yc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdKGN0eCk7CiAgICAJCQkJCQlpZl9ibG9jay5jKCk7CiAgICAJCQkJCX0gZWxzZSB7CiAgICAJCQkJCQlpZl9ibG9jay5wKGN0eCwgZGlydHkpOwogICAgCQkJCQl9CgogICAgCQkJCQl0cmFuc2l0aW9uX2luKGlmX2Jsb2NrLCAxKTsKICAgIAkJCQkJaWZfYmxvY2subShpZl9ibG9ja19hbmNob3IucGFyZW50Tm9kZSwgaWZfYmxvY2tfYW5jaG9yKTsKICAgIAkJCQl9IGVsc2UgewogICAgCQkJCQlpZl9ibG9jayA9IG51bGw7CiAgICAJCQkJfQogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oaWZfYmxvY2spOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChpZl9ibG9jayk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAofmN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleCkgewogICAgCQkJCWlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdLmQoZGV0YWNoaW5nKTsKICAgIAkJCX0KCiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlmX2Jsb2NrX2FuY2hvcik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2ZyYWdtZW50JDYubmFtZSwKICAgIAkJdHlwZTogImNvbXBvbmVudCIsCiAgICAJCXNvdXJjZTogIiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2UkNigkJHNlbGYsICQkcHJvcHMsICQkaW52YWxpZGF0ZSkgewogICAgCWNvbnN0IG9taXRfcHJvcHNfbmFtZXMgPSBbCiAgICAJCSJjbGFzcyIsInR5cGUiLCJzaXplIiwiYnNTaXplIiwiY29sb3IiLCJjaGVja2VkIiwidmFsaWQiLCJpbnZhbGlkIiwicGxhaW50ZXh0IiwiYWRkb24iLCJ2YWx1ZSIsImZpbGVzIiwicmVhZG9ubHkiLCJtdWx0aXBsZSIsIm5hbWUiLCJwbGFjZWhvbGRlciIsImRpc2FibGVkIgogICAgCV07CgogICAgCWxldCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKTsKICAgIAlsZXQgeyAkJHNsb3RzOiBzbG90cyA9IHt9LCAkJHNjb3BlIH0gPSAkJHByb3BzOwogICAgCXZhbGlkYXRlX3Nsb3RzKCJJbnB1dCIsIHNsb3RzLCBbJ2RlZmF1bHQnXSk7CiAgICAJbGV0IHsgY2xhc3M6IGNsYXNzTmFtZSA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHR5cGUgPSAidGV4dCIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgc2l6ZSA9IHVuZGVmaW5lZCB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBic1NpemUgPSB1bmRlZmluZWQgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgY29sb3IgPSB1bmRlZmluZWQgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgY2hlY2tlZCA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHZhbGlkID0gZmFsc2UgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgaW52YWxpZCA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHBsYWludGV4dCA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGFkZG9uID0gZmFsc2UgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgdmFsdWUgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBmaWxlcyA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHJlYWRvbmx5ID0gdW5kZWZpbmVkIH0gPSAkJHByb3BzOwogICAgCWxldCB7IG11bHRpcGxlID0gdW5kZWZpbmVkIH0gPSAkJHByb3BzOwogICAgCWxldCB7IG5hbWUgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBwbGFjZWhvbGRlciA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGRpc2FibGVkID0gdW5kZWZpbmVkIH0gPSAkJHByb3BzOwogICAgCWxldCBjbGFzc2VzOwogICAgCWxldCB0YWc7CgogICAgCWNvbnN0IGhhbmRsZUlucHV0ID0gZXZlbnQgPT4gewogICAgCQkkJGludmFsaWRhdGUoMSwgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWUpOwogICAgCX07CgogICAgCWZ1bmN0aW9uIGNoYW5nZV9oYW5kbGVyKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBmb2N1c19oYW5kbGVyKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGtleWRvd25faGFuZGxlcihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGtleXVwX2hhbmRsZXIoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfaGFuZGxlcihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl8xKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcl8xKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfMShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfMShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyXzEoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl8xKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfMShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl8yKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcl8yKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfMihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfMihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyXzIoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl8yKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfMihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl8zKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcl8zKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfMyhldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfMyhldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyXzMoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl8zKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfMyhldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBpbnB1dF9oYW5kbGVyXzQoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gYmx1cl9oYW5kbGVyXzQoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gZm9jdXNfaGFuZGxlcl80KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGtleWRvd25faGFuZGxlcl80KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGtleXByZXNzX2hhbmRsZXJfNChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXl1cF9oYW5kbGVyXzQoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gY2hhbmdlX2hhbmRsZXJfNChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl81KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcl81KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfNShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfNShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyXzUoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl81KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfNShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl82KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcl82KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfNihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfNihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyXzYoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl82KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfNihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl83KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcl83KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfNyhldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfNyhldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyXzcoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl83KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfNyhldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl84KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcl84KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfOChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfOChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyXzgoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl84KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfOChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl85KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcl85KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfOShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfOShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyXzkoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl85KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfOShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl8xMChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBibHVyX2hhbmRsZXJfMTAoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gZm9jdXNfaGFuZGxlcl8xMChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfMTAoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5cHJlc3NfaGFuZGxlcl8xMChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXl1cF9oYW5kbGVyXzEwKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfMTAoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gY2hhbmdlX2hhbmRsZXJfMTEoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gYmx1cl9oYW5kbGVyXzExKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfMTEoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5ZG93bl9oYW5kbGVyXzExKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGtleXByZXNzX2hhbmRsZXJfMTEoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl8xMShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBpbnB1dF9oYW5kbGVyXzExKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGNoYW5nZV9oYW5kbGVyXzEyKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGJsdXJfaGFuZGxlcl8xMihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBmb2N1c19oYW5kbGVyXzEyKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGtleWRvd25faGFuZGxlcl8xMihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlwcmVzc19oYW5kbGVyXzEyKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGtleXVwX2hhbmRsZXJfMTIoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfaGFuZGxlcl8xMihldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl8xMyhldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBibHVyX2hhbmRsZXJfMTMoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gZm9jdXNfaGFuZGxlcl8xMyhldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfMTMoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5cHJlc3NfaGFuZGxlcl8xMyhldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXl1cF9oYW5kbGVyXzEzKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfMTMoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gYmx1cl9oYW5kbGVyXzE0KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfMTQoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5ZG93bl9oYW5kbGVyXzE0KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGtleXByZXNzX2hhbmRsZXJfMTQoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5dXBfaGFuZGxlcl8xNChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjaGFuZ2VfaGFuZGxlcl8xNChldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBibHVyX2hhbmRsZXJfMTUoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gZm9jdXNfaGFuZGxlcl8xNShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXlkb3duX2hhbmRsZXJfMTUoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24ga2V5cHJlc3NfaGFuZGxlcl8xNShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBrZXl1cF9oYW5kbGVyXzE1KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2hhbmRsZXJfMTQoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gYmx1cl9oYW5kbGVyXzE2KGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGZvY3VzX2hhbmRsZXJfMTYoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gY2hhbmdlX2hhbmRsZXJfMTUoZXZlbnQpIHsKICAgIAkJYnViYmxlKCQkc2VsZiwgZXZlbnQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfaGFuZGxlcl8xNShldmVudCkgewogICAgCQlidWJibGUoJCRzZWxmLCBldmVudCk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBpbnB1dF9pbnB1dF9oYW5kbGVyKCkgewogICAgCQl2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCB2YWx1ZSk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBpbnB1dF9pbnB1dF9oYW5kbGVyXzEoKSB7CiAgICAJCXZhbHVlID0gdGhpcy52YWx1ZTsKICAgIAkJJCRpbnZhbGlkYXRlKDEsIHZhbHVlKTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2lucHV0X2hhbmRsZXJfMigpIHsKICAgIAkJdmFsdWUgPSB0aGlzLnZhbHVlOwogICAgCQkkJGludmFsaWRhdGUoMSwgdmFsdWUpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfY2hhbmdlX2hhbmRsZXIoKSB7CiAgICAJCWZpbGVzID0gdGhpcy5maWxlczsKICAgIAkJJCRpbnZhbGlkYXRlKDIsIGZpbGVzKTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2NoYW5nZV9oYW5kbGVyXzEoKSB7CiAgICAJCXZhbHVlID0gdGhpcy52YWx1ZTsKICAgIAkJY2hlY2tlZCA9IHRoaXMuY2hlY2tlZDsKICAgIAkJJCRpbnZhbGlkYXRlKDEsIHZhbHVlKTsKICAgIAkJJCRpbnZhbGlkYXRlKDAsIGNoZWNrZWQpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfY2hhbmdlX2hhbmRsZXJfMigpIHsKICAgIAkJdmFsdWUgPSB0aGlzLnZhbHVlOwogICAgCQkkJGludmFsaWRhdGUoMSwgdmFsdWUpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfaW5wdXRfaGFuZGxlcl8zKCkgewogICAgCQl2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCB2YWx1ZSk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBpbnB1dF9pbnB1dF9oYW5kbGVyXzQoKSB7CiAgICAJCXZhbHVlID0gdG9fbnVtYmVyKHRoaXMudmFsdWUpOwogICAgCQkkJGludmFsaWRhdGUoMSwgdmFsdWUpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfaW5wdXRfaGFuZGxlcl81KCkgewogICAgCQl2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCB2YWx1ZSk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBpbnB1dF9pbnB1dF9oYW5kbGVyXzYoKSB7CiAgICAJCXZhbHVlID0gdGhpcy52YWx1ZTsKICAgIAkJJCRpbnZhbGlkYXRlKDEsIHZhbHVlKTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlucHV0X2lucHV0X2hhbmRsZXJfNygpIHsKICAgIAkJdmFsdWUgPSB0aGlzLnZhbHVlOwogICAgCQkkJGludmFsaWRhdGUoMSwgdmFsdWUpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfaW5wdXRfaGFuZGxlcl84KCkgewogICAgCQl2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCB2YWx1ZSk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBpbnB1dF9jaGFuZ2VfaW5wdXRfaGFuZGxlcigpIHsKICAgIAkJdmFsdWUgPSB0b19udW1iZXIodGhpcy52YWx1ZSk7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCB2YWx1ZSk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBpbnB1dF9pbnB1dF9oYW5kbGVyXzkoKSB7CiAgICAJCXZhbHVlID0gdGhpcy52YWx1ZTsKICAgIAkJJCRpbnZhbGlkYXRlKDEsIHZhbHVlKTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIHRleHRhcmVhX2lucHV0X2hhbmRsZXIoKSB7CiAgICAJCXZhbHVlID0gdGhpcy52YWx1ZTsKICAgIAkJJCRpbnZhbGlkYXRlKDEsIHZhbHVlKTsKICAgIAl9CgogICAgCWZ1bmN0aW9uIHNlbGVjdF9jaGFuZ2VfaGFuZGxlcigpIHsKICAgIAkJdmFsdWUgPSBzZWxlY3RfdmFsdWUodGhpcyk7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCB2YWx1ZSk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCRzZXQgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCSQkcHJvcHMgPSBhc3NpZ24oYXNzaWduKHt9LCAkJHByb3BzKSwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcygkJG5ld19wcm9wcykpOwogICAgCQkkJGludmFsaWRhdGUoMTIsICQkcmVzdFByb3BzID0gY29tcHV0ZV9yZXN0X3Byb3BzKCQkcHJvcHMsIG9taXRfcHJvcHNfbmFtZXMpKTsKICAgIAkJaWYgKCJjbGFzcyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgxNSwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3MpOwogICAgCQlpZiAoInR5cGUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMywgdHlwZSA9ICQkbmV3X3Byb3BzLnR5cGUpOwogICAgCQlpZiAoInNpemUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTMsIHNpemUgPSAkJG5ld19wcm9wcy5zaXplKTsKICAgIAkJaWYgKCJic1NpemUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTQsIGJzU2l6ZSA9ICQkbmV3X3Byb3BzLmJzU2l6ZSk7CiAgICAJCWlmICgiY29sb3IiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTYsIGNvbG9yID0gJCRuZXdfcHJvcHMuY29sb3IpOwogICAgCQlpZiAoImNoZWNrZWQiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMCwgY2hlY2tlZCA9ICQkbmV3X3Byb3BzLmNoZWNrZWQpOwogICAgCQlpZiAoInZhbGlkIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDE3LCB2YWxpZCA9ICQkbmV3X3Byb3BzLnZhbGlkKTsKICAgIAkJaWYgKCJpbnZhbGlkIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDE4LCBpbnZhbGlkID0gJCRuZXdfcHJvcHMuaW52YWxpZCk7CiAgICAJCWlmICgicGxhaW50ZXh0IiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDE5LCBwbGFpbnRleHQgPSAkJG5ld19wcm9wcy5wbGFpbnRleHQpOwogICAgCQlpZiAoImFkZG9uIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDIwLCBhZGRvbiA9ICQkbmV3X3Byb3BzLmFkZG9uKTsKICAgIAkJaWYgKCJ2YWx1ZSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgxLCB2YWx1ZSA9ICQkbmV3X3Byb3BzLnZhbHVlKTsKICAgIAkJaWYgKCJmaWxlcyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgyLCBmaWxlcyA9ICQkbmV3X3Byb3BzLmZpbGVzKTsKICAgIAkJaWYgKCJyZWFkb25seSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg0LCByZWFkb25seSA9ICQkbmV3X3Byb3BzLnJlYWRvbmx5KTsKICAgIAkJaWYgKCJtdWx0aXBsZSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg1LCBtdWx0aXBsZSA9ICQkbmV3X3Byb3BzLm11bHRpcGxlKTsKICAgIAkJaWYgKCJuYW1lIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDYsIG5hbWUgPSAkJG5ld19wcm9wcy5uYW1lKTsKICAgIAkJaWYgKCJwbGFjZWhvbGRlciIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg3LCBwbGFjZWhvbGRlciA9ICQkbmV3X3Byb3BzLnBsYWNlaG9sZGVyKTsKICAgIAkJaWYgKCJkaXNhYmxlZCIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg4LCBkaXNhYmxlZCA9ICQkbmV3X3Byb3BzLmRpc2FibGVkKTsKICAgIAkJaWYgKCIkJHNjb3BlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDIxLCAkJHNjb3BlID0gJCRuZXdfcHJvcHMuJCRzY29wZSk7CiAgICAJfTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsKICAgIAkJY2xhc3NuYW1lcywKICAgIAkJY2xhc3NOYW1lLAogICAgCQl0eXBlLAogICAgCQlzaXplLAogICAgCQlic1NpemUsCiAgICAJCWNvbG9yLAogICAgCQljaGVja2VkLAogICAgCQl2YWxpZCwKICAgIAkJaW52YWxpZCwKICAgIAkJcGxhaW50ZXh0LAogICAgCQlhZGRvbiwKICAgIAkJdmFsdWUsCiAgICAJCWZpbGVzLAogICAgCQlyZWFkb25seSwKICAgIAkJbXVsdGlwbGUsCiAgICAJCW5hbWUsCiAgICAJCXBsYWNlaG9sZGVyLAogICAgCQlkaXNhYmxlZCwKICAgIAkJY2xhc3NlcywKICAgIAkJdGFnLAogICAgCQloYW5kbGVJbnB1dAogICAgCX0pOwoKICAgIAkkJHNlbGYuJGluamVjdF9zdGF0ZSA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJaWYgKCJjbGFzc05hbWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxNSwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3NOYW1lKTsKICAgIAkJaWYgKCJ0eXBlIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMywgdHlwZSA9ICQkbmV3X3Byb3BzLnR5cGUpOwogICAgCQlpZiAoInNpemUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxMywgc2l6ZSA9ICQkbmV3X3Byb3BzLnNpemUpOwogICAgCQlpZiAoImJzU2l6ZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDE0LCBic1NpemUgPSAkJG5ld19wcm9wcy5ic1NpemUpOwogICAgCQlpZiAoImNvbG9yIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMTYsIGNvbG9yID0gJCRuZXdfcHJvcHMuY29sb3IpOwogICAgCQlpZiAoImNoZWNrZWQiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBjaGVja2VkID0gJCRuZXdfcHJvcHMuY2hlY2tlZCk7CiAgICAJCWlmICgidmFsaWQiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxNywgdmFsaWQgPSAkJG5ld19wcm9wcy52YWxpZCk7CiAgICAJCWlmICgiaW52YWxpZCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDE4LCBpbnZhbGlkID0gJCRuZXdfcHJvcHMuaW52YWxpZCk7CiAgICAJCWlmICgicGxhaW50ZXh0IiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMTksIHBsYWludGV4dCA9ICQkbmV3X3Byb3BzLnBsYWludGV4dCk7CiAgICAJCWlmICgiYWRkb24iIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgyMCwgYWRkb24gPSAkJG5ld19wcm9wcy5hZGRvbik7CiAgICAJCWlmICgidmFsdWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxLCB2YWx1ZSA9ICQkbmV3X3Byb3BzLnZhbHVlKTsKICAgIAkJaWYgKCJmaWxlcyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIGZpbGVzID0gJCRuZXdfcHJvcHMuZmlsZXMpOwogICAgCQlpZiAoInJlYWRvbmx5IiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNCwgcmVhZG9ubHkgPSAkJG5ld19wcm9wcy5yZWFkb25seSk7CiAgICAJCWlmICgibXVsdGlwbGUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg1LCBtdWx0aXBsZSA9ICQkbmV3X3Byb3BzLm11bHRpcGxlKTsKICAgIAkJaWYgKCJuYW1lIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNiwgbmFtZSA9ICQkbmV3X3Byb3BzLm5hbWUpOwogICAgCQlpZiAoInBsYWNlaG9sZGVyIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNywgcGxhY2Vob2xkZXIgPSAkJG5ld19wcm9wcy5wbGFjZWhvbGRlcik7CiAgICAJCWlmICgiZGlzYWJsZWQiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg4LCBkaXNhYmxlZCA9ICQkbmV3X3Byb3BzLmRpc2FibGVkKTsKICAgIAkJaWYgKCJjbGFzc2VzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoOSwgY2xhc3NlcyA9ICQkbmV3X3Byb3BzLmNsYXNzZXMpOwogICAgCQlpZiAoInRhZyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEwLCB0YWcgPSAkJG5ld19wcm9wcy50YWcpOwogICAgCX07CgogICAgCWlmICgkJHByb3BzICYmICIkJGluamVjdCIgaW4gJCRwcm9wcykgewogICAgCQkkJHNlbGYuJGluamVjdF9zdGF0ZSgkJHByb3BzLiQkaW5qZWN0KTsKICAgIAl9CgogICAgCSQkc2VsZi4kJC51cGRhdGUgPSAoKSA9PiB7CiAgICAJCWlmICgkJHNlbGYuJCQuZGlydHlbMF0gJiAvKnR5cGUsIHBsYWludGV4dCwgYWRkb24sIGNvbG9yLCBzaXplLCBjbGFzc05hbWUsIGludmFsaWQsIHZhbGlkLCBic1NpemUqLyAyMDg4OTY4KSB7CiAgICAJCQkgewogICAgCQkJCWNvbnN0IGNoZWNrSW5wdXQgPSBbInJhZGlvIiwgImNoZWNrYm94Il0uaW5kZXhPZih0eXBlKSA+IC0xOwogICAgCQkJCWNvbnN0IGlzTm90YU51bWJlciA9IG5ldyBSZWdFeHAoIlxcRCIsICJnIik7CiAgICAJCQkJY29uc3QgZmlsZUlucHV0ID0gdHlwZSA9PT0gImZpbGUiOwogICAgCQkJCWNvbnN0IHRleHRhcmVhSW5wdXQgPSB0eXBlID09PSAidGV4dGFyZWEiOwogICAgCQkJCWNvbnN0IHJhbmdlSW5wdXQgPSB0eXBlID09PSAicmFuZ2UiOwogICAgCQkJCWNvbnN0IHNlbGVjdElucHV0ID0gdHlwZSA9PT0gInNlbGVjdCI7CiAgICAJCQkJY29uc3QgYnV0dG9uSW5wdXQgPSB0eXBlID09PSAiYnV0dG9uIiB8fCB0eXBlID09PSAicmVzZXQiIHx8IHR5cGUgPT09ICJzdWJtaXQiOwogICAgCQkJCWNvbnN0IHVuc3VwcG9ydGVkSW5wdXQgPSB0eXBlID09PSAiaGlkZGVuIiB8fCB0eXBlID09PSAiaW1hZ2UiOwogICAgCQkJCSQkaW52YWxpZGF0ZSgxMCwgdGFnID0gc2VsZWN0SW5wdXQgfHwgdGV4dGFyZWFJbnB1dCA/IHR5cGUgOiAiaW5wdXQiKTsKICAgIAkJCQlsZXQgZm9ybUNvbnRyb2xDbGFzcyA9ICJmb3JtLWNvbnRyb2wiOwoKICAgIAkJCQlpZiAocGxhaW50ZXh0KSB7CiAgICAJCQkJCWZvcm1Db250cm9sQ2xhc3MgPSBgJHtmb3JtQ29udHJvbENsYXNzfS1wbGFpbnRleHRgOwogICAgCQkJCQkkJGludmFsaWRhdGUoMTAsIHRhZyA9ICJpbnB1dCIpOwogICAgCQkJCX0gZWxzZSBpZiAoZmlsZUlucHV0KSB7CiAgICAJCQkJCWZvcm1Db250cm9sQ2xhc3MgPSBgJHtmb3JtQ29udHJvbENsYXNzfS1maWxlYDsKICAgIAkJCQl9IGVsc2UgaWYgKGNoZWNrSW5wdXQpIHsKICAgIAkJCQkJaWYgKGFkZG9uKSB7CiAgICAJCQkJCQlmb3JtQ29udHJvbENsYXNzID0gbnVsbDsKICAgIAkJCQkJfSBlbHNlIHsKICAgIAkJCQkJCWZvcm1Db250cm9sQ2xhc3MgPSAiZm9ybS1jaGVjay1pbnB1dCI7CiAgICAJCQkJCX0KICAgIAkJCQl9IGVsc2UgaWYgKGJ1dHRvbklucHV0KSB7CiAgICAJCQkJCWZvcm1Db250cm9sQ2xhc3MgPSBgYnRuIGJ0bi0ke2NvbG9yIHx8ICJzZWNvbmRhcnkifWA7CiAgICAJCQkJfSBlbHNlIGlmIChyYW5nZUlucHV0KSB7CiAgICAJCQkJCWZvcm1Db250cm9sQ2xhc3MgPSAiZm9ybS1jb250cm9sLXJhbmdlIjsKICAgIAkJCQl9IGVsc2UgaWYgKHVuc3VwcG9ydGVkSW5wdXQpIHsKICAgIAkJCQkJZm9ybUNvbnRyb2xDbGFzcyA9ICIiOwogICAgCQkJCX0KCiAgICAJCQkJaWYgKHNpemUgJiYgaXNOb3RhTnVtYmVyLnRlc3Qoc2l6ZSkpIHsKICAgIAkJCQkJY29uc29sZS53YXJuKCJQbGVhc2UgdXNlIHRoZSBwcm9wIFwiYnNTaXplXCIgaW5zdGVhZCBvZiB0aGUgXCJzaXplXCIgdG8gYm9vdHN0cmFwJ3MgaW5wdXQgc2l6aW5nLiIpOwogICAgCQkJCQkkJGludmFsaWRhdGUoMTQsIGJzU2l6ZSA9IHNpemUpOwogICAgCQkJCQkkJGludmFsaWRhdGUoMTMsIHNpemUgPSB1bmRlZmluZWQpOwogICAgCQkJCX0KCiAgICAJCQkJJCRpbnZhbGlkYXRlKDksIGNsYXNzZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgaW52YWxpZCAmJiAiaXMtaW52YWxpZCIsIHZhbGlkICYmICJpcy12YWxpZCIsIGJzU2l6ZSA/IGBmb3JtLWNvbnRyb2wtJHtic1NpemV9YCA6IGZhbHNlLCBmb3JtQ29udHJvbENsYXNzKSk7CiAgICAJCQl9CiAgICAJCX0KICAgIAl9OwoKICAgIAlyZXR1cm4gWwogICAgCQljaGVja2VkLAogICAgCQl2YWx1ZSwKICAgIAkJZmlsZXMsCiAgICAJCXR5cGUsCiAgICAJCXJlYWRvbmx5LAogICAgCQltdWx0aXBsZSwKICAgIAkJbmFtZSwKICAgIAkJcGxhY2Vob2xkZXIsCiAgICAJCWRpc2FibGVkLAogICAgCQljbGFzc2VzLAogICAgCQl0YWcsCiAgICAJCWhhbmRsZUlucHV0LAogICAgCQkkJHJlc3RQcm9wcywKICAgIAkJc2l6ZSwKICAgIAkJYnNTaXplLAogICAgCQljbGFzc05hbWUsCiAgICAJCWNvbG9yLAogICAgCQl2YWxpZCwKICAgIAkJaW52YWxpZCwKICAgIAkJcGxhaW50ZXh0LAogICAgCQlhZGRvbiwKICAgIAkJJCRzY29wZSwKICAgIAkJc2xvdHMsCiAgICAJCWNoYW5nZV9oYW5kbGVyLAogICAgCQlibHVyX2hhbmRsZXIsCiAgICAJCWZvY3VzX2hhbmRsZXIsCiAgICAJCWtleWRvd25faGFuZGxlciwKICAgIAkJa2V5cHJlc3NfaGFuZGxlciwKICAgIAkJa2V5dXBfaGFuZGxlciwKICAgIAkJaW5wdXRfaGFuZGxlciwKICAgIAkJY2hhbmdlX2hhbmRsZXJfMSwKICAgIAkJYmx1cl9oYW5kbGVyXzEsCiAgICAJCWZvY3VzX2hhbmRsZXJfMSwKICAgIAkJa2V5ZG93bl9oYW5kbGVyXzEsCiAgICAJCWtleXByZXNzX2hhbmRsZXJfMSwKICAgIAkJa2V5dXBfaGFuZGxlcl8xLAogICAgCQlpbnB1dF9oYW5kbGVyXzEsCiAgICAJCWNoYW5nZV9oYW5kbGVyXzIsCiAgICAJCWJsdXJfaGFuZGxlcl8yLAogICAgCQlmb2N1c19oYW5kbGVyXzIsCiAgICAJCWtleWRvd25faGFuZGxlcl8yLAogICAgCQlrZXlwcmVzc19oYW5kbGVyXzIsCiAgICAJCWtleXVwX2hhbmRsZXJfMiwKICAgIAkJaW5wdXRfaGFuZGxlcl8yLAogICAgCQljaGFuZ2VfaGFuZGxlcl8zLAogICAgCQlibHVyX2hhbmRsZXJfMywKICAgIAkJZm9jdXNfaGFuZGxlcl8zLAogICAgCQlrZXlkb3duX2hhbmRsZXJfMywKICAgIAkJa2V5cHJlc3NfaGFuZGxlcl8zLAogICAgCQlrZXl1cF9oYW5kbGVyXzMsCiAgICAJCWlucHV0X2hhbmRsZXJfMywKICAgIAkJaW5wdXRfaGFuZGxlcl80LAogICAgCQlibHVyX2hhbmRsZXJfNCwKICAgIAkJZm9jdXNfaGFuZGxlcl80LAogICAgCQlrZXlkb3duX2hhbmRsZXJfNCwKICAgIAkJa2V5cHJlc3NfaGFuZGxlcl80LAogICAgCQlrZXl1cF9oYW5kbGVyXzQsCiAgICAJCWNoYW5nZV9oYW5kbGVyXzQsCiAgICAJCWNoYW5nZV9oYW5kbGVyXzUsCiAgICAJCWJsdXJfaGFuZGxlcl81LAogICAgCQlmb2N1c19oYW5kbGVyXzUsCiAgICAJCWtleWRvd25faGFuZGxlcl81LAogICAgCQlrZXlwcmVzc19oYW5kbGVyXzUsCiAgICAJCWtleXVwX2hhbmRsZXJfNSwKICAgIAkJaW5wdXRfaGFuZGxlcl81LAogICAgCQljaGFuZ2VfaGFuZGxlcl82LAogICAgCQlibHVyX2hhbmRsZXJfNiwKICAgIAkJZm9jdXNfaGFuZGxlcl82LAogICAgCQlrZXlkb3duX2hhbmRsZXJfNiwKICAgIAkJa2V5cHJlc3NfaGFuZGxlcl82LAogICAgCQlrZXl1cF9oYW5kbGVyXzYsCiAgICAJCWlucHV0X2hhbmRsZXJfNiwKICAgIAkJY2hhbmdlX2hhbmRsZXJfNywKICAgIAkJYmx1cl9oYW5kbGVyXzcsCiAgICAJCWZvY3VzX2hhbmRsZXJfNywKICAgIAkJa2V5ZG93bl9oYW5kbGVyXzcsCiAgICAJCWtleXByZXNzX2hhbmRsZXJfNywKICAgIAkJa2V5dXBfaGFuZGxlcl83LAogICAgCQlpbnB1dF9oYW5kbGVyXzcsCiAgICAJCWNoYW5nZV9oYW5kbGVyXzgsCiAgICAJCWJsdXJfaGFuZGxlcl84LAogICAgCQlmb2N1c19oYW5kbGVyXzgsCiAgICAJCWtleWRvd25faGFuZGxlcl84LAogICAgCQlrZXlwcmVzc19oYW5kbGVyXzgsCiAgICAJCWtleXVwX2hhbmRsZXJfOCwKICAgIAkJaW5wdXRfaGFuZGxlcl84LAogICAgCQljaGFuZ2VfaGFuZGxlcl85LAogICAgCQlibHVyX2hhbmRsZXJfOSwKICAgIAkJZm9jdXNfaGFuZGxlcl85LAogICAgCQlrZXlkb3duX2hhbmRsZXJfOSwKICAgIAkJa2V5cHJlc3NfaGFuZGxlcl85LAogICAgCQlrZXl1cF9oYW5kbGVyXzksCiAgICAJCWlucHV0X2hhbmRsZXJfOSwKICAgIAkJY2hhbmdlX2hhbmRsZXJfMTAsCiAgICAJCWJsdXJfaGFuZGxlcl8xMCwKICAgIAkJZm9jdXNfaGFuZGxlcl8xMCwKICAgIAkJa2V5ZG93bl9oYW5kbGVyXzEwLAogICAgCQlrZXlwcmVzc19oYW5kbGVyXzEwLAogICAgCQlrZXl1cF9oYW5kbGVyXzEwLAogICAgCQlpbnB1dF9oYW5kbGVyXzEwLAogICAgCQljaGFuZ2VfaGFuZGxlcl8xMSwKICAgIAkJYmx1cl9oYW5kbGVyXzExLAogICAgCQlmb2N1c19oYW5kbGVyXzExLAogICAgCQlrZXlkb3duX2hhbmRsZXJfMTEsCiAgICAJCWtleXByZXNzX2hhbmRsZXJfMTEsCiAgICAJCWtleXVwX2hhbmRsZXJfMTEsCiAgICAJCWlucHV0X2hhbmRsZXJfMTEsCiAgICAJCWNoYW5nZV9oYW5kbGVyXzEyLAogICAgCQlibHVyX2hhbmRsZXJfMTIsCiAgICAJCWZvY3VzX2hhbmRsZXJfMTIsCiAgICAJCWtleWRvd25faGFuZGxlcl8xMiwKICAgIAkJa2V5cHJlc3NfaGFuZGxlcl8xMiwKICAgIAkJa2V5dXBfaGFuZGxlcl8xMiwKICAgIAkJaW5wdXRfaGFuZGxlcl8xMiwKICAgIAkJY2hhbmdlX2hhbmRsZXJfMTMsCiAgICAJCWJsdXJfaGFuZGxlcl8xMywKICAgIAkJZm9jdXNfaGFuZGxlcl8xMywKICAgIAkJa2V5ZG93bl9oYW5kbGVyXzEzLAogICAgCQlrZXlwcmVzc19oYW5kbGVyXzEzLAogICAgCQlrZXl1cF9oYW5kbGVyXzEzLAogICAgCQlpbnB1dF9oYW5kbGVyXzEzLAogICAgCQlibHVyX2hhbmRsZXJfMTQsCiAgICAJCWZvY3VzX2hhbmRsZXJfMTQsCiAgICAJCWtleWRvd25faGFuZGxlcl8xNCwKICAgIAkJa2V5cHJlc3NfaGFuZGxlcl8xNCwKICAgIAkJa2V5dXBfaGFuZGxlcl8xNCwKICAgIAkJY2hhbmdlX2hhbmRsZXJfMTQsCiAgICAJCWJsdXJfaGFuZGxlcl8xNSwKICAgIAkJZm9jdXNfaGFuZGxlcl8xNSwKICAgIAkJa2V5ZG93bl9oYW5kbGVyXzE1LAogICAgCQlrZXlwcmVzc19oYW5kbGVyXzE1LAogICAgCQlrZXl1cF9oYW5kbGVyXzE1LAogICAgCQlpbnB1dF9oYW5kbGVyXzE0LAogICAgCQlibHVyX2hhbmRsZXJfMTYsCiAgICAJCWZvY3VzX2hhbmRsZXJfMTYsCiAgICAJCWNoYW5nZV9oYW5kbGVyXzE1LAogICAgCQlpbnB1dF9oYW5kbGVyXzE1LAogICAgCQlpbnB1dF9pbnB1dF9oYW5kbGVyLAogICAgCQlpbnB1dF9pbnB1dF9oYW5kbGVyXzEsCiAgICAJCWlucHV0X2lucHV0X2hhbmRsZXJfMiwKICAgIAkJaW5wdXRfY2hhbmdlX2hhbmRsZXIsCiAgICAJCWlucHV0X2NoYW5nZV9oYW5kbGVyXzEsCiAgICAJCWlucHV0X2NoYW5nZV9oYW5kbGVyXzIsCiAgICAJCWlucHV0X2lucHV0X2hhbmRsZXJfMywKICAgIAkJaW5wdXRfaW5wdXRfaGFuZGxlcl80LAogICAgCQlpbnB1dF9pbnB1dF9oYW5kbGVyXzUsCiAgICAJCWlucHV0X2lucHV0X2hhbmRsZXJfNiwKICAgIAkJaW5wdXRfaW5wdXRfaGFuZGxlcl83LAogICAgCQlpbnB1dF9pbnB1dF9oYW5kbGVyXzgsCiAgICAJCWlucHV0X2NoYW5nZV9pbnB1dF9oYW5kbGVyLAogICAgCQlpbnB1dF9pbnB1dF9oYW5kbGVyXzksCiAgICAJCXRleHRhcmVhX2lucHV0X2hhbmRsZXIsCiAgICAJCXNlbGVjdF9jaGFuZ2VfaGFuZGxlcgogICAgCV07CiAgICB9CgogICAgY2xhc3MgSW5wdXQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CgogICAgCQlpbml0KAogICAgCQkJdGhpcywKICAgIAkJCW9wdGlvbnMsCiAgICAJCQlpbnN0YW5jZSQ2LAogICAgCQkJY3JlYXRlX2ZyYWdtZW50JDYsCiAgICAJCQlzYWZlX25vdF9lcXVhbCwKICAgIAkJCXsKICAgIAkJCQljbGFzczogMTUsCiAgICAJCQkJdHlwZTogMywKICAgIAkJCQlzaXplOiAxMywKICAgIAkJCQlic1NpemU6IDE0LAogICAgCQkJCWNvbG9yOiAxNiwKICAgIAkJCQljaGVja2VkOiAwLAogICAgCQkJCXZhbGlkOiAxNywKICAgIAkJCQlpbnZhbGlkOiAxOCwKICAgIAkJCQlwbGFpbnRleHQ6IDE5LAogICAgCQkJCWFkZG9uOiAyMCwKICAgIAkJCQl2YWx1ZTogMSwKICAgIAkJCQlmaWxlczogMiwKICAgIAkJCQlyZWFkb25seTogNCwKICAgIAkJCQltdWx0aXBsZTogNSwKICAgIAkJCQluYW1lOiA2LAogICAgCQkJCXBsYWNlaG9sZGVyOiA3LAogICAgCQkJCWRpc2FibGVkOiA4CiAgICAJCQl9LAogICAgCQkJWy0xLCAtMSwgLTEsIC0xLCAtMV0KICAgIAkJKTsKCiAgICAJCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJDb21wb25lbnQiLCB7CiAgICAJCQljb21wb25lbnQ6IHRoaXMsCiAgICAJCQl0YWdOYW1lOiAiSW5wdXQiLAogICAgCQkJb3B0aW9ucywKICAgIAkJCWlkOiBjcmVhdGVfZnJhZ21lbnQkNi5uYW1lCiAgICAJCX0pOwogICAgCX0KCiAgICAJZ2V0IGNsYXNzKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjbGFzcyh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCB0eXBlKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCB0eXBlKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IHNpemUoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHNpemUodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8SW5wdXQ+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgYnNTaXplKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBic1NpemUodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8SW5wdXQ+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgY29sb3IoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGNvbG9yKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGNoZWNrZWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGNoZWNrZWQodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8SW5wdXQ+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgdmFsaWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHZhbGlkKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGludmFsaWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGludmFsaWQodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8SW5wdXQ+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgcGxhaW50ZXh0KCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBwbGFpbnRleHQodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8SW5wdXQ+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgYWRkb24oKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGFkZG9uKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IHZhbHVlKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCB2YWx1ZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBmaWxlcygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8SW5wdXQ+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgZmlsZXModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8SW5wdXQ+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgcmVhZG9ubHkoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHJlYWRvbmx5KHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IG11bHRpcGxlKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBtdWx0aXBsZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBuYW1lKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBuYW1lKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPElucHV0PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IHBsYWNlaG9sZGVyKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBwbGFjZWhvbGRlcih2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxJbnB1dD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBkaXNhYmxlZCgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8SW5wdXQ+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgZGlzYWJsZWQodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8SW5wdXQ+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQogICAgfQoKICAgIC8qIG5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvTGFiZWwuc3ZlbHRlIGdlbmVyYXRlZCBieSBTdmVsdGUgdjMuMzEuMiAqLwogICAgY29uc3QgZmlsZSQ3ID0gIm5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvTGFiZWwuc3ZlbHRlIjsKCiAgICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkNyhjdHgpIHsKICAgIAlsZXQgbGFiZWw7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbMTRdLmRlZmF1bHQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90ID0gY3JlYXRlX3Nsb3QoZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFsxM10sIG51bGwpOwoKICAgIAlsZXQgbGFiZWxfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzJdLAogICAgCQl7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbMV0gfSwKICAgIAkJeyBmb3I6IC8qZm9yZSovIGN0eFswXSB9CiAgICAJXTsKCiAgICAJbGV0IGxhYmVsX2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBsYWJlbF9sZXZlbHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJbGFiZWxfZGF0YSA9IGFzc2lnbihsYWJlbF9kYXRhLCBsYWJlbF9sZXZlbHNbaV0pOwogICAgCX0KCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWxhYmVsID0gZWxlbWVudCgibGFiZWwiKTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5jKCk7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhsYWJlbCwgbGFiZWxfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24obGFiZWwsIGZpbGUkNywgNjksIDAsIDE2MjUpOwogICAgCQl9LAogICAgCQlsOiBmdW5jdGlvbiBjbGFpbShub2RlcykgewogICAgCQkJdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zLmh5ZHJhdGUgb25seSB3b3JrcyBpZiB0aGUgY29tcG9uZW50IHdhcyBjb21waWxlZCB3aXRoIHRoZSBgaHlkcmF0YWJsZTogdHJ1ZWAgb3B0aW9uIik7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgbGFiZWwsIGFuY2hvcik7CgogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWRlZmF1bHRfc2xvdC5tKGxhYmVsLCBudWxsKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgW2RpcnR5XSkgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDgxOTIpIHsKICAgIAkJCQkJdXBkYXRlX3Nsb3QoZGVmYXVsdF9zbG90LCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzEzXSwgZGlydHksIG51bGwsIG51bGwpOwogICAgCQkJCX0KICAgIAkJCX0KCiAgICAJCQlzZXRfYXR0cmlidXRlcyhsYWJlbCwgbGFiZWxfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGxhYmVsX2xldmVscywgWwogICAgCQkJCWRpcnR5ICYgLyokJHJlc3RQcm9wcyovIDQgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsyXSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmNsYXNzZXMqLyAyKSAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbMV0gfSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmZvcmUqLyAxKSAmJiB7IGZvcjogLypmb3JlKi8gY3R4WzBdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYobGFiZWwpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZnJhZ21lbnQkNy5uYW1lLAogICAgCQl0eXBlOiAiY29tcG9uZW50IiwKICAgIAkJc291cmNlOiAiIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnN0YW5jZSQ3KCQkc2VsZiwgJCRwcm9wcywgJCRpbnZhbGlkYXRlKSB7CiAgICAJbGV0IGNsYXNzZXM7CiAgICAJY29uc3Qgb21pdF9wcm9wc19uYW1lcyA9IFsiY2xhc3MiLCJoaWRkZW4iLCJjaGVjayIsInNpemUiLCJmb3IiLCJ4cyIsInNtIiwibWQiLCJsZyIsInhsIiwid2lkdGhzIl07CiAgICAJbGV0ICQkcmVzdFByb3BzID0gY29tcHV0ZV9yZXN0X3Byb3BzKCQkcHJvcHMsIG9taXRfcHJvcHNfbmFtZXMpOwogICAgCWxldCB7ICQkc2xvdHM6IHNsb3RzID0ge30sICQkc2NvcGUgfSA9ICQkcHJvcHM7CiAgICAJdmFsaWRhdGVfc2xvdHMoIkxhYmVsIiwgc2xvdHMsIFsnZGVmYXVsdCddKTsKICAgIAlsZXQgeyBjbGFzczogY2xhc3NOYW1lID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgaGlkZGVuID0gZmFsc2UgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgY2hlY2sgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBzaXplID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgZm9yOiBmb3JlID0gbnVsbCB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyB4cyA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHNtID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgbWQgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBsZyA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHhsID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJY29uc3QgY29sV2lkdGhzID0geyB4cywgc20sIG1kLCBsZywgeGwgfTsKICAgIAlsZXQgeyB3aWR0aHMgPSBPYmplY3Qua2V5cyhjb2xXaWR0aHMpIH0gPSAkJHByb3BzOwogICAgCWNvbnN0IGNvbENsYXNzZXMgPSBbXTsKCiAgICAJd2lkdGhzLmZvckVhY2goY29sV2lkdGggPT4gewogICAgCQlsZXQgY29sdW1uUHJvcCA9ICQkcHJvcHNbY29sV2lkdGhdOwoKICAgIAkJaWYgKCFjb2x1bW5Qcm9wICYmIGNvbHVtblByb3AgIT09ICIiKSB7CiAgICAJCQlyZXR1cm47CiAgICAJCX0KCiAgICAJCWNvbnN0IGlzWHMgPSBjb2xXaWR0aCA9PT0gInhzIjsKICAgIAkJbGV0IGNvbENsYXNzOwoKICAgIAkJaWYgKGlzT2JqZWN0KGNvbHVtblByb3ApKSB7CiAgICAJCQljb25zdCBjb2xTaXplSW50ZXJmaXggPSBpc1hzID8gIi0iIDogYC0ke2NvbFdpZHRofS1gOwogICAgCQkJY29sQ2xhc3MgPSBnZXRDb2x1bW5TaXplQ2xhc3MoaXNYcywgY29sV2lkdGgsIGNvbHVtblByb3Auc2l6ZSk7CgogICAgCQkJY29sQ2xhc3Nlcy5wdXNoKGNsYXNzbmFtZXMoewogICAgCQkJCVtjb2xDbGFzc106IGNvbHVtblByb3Auc2l6ZSB8fCBjb2x1bW5Qcm9wLnNpemUgPT09ICIiLAogICAgCQkJCVtgb3JkZXIke2NvbFNpemVJbnRlcmZpeH0ke2NvbHVtblByb3Aub3JkZXJ9YF06IGNvbHVtblByb3Aub3JkZXIgfHwgY29sdW1uUHJvcC5vcmRlciA9PT0gMCwKICAgIAkJCQlbYG9mZnNldCR7Y29sU2l6ZUludGVyZml4fSR7Y29sdW1uUHJvcC5vZmZzZXR9YF06IGNvbHVtblByb3Aub2Zmc2V0IHx8IGNvbHVtblByb3Aub2Zmc2V0ID09PSAwCiAgICAJCQl9KSk7CiAgICAJCX0gZWxzZSB7CiAgICAJCQljb2xDbGFzcyA9IGdldENvbHVtblNpemVDbGFzcyhpc1hzLCBjb2xXaWR0aCwgY29sdW1uUHJvcCk7CiAgICAJCQljb2xDbGFzc2VzLnB1c2goY29sQ2xhc3MpOwogICAgCQl9CiAgICAJfSk7CgogICAgCSQkc2VsZi4kJHNldCA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJJCRpbnZhbGlkYXRlKDE3LCAkJHByb3BzID0gYXNzaWduKGFzc2lnbih7fSwgJCRwcm9wcyksIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMoJCRuZXdfcHJvcHMpKSk7CiAgICAJCSQkaW52YWxpZGF0ZSgyLCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKSk7CiAgICAJCWlmICgiY2xhc3MiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMywgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3MpOwogICAgCQlpZiAoImhpZGRlbiIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg0LCBoaWRkZW4gPSAkJG5ld19wcm9wcy5oaWRkZW4pOwogICAgCQlpZiAoImNoZWNrIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDUsIGNoZWNrID0gJCRuZXdfcHJvcHMuY2hlY2spOwogICAgCQlpZiAoInNpemUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNiwgc2l6ZSA9ICQkbmV3X3Byb3BzLnNpemUpOwogICAgCQlpZiAoImZvciIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBmb3JlID0gJCRuZXdfcHJvcHMuZm9yKTsKICAgIAkJaWYgKCJ4cyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg3LCB4cyA9ICQkbmV3X3Byb3BzLnhzKTsKICAgIAkJaWYgKCJzbSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg4LCBzbSA9ICQkbmV3X3Byb3BzLnNtKTsKICAgIAkJaWYgKCJtZCIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg5LCBtZCA9ICQkbmV3X3Byb3BzLm1kKTsKICAgIAkJaWYgKCJsZyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgxMCwgbGcgPSAkJG5ld19wcm9wcy5sZyk7CiAgICAJCWlmICgieGwiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTEsIHhsID0gJCRuZXdfcHJvcHMueGwpOwogICAgCQlpZiAoIndpZHRocyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgxMiwgd2lkdGhzID0gJCRuZXdfcHJvcHMud2lkdGhzKTsKICAgIAkJaWYgKCIkJHNjb3BlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDEzLCAkJHNjb3BlID0gJCRuZXdfcHJvcHMuJCRzY29wZSk7CiAgICAJfTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsKICAgIAkJY2xhc3NuYW1lcywKICAgIAkJZ2V0Q29sdW1uU2l6ZUNsYXNzLAogICAgCQlpc09iamVjdCwKICAgIAkJY2xhc3NOYW1lLAogICAgCQloaWRkZW4sCiAgICAJCWNoZWNrLAogICAgCQlzaXplLAogICAgCQlmb3JlLAogICAgCQl4cywKICAgIAkJc20sCiAgICAJCW1kLAogICAgCQlsZywKICAgIAkJeGwsCiAgICAJCWNvbFdpZHRocywKICAgIAkJd2lkdGhzLAogICAgCQljb2xDbGFzc2VzLAogICAgCQljbGFzc2VzCiAgICAJfSk7CgogICAgCSQkc2VsZi4kaW5qZWN0X3N0YXRlID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQkkJGludmFsaWRhdGUoMTcsICQkcHJvcHMgPSBhc3NpZ24oYXNzaWduKHt9LCAkJHByb3BzKSwgJCRuZXdfcHJvcHMpKTsKICAgIAkJaWYgKCJjbGFzc05hbWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgzLCBjbGFzc05hbWUgPSAkJG5ld19wcm9wcy5jbGFzc05hbWUpOwogICAgCQlpZiAoImhpZGRlbiIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDQsIGhpZGRlbiA9ICQkbmV3X3Byb3BzLmhpZGRlbik7CiAgICAJCWlmICgiY2hlY2siIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg1LCBjaGVjayA9ICQkbmV3X3Byb3BzLmNoZWNrKTsKICAgIAkJaWYgKCJzaXplIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNiwgc2l6ZSA9ICQkbmV3X3Byb3BzLnNpemUpOwogICAgCQlpZiAoImZvcmUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBmb3JlID0gJCRuZXdfcHJvcHMuZm9yZSk7CiAgICAJCWlmICgieHMiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg3LCB4cyA9ICQkbmV3X3Byb3BzLnhzKTsKICAgIAkJaWYgKCJzbSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDgsIHNtID0gJCRuZXdfcHJvcHMuc20pOwogICAgCQlpZiAoIm1kIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoOSwgbWQgPSAkJG5ld19wcm9wcy5tZCk7CiAgICAJCWlmICgibGciIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxMCwgbGcgPSAkJG5ld19wcm9wcy5sZyk7CiAgICAJCWlmICgieGwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxMSwgeGwgPSAkJG5ld19wcm9wcy54bCk7CiAgICAJCWlmICgid2lkdGhzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMTIsIHdpZHRocyA9ICQkbmV3X3Byb3BzLndpZHRocyk7CiAgICAJCWlmICgiY2xhc3NlcyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEsIGNsYXNzZXMgPSAkJG5ld19wcm9wcy5jbGFzc2VzKTsKICAgIAl9OwoKICAgIAlpZiAoJCRwcm9wcyAmJiAiJCRpbmplY3QiIGluICQkcHJvcHMpIHsKICAgIAkJJCRzZWxmLiRpbmplY3Rfc3RhdGUoJCRwcm9wcy4kJGluamVjdCk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCQudXBkYXRlID0gKCkgPT4gewogICAgCQlpZiAoJCRzZWxmLiQkLmRpcnR5ICYgLypjbGFzc05hbWUsIGhpZGRlbiwgY2hlY2ssIHNpemUqLyAxMjApIHsKICAgIAkJCSAkJGludmFsaWRhdGUoMSwgY2xhc3NlcyA9IGNsYXNzbmFtZXMoY2xhc3NOYW1lLCBoaWRkZW4gPyAic3Itb25seSIgOiBmYWxzZSwgY2hlY2sgPyAiZm9ybS1jaGVjay1sYWJlbCIgOiBmYWxzZSwgc2l6ZSA/IGBjb2wtZm9ybS1sYWJlbC0ke3NpemV9YCA6IGZhbHNlLCBjb2xDbGFzc2VzLCBjb2xDbGFzc2VzLmxlbmd0aCA/ICJjb2wtZm9ybS1sYWJlbCIgOiBmYWxzZSkpOwogICAgCQl9CiAgICAJfTsKCiAgICAJJCRwcm9wcyA9IGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMoJCRwcm9wcyk7CgogICAgCXJldHVybiBbCiAgICAJCWZvcmUsCiAgICAJCWNsYXNzZXMsCiAgICAJCSQkcmVzdFByb3BzLAogICAgCQljbGFzc05hbWUsCiAgICAJCWhpZGRlbiwKICAgIAkJY2hlY2ssCiAgICAJCXNpemUsCiAgICAJCXhzLAogICAgCQlzbSwKICAgIAkJbWQsCiAgICAJCWxnLAogICAgCQl4bCwKICAgIAkJd2lkdGhzLAogICAgCQkkJHNjb3BlLAogICAgCQlzbG90cwogICAgCV07CiAgICB9CgogICAgY2xhc3MgTGFiZWwgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CgogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJDcsIGNyZWF0ZV9mcmFnbWVudCQ3LCBzYWZlX25vdF9lcXVhbCwgewogICAgCQkJY2xhc3M6IDMsCiAgICAJCQloaWRkZW46IDQsCiAgICAJCQljaGVjazogNSwKICAgIAkJCXNpemU6IDYsCiAgICAJCQlmb3I6IDAsCiAgICAJCQl4czogNywKICAgIAkJCXNtOiA4LAogICAgCQkJbWQ6IDksCiAgICAJCQlsZzogMTAsCiAgICAJCQl4bDogMTEsCiAgICAJCQl3aWR0aHM6IDEyCiAgICAJCX0pOwoKICAgIAkJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckNvbXBvbmVudCIsIHsKICAgIAkJCWNvbXBvbmVudDogdGhpcywKICAgIAkJCXRhZ05hbWU6ICJMYWJlbCIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudCQ3Lm5hbWUKICAgIAkJfSk7CiAgICAJfQoKICAgIAlnZXQgY2xhc3MoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExhYmVsPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGNsYXNzKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExhYmVsPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGhpZGRlbigpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGFiZWw+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgaGlkZGVuKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExhYmVsPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGNoZWNrKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMYWJlbD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjaGVjayh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMYWJlbD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBzaXplKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMYWJlbD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBzaXplKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExhYmVsPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGZvcigpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGFiZWw+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgZm9yKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExhYmVsPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IHhzKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMYWJlbD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCB4cyh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMYWJlbD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBzbSgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGFiZWw+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgc20odmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGFiZWw+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgbWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExhYmVsPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IG1kKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExhYmVsPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGxnKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMYWJlbD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBsZyh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMYWJlbD46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCB4bCgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGFiZWw+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgeGwodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGFiZWw+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgd2lkdGhzKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMYWJlbD46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCB3aWR0aHModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGFiZWw+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQogICAgfQoKICAgIC8qIG5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvTGlzdEdyb3VwLnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjMxLjIgKi8KICAgIGNvbnN0IGZpbGUkOCA9ICJub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL0xpc3RHcm91cC5zdmVsdGUiOwoKICAgIGZ1bmN0aW9uIGNyZWF0ZV9mcmFnbWVudCQ4KGN0eCkgewogICAgCWxldCB1bDsKICAgIAlsZXQgY3VycmVudDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUgPSAvKiNzbG90cyovIGN0eFs1XS5kZWZhdWx0OwogICAgCWNvbnN0IGRlZmF1bHRfc2xvdCA9IGNyZWF0ZV9zbG90KGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbNF0sIG51bGwpOwogICAgCWxldCB1bF9sZXZlbHMgPSBbLyokJHJlc3RQcm9wcyovIGN0eFsxXSwgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzBdIH1dOwogICAgCWxldCB1bF9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgdWxfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCXVsX2RhdGEgPSBhc3NpZ24odWxfZGF0YSwgdWxfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl1bCA9IGVsZW1lbnQoInVsIik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXModWwsIHVsX2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKHVsLCBmaWxlJDgsIDE0LCAwLCAyNDUpOwogICAgCQl9LAogICAgCQlsOiBmdW5jdGlvbiBjbGFpbShub2RlcykgewogICAgCQkJdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zLmh5ZHJhdGUgb25seSB3b3JrcyBpZiB0aGUgY29tcG9uZW50IHdhcyBjb21waWxlZCB3aXRoIHRoZSBgaHlkcmF0YWJsZTogdHJ1ZWAgb3B0aW9uIik7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdWwsIGFuY2hvcik7CgogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWRlZmF1bHRfc2xvdC5tKHVsLCBudWxsKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgW2RpcnR5XSkgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDE2KSB7CiAgICAJCQkJCXVwZGF0ZV9zbG90KGRlZmF1bHRfc2xvdCwgZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFs0XSwgZGlydHksIG51bGwsIG51bGwpOwogICAgCQkJCX0KICAgIAkJCX0KCiAgICAJCQlzZXRfYXR0cmlidXRlcyh1bCwgdWxfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKHVsX2xldmVscywgWwogICAgCQkJCWRpcnR5ICYgLyokJHJlc3RQcm9wcyovIDIgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsxXSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmNsYXNzZXMqLyAxKSAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbMF0gfQogICAgCQkJXSkpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih1bCk7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuZChkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9mcmFnbWVudCQ4Lm5hbWUsCiAgICAJCXR5cGU6ICJjb21wb25lbnQiLAogICAgCQlzb3VyY2U6ICIiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RhbmNlJDgoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHsKICAgIAlsZXQgY2xhc3NlczsKICAgIAljb25zdCBvbWl0X3Byb3BzX25hbWVzID0gWyJjbGFzcyIsImZsdXNoIl07CiAgICAJbGV0ICQkcmVzdFByb3BzID0gY29tcHV0ZV9yZXN0X3Byb3BzKCQkcHJvcHMsIG9taXRfcHJvcHNfbmFtZXMpOwogICAgCWxldCB7ICQkc2xvdHM6IHNsb3RzID0ge30sICQkc2NvcGUgfSA9ICQkcHJvcHM7CiAgICAJdmFsaWRhdGVfc2xvdHMoIkxpc3RHcm91cCIsIHNsb3RzLCBbJ2RlZmF1bHQnXSk7CiAgICAJbGV0IHsgY2xhc3M6IGNsYXNzTmFtZSA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGZsdXNoID0gZmFsc2UgfSA9ICQkcHJvcHM7CgogICAgCSQkc2VsZi4kJHNldCA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJJCRwcm9wcyA9IGFzc2lnbihhc3NpZ24oe30sICQkcHJvcHMpLCBleGNsdWRlX2ludGVybmFsX3Byb3BzKCQkbmV3X3Byb3BzKSk7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKSk7CiAgICAJCWlmICgiY2xhc3MiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMiwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3MpOwogICAgCQlpZiAoImZsdXNoIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDMsIGZsdXNoID0gJCRuZXdfcHJvcHMuZmx1c2gpOwogICAgCQlpZiAoIiQkc2NvcGUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNCwgJCRzY29wZSA9ICQkbmV3X3Byb3BzLiQkc2NvcGUpOwogICAgCX07CgogICAgCSQkc2VsZi4kY2FwdHVyZV9zdGF0ZSA9ICgpID0+ICh7IGNsYXNzbmFtZXMsIGNsYXNzTmFtZSwgZmx1c2gsIGNsYXNzZXMgfSk7CgogICAgCSQkc2VsZi4kaW5qZWN0X3N0YXRlID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQlpZiAoImNsYXNzTmFtZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzTmFtZSk7CiAgICAJCWlmICgiZmx1c2giIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgzLCBmbHVzaCA9ICQkbmV3X3Byb3BzLmZsdXNoKTsKICAgIAkJaWYgKCJjbGFzc2VzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMCwgY2xhc3NlcyA9ICQkbmV3X3Byb3BzLmNsYXNzZXMpOwogICAgCX07CgogICAgCWlmICgkJHByb3BzICYmICIkJGluamVjdCIgaW4gJCRwcm9wcykgewogICAgCQkkJHNlbGYuJGluamVjdF9zdGF0ZSgkJHByb3BzLiQkaW5qZWN0KTsKICAgIAl9CgogICAgCSQkc2VsZi4kJC51cGRhdGUgPSAoKSA9PiB7CiAgICAJCWlmICgkJHNlbGYuJCQuZGlydHkgJiAvKmNsYXNzTmFtZSwgZmx1c2gqLyAxMikgewogICAgCQkJICQkaW52YWxpZGF0ZSgwLCBjbGFzc2VzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsICJsaXN0LWdyb3VwIiwgZmx1c2ggPyAibGlzdC1ncm91cC1mbHVzaCIgOiBmYWxzZSkpOwogICAgCQl9CiAgICAJfTsKCiAgICAJcmV0dXJuIFtjbGFzc2VzLCAkJHJlc3RQcm9wcywgY2xhc3NOYW1lLCBmbHVzaCwgJCRzY29wZSwgc2xvdHNdOwogICAgfQoKICAgIGNsYXNzIExpc3RHcm91cCBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudERldiB7CiAgICAJY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgCQlzdXBlcihvcHRpb25zKTsKICAgIAkJaW5pdCh0aGlzLCBvcHRpb25zLCBpbnN0YW5jZSQ4LCBjcmVhdGVfZnJhZ21lbnQkOCwgc2FmZV9ub3RfZXF1YWwsIHsgY2xhc3M6IDIsIGZsdXNoOiAzIH0pOwoKICAgIAkJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckNvbXBvbmVudCIsIHsKICAgIAkJCWNvbXBvbmVudDogdGhpcywKICAgIAkJCXRhZ05hbWU6ICJMaXN0R3JvdXAiLAogICAgCQkJb3B0aW9ucywKICAgIAkJCWlkOiBjcmVhdGVfZnJhZ21lbnQkOC5uYW1lCiAgICAJCX0pOwogICAgCX0KCiAgICAJZ2V0IGNsYXNzKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMaXN0R3JvdXA+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgY2xhc3ModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGlzdEdyb3VwPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGZsdXNoKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMaXN0R3JvdXA+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgZmx1c2godmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGlzdEdyb3VwPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KICAgIH0KCiAgICAvKiBub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL0xpc3RHcm91cEl0ZW0uc3ZlbHRlIGdlbmVyYXRlZCBieSBTdmVsdGUgdjMuMzEuMiAqLwogICAgY29uc3QgZmlsZSQ5ID0gIm5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvTGlzdEdyb3VwSXRlbS5zdmVsdGUiOwoKICAgIC8vICgzNzowKSB7OmVsc2V9CiAgICBmdW5jdGlvbiBjcmVhdGVfZWxzZV9ibG9jayQzKGN0eCkgewogICAgCWxldCBsaTsKICAgIAlsZXQgY3VycmVudDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUgPSAvKiNzbG90cyovIGN0eFsxMF0uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzldLCBudWxsKTsKCiAgICAJbGV0IGxpX2xldmVscyA9IFsKICAgIAkJLyokJHJlc3RQcm9wcyovIGN0eFs1XSwKICAgIAkJeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzRdIH0sCiAgICAJCXsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbMV0gfSwKICAgIAkJeyBhY3RpdmU6IC8qYWN0aXZlKi8gY3R4WzBdIH0KICAgIAldOwoKICAgIAlsZXQgbGlfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGxpX2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlsaV9kYXRhID0gYXNzaWduKGxpX2RhdGEsIGxpX2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJbGkgPSBlbGVtZW50KCJsaSIpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmMoKTsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGxpLCBsaV9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbihsaSwgZmlsZSQ5LCAzNywgMiwgNzc5KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBsaSwgYW5jaG9yKTsKCiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJZGVmYXVsdF9zbG90Lm0obGksIG51bGwpOwogICAgCQkJfQoKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDUxMikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbOV0sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMobGksIGxpX2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShsaV9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyAzMiAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzVdLAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qY2xhc3NlcyovIDE2KSAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNF0gfSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmRpc2FibGVkKi8gMikgJiYgeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFsxXSB9LAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qYWN0aXZlKi8gMSkgJiYgeyBhY3RpdmU6IC8qYWN0aXZlKi8gY3R4WzBdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYobGkpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZWxzZV9ibG9jayQzLm5hbWUsCiAgICAJCXR5cGU6ICJlbHNlIiwKICAgIAkJc291cmNlOiAiKDM3OjApIHs6ZWxzZX0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgyNzoyNykgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMSQyKGN0eCkgewogICAgCWxldCBidXR0b247CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJbGV0IG1vdW50ZWQ7CiAgICAJbGV0IGRpc3Bvc2U7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbMTBdLmRlZmF1bHQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90ID0gY3JlYXRlX3Nsb3QoZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFs5XSwgbnVsbCk7CgogICAgCWxldCBidXR0b25fbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzVdLAogICAgCQl7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNF0gfSwKICAgIAkJeyB0eXBlOiAiYnV0dG9uIiB9LAogICAgCQl7IGRpc2FibGVkOiAvKmRpc2FibGVkKi8gY3R4WzFdIH0sCiAgICAJCXsgYWN0aXZlOiAvKmFjdGl2ZSovIGN0eFswXSB9CiAgICAJXTsKCiAgICAJbGV0IGJ1dHRvbl9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgYnV0dG9uX2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlidXR0b25fZGF0YSA9IGFzc2lnbihidXR0b25fZGF0YSwgYnV0dG9uX2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJYnV0dG9uID0gZWxlbWVudCgiYnV0dG9uIik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoYnV0dG9uLCBidXR0b25fZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oYnV0dG9uLCBmaWxlJDksIDI3LCAyLCA2MzUpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGJ1dHRvbiwgYW5jaG9yKTsKCiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJZGVmYXVsdF9zbG90Lm0oYnV0dG9uLCBudWxsKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gbGlzdGVuX2RldihidXR0b24sICJjbGljayIsIC8qY2xpY2tfaGFuZGxlciovIGN0eFsxMV0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgCQkJCW1vdW50ZWQgPSB0cnVlOwogICAgCQkJfQogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDUxMikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbOV0sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMoYnV0dG9uLCBidXR0b25fZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGJ1dHRvbl9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyAzMiAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzVdLAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qY2xhc3NlcyovIDE2KSAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNF0gfSwKICAgIAkJCQl7IHR5cGU6ICJidXR0b24iIH0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypkaXNhYmxlZCovIDIpICYmIHsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbMV0gfSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmFjdGl2ZSovIDEpICYmIHsgYWN0aXZlOiAvKmFjdGl2ZSovIGN0eFswXSB9CiAgICAJCQldKSk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGJ1dHRvbik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuZChkZXRhY2hpbmcpOwogICAgCQkJbW91bnRlZCA9IGZhbHNlOwogICAgCQkJZGlzcG9zZSgpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9ja18xJDIubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDI3OjI3KSAiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgyMzowKSB7I2lmIGhyZWZ9CiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2skMyhjdHgpIHsKICAgIAlsZXQgYTsKICAgIAlsZXQgY3VycmVudDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUgPSAvKiNzbG90cyovIGN0eFsxMF0uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzldLCBudWxsKTsKCiAgICAJbGV0IGFfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzVdLAogICAgCQl7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNF0gfSwKICAgIAkJeyBocmVmOiAvKmhyZWYqLyBjdHhbMl0gfSwKICAgIAkJeyBkaXNhYmxlZDogLypkaXNhYmxlZCovIGN0eFsxXSB9LAogICAgCQl7IGFjdGl2ZTogLyphY3RpdmUqLyBjdHhbMF0gfQogICAgCV07CgogICAgCWxldCBhX2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBhX2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlhX2RhdGEgPSBhc3NpZ24oYV9kYXRhLCBhX2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJYSA9IGVsZW1lbnQoImEiKTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5jKCk7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhhLCBhX2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGEsIGZpbGUkOSwgMjMsIDIsIDUyMSk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgYSwgYW5jaG9yKTsKCiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJZGVmYXVsdF9zbG90Lm0oYSwgbnVsbCk7CiAgICAJCQl9CgogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJaWYgKGRlZmF1bHRfc2xvdC5wICYmIGRpcnR5ICYgLyokJHNjb3BlKi8gNTEyKSB7CiAgICAJCQkJCXVwZGF0ZV9zbG90KGRlZmF1bHRfc2xvdCwgZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFs5XSwgZGlydHksIG51bGwsIG51bGwpOwogICAgCQkJCX0KICAgIAkJCX0KCiAgICAJCQlzZXRfYXR0cmlidXRlcyhhLCBhX2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShhX2xldmVscywgWwogICAgCQkJCWRpcnR5ICYgLyokJHJlc3RQcm9wcyovIDMyICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbNV0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gMTYpICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs0XSB9LAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qaHJlZiovIDQpICYmIHsgaHJlZjogLypocmVmKi8gY3R4WzJdIH0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypkaXNhYmxlZCovIDIpICYmIHsgZGlzYWJsZWQ6IC8qZGlzYWJsZWQqLyBjdHhbMV0gfSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmFjdGl2ZSovIDEpICYmIHsgYWN0aXZlOiAvKmFjdGl2ZSovIGN0eFswXSB9CiAgICAJCQldKSk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGEpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2skMy5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoMjM6MCkgeyNpZiBocmVmfSIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlX2ZyYWdtZW50JDkoY3R4KSB7CiAgICAJbGV0IGN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleDsKICAgIAlsZXQgaWZfYmxvY2s7CiAgICAJbGV0IGlmX2Jsb2NrX2FuY2hvcjsKICAgIAlsZXQgY3VycmVudDsKICAgIAljb25zdCBpZl9ibG9ja19jcmVhdG9ycyA9IFtjcmVhdGVfaWZfYmxvY2skMywgY3JlYXRlX2lmX2Jsb2NrXzEkMiwgY3JlYXRlX2Vsc2VfYmxvY2skM107CiAgICAJY29uc3QgaWZfYmxvY2tzID0gW107CgogICAgCWZ1bmN0aW9uIHNlbGVjdF9ibG9ja190eXBlKGN0eCwgZGlydHkpIHsKICAgIAkJaWYgKC8qaHJlZiovIGN0eFsyXSkgcmV0dXJuIDA7CiAgICAJCWlmICgvKnRhZyovIGN0eFszXSA9PT0gImJ1dHRvbiIpIHJldHVybiAxOwogICAgCQlyZXR1cm4gMjsKICAgIAl9CgogICAgCWN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleCA9IHNlbGVjdF9ibG9ja190eXBlKGN0eCk7CiAgICAJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlmX2Jsb2NrLmMoKTsKICAgIAkJCWlmX2Jsb2NrX2FuY2hvciA9IGVtcHR5KCk7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdLm0odGFyZ2V0LCBhbmNob3IpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGlmX2Jsb2NrX2FuY2hvciwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBbZGlydHldKSB7CiAgICAJCQlsZXQgcHJldmlvdXNfYmxvY2tfaW5kZXggPSBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7CiAgICAJCQljdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZShjdHgpOwoKICAgIAkJCWlmIChjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPT09IHByZXZpb3VzX2Jsb2NrX2luZGV4KSB7CiAgICAJCQkJaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0ucChjdHgsIGRpcnR5KTsKICAgIAkJCX0gZWxzZSB7CiAgICAJCQkJZ3JvdXBfb3V0cm9zKCk7CgogICAgCQkJCXRyYW5zaXRpb25fb3V0KGlmX2Jsb2Nrc1twcmV2aW91c19ibG9ja19pbmRleF0sIDEsIDEsICgpID0+IHsKICAgIAkJCQkJaWZfYmxvY2tzW3ByZXZpb3VzX2Jsb2NrX2luZGV4XSA9IG51bGw7CiAgICAJCQkJfSk7CgogICAgCQkJCWNoZWNrX291dHJvcygpOwogICAgCQkJCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF07CgogICAgCQkJCWlmICghaWZfYmxvY2spIHsKICAgIAkJCQkJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTsKICAgIAkJCQkJaWZfYmxvY2suYygpOwogICAgCQkJCX0gZWxzZSB7CiAgICAJCQkJCWlmX2Jsb2NrLnAoY3R4LCBkaXJ0eSk7CiAgICAJCQkJfQoKICAgIAkJCQl0cmFuc2l0aW9uX2luKGlmX2Jsb2NrLCAxKTsKICAgIAkJCQlpZl9ibG9jay5tKGlmX2Jsb2NrX2FuY2hvci5wYXJlbnROb2RlLCBpZl9ibG9ja19hbmNob3IpOwogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oaWZfYmxvY2spOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChpZl9ibG9jayk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5kKGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlmX2Jsb2NrX2FuY2hvcik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2ZyYWdtZW50JDkubmFtZSwKICAgIAkJdHlwZTogImNvbXBvbmVudCIsCiAgICAJCXNvdXJjZTogIiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2UkOSgkJHNlbGYsICQkcHJvcHMsICQkaW52YWxpZGF0ZSkgewogICAgCWxldCBjbGFzc2VzOwogICAgCWNvbnN0IG9taXRfcHJvcHNfbmFtZXMgPSBbImNsYXNzIiwiYWN0aXZlIiwiZGlzYWJsZWQiLCJjb2xvciIsImFjdGlvbiIsImhyZWYiLCJ0YWciXTsKICAgIAlsZXQgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcyk7CiAgICAJbGV0IHsgJCRzbG90czogc2xvdHMgPSB7fSwgJCRzY29wZSB9ID0gJCRwcm9wczsKICAgIAl2YWxpZGF0ZV9zbG90cygiTGlzdEdyb3VwSXRlbSIsIHNsb3RzLCBbJ2RlZmF1bHQnXSk7CiAgICAJbGV0IHsgY2xhc3M6IGNsYXNzTmFtZSA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGFjdGl2ZSA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGRpc2FibGVkID0gZmFsc2UgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgY29sb3IgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBhY3Rpb24gPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBocmVmID0gbnVsbCB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyB0YWcgPSBudWxsIH0gPSAkJHByb3BzOwoKICAgIAlmdW5jdGlvbiBjbGlja19oYW5kbGVyKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCSQkc2VsZi4kJHNldCA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJJCRwcm9wcyA9IGFzc2lnbihhc3NpZ24oe30sICQkcHJvcHMpLCBleGNsdWRlX2ludGVybmFsX3Byb3BzKCQkbmV3X3Byb3BzKSk7CiAgICAJCSQkaW52YWxpZGF0ZSg1LCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKSk7CiAgICAJCWlmICgiY2xhc3MiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNiwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3MpOwogICAgCQlpZiAoImFjdGl2ZSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBhY3RpdmUgPSAkJG5ld19wcm9wcy5hY3RpdmUpOwogICAgCQlpZiAoImRpc2FibGVkIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDEsIGRpc2FibGVkID0gJCRuZXdfcHJvcHMuZGlzYWJsZWQpOwogICAgCQlpZiAoImNvbG9yIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDcsIGNvbG9yID0gJCRuZXdfcHJvcHMuY29sb3IpOwogICAgCQlpZiAoImFjdGlvbiIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg4LCBhY3Rpb24gPSAkJG5ld19wcm9wcy5hY3Rpb24pOwogICAgCQlpZiAoImhyZWYiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMiwgaHJlZiA9ICQkbmV3X3Byb3BzLmhyZWYpOwogICAgCQlpZiAoInRhZyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgzLCB0YWcgPSAkJG5ld19wcm9wcy50YWcpOwogICAgCQlpZiAoIiQkc2NvcGUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoOSwgJCRzY29wZSA9ICQkbmV3X3Byb3BzLiQkc2NvcGUpOwogICAgCX07CgogICAgCSQkc2VsZi4kY2FwdHVyZV9zdGF0ZSA9ICgpID0+ICh7CiAgICAJCWNsYXNzbmFtZXMsCiAgICAJCWNsYXNzTmFtZSwKICAgIAkJYWN0aXZlLAogICAgCQlkaXNhYmxlZCwKICAgIAkJY29sb3IsCiAgICAJCWFjdGlvbiwKICAgIAkJaHJlZiwKICAgIAkJdGFnLAogICAgCQljbGFzc2VzCiAgICAJfSk7CgogICAgCSQkc2VsZi4kaW5qZWN0X3N0YXRlID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQlpZiAoImNsYXNzTmFtZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDYsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzTmFtZSk7CiAgICAJCWlmICgiYWN0aXZlIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMCwgYWN0aXZlID0gJCRuZXdfcHJvcHMuYWN0aXZlKTsKICAgIAkJaWYgKCJkaXNhYmxlZCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEsIGRpc2FibGVkID0gJCRuZXdfcHJvcHMuZGlzYWJsZWQpOwogICAgCQlpZiAoImNvbG9yIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNywgY29sb3IgPSAkJG5ld19wcm9wcy5jb2xvcik7CiAgICAJCWlmICgiYWN0aW9uIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoOCwgYWN0aW9uID0gJCRuZXdfcHJvcHMuYWN0aW9uKTsKICAgIAkJaWYgKCJocmVmIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMiwgaHJlZiA9ICQkbmV3X3Byb3BzLmhyZWYpOwogICAgCQlpZiAoInRhZyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIHRhZyA9ICQkbmV3X3Byb3BzLnRhZyk7CiAgICAJCWlmICgiY2xhc3NlcyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDQsIGNsYXNzZXMgPSAkJG5ld19wcm9wcy5jbGFzc2VzKTsKICAgIAl9OwoKICAgIAlpZiAoJCRwcm9wcyAmJiAiJCRpbmplY3QiIGluICQkcHJvcHMpIHsKICAgIAkJJCRzZWxmLiRpbmplY3Rfc3RhdGUoJCRwcm9wcy4kJGluamVjdCk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCQudXBkYXRlID0gKCkgPT4gewogICAgCQlpZiAoJCRzZWxmLiQkLmRpcnR5ICYgLypjbGFzc05hbWUsIGFjdGl2ZSwgZGlzYWJsZWQsIGFjdGlvbiwgY29sb3IqLyA0NTEpIHsKICAgIAkJCSAkJGludmFsaWRhdGUoNCwgY2xhc3NlcyA9IGNsYXNzbmFtZXMoY2xhc3NOYW1lLCBhY3RpdmUgPyAiYWN0aXZlIiA6IGZhbHNlLCBkaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiBmYWxzZSwgYWN0aW9uID8gImxpc3QtZ3JvdXAtaXRlbS1hY3Rpb24iIDogZmFsc2UsIGNvbG9yID8gYGxpc3QtZ3JvdXAtaXRlbS0ke2NvbG9yfWAgOiBmYWxzZSwgImxpc3QtZ3JvdXAtaXRlbSIpKTsKICAgIAkJfQogICAgCX07CgogICAgCXJldHVybiBbCiAgICAJCWFjdGl2ZSwKICAgIAkJZGlzYWJsZWQsCiAgICAJCWhyZWYsCiAgICAJCXRhZywKICAgIAkJY2xhc3NlcywKICAgIAkJJCRyZXN0UHJvcHMsCiAgICAJCWNsYXNzTmFtZSwKICAgIAkJY29sb3IsCiAgICAJCWFjdGlvbiwKICAgIAkJJCRzY29wZSwKICAgIAkJc2xvdHMsCiAgICAJCWNsaWNrX2hhbmRsZXIKICAgIAldOwogICAgfQoKICAgIGNsYXNzIExpc3RHcm91cEl0ZW0gZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CgogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJDksIGNyZWF0ZV9mcmFnbWVudCQ5LCBzYWZlX25vdF9lcXVhbCwgewogICAgCQkJY2xhc3M6IDYsCiAgICAJCQlhY3RpdmU6IDAsCiAgICAJCQlkaXNhYmxlZDogMSwKICAgIAkJCWNvbG9yOiA3LAogICAgCQkJYWN0aW9uOiA4LAogICAgCQkJaHJlZjogMiwKICAgIAkJCXRhZzogMwogICAgCQl9KTsKCiAgICAJCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJDb21wb25lbnQiLCB7CiAgICAJCQljb21wb25lbnQ6IHRoaXMsCiAgICAJCQl0YWdOYW1lOiAiTGlzdEdyb3VwSXRlbSIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudCQ5Lm5hbWUKICAgIAkJfSk7CiAgICAJfQoKICAgIAlnZXQgY2xhc3MoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExpc3RHcm91cEl0ZW0+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgY2xhc3ModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGlzdEdyb3VwSXRlbT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBhY3RpdmUoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExpc3RHcm91cEl0ZW0+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgYWN0aXZlKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExpc3RHcm91cEl0ZW0+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgZGlzYWJsZWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExpc3RHcm91cEl0ZW0+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgZGlzYWJsZWQodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGlzdEdyb3VwSXRlbT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBjb2xvcigpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGlzdEdyb3VwSXRlbT46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjb2xvcih2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMaXN0R3JvdXBJdGVtPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGFjdGlvbigpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGlzdEdyb3VwSXRlbT46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBhY3Rpb24odmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGlzdEdyb3VwSXRlbT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBocmVmKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxMaXN0R3JvdXBJdGVtPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGhyZWYodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TGlzdEdyb3VwSXRlbT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCB0YWcoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExpc3RHcm91cEl0ZW0+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgdGFnKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPExpc3RHcm91cEl0ZW0+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQogICAgfQoKICAgIC8qIG5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvTWVkaWEuc3ZlbHRlIGdlbmVyYXRlZCBieSBTdmVsdGUgdjMuMzEuMiAqLwogICAgY29uc3QgZmlsZSRhID0gIm5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvTWVkaWEuc3ZlbHRlIjsKCiAgICAvLyAoNTY6MCkgezplbHNlfQogICAgZnVuY3Rpb24gY3JlYXRlX2Vsc2VfYmxvY2skNChjdHgpIHsKICAgIAlsZXQgZGl2OwogICAgCWxldCBjdXJyZW50OwogICAgCWNvbnN0IGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSA9IC8qI3Nsb3RzKi8gY3R4WzE2XS5kZWZhdWx0OwogICAgCWNvbnN0IGRlZmF1bHRfc2xvdCA9IGNyZWF0ZV9zbG90KGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbMTVdLCBudWxsKTsKICAgIAlsZXQgZGl2X2xldmVscyA9IFsvKiQkcmVzdFByb3BzKi8gY3R4WzddLCB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNl0gfV07CiAgICAJbGV0IGRpdl9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgZGl2X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlkaXZfZGF0YSA9IGFzc2lnbihkaXZfZGF0YSwgZGl2X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJZGl2ID0gZWxlbWVudCgiZGl2Iik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZGl2LCBkaXZfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oZGl2LCBmaWxlJGEsIDU2LCAyLCAxMTkwKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBkaXYsIGFuY2hvcik7CgogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWRlZmF1bHRfc2xvdC5tKGRpdiwgbnVsbCk7CiAgICAJCQl9CgogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJaWYgKGRlZmF1bHRfc2xvdC5wICYmIGRpcnR5ICYgLyokJHNjb3BlKi8gMzI3NjgpIHsKICAgIAkJCQkJdXBkYXRlX3Nsb3QoZGVmYXVsdF9zbG90LCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzE1XSwgZGlydHksIG51bGwsIG51bGwpOwogICAgCQkJCX0KICAgIAkJCX0KCiAgICAJCQlzZXRfYXR0cmlidXRlcyhkaXYsIGRpdl9kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoZGl2X2xldmVscywgWwogICAgCQkJCWRpcnR5ICYgLyokJHJlc3RQcm9wcyovIDEyOCAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzddLAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qY2xhc3NlcyovIDY0KSAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNl0gfQogICAgCQkJXSkpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihkaXYpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZWxzZV9ibG9jayQ0Lm5hbWUsCiAgICAJCXR5cGU6ICJlbHNlIiwKICAgIAkJc291cmNlOiAiKDU2OjApIHs6ZWxzZX0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg1MjoxNSkgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMyQyKGN0eCkgewogICAgCWxldCB1bDsKICAgIAlsZXQgY3VycmVudDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUgPSAvKiNzbG90cyovIGN0eFsxNl0uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzE1XSwgbnVsbCk7CiAgICAJbGV0IHVsX2xldmVscyA9IFsvKiQkcmVzdFByb3BzKi8gY3R4WzddLCB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNl0gfV07CiAgICAJbGV0IHVsX2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCB1bF9sZXZlbHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJdWxfZGF0YSA9IGFzc2lnbih1bF9kYXRhLCB1bF9sZXZlbHNbaV0pOwogICAgCX0KCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCXVsID0gZWxlbWVudCgidWwiKTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5jKCk7CiAgICAJCQlzZXRfYXR0cmlidXRlcyh1bCwgdWxfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24odWwsIGZpbGUkYSwgNTIsIDIsIDExMjEpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHVsLCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubSh1bCwgbnVsbCk7CiAgICAJCQl9CgogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJaWYgKGRlZmF1bHRfc2xvdC5wICYmIGRpcnR5ICYgLyokJHNjb3BlKi8gMzI3NjgpIHsKICAgIAkJCQkJdXBkYXRlX3Nsb3QoZGVmYXVsdF9zbG90LCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzE1XSwgZGlydHksIG51bGwsIG51bGwpOwogICAgCQkJCX0KICAgIAkJCX0KCiAgICAJCQlzZXRfYXR0cmlidXRlcyh1bCwgdWxfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKHVsX2xldmVscywgWwogICAgCQkJCWRpcnR5ICYgLyokJHJlc3RQcm9wcyovIDEyOCAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzddLAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qY2xhc3NlcyovIDY0KSAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNl0gfQogICAgCQkJXSkpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih1bCk7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuZChkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9ja18zJDIubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDUyOjE1KSAiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg1MDoyNCkgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfMiQyKGN0eCkgewogICAgCWxldCBpbWc7CiAgICAJbGV0IGltZ19zcmNfdmFsdWU7CgogICAgCWxldCBpbWdfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzddLAogICAgCQl7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNl0gfSwKICAgIAkJeyBzcmM6IGltZ19zcmNfdmFsdWUgPSAvKnNyYyovIGN0eFs0XSB9LAogICAgCQl7IGFsdDogLyphbHQqLyBjdHhbNV0gfQogICAgCV07CgogICAgCWxldCBpbWdfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGltZ19sZXZlbHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJaW1nX2RhdGEgPSBhc3NpZ24oaW1nX2RhdGEsIGltZ19sZXZlbHNbaV0pOwogICAgCX0KCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWltZyA9IGVsZW1lbnQoImltZyIpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaW1nLCBpbWdfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oaW1nLCBmaWxlJGEsIDUwLCAyLCAxMDUwKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpbWcsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhpbWcsIGltZ19kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoaW1nX2xldmVscywgWwogICAgCQkJCWRpcnR5ICYgLyokJHJlc3RQcm9wcyovIDEyOCAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzddLAogICAgCQkJCWRpcnR5ICYgLypjbGFzc2VzKi8gNjQgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzZdIH0sCiAgICAJCQkJZGlydHkgJiAvKnNyYyovIDE2ICYmIGltZy5zcmMgIT09IChpbWdfc3JjX3ZhbHVlID0gLypzcmMqLyBjdHhbNF0pICYmIHsgc3JjOiBpbWdfc3JjX3ZhbHVlIH0sCiAgICAJCQkJZGlydHkgJiAvKmFsdCovIDMyICYmIHsgYWx0OiAvKmFsdCovIGN0eFs1XSB9CiAgICAJCQldKSk7CiAgICAJCX0sCiAgICAJCWk6IG5vb3AsCiAgICAJCW86IG5vb3AsCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGltZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzIkMi5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoNTA6MjQpICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDQ2OjE1KSAKICAgIGZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9ja18xJDMoY3R4KSB7CiAgICAJbGV0IGE7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbMTZdLmRlZmF1bHQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90ID0gY3JlYXRlX3Nsb3QoZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFsxNV0sIG51bGwpOwoKICAgIAlsZXQgYV9sZXZlbHMgPSBbCiAgICAJCS8qJCRyZXN0UHJvcHMqLyBjdHhbN10sCiAgICAJCXsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs2XSB9LAogICAgCQl7IGhyZWY6IC8qaHJlZiovIGN0eFszXSB9CiAgICAJXTsKCiAgICAJbGV0IGFfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGFfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWFfZGF0YSA9IGFzc2lnbihhX2RhdGEsIGFfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlhID0gZWxlbWVudCgiYSIpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmMoKTsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGEsIGFfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oYSwgZmlsZSRhLCA0NiwgMiwgOTU5KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBhLCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubShhLCBudWxsKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlpZiAoZGVmYXVsdF9zbG90LnAgJiYgZGlydHkgJiAvKiQkc2NvcGUqLyAzMjc2OCkgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbMTVdLCBkaXJ0eSwgbnVsbCwgbnVsbCk7CiAgICAJCQkJfQogICAgCQkJfQoKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGEsIGFfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGFfbGV2ZWxzLCBbCiAgICAJCQkJZGlydHkgJiAvKiQkcmVzdFByb3BzKi8gMTI4ICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbN10sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gNjQpICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFs2XSB9LAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qaHJlZiovIDgpICYmIHsgaHJlZjogLypocmVmKi8gY3R4WzNdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoYSk7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuZChkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9ja18xJDMubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDQ2OjE1KSAiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg0MjowKSB7I2lmIGhlYWRpbmd9CiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2skNChjdHgpIHsKICAgIAlsZXQgaDQ7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbMTZdLmRlZmF1bHQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90ID0gY3JlYXRlX3Nsb3QoZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFsxNV0sIG51bGwpOwogICAgCWxldCBoNF9sZXZlbHMgPSBbLyokJHJlc3RQcm9wcyovIGN0eFs3XSwgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzZdIH1dOwogICAgCWxldCBoNF9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgaDRfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWg0X2RhdGEgPSBhc3NpZ24oaDRfZGF0YSwgaDRfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQloNCA9IGVsZW1lbnQoImg0Iik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoaDQsIGg0X2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGg0LCBmaWxlJGEsIDQyLCAyLCA4ODIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGg0LCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubShoNCwgbnVsbCk7CiAgICAJCQl9CgogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJaWYgKGRlZmF1bHRfc2xvdC5wICYmIGRpcnR5ICYgLyokJHNjb3BlKi8gMzI3NjgpIHsKICAgIAkJCQkJdXBkYXRlX3Nsb3QoZGVmYXVsdF9zbG90LCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzE1XSwgZGlydHksIG51bGwsIG51bGwpOwogICAgCQkJCX0KICAgIAkJCX0KCiAgICAJCQlzZXRfYXR0cmlidXRlcyhoNCwgaDRfZGF0YSA9IGdldF9zcHJlYWRfdXBkYXRlKGg0X2xldmVscywgWwogICAgCQkJCWRpcnR5ICYgLyokJHJlc3RQcm9wcyovIDEyOCAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzddLAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qY2xhc3NlcyovIDY0KSAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbNl0gfQogICAgCQkJXSkpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihoNCk7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuZChkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9jayQ0Lm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIig0MjowKSB7I2lmIGhlYWRpbmd9IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkYShjdHgpIHsKICAgIAlsZXQgY3VycmVudF9ibG9ja190eXBlX2luZGV4OwogICAgCWxldCBpZl9ibG9jazsKICAgIAlsZXQgaWZfYmxvY2tfYW5jaG9yOwogICAgCWxldCBjdXJyZW50OwoKICAgIAljb25zdCBpZl9ibG9ja19jcmVhdG9ycyA9IFsKICAgIAkJY3JlYXRlX2lmX2Jsb2NrJDQsCiAgICAJCWNyZWF0ZV9pZl9ibG9ja18xJDMsCiAgICAJCWNyZWF0ZV9pZl9ibG9ja18yJDIsCiAgICAJCWNyZWF0ZV9pZl9ibG9ja18zJDIsCiAgICAJCWNyZWF0ZV9lbHNlX2Jsb2NrJDQKICAgIAldOwoKICAgIAljb25zdCBpZl9ibG9ja3MgPSBbXTsKCiAgICAJZnVuY3Rpb24gc2VsZWN0X2Jsb2NrX3R5cGUoY3R4LCBkaXJ0eSkgewogICAgCQlpZiAoLypoZWFkaW5nKi8gY3R4WzBdKSByZXR1cm4gMDsKICAgIAkJaWYgKC8qaHJlZiovIGN0eFszXSkgcmV0dXJuIDE7CiAgICAJCWlmICgvKnNyYyovIGN0eFs0XSB8fCAvKm9iamVjdCovIGN0eFsyXSkgcmV0dXJuIDI7CiAgICAJCWlmICgvKmxpc3QqLyBjdHhbMV0pIHJldHVybiAzOwogICAgCQlyZXR1cm4gNDsKICAgIAl9CgogICAgCWN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleCA9IHNlbGVjdF9ibG9ja190eXBlKGN0eCk7CiAgICAJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWlmX2Jsb2NrLmMoKTsKICAgIAkJCWlmX2Jsb2NrX2FuY2hvciA9IGVtcHR5KCk7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdLm0odGFyZ2V0LCBhbmNob3IpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGlmX2Jsb2NrX2FuY2hvciwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBbZGlydHldKSB7CiAgICAJCQlsZXQgcHJldmlvdXNfYmxvY2tfaW5kZXggPSBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7CiAgICAJCQljdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZShjdHgpOwoKICAgIAkJCWlmIChjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPT09IHByZXZpb3VzX2Jsb2NrX2luZGV4KSB7CiAgICAJCQkJaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0ucChjdHgsIGRpcnR5KTsKICAgIAkJCX0gZWxzZSB7CiAgICAJCQkJZ3JvdXBfb3V0cm9zKCk7CgogICAgCQkJCXRyYW5zaXRpb25fb3V0KGlmX2Jsb2Nrc1twcmV2aW91c19ibG9ja19pbmRleF0sIDEsIDEsICgpID0+IHsKICAgIAkJCQkJaWZfYmxvY2tzW3ByZXZpb3VzX2Jsb2NrX2luZGV4XSA9IG51bGw7CiAgICAJCQkJfSk7CgogICAgCQkJCWNoZWNrX291dHJvcygpOwogICAgCQkJCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF07CgogICAgCQkJCWlmICghaWZfYmxvY2spIHsKICAgIAkJCQkJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTsKICAgIAkJCQkJaWZfYmxvY2suYygpOwogICAgCQkJCX0gZWxzZSB7CiAgICAJCQkJCWlmX2Jsb2NrLnAoY3R4LCBkaXJ0eSk7CiAgICAJCQkJfQoKICAgIAkJCQl0cmFuc2l0aW9uX2luKGlmX2Jsb2NrLCAxKTsKICAgIAkJCQlpZl9ibG9jay5tKGlmX2Jsb2NrX2FuY2hvci5wYXJlbnROb2RlLCBpZl9ibG9ja19hbmNob3IpOwogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oaWZfYmxvY2spOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChpZl9ibG9jayk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5kKGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGlmX2Jsb2NrX2FuY2hvcik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2ZyYWdtZW50JGEubmFtZSwKICAgIAkJdHlwZTogImNvbXBvbmVudCIsCiAgICAJCXNvdXJjZTogIiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2UkYSgkJHNlbGYsICQkcHJvcHMsICQkaW52YWxpZGF0ZSkgewogICAgCWxldCBjbGFzc2VzOwoKICAgIAljb25zdCBvbWl0X3Byb3BzX25hbWVzID0gWwogICAgCQkiY2xhc3MiLCJib2R5IiwiYm90dG9tIiwiaGVhZGluZyIsImxlZnQiLCJsaXN0IiwibWlkZGxlIiwib2JqZWN0IiwicmlnaHQiLCJ0b3AiLCJocmVmIiwic3JjIiwiYWx0IgogICAgCV07CgogICAgCWxldCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKTsKICAgIAlsZXQgeyAkJHNsb3RzOiBzbG90cyA9IHt9LCAkJHNjb3BlIH0gPSAkJHByb3BzOwogICAgCXZhbGlkYXRlX3Nsb3RzKCJNZWRpYSIsIHNsb3RzLCBbJ2RlZmF1bHQnXSk7CiAgICAJbGV0IHsgY2xhc3M6IGNsYXNzTmFtZSA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGJvZHkgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBib3R0b20gPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBoZWFkaW5nID0gZmFsc2UgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgbGVmdCA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGxpc3QgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBtaWRkbGUgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBvYmplY3QgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyByaWdodCA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHRvcCA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGhyZWYgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBzcmMgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBhbHQgPSAiIiB9ID0gJCRwcm9wczsKCiAgICAJJCRzZWxmLiQkc2V0ID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQkkJHByb3BzID0gYXNzaWduKGFzc2lnbih7fSwgJCRwcm9wcyksIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMoJCRuZXdfcHJvcHMpKTsKICAgIAkJJCRpbnZhbGlkYXRlKDcsICQkcmVzdFByb3BzID0gY29tcHV0ZV9yZXN0X3Byb3BzKCQkcHJvcHMsIG9taXRfcHJvcHNfbmFtZXMpKTsKICAgIAkJaWYgKCJjbGFzcyIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg4LCBjbGFzc05hbWUgPSAkJG5ld19wcm9wcy5jbGFzcyk7CiAgICAJCWlmICgiYm9keSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg5LCBib2R5ID0gJCRuZXdfcHJvcHMuYm9keSk7CiAgICAJCWlmICgiYm90dG9tIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDEwLCBib3R0b20gPSAkJG5ld19wcm9wcy5ib3R0b20pOwogICAgCQlpZiAoImhlYWRpbmciIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMCwgaGVhZGluZyA9ICQkbmV3X3Byb3BzLmhlYWRpbmcpOwogICAgCQlpZiAoImxlZnQiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTEsIGxlZnQgPSAkJG5ld19wcm9wcy5sZWZ0KTsKICAgIAkJaWYgKCJsaXN0IiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDEsIGxpc3QgPSAkJG5ld19wcm9wcy5saXN0KTsKICAgIAkJaWYgKCJtaWRkbGUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTIsIG1pZGRsZSA9ICQkbmV3X3Byb3BzLm1pZGRsZSk7CiAgICAJCWlmICgib2JqZWN0IiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDIsIG9iamVjdCA9ICQkbmV3X3Byb3BzLm9iamVjdCk7CiAgICAJCWlmICgicmlnaHQiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTMsIHJpZ2h0ID0gJCRuZXdfcHJvcHMucmlnaHQpOwogICAgCQlpZiAoInRvcCIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSgxNCwgdG9wID0gJCRuZXdfcHJvcHMudG9wKTsKICAgIAkJaWYgKCJocmVmIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDMsIGhyZWYgPSAkJG5ld19wcm9wcy5ocmVmKTsKICAgIAkJaWYgKCJzcmMiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNCwgc3JjID0gJCRuZXdfcHJvcHMuc3JjKTsKICAgIAkJaWYgKCJhbHQiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNSwgYWx0ID0gJCRuZXdfcHJvcHMuYWx0KTsKICAgIAkJaWYgKCIkJHNjb3BlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDE1LCAkJHNjb3BlID0gJCRuZXdfcHJvcHMuJCRzY29wZSk7CiAgICAJfTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsKICAgIAkJY2xhc3NuYW1lcywKICAgIAkJY2xhc3NOYW1lLAogICAgCQlib2R5LAogICAgCQlib3R0b20sCiAgICAJCWhlYWRpbmcsCiAgICAJCWxlZnQsCiAgICAJCWxpc3QsCiAgICAJCW1pZGRsZSwKICAgIAkJb2JqZWN0LAogICAgCQlyaWdodCwKICAgIAkJdG9wLAogICAgCQlocmVmLAogICAgCQlzcmMsCiAgICAJCWFsdCwKICAgIAkJY2xhc3NlcwogICAgCX0pOwoKICAgIAkkJHNlbGYuJGluamVjdF9zdGF0ZSA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJaWYgKCJjbGFzc05hbWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg4LCBjbGFzc05hbWUgPSAkJG5ld19wcm9wcy5jbGFzc05hbWUpOwogICAgCQlpZiAoImJvZHkiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg5LCBib2R5ID0gJCRuZXdfcHJvcHMuYm9keSk7CiAgICAJCWlmICgiYm90dG9tIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMTAsIGJvdHRvbSA9ICQkbmV3X3Byb3BzLmJvdHRvbSk7CiAgICAJCWlmICgiaGVhZGluZyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIGhlYWRpbmcgPSAkJG5ld19wcm9wcy5oZWFkaW5nKTsKICAgIAkJaWYgKCJsZWZ0IiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMTEsIGxlZnQgPSAkJG5ld19wcm9wcy5sZWZ0KTsKICAgIAkJaWYgKCJsaXN0IiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMSwgbGlzdCA9ICQkbmV3X3Byb3BzLmxpc3QpOwogICAgCQlpZiAoIm1pZGRsZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEyLCBtaWRkbGUgPSAkJG5ld19wcm9wcy5taWRkbGUpOwogICAgCQlpZiAoIm9iamVjdCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIG9iamVjdCA9ICQkbmV3X3Byb3BzLm9iamVjdCk7CiAgICAJCWlmICgicmlnaHQiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxMywgcmlnaHQgPSAkJG5ld19wcm9wcy5yaWdodCk7CiAgICAJCWlmICgidG9wIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMTQsIHRvcCA9ICQkbmV3X3Byb3BzLnRvcCk7CiAgICAJCWlmICgiaHJlZiIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIGhyZWYgPSAkJG5ld19wcm9wcy5ocmVmKTsKICAgIAkJaWYgKCJzcmMiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg0LCBzcmMgPSAkJG5ld19wcm9wcy5zcmMpOwogICAgCQlpZiAoImFsdCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDUsIGFsdCA9ICQkbmV3X3Byb3BzLmFsdCk7CiAgICAJCWlmICgiY2xhc3NlcyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDYsIGNsYXNzZXMgPSAkJG5ld19wcm9wcy5jbGFzc2VzKTsKICAgIAl9OwoKICAgIAlpZiAoJCRwcm9wcyAmJiAiJCRpbmplY3QiIGluICQkcHJvcHMpIHsKICAgIAkJJCRzZWxmLiRpbmplY3Rfc3RhdGUoJCRwcm9wcy4kJGluamVjdCk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCQudXBkYXRlID0gKCkgPT4gewogICAgCQlpZiAoJCRzZWxmLiQkLmRpcnR5ICYgLypjbGFzc05hbWUsIGJvZHksIGhlYWRpbmcsIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbWlkZGxlLCBvYmplY3QsIGxpc3QqLyAzMjUxOSkgewogICAgCQkJICQkaW52YWxpZGF0ZSg2LCBjbGFzc2VzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsIHsKICAgIAkJCQkibWVkaWEtYm9keSI6IGJvZHksCiAgICAJCQkJIm1lZGlhLWhlYWRpbmciOiBoZWFkaW5nLAogICAgCQkJCSJtZWRpYS1sZWZ0IjogbGVmdCwKICAgIAkJCQkibWVkaWEtcmlnaHQiOiByaWdodCwKICAgIAkJCQkibWVkaWEtdG9wIjogdG9wLAogICAgCQkJCSJtZWRpYS1ib3R0b20iOiBib3R0b20sCiAgICAJCQkJIm1lZGlhLW1pZGRsZSI6IG1pZGRsZSwKICAgIAkJCQkibWVkaWEtb2JqZWN0Ijogb2JqZWN0LAogICAgCQkJCSJtZWRpYS1saXN0IjogbGlzdCwKICAgIAkJCQltZWRpYTogIWJvZHkgJiYgIWhlYWRpbmcgJiYgIWxlZnQgJiYgIXJpZ2h0ICYmICF0b3AgJiYgIWJvdHRvbSAmJiAhbWlkZGxlICYmICFvYmplY3QgJiYgIWxpc3QKICAgIAkJCX0pKTsKICAgIAkJfQogICAgCX07CgogICAgCXJldHVybiBbCiAgICAJCWhlYWRpbmcsCiAgICAJCWxpc3QsCiAgICAJCW9iamVjdCwKICAgIAkJaHJlZiwKICAgIAkJc3JjLAogICAgCQlhbHQsCiAgICAJCWNsYXNzZXMsCiAgICAJCSQkcmVzdFByb3BzLAogICAgCQljbGFzc05hbWUsCiAgICAJCWJvZHksCiAgICAJCWJvdHRvbSwKICAgIAkJbGVmdCwKICAgIAkJbWlkZGxlLAogICAgCQlyaWdodCwKICAgIAkJdG9wLAogICAgCQkkJHNjb3BlLAogICAgCQlzbG90cwogICAgCV07CiAgICB9CgogICAgY2xhc3MgTWVkaWEgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CgogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJGEsIGNyZWF0ZV9mcmFnbWVudCRhLCBzYWZlX25vdF9lcXVhbCwgewogICAgCQkJY2xhc3M6IDgsCiAgICAJCQlib2R5OiA5LAogICAgCQkJYm90dG9tOiAxMCwKICAgIAkJCWhlYWRpbmc6IDAsCiAgICAJCQlsZWZ0OiAxMSwKICAgIAkJCWxpc3Q6IDEsCiAgICAJCQltaWRkbGU6IDEyLAogICAgCQkJb2JqZWN0OiAyLAogICAgCQkJcmlnaHQ6IDEzLAogICAgCQkJdG9wOiAxNCwKICAgIAkJCWhyZWY6IDMsCiAgICAJCQlzcmM6IDQsCiAgICAJCQlhbHQ6IDUKICAgIAkJfSk7CgogICAgCQlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQ29tcG9uZW50IiwgewogICAgCQkJY29tcG9uZW50OiB0aGlzLAogICAgCQkJdGFnTmFtZTogIk1lZGlhIiwKICAgIAkJCW9wdGlvbnMsCiAgICAJCQlpZDogY3JlYXRlX2ZyYWdtZW50JGEubmFtZQogICAgCQl9KTsKICAgIAl9CgogICAgCWdldCBjbGFzcygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TWVkaWE+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgY2xhc3ModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TWVkaWE+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgYm9keSgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TWVkaWE+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgYm9keSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBib3R0b20oKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE1lZGlhPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGJvdHRvbSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBoZWFkaW5nKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBoZWFkaW5nKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE1lZGlhPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGxlZnQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE1lZGlhPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGxlZnQodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TWVkaWE+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgbGlzdCgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TWVkaWE+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgbGlzdCh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBtaWRkbGUoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE1lZGlhPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IG1pZGRsZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBvYmplY3QoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE1lZGlhPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IG9iamVjdCh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCByaWdodCgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TWVkaWE+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgcmlnaHQodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TWVkaWE+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgdG9wKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCB0b3AodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TWVkaWE+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgaHJlZigpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TWVkaWE+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgaHJlZih2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBzcmMoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE1lZGlhPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHNyYyh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBhbHQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE1lZGlhPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGFsdCh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxNZWRpYT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CiAgICB9CgogICAgLyogbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9OYXYuc3ZlbHRlIGdlbmVyYXRlZCBieSBTdmVsdGUgdjMuMzEuMiAqLwogICAgY29uc3QgZmlsZSRiID0gIm5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvTmF2LnN2ZWx0ZSI7CgogICAgZnVuY3Rpb24gY3JlYXRlX2ZyYWdtZW50JGIoY3R4KSB7CiAgICAJbGV0IHVsOwogICAgCWxldCBjdXJyZW50OwogICAgCWNvbnN0IGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSA9IC8qI3Nsb3RzKi8gY3R4WzEyXS5kZWZhdWx0OwogICAgCWNvbnN0IGRlZmF1bHRfc2xvdCA9IGNyZWF0ZV9zbG90KGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbMTFdLCBudWxsKTsKICAgIAlsZXQgdWxfbGV2ZWxzID0gWy8qJCRyZXN0UHJvcHMqLyBjdHhbMV0sIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFswXSB9XTsKICAgIAlsZXQgdWxfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IHVsX2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQl1bF9kYXRhID0gYXNzaWduKHVsX2RhdGEsIHVsX2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJdWwgPSBlbGVtZW50KCJ1bCIpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmMoKTsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKHVsLCB1bF9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbih1bCwgZmlsZSRiLCAzOSwgMCwgOTQxKTsKICAgIAkJfSwKICAgIAkJbDogZnVuY3Rpb24gY2xhaW0obm9kZXMpIHsKICAgIAkJCXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5oeWRyYXRlIG9ubHkgd29ya3MgaWYgdGhlIGNvbXBvbmVudCB3YXMgY29tcGlsZWQgd2l0aCB0aGUgYGh5ZHJhdGFibGU6IHRydWVgIG9wdGlvbiIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHVsLCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubSh1bCwgbnVsbCk7CiAgICAJCQl9CgogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIFtkaXJ0eV0pIHsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlpZiAoZGVmYXVsdF9zbG90LnAgJiYgZGlydHkgJiAvKiQkc2NvcGUqLyAyMDQ4KSB7CiAgICAJCQkJCXVwZGF0ZV9zbG90KGRlZmF1bHRfc2xvdCwgZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFsxMV0sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXModWwsIHVsX2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZSh1bF9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyAyICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMV0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gMSkgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzBdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodWwpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZnJhZ21lbnQkYi5uYW1lLAogICAgCQl0eXBlOiAiY29tcG9uZW50IiwKICAgIAkJc291cmNlOiAiIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRWZXJ0aWNhbENsYXNzKHZlcnRpY2FsKSB7CiAgICAJaWYgKHZlcnRpY2FsID09PSBmYWxzZSkgewogICAgCQlyZXR1cm4gZmFsc2U7CiAgICAJfSBlbHNlIGlmICh2ZXJ0aWNhbCA9PT0gdHJ1ZSB8fCB2ZXJ0aWNhbCA9PT0gInhzIikgewogICAgCQlyZXR1cm4gImZsZXgtY29sdW1uIjsKICAgIAl9CgogICAgCXJldHVybiBgZmxleC0ke3ZlcnRpY2FsfS1jb2x1bW5gOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RhbmNlJGIoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHsKICAgIAlsZXQgY2xhc3NlczsKCiAgICAJY29uc3Qgb21pdF9wcm9wc19uYW1lcyA9IFsKICAgIAkJImNsYXNzIiwidGFicyIsInBpbGxzIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwianVzdGlmaWVkIiwiZmlsbCIsIm5hdmJhciIsImNhcmQiCiAgICAJXTsKCiAgICAJbGV0ICQkcmVzdFByb3BzID0gY29tcHV0ZV9yZXN0X3Byb3BzKCQkcHJvcHMsIG9taXRfcHJvcHNfbmFtZXMpOwogICAgCWxldCB7ICQkc2xvdHM6IHNsb3RzID0ge30sICQkc2NvcGUgfSA9ICQkcHJvcHM7CiAgICAJdmFsaWRhdGVfc2xvdHMoIk5hdiIsIHNsb3RzLCBbJ2RlZmF1bHQnXSk7CiAgICAJbGV0IHsgY2xhc3M6IGNsYXNzTmFtZSA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHRhYnMgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBwaWxscyA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHZlcnRpY2FsID0gZmFsc2UgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgaG9yaXpvbnRhbCA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGp1c3RpZmllZCA9IGZhbHNlIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGZpbGwgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBuYXZiYXIgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBjYXJkID0gZmFsc2UgfSA9ICQkcHJvcHM7CgogICAgCSQkc2VsZi4kJHNldCA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJJCRwcm9wcyA9IGFzc2lnbihhc3NpZ24oe30sICQkcHJvcHMpLCBleGNsdWRlX2ludGVybmFsX3Byb3BzKCQkbmV3X3Byb3BzKSk7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKSk7CiAgICAJCWlmICgiY2xhc3MiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMiwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3MpOwogICAgCQlpZiAoInRhYnMiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMywgdGFicyA9ICQkbmV3X3Byb3BzLnRhYnMpOwogICAgCQlpZiAoInBpbGxzIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDQsIHBpbGxzID0gJCRuZXdfcHJvcHMucGlsbHMpOwogICAgCQlpZiAoInZlcnRpY2FsIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDUsIHZlcnRpY2FsID0gJCRuZXdfcHJvcHMudmVydGljYWwpOwogICAgCQlpZiAoImhvcml6b250YWwiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNiwgaG9yaXpvbnRhbCA9ICQkbmV3X3Byb3BzLmhvcml6b250YWwpOwogICAgCQlpZiAoImp1c3RpZmllZCIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg3LCBqdXN0aWZpZWQgPSAkJG5ld19wcm9wcy5qdXN0aWZpZWQpOwogICAgCQlpZiAoImZpbGwiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoOCwgZmlsbCA9ICQkbmV3X3Byb3BzLmZpbGwpOwogICAgCQlpZiAoIm5hdmJhciIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg5LCBuYXZiYXIgPSAkJG5ld19wcm9wcy5uYXZiYXIpOwogICAgCQlpZiAoImNhcmQiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMTAsIGNhcmQgPSAkJG5ld19wcm9wcy5jYXJkKTsKICAgIAkJaWYgKCIkJHNjb3BlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDExLCAkJHNjb3BlID0gJCRuZXdfcHJvcHMuJCRzY29wZSk7CiAgICAJfTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsKICAgIAkJY2xhc3NuYW1lcywKICAgIAkJY2xhc3NOYW1lLAogICAgCQl0YWJzLAogICAgCQlwaWxscywKICAgIAkJdmVydGljYWwsCiAgICAJCWhvcml6b250YWwsCiAgICAJCWp1c3RpZmllZCwKICAgIAkJZmlsbCwKICAgIAkJbmF2YmFyLAogICAgCQljYXJkLAogICAgCQlnZXRWZXJ0aWNhbENsYXNzLAogICAgCQljbGFzc2VzCiAgICAJfSk7CgogICAgCSQkc2VsZi4kaW5qZWN0X3N0YXRlID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQlpZiAoImNsYXNzTmFtZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzTmFtZSk7CiAgICAJCWlmICgidGFicyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIHRhYnMgPSAkJG5ld19wcm9wcy50YWJzKTsKICAgIAkJaWYgKCJwaWxscyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDQsIHBpbGxzID0gJCRuZXdfcHJvcHMucGlsbHMpOwogICAgCQlpZiAoInZlcnRpY2FsIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNSwgdmVydGljYWwgPSAkJG5ld19wcm9wcy52ZXJ0aWNhbCk7CiAgICAJCWlmICgiaG9yaXpvbnRhbCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDYsIGhvcml6b250YWwgPSAkJG5ld19wcm9wcy5ob3Jpem9udGFsKTsKICAgIAkJaWYgKCJqdXN0aWZpZWQiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg3LCBqdXN0aWZpZWQgPSAkJG5ld19wcm9wcy5qdXN0aWZpZWQpOwogICAgCQlpZiAoImZpbGwiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg4LCBmaWxsID0gJCRuZXdfcHJvcHMuZmlsbCk7CiAgICAJCWlmICgibmF2YmFyIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoOSwgbmF2YmFyID0gJCRuZXdfcHJvcHMubmF2YmFyKTsKICAgIAkJaWYgKCJjYXJkIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMTAsIGNhcmQgPSAkJG5ld19wcm9wcy5jYXJkKTsKICAgIAkJaWYgKCJjbGFzc2VzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMCwgY2xhc3NlcyA9ICQkbmV3X3Byb3BzLmNsYXNzZXMpOwogICAgCX07CgogICAgCWlmICgkJHByb3BzICYmICIkJGluamVjdCIgaW4gJCRwcm9wcykgewogICAgCQkkJHNlbGYuJGluamVjdF9zdGF0ZSgkJHByb3BzLiQkaW5qZWN0KTsKICAgIAl9CgogICAgCSQkc2VsZi4kJC51cGRhdGUgPSAoKSA9PiB7CiAgICAJCWlmICgkJHNlbGYuJCQuZGlydHkgJiAvKmNsYXNzTmFtZSwgbmF2YmFyLCBob3Jpem9udGFsLCB2ZXJ0aWNhbCwgdGFicywgY2FyZCwgcGlsbHMsIGp1c3RpZmllZCwgZmlsbCovIDIwNDQpIHsKICAgIAkJCSAkJGludmFsaWRhdGUoMCwgY2xhc3NlcyA9IGNsYXNzbmFtZXMoY2xhc3NOYW1lLCBuYXZiYXIgPyAibmF2YmFyLW5hdiIgOiAibmF2IiwgaG9yaXpvbnRhbCA/IGBqdXN0aWZ5LWNvbnRlbnQtJHtob3Jpem9udGFsfWAgOiBmYWxzZSwgZ2V0VmVydGljYWxDbGFzcyh2ZXJ0aWNhbCksIHsKICAgIAkJCQkibmF2LXRhYnMiOiB0YWJzLAogICAgCQkJCSJjYXJkLWhlYWRlci10YWJzIjogY2FyZCAmJiB0YWJzLAogICAgCQkJCSJuYXYtcGlsbHMiOiBwaWxscywKICAgIAkJCQkiY2FyZC1oZWFkZXItcGlsbHMiOiBjYXJkICYmIHBpbGxzLAogICAgCQkJCSJuYXYtanVzdGlmaWVkIjoganVzdGlmaWVkLAogICAgCQkJCSJuYXYtZmlsbCI6IGZpbGwKICAgIAkJCX0pKTsKICAgIAkJfQogICAgCX07CgogICAgCXJldHVybiBbCiAgICAJCWNsYXNzZXMsCiAgICAJCSQkcmVzdFByb3BzLAogICAgCQljbGFzc05hbWUsCiAgICAJCXRhYnMsCiAgICAJCXBpbGxzLAogICAgCQl2ZXJ0aWNhbCwKICAgIAkJaG9yaXpvbnRhbCwKICAgIAkJanVzdGlmaWVkLAogICAgCQlmaWxsLAogICAgCQluYXZiYXIsCiAgICAJCWNhcmQsCiAgICAJCSQkc2NvcGUsCiAgICAJCXNsb3RzCiAgICAJXTsKICAgIH0KCiAgICBjbGFzcyBOYXYgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CgogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJGIsIGNyZWF0ZV9mcmFnbWVudCRiLCBzYWZlX25vdF9lcXVhbCwgewogICAgCQkJY2xhc3M6IDIsCiAgICAJCQl0YWJzOiAzLAogICAgCQkJcGlsbHM6IDQsCiAgICAJCQl2ZXJ0aWNhbDogNSwKICAgIAkJCWhvcml6b250YWw6IDYsCiAgICAJCQlqdXN0aWZpZWQ6IDcsCiAgICAJCQlmaWxsOiA4LAogICAgCQkJbmF2YmFyOiA5LAogICAgCQkJY2FyZDogMTAKICAgIAkJfSk7CgogICAgCQlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQ29tcG9uZW50IiwgewogICAgCQkJY29tcG9uZW50OiB0aGlzLAogICAgCQkJdGFnTmFtZTogIk5hdiIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRiLm5hbWUKICAgIAkJfSk7CiAgICAJfQoKICAgIAlnZXQgY2xhc3MoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjbGFzcyh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxOYXY+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgdGFicygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TmF2PjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHRhYnModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TmF2PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IHBpbGxzKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxOYXY+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgcGlsbHModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TmF2PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IHZlcnRpY2FsKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxOYXY+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgdmVydGljYWwodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TmF2PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGhvcml6b250YWwoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBob3Jpem9udGFsKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdj46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBqdXN0aWZpZWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBqdXN0aWZpZWQodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TmF2PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGZpbGwoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBmaWxsKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdj46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBuYXZiYXIoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBuYXZiYXIodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TmF2PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGNhcmQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjYXJkKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdj46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CiAgICB9CgogICAgLyogbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9OYXZJdGVtLnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjMxLjIgKi8KICAgIGNvbnN0IGZpbGUkYyA9ICJub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL05hdkl0ZW0uc3ZlbHRlIjsKCiAgICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkYyhjdHgpIHsKICAgIAlsZXQgbGk7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbNV0uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzRdLCBudWxsKTsKICAgIAlsZXQgbGlfbGV2ZWxzID0gWy8qJCRyZXN0UHJvcHMqLyBjdHhbMV0sIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFswXSB9XTsKICAgIAlsZXQgbGlfZGF0YSA9IHt9OwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGxpX2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlsaV9kYXRhID0gYXNzaWduKGxpX2RhdGEsIGxpX2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJbGkgPSBlbGVtZW50KCJsaSIpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmMoKTsKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGxpLCBsaV9kYXRhKTsKICAgIAkJCWFkZF9sb2NhdGlvbihsaSwgZmlsZSRjLCAxMCwgMCwgMjE5KTsKICAgIAkJfSwKICAgIAkJbDogZnVuY3Rpb24gY2xhaW0obm9kZXMpIHsKICAgIAkJCXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5oeWRyYXRlIG9ubHkgd29ya3MgaWYgdGhlIGNvbXBvbmVudCB3YXMgY29tcGlsZWQgd2l0aCB0aGUgYGh5ZHJhdGFibGU6IHRydWVgIG9wdGlvbiIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGxpLCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubShsaSwgbnVsbCk7CiAgICAJCQl9CgogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIFtkaXJ0eV0pIHsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlpZiAoZGVmYXVsdF9zbG90LnAgJiYgZGlydHkgJiAvKiQkc2NvcGUqLyAxNikgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbNF0sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMobGksIGxpX2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShsaV9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyAyICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbMV0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gMSkgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzBdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYobGkpOwogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgZGVmYXVsdF9zbG90LmQoZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZnJhZ21lbnQkYy5uYW1lLAogICAgCQl0eXBlOiAiY29tcG9uZW50IiwKICAgIAkJc291cmNlOiAiIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnN0YW5jZSRjKCQkc2VsZiwgJCRwcm9wcywgJCRpbnZhbGlkYXRlKSB7CiAgICAJbGV0IGNsYXNzZXM7CiAgICAJY29uc3Qgb21pdF9wcm9wc19uYW1lcyA9IFsiY2xhc3MiLCJhY3RpdmUiXTsKICAgIAlsZXQgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcyk7CiAgICAJbGV0IHsgJCRzbG90czogc2xvdHMgPSB7fSwgJCRzY29wZSB9ID0gJCRwcm9wczsKICAgIAl2YWxpZGF0ZV9zbG90cygiTmF2SXRlbSIsIHNsb3RzLCBbJ2RlZmF1bHQnXSk7CiAgICAJbGV0IHsgY2xhc3M6IGNsYXNzTmFtZSA9ICIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IGFjdGl2ZSA9IGZhbHNlIH0gPSAkJHByb3BzOwoKICAgIAkkJHNlbGYuJCRzZXQgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCSQkcHJvcHMgPSBhc3NpZ24oYXNzaWduKHt9LCAkJHByb3BzKSwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcygkJG5ld19wcm9wcykpOwogICAgCQkkJGludmFsaWRhdGUoMSwgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcykpOwogICAgCQlpZiAoImNsYXNzIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzKTsKICAgIAkJaWYgKCJhY3RpdmUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMywgYWN0aXZlID0gJCRuZXdfcHJvcHMuYWN0aXZlKTsKICAgIAkJaWYgKCIkJHNjb3BlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDQsICQkc2NvcGUgPSAkJG5ld19wcm9wcy4kJHNjb3BlKTsKICAgIAl9OwoKICAgIAkkJHNlbGYuJGNhcHR1cmVfc3RhdGUgPSAoKSA9PiAoeyBjbGFzc25hbWVzLCBjbGFzc05hbWUsIGFjdGl2ZSwgY2xhc3NlcyB9KTsKCiAgICAJJCRzZWxmLiRpbmplY3Rfc3RhdGUgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCWlmICgiY2xhc3NOYW1lIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMiwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3NOYW1lKTsKICAgIAkJaWYgKCJhY3RpdmUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgzLCBhY3RpdmUgPSAkJG5ld19wcm9wcy5hY3RpdmUpOwogICAgCQlpZiAoImNsYXNzZXMiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBjbGFzc2VzID0gJCRuZXdfcHJvcHMuY2xhc3Nlcyk7CiAgICAJfTsKCiAgICAJaWYgKCQkcHJvcHMgJiYgIiQkaW5qZWN0IiBpbiAkJHByb3BzKSB7CiAgICAJCSQkc2VsZi4kaW5qZWN0X3N0YXRlKCQkcHJvcHMuJCRpbmplY3QpOwogICAgCX0KCiAgICAJJCRzZWxmLiQkLnVwZGF0ZSA9ICgpID0+IHsKICAgIAkJaWYgKCQkc2VsZi4kJC5kaXJ0eSAmIC8qY2xhc3NOYW1lLCBhY3RpdmUqLyAxMikgewogICAgCQkJICQkaW52YWxpZGF0ZSgwLCBjbGFzc2VzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsICJuYXYtaXRlbSIsIGFjdGl2ZSA/ICJhY3RpdmUiIDogZmFsc2UpKTsKICAgIAkJfQogICAgCX07CgogICAgCXJldHVybiBbY2xhc3NlcywgJCRyZXN0UHJvcHMsIGNsYXNzTmFtZSwgYWN0aXZlLCAkJHNjb3BlLCBzbG90c107CiAgICB9CgogICAgY2xhc3MgTmF2SXRlbSBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudERldiB7CiAgICAJY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgCQlzdXBlcihvcHRpb25zKTsKICAgIAkJaW5pdCh0aGlzLCBvcHRpb25zLCBpbnN0YW5jZSRjLCBjcmVhdGVfZnJhZ21lbnQkYywgc2FmZV9ub3RfZXF1YWwsIHsgY2xhc3M6IDIsIGFjdGl2ZTogMyB9KTsKCiAgICAJCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJDb21wb25lbnQiLCB7CiAgICAJCQljb21wb25lbnQ6IHRoaXMsCiAgICAJCQl0YWdOYW1lOiAiTmF2SXRlbSIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRjLm5hbWUKICAgIAkJfSk7CiAgICAJfQoKICAgIAlnZXQgY2xhc3MoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdkl0ZW0+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgY2xhc3ModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TmF2SXRlbT46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBhY3RpdmUoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdkl0ZW0+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgYWN0aXZlKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdkl0ZW0+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQogICAgfQoKICAgIC8qIG5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvTmF2TGluay5zdmVsdGUgZ2VuZXJhdGVkIGJ5IFN2ZWx0ZSB2My4zMS4yICovCiAgICBjb25zdCBmaWxlJGQgPSAibm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9OYXZMaW5rLnN2ZWx0ZSI7CgogICAgZnVuY3Rpb24gY3JlYXRlX2ZyYWdtZW50JGQoY3R4KSB7CiAgICAJbGV0IGE7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJbGV0IG1vdW50ZWQ7CiAgICAJbGV0IGRpc3Bvc2U7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbOF0uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzddLCBudWxsKTsKCiAgICAJbGV0IGFfbGV2ZWxzID0gWwogICAgCQkvKiQkcmVzdFByb3BzKi8gY3R4WzNdLAogICAgCQl7IGhyZWY6IC8qaHJlZiovIGN0eFswXSB9LAogICAgCQl7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbMV0gfQogICAgCV07CgogICAgCWxldCBhX2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBhX2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlhX2RhdGEgPSBhc3NpZ24oYV9kYXRhLCBhX2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJYSA9IGVsZW1lbnQoImEiKTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5jKCk7CiAgICAJCQlzZXRfYXR0cmlidXRlcyhhLCBhX2RhdGEpOwogICAgCQkJYWRkX2xvY2F0aW9uKGEsIGZpbGUkZCwgMjcsIDAsIDQ3Mik7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBhLCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubShhLCBudWxsKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKCiAgICAJCQlpZiAoIW1vdW50ZWQpIHsKICAgIAkJCQlkaXNwb3NlID0gWwogICAgCQkJCQlsaXN0ZW5fZGV2KGEsICJjbGljayIsIC8qY2xpY2tfaGFuZGxlciovIGN0eFs5XSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAJCQkJCWxpc3Rlbl9kZXYoYSwgImNsaWNrIiwgLypoYW5kbGVDbGljayovIGN0eFsyXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkKICAgIAkJCQldOwoKICAgIAkJCQltb3VudGVkID0gdHJ1ZTsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgW2RpcnR5XSkgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDEyOCkgewogICAgCQkJCQl1cGRhdGVfc2xvdChkZWZhdWx0X3Nsb3QsIGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSwgY3R4LCAvKiQkc2NvcGUqLyBjdHhbN10sIGRpcnR5LCBudWxsLCBudWxsKTsKICAgIAkJCQl9CiAgICAJCQl9CgogICAgCQkJc2V0X2F0dHJpYnV0ZXMoYSwgYV9kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoYV9sZXZlbHMsIFsKICAgIAkJCQlkaXJ0eSAmIC8qJCRyZXN0UHJvcHMqLyA4ICYmIC8qJCRyZXN0UHJvcHMqLyBjdHhbM10sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypocmVmKi8gMSkgJiYgeyBocmVmOiAvKmhyZWYqLyBjdHhbMF0gfSwKICAgIAkJCQkoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmNsYXNzZXMqLyAyKSAmJiB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbMV0gfQogICAgCQkJXSkpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGRlZmF1bHRfc2xvdCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihhKTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIGRlZmF1bHRfc2xvdC5kKGRldGFjaGluZyk7CiAgICAJCQltb3VudGVkID0gZmFsc2U7CiAgICAJCQlydW5fYWxsKGRpc3Bvc2UpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRkLm5hbWUsCiAgICAJCXR5cGU6ICJjb21wb25lbnQiLAogICAgCQlzb3VyY2U6ICIiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RhbmNlJGQoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHsKICAgIAlsZXQgY2xhc3NlczsKICAgIAljb25zdCBvbWl0X3Byb3BzX25hbWVzID0gWyJjbGFzcyIsImRpc2FibGVkIiwiYWN0aXZlIiwiaHJlZiJdOwogICAgCWxldCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKTsKICAgIAlsZXQgeyAkJHNsb3RzOiBzbG90cyA9IHt9LCAkJHNjb3BlIH0gPSAkJHByb3BzOwogICAgCXZhbGlkYXRlX3Nsb3RzKCJOYXZMaW5rIiwgc2xvdHMsIFsnZGVmYXVsdCddKTsKICAgIAlsZXQgeyBjbGFzczogY2xhc3NOYW1lID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgZGlzYWJsZWQgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBhY3RpdmUgPSBmYWxzZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBocmVmID0gIiMiIH0gPSAkJHByb3BzOwoKICAgIAlmdW5jdGlvbiBoYW5kbGVDbGljayhlKSB7CiAgICAJCWlmIChkaXNhYmxlZCkgewogICAgCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgCQkJZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgIAkJCXJldHVybjsKICAgIAkJfQoKICAgIAkJaWYgKGhyZWYgPT09ICIjIikgewogICAgCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgCQl9CiAgICAJfQoKICAgIAlmdW5jdGlvbiBjbGlja19oYW5kbGVyKGV2ZW50KSB7CiAgICAJCWJ1YmJsZSgkJHNlbGYsIGV2ZW50KTsKICAgIAl9CgogICAgCSQkc2VsZi4kJHNldCA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJJCRwcm9wcyA9IGFzc2lnbihhc3NpZ24oe30sICQkcHJvcHMpLCBleGNsdWRlX2ludGVybmFsX3Byb3BzKCQkbmV3X3Byb3BzKSk7CiAgICAJCSQkaW52YWxpZGF0ZSgzLCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKSk7CiAgICAJCWlmICgiY2xhc3MiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNCwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3MpOwogICAgCQlpZiAoImRpc2FibGVkIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDUsIGRpc2FibGVkID0gJCRuZXdfcHJvcHMuZGlzYWJsZWQpOwogICAgCQlpZiAoImFjdGl2ZSIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg2LCBhY3RpdmUgPSAkJG5ld19wcm9wcy5hY3RpdmUpOwogICAgCQlpZiAoImhyZWYiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMCwgaHJlZiA9ICQkbmV3X3Byb3BzLmhyZWYpOwogICAgCQlpZiAoIiQkc2NvcGUiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoNywgJCRzY29wZSA9ICQkbmV3X3Byb3BzLiQkc2NvcGUpOwogICAgCX07CgogICAgCSQkc2VsZi4kY2FwdHVyZV9zdGF0ZSA9ICgpID0+ICh7CiAgICAJCWNsYXNzbmFtZXMsCiAgICAJCWNsYXNzTmFtZSwKICAgIAkJZGlzYWJsZWQsCiAgICAJCWFjdGl2ZSwKICAgIAkJaHJlZiwKICAgIAkJaGFuZGxlQ2xpY2ssCiAgICAJCWNsYXNzZXMKICAgIAl9KTsKCiAgICAJJCRzZWxmLiRpbmplY3Rfc3RhdGUgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCWlmICgiY2xhc3NOYW1lIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNCwgY2xhc3NOYW1lID0gJCRuZXdfcHJvcHMuY2xhc3NOYW1lKTsKICAgIAkJaWYgKCJkaXNhYmxlZCIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDUsIGRpc2FibGVkID0gJCRuZXdfcHJvcHMuZGlzYWJsZWQpOwogICAgCQlpZiAoImFjdGl2ZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDYsIGFjdGl2ZSA9ICQkbmV3X3Byb3BzLmFjdGl2ZSk7CiAgICAJCWlmICgiaHJlZiIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIGhyZWYgPSAkJG5ld19wcm9wcy5ocmVmKTsKICAgIAkJaWYgKCJjbGFzc2VzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMSwgY2xhc3NlcyA9ICQkbmV3X3Byb3BzLmNsYXNzZXMpOwogICAgCX07CgogICAgCWlmICgkJHByb3BzICYmICIkJGluamVjdCIgaW4gJCRwcm9wcykgewogICAgCQkkJHNlbGYuJGluamVjdF9zdGF0ZSgkJHByb3BzLiQkaW5qZWN0KTsKICAgIAl9CgogICAgCSQkc2VsZi4kJC51cGRhdGUgPSAoKSA9PiB7CiAgICAJCWlmICgkJHNlbGYuJCQuZGlydHkgJiAvKmNsYXNzTmFtZSwgZGlzYWJsZWQsIGFjdGl2ZSovIDExMikgewogICAgCQkJICQkaW52YWxpZGF0ZSgxLCBjbGFzc2VzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsICJuYXYtbGluayIsIHsgZGlzYWJsZWQsIGFjdGl2ZSB9KSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlyZXR1cm4gWwogICAgCQlocmVmLAogICAgCQljbGFzc2VzLAogICAgCQloYW5kbGVDbGljaywKICAgIAkJJCRyZXN0UHJvcHMsCiAgICAJCWNsYXNzTmFtZSwKICAgIAkJZGlzYWJsZWQsCiAgICAJCWFjdGl2ZSwKICAgIAkJJCRzY29wZSwKICAgIAkJc2xvdHMsCiAgICAJCWNsaWNrX2hhbmRsZXIKICAgIAldOwogICAgfQoKICAgIGNsYXNzIE5hdkxpbmsgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CgogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJGQsIGNyZWF0ZV9mcmFnbWVudCRkLCBzYWZlX25vdF9lcXVhbCwgewogICAgCQkJY2xhc3M6IDQsCiAgICAJCQlkaXNhYmxlZDogNSwKICAgIAkJCWFjdGl2ZTogNiwKICAgIAkJCWhyZWY6IDAKICAgIAkJfSk7CgogICAgCQlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQ29tcG9uZW50IiwgewogICAgCQkJY29tcG9uZW50OiB0aGlzLAogICAgCQkJdGFnTmFtZTogIk5hdkxpbmsiLAogICAgCQkJb3B0aW9ucywKICAgIAkJCWlkOiBjcmVhdGVfZnJhZ21lbnQkZC5uYW1lCiAgICAJCX0pOwogICAgCX0KCiAgICAJZ2V0IGNsYXNzKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxOYXZMaW5rPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGNsYXNzKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdkxpbms+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgZGlzYWJsZWQoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdkxpbms+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgZGlzYWJsZWQodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TmF2TGluaz46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBhY3RpdmUoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdkxpbms+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgYWN0aXZlKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdkxpbms+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgaHJlZigpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8TmF2TGluaz46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBocmVmKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPE5hdkxpbms+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQogICAgfQoKICAgIC8qIG5vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvUm93LnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjMxLjIgKi8KICAgIGNvbnN0IGZpbGUkZSA9ICJub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL1Jvdy5zdmVsdGUiOwoKICAgIGZ1bmN0aW9uIGNyZWF0ZV9mcmFnbWVudCRlKGN0eCkgewogICAgCWxldCBkaXY7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X3RlbXBsYXRlID0gLyojc2xvdHMqLyBjdHhbNl0uZGVmYXVsdDsKICAgIAljb25zdCBkZWZhdWx0X3Nsb3QgPSBjcmVhdGVfc2xvdChkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzVdLCBudWxsKTsKICAgIAlsZXQgZGl2X2xldmVscyA9IFsvKiQkcmVzdFByb3BzKi8gY3R4WzFdLCB7IGNsYXNzOiAvKmNsYXNzZXMqLyBjdHhbMF0gfV07CiAgICAJbGV0IGRpdl9kYXRhID0ge307CgogICAgCWZvciAobGV0IGkgPSAwOyBpIDwgZGl2X2xldmVscy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQlkaXZfZGF0YSA9IGFzc2lnbihkaXZfZGF0YSwgZGl2X2xldmVsc1tpXSk7CiAgICAJfQoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJZGl2ID0gZWxlbWVudCgiZGl2Iik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuYygpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZGl2LCBkaXZfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oZGl2LCBmaWxlJGUsIDE1LCAwLCAyODYpOwogICAgCQl9LAogICAgCQlsOiBmdW5jdGlvbiBjbGFpbShub2RlcykgewogICAgCQkJdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zLmh5ZHJhdGUgb25seSB3b3JrcyBpZiB0aGUgY29tcG9uZW50IHdhcyBjb21waWxlZCB3aXRoIHRoZSBgaHlkcmF0YWJsZTogdHJ1ZWAgb3B0aW9uIik7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgZGl2LCBhbmNob3IpOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3QpIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3QubShkaXYsIG51bGwpOwogICAgCQkJfQoKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBbZGlydHldKSB7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSB7CiAgICAJCQkJaWYgKGRlZmF1bHRfc2xvdC5wICYmIGRpcnR5ICYgLyokJHNjb3BlKi8gMzIpIHsKICAgIAkJCQkJdXBkYXRlX3Nsb3QoZGVmYXVsdF9zbG90LCBkZWZhdWx0X3Nsb3RfdGVtcGxhdGUsIGN0eCwgLyokJHNjb3BlKi8gY3R4WzVdLCBkaXJ0eSwgbnVsbCwgbnVsbCk7CiAgICAJCQkJfQogICAgCQkJfQoKICAgIAkJCXNldF9hdHRyaWJ1dGVzKGRpdiwgZGl2X2RhdGEgPSBnZXRfc3ByZWFkX3VwZGF0ZShkaXZfbGV2ZWxzLCBbCiAgICAJCQkJZGlydHkgJiAvKiQkcmVzdFByb3BzKi8gMiAmJiAvKiQkcmVzdFByb3BzKi8gY3R4WzFdLAogICAgCQkJCSghY3VycmVudCB8fCBkaXJ0eSAmIC8qY2xhc3NlcyovIDEpICYmIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFswXSB9CiAgICAJCQldKSk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihkZWZhdWx0X3Nsb3QsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoZGVmYXVsdF9zbG90LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGRpdik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90KSBkZWZhdWx0X3Nsb3QuZChkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRlLm5hbWUsCiAgICAJCXR5cGU6ICJjb21wb25lbnQiLAogICAgCQlzb3VyY2U6ICIiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RhbmNlJGUoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHsKICAgIAlsZXQgY2xhc3NlczsKICAgIAljb25zdCBvbWl0X3Byb3BzX25hbWVzID0gWyJjbGFzcyIsIm5vR3V0dGVycyIsImZvcm0iXTsKICAgIAlsZXQgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcyk7CiAgICAJbGV0IHsgJCRzbG90czogc2xvdHMgPSB7fSwgJCRzY29wZSB9ID0gJCRwcm9wczsKICAgIAl2YWxpZGF0ZV9zbG90cygiUm93Iiwgc2xvdHMsIFsnZGVmYXVsdCddKTsKICAgIAlsZXQgeyBjbGFzczogY2xhc3NOYW1lID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgbm9HdXR0ZXJzID0gZmFsc2UgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgZm9ybSA9IGZhbHNlIH0gPSAkJHByb3BzOwoKICAgIAkkJHNlbGYuJCRzZXQgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCSQkcHJvcHMgPSBhc3NpZ24oYXNzaWduKHt9LCAkJHByb3BzKSwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcygkJG5ld19wcm9wcykpOwogICAgCQkkJGludmFsaWRhdGUoMSwgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcykpOwogICAgCQlpZiAoImNsYXNzIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzKTsKICAgIAkJaWYgKCJub0d1dHRlcnMiIGluICQkbmV3X3Byb3BzKSAkJGludmFsaWRhdGUoMywgbm9HdXR0ZXJzID0gJCRuZXdfcHJvcHMubm9HdXR0ZXJzKTsKICAgIAkJaWYgKCJmb3JtIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDQsIGZvcm0gPSAkJG5ld19wcm9wcy5mb3JtKTsKICAgIAkJaWYgKCIkJHNjb3BlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDUsICQkc2NvcGUgPSAkJG5ld19wcm9wcy4kJHNjb3BlKTsKICAgIAl9OwoKICAgIAkkJHNlbGYuJGNhcHR1cmVfc3RhdGUgPSAoKSA9PiAoewogICAgCQljbGFzc25hbWVzLAogICAgCQljbGFzc05hbWUsCiAgICAJCW5vR3V0dGVycywKICAgIAkJZm9ybSwKICAgIAkJY2xhc3NlcwogICAgCX0pOwoKICAgIAkkJHNlbGYuJGluamVjdF9zdGF0ZSA9ICQkbmV3X3Byb3BzID0+IHsKICAgIAkJaWYgKCJjbGFzc05hbWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgyLCBjbGFzc05hbWUgPSAkJG5ld19wcm9wcy5jbGFzc05hbWUpOwogICAgCQlpZiAoIm5vR3V0dGVycyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIG5vR3V0dGVycyA9ICQkbmV3X3Byb3BzLm5vR3V0dGVycyk7CiAgICAJCWlmICgiZm9ybSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDQsIGZvcm0gPSAkJG5ld19wcm9wcy5mb3JtKTsKICAgIAkJaWYgKCJjbGFzc2VzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMCwgY2xhc3NlcyA9ICQkbmV3X3Byb3BzLmNsYXNzZXMpOwogICAgCX07CgogICAgCWlmICgkJHByb3BzICYmICIkJGluamVjdCIgaW4gJCRwcm9wcykgewogICAgCQkkJHNlbGYuJGluamVjdF9zdGF0ZSgkJHByb3BzLiQkaW5qZWN0KTsKICAgIAl9CgogICAgCSQkc2VsZi4kJC51cGRhdGUgPSAoKSA9PiB7CiAgICAJCWlmICgkJHNlbGYuJCQuZGlydHkgJiAvKmNsYXNzTmFtZSwgbm9HdXR0ZXJzLCBmb3JtKi8gMjgpIHsKICAgIAkJCSAkJGludmFsaWRhdGUoMCwgY2xhc3NlcyA9IGNsYXNzbmFtZXMoY2xhc3NOYW1lLCBub0d1dHRlcnMgPyAibm8tZ3V0dGVycyIgOiBudWxsLCBmb3JtID8gImZvcm0tcm93IiA6ICJyb3ciKSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlyZXR1cm4gW2NsYXNzZXMsICQkcmVzdFByb3BzLCBjbGFzc05hbWUsIG5vR3V0dGVycywgZm9ybSwgJCRzY29wZSwgc2xvdHNdOwogICAgfQoKICAgIGNsYXNzIFJvdyBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudERldiB7CiAgICAJY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgCQlzdXBlcihvcHRpb25zKTsKICAgIAkJaW5pdCh0aGlzLCBvcHRpb25zLCBpbnN0YW5jZSRlLCBjcmVhdGVfZnJhZ21lbnQkZSwgc2FmZV9ub3RfZXF1YWwsIHsgY2xhc3M6IDIsIG5vR3V0dGVyczogMywgZm9ybTogNCB9KTsKCiAgICAJCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJDb21wb25lbnQiLCB7CiAgICAJCQljb21wb25lbnQ6IHRoaXMsCiAgICAJCQl0YWdOYW1lOiAiUm93IiwKICAgIAkJCW9wdGlvbnMsCiAgICAJCQlpZDogY3JlYXRlX2ZyYWdtZW50JGUubmFtZQogICAgCQl9KTsKICAgIAl9CgogICAgCWdldCBjbGFzcygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Um93PjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGNsYXNzKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPFJvdz46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBub0d1dHRlcnMoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPFJvdz46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBub0d1dHRlcnModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8Um93PjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJZ2V0IGZvcm0oKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPFJvdz46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBmb3JtKHZhbHVlKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPFJvdz46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CiAgICB9CgogICAgLyogbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9TcGlubmVyLnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjMxLjIgKi8KICAgIGNvbnN0IGZpbGUkZiA9ICJub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL1NwaW5uZXIuc3ZlbHRlIjsKCiAgICAvLyAoMjA6MTApIExvYWRpbmcuLi4KICAgIGZ1bmN0aW9uIGZhbGxiYWNrX2Jsb2NrJDEoY3R4KSB7CiAgICAJbGV0IHQ7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl0ID0gdGV4dCgiTG9hZGluZy4uLiIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGZhbGxiYWNrX2Jsb2NrJDEubmFtZSwKICAgIAkJdHlwZTogImZhbGxiYWNrIiwKICAgIAkJc291cmNlOiAiKDIwOjEwKSBMb2FkaW5nLi4uIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkZihjdHgpIHsKICAgIAlsZXQgZGl2OwogICAgCWxldCBzcGFuOwogICAgCWxldCBjdXJyZW50OwogICAgCWNvbnN0IGRlZmF1bHRfc2xvdF90ZW1wbGF0ZSA9IC8qI3Nsb3RzKi8gY3R4WzddLmRlZmF1bHQ7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90ID0gY3JlYXRlX3Nsb3QoZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFs2XSwgbnVsbCk7CiAgICAJY29uc3QgZGVmYXVsdF9zbG90X29yX2ZhbGxiYWNrID0gZGVmYXVsdF9zbG90IHx8IGZhbGxiYWNrX2Jsb2NrJDEoY3R4KTsKICAgIAlsZXQgZGl2X2xldmVscyA9IFsvKiQkcmVzdFByb3BzKi8gY3R4WzFdLCB7IHJvbGU6ICJzdGF0dXMiIH0sIHsgY2xhc3M6IC8qY2xhc3NlcyovIGN0eFswXSB9XTsKICAgIAlsZXQgZGl2X2RhdGEgPSB7fTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBkaXZfbGV2ZWxzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWRpdl9kYXRhID0gYXNzaWduKGRpdl9kYXRhLCBkaXZfbGV2ZWxzW2ldKTsKICAgIAl9CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlkaXYgPSBlbGVtZW50KCJkaXYiKTsKICAgIAkJCXNwYW4gPSBlbGVtZW50KCJzcGFuIik7CiAgICAJCQlpZiAoZGVmYXVsdF9zbG90X29yX2ZhbGxiYWNrKSBkZWZhdWx0X3Nsb3Rfb3JfZmFsbGJhY2suYygpOwogICAgCQkJYXR0cl9kZXYoc3BhbiwgImNsYXNzIiwgInNyLW9ubHkiKTsKICAgIAkJCWFkZF9sb2NhdGlvbihzcGFuLCBmaWxlJGYsIDE4LCAyLCAzOTkpOwogICAgCQkJc2V0X2F0dHJpYnV0ZXMoZGl2LCBkaXZfZGF0YSk7CiAgICAJCQlhZGRfbG9jYXRpb24oZGl2LCBmaWxlJGYsIDE3LCAwLCAzNDQpOwogICAgCQl9LAogICAgCQlsOiBmdW5jdGlvbiBjbGFpbShub2RlcykgewogICAgCQkJdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zLmh5ZHJhdGUgb25seSB3b3JrcyBpZiB0aGUgY29tcG9uZW50IHdhcyBjb21waWxlZCB3aXRoIHRoZSBgaHlkcmF0YWJsZTogdHJ1ZWAgb3B0aW9uIik7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgZGl2LCBhbmNob3IpOwogICAgCQkJYXBwZW5kX2RldihkaXYsIHNwYW4pOwoKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3Rfb3JfZmFsbGJhY2spIHsKICAgIAkJCQlkZWZhdWx0X3Nsb3Rfb3JfZmFsbGJhY2subShzcGFuLCBudWxsKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgW2RpcnR5XSkgewogICAgCQkJaWYgKGRlZmF1bHRfc2xvdCkgewogICAgCQkJCWlmIChkZWZhdWx0X3Nsb3QucCAmJiBkaXJ0eSAmIC8qJCRzY29wZSovIDY0KSB7CiAgICAJCQkJCXVwZGF0ZV9zbG90KGRlZmF1bHRfc2xvdCwgZGVmYXVsdF9zbG90X3RlbXBsYXRlLCBjdHgsIC8qJCRzY29wZSovIGN0eFs2XSwgZGlydHksIG51bGwsIG51bGwpOwogICAgCQkJCX0KICAgIAkJCX0KCiAgICAJCQlzZXRfYXR0cmlidXRlcyhkaXYsIGRpdl9kYXRhID0gZ2V0X3NwcmVhZF91cGRhdGUoZGl2X2xldmVscywgWwogICAgCQkJCWRpcnR5ICYgLyokJHJlc3RQcm9wcyovIDIgJiYgLyokJHJlc3RQcm9wcyovIGN0eFsxXSwKICAgIAkJCQl7IHJvbGU6ICJzdGF0dXMiIH0sCiAgICAJCQkJKCFjdXJyZW50IHx8IGRpcnR5ICYgLypjbGFzc2VzKi8gMSkgJiYgeyBjbGFzczogLypjbGFzc2VzKi8gY3R4WzBdIH0KICAgIAkJCV0pKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGRlZmF1bHRfc2xvdF9vcl9mYWxsYmFjaywgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChkZWZhdWx0X3Nsb3Rfb3JfZmFsbGJhY2ssIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoZGl2KTsKICAgIAkJCWlmIChkZWZhdWx0X3Nsb3Rfb3JfZmFsbGJhY2spIGRlZmF1bHRfc2xvdF9vcl9mYWxsYmFjay5kKGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2ZyYWdtZW50JGYubmFtZSwKICAgIAkJdHlwZTogImNvbXBvbmVudCIsCiAgICAJCXNvdXJjZTogIiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2UkZigkJHNlbGYsICQkcHJvcHMsICQkaW52YWxpZGF0ZSkgewogICAgCWxldCBjbGFzc2VzOwogICAgCWNvbnN0IG9taXRfcHJvcHNfbmFtZXMgPSBbImNsYXNzIiwidHlwZSIsInNpemUiLCJjb2xvciJdOwogICAgCWxldCAkJHJlc3RQcm9wcyA9IGNvbXB1dGVfcmVzdF9wcm9wcygkJHByb3BzLCBvbWl0X3Byb3BzX25hbWVzKTsKICAgIAlsZXQgeyAkJHNsb3RzOiBzbG90cyA9IHt9LCAkJHNjb3BlIH0gPSAkJHByb3BzOwogICAgCXZhbGlkYXRlX3Nsb3RzKCJTcGlubmVyIiwgc2xvdHMsIFsnZGVmYXVsdCddKTsKICAgIAlsZXQgeyBjbGFzczogY2xhc3NOYW1lID0gIiIgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHsgdHlwZSA9ICJib3JkZXIiIH0gPSAkJHByb3BzOwogICAgCWxldCB7IHNpemUgPSAiIiB9ID0gJCRwcm9wczsKICAgIAlsZXQgeyBjb2xvciA9ICIiIH0gPSAkJHByb3BzOwoKICAgIAkkJHNlbGYuJCRzZXQgPSAkJG5ld19wcm9wcyA9PiB7CiAgICAJCSQkcHJvcHMgPSBhc3NpZ24oYXNzaWduKHt9LCAkJHByb3BzKSwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcygkJG5ld19wcm9wcykpOwogICAgCQkkJGludmFsaWRhdGUoMSwgJCRyZXN0UHJvcHMgPSBjb21wdXRlX3Jlc3RfcHJvcHMoJCRwcm9wcywgb21pdF9wcm9wc19uYW1lcykpOwogICAgCQlpZiAoImNsYXNzIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzKTsKICAgIAkJaWYgKCJ0eXBlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDMsIHR5cGUgPSAkJG5ld19wcm9wcy50eXBlKTsKICAgIAkJaWYgKCJzaXplIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDQsIHNpemUgPSAkJG5ld19wcm9wcy5zaXplKTsKICAgIAkJaWYgKCJjb2xvciIgaW4gJCRuZXdfcHJvcHMpICQkaW52YWxpZGF0ZSg1LCBjb2xvciA9ICQkbmV3X3Byb3BzLmNvbG9yKTsKICAgIAkJaWYgKCIkJHNjb3BlIiBpbiAkJG5ld19wcm9wcykgJCRpbnZhbGlkYXRlKDYsICQkc2NvcGUgPSAkJG5ld19wcm9wcy4kJHNjb3BlKTsKICAgIAl9OwoKICAgIAkkJHNlbGYuJGNhcHR1cmVfc3RhdGUgPSAoKSA9PiAoewogICAgCQljbGFzc25hbWVzLAogICAgCQljbGFzc05hbWUsCiAgICAJCXR5cGUsCiAgICAJCXNpemUsCiAgICAJCWNvbG9yLAogICAgCQljbGFzc2VzCiAgICAJfSk7CgogICAgCSQkc2VsZi4kaW5qZWN0X3N0YXRlID0gJCRuZXdfcHJvcHMgPT4gewogICAgCQlpZiAoImNsYXNzTmFtZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDIsIGNsYXNzTmFtZSA9ICQkbmV3X3Byb3BzLmNsYXNzTmFtZSk7CiAgICAJCWlmICgidHlwZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIHR5cGUgPSAkJG5ld19wcm9wcy50eXBlKTsKICAgIAkJaWYgKCJzaXplIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNCwgc2l6ZSA9ICQkbmV3X3Byb3BzLnNpemUpOwogICAgCQlpZiAoImNvbG9yIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNSwgY29sb3IgPSAkJG5ld19wcm9wcy5jb2xvcik7CiAgICAJCWlmICgiY2xhc3NlcyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIGNsYXNzZXMgPSAkJG5ld19wcm9wcy5jbGFzc2VzKTsKICAgIAl9OwoKICAgIAlpZiAoJCRwcm9wcyAmJiAiJCRpbmplY3QiIGluICQkcHJvcHMpIHsKICAgIAkJJCRzZWxmLiRpbmplY3Rfc3RhdGUoJCRwcm9wcy4kJGluamVjdCk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCQudXBkYXRlID0gKCkgPT4gewogICAgCQlpZiAoJCRzZWxmLiQkLmRpcnR5ICYgLypjbGFzc05hbWUsIHNpemUsIHR5cGUsIGNvbG9yKi8gNjApIHsKICAgIAkJCSAkJGludmFsaWRhdGUoMCwgY2xhc3NlcyA9IGNsYXNzbmFtZXMoY2xhc3NOYW1lLCBzaXplID8gYHNwaW5uZXItJHt0eXBlfS0ke3NpemV9YCA6IGZhbHNlLCBgc3Bpbm5lci0ke3R5cGV9YCwgY29sb3IgPyBgdGV4dC0ke2NvbG9yfWAgOiBmYWxzZSkpOwogICAgCQl9CiAgICAJfTsKCiAgICAJcmV0dXJuIFtjbGFzc2VzLCAkJHJlc3RQcm9wcywgY2xhc3NOYW1lLCB0eXBlLCBzaXplLCBjb2xvciwgJCRzY29wZSwgc2xvdHNdOwogICAgfQoKICAgIGNsYXNzIFNwaW5uZXIgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CiAgICAJCWluaXQodGhpcywgb3B0aW9ucywgaW5zdGFuY2UkZiwgY3JlYXRlX2ZyYWdtZW50JGYsIHNhZmVfbm90X2VxdWFsLCB7IGNsYXNzOiAyLCB0eXBlOiAzLCBzaXplOiA0LCBjb2xvcjogNSB9KTsKCiAgICAJCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJDb21wb25lbnQiLCB7CiAgICAJCQljb21wb25lbnQ6IHRoaXMsCiAgICAJCQl0YWdOYW1lOiAiU3Bpbm5lciIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRmLm5hbWUKICAgIAkJfSk7CiAgICAJfQoKICAgIAlnZXQgY2xhc3MoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPFNwaW5uZXI+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgY2xhc3ModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U3Bpbm5lcj46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCB0eXBlKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxTcGlubmVyPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHR5cGUodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U3Bpbm5lcj46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBzaXplKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxTcGlubmVyPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IHNpemUodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U3Bpbm5lcj46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCWdldCBjb2xvcigpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U3Bpbm5lcj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBjb2xvcih2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxTcGlubmVyPjogUHJvcHMgY2Fubm90IGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KICAgIH0KCiAgICBjb25zdCBzY2FubmVyID0gd3JpdGFibGUoIiIpOwoKICAgIC8qIHNyYy9TY2FubmVycy5zdmVsdGUgZ2VuZXJhdGVkIGJ5IFN2ZWx0ZSB2My4zMS4yICovCgogICAgZnVuY3Rpb24gZ2V0X2VhY2hfY29udGV4dChjdHgsIGxpc3QsIGkpIHsKICAgIAljb25zdCBjaGlsZF9jdHggPSBjdHguc2xpY2UoKTsKICAgIAljaGlsZF9jdHhbM10gPSBsaXN0W2ldOwogICAgCXJldHVybiBjaGlsZF9jdHg7CiAgICB9CgogICAgLy8gKDM2OjApIHs6ZWxzZX0KICAgIGZ1bmN0aW9uIGNyZWF0ZV9lbHNlX2Jsb2NrJDUoY3R4KSB7CiAgICAJbGV0IHNwaW5uZXI7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJc3Bpbm5lciA9IG5ldyBTcGlubmVyKHsgJCRpbmxpbmU6IHRydWUgfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KHNwaW5uZXIuJCQuZnJhZ21lbnQpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJbW91bnRfY29tcG9uZW50KHNwaW5uZXIsIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBub29wLAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oc3Bpbm5lci4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChzcGlubmVyLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChzcGlubmVyLCBkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9lbHNlX2Jsb2NrJDUubmFtZSwKICAgIAkJdHlwZTogImVsc2UiLAogICAgCQlzb3VyY2U6ICIoMzY6MCkgezplbHNlfSIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDMwOjApIHsjaWYgc2Nhbm5lcnN9CiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2skNShjdHgpIHsKICAgIAlsZXQgbGlzdGdyb3VwOwogICAgCWxldCBjdXJyZW50OwoKICAgIAlsaXN0Z3JvdXAgPSBuZXcgTGlzdEdyb3VwKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJJCRzbG90czogeyBkZWZhdWx0OiBbY3JlYXRlX2RlZmF1bHRfc2xvdF0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGxpc3Rncm91cC4kJC5mcmFnbWVudCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQltb3VudF9jb21wb25lbnQobGlzdGdyb3VwLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWNvbnN0IGxpc3Rncm91cF9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBzY2FubmVycywgdmFsdWUqLyA2NykgewogICAgCQkJCWxpc3Rncm91cF9jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQlsaXN0Z3JvdXAuJHNldChsaXN0Z3JvdXBfY2hhbmdlcyk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihsaXN0Z3JvdXAuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQobGlzdGdyb3VwLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChsaXN0Z3JvdXAsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrJDUubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDMwOjApIHsjaWYgc2Nhbm5lcnN9IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoMzM6OCkgPExpc3RHcm91cEl0ZW0gYWN0aXZlPXtzY2FubmVyLm5hbWUgPT0gdmFsdWV9IGFjdGlvbiB0YWc9ImJ1dHRvbiIgb246Y2xpY2s9e3NlbGVjdChzY2FubmVyLm5hbWUpfT4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfMShjdHgpIHsKICAgIAlsZXQgdF92YWx1ZSA9IC8qc2Nhbm5lciovIGN0eFszXS5uYW1lICsgIiI7CiAgICAJbGV0IHQ7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl0ID0gdGV4dCh0X3ZhbHVlKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0LCBhbmNob3IpOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJaWYgKGRpcnR5ICYgLypzY2FubmVycyovIDEgJiYgdF92YWx1ZSAhPT0gKHRfdmFsdWUgPSAvKnNjYW5uZXIqLyBjdHhbM10ubmFtZSArICIiKSkgc2V0X2RhdGFfZGV2KHQsIHRfdmFsdWUpOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0KTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzEubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoMzM6OCkgPExpc3RHcm91cEl0ZW0gYWN0aXZlPXtzY2FubmVyLm5hbWUgPT0gdmFsdWV9IGFjdGlvbiB0YWc9XFxcImJ1dHRvblxcXCIgb246Y2xpY2s9e3NlbGVjdChzY2FubmVyLm5hbWUpfT4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgzMjo0KSB7I2VhY2ggc2Nhbm5lcnMgYXMgc2Nhbm5lciB9CiAgICBmdW5jdGlvbiBjcmVhdGVfZWFjaF9ibG9jayhjdHgpIHsKICAgIAlsZXQgbGlzdGdyb3VwaXRlbTsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJbGlzdGdyb3VwaXRlbSA9IG5ldyBMaXN0R3JvdXBJdGVtKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJYWN0aXZlOiAvKnNjYW5uZXIqLyBjdHhbM10ubmFtZSA9PSAvKnZhbHVlKi8gY3R4WzFdLAogICAgCQkJCWFjdGlvbjogdHJ1ZSwKICAgIAkJCQl0YWc6ICJidXR0b24iLAogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfMV0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWxpc3Rncm91cGl0ZW0uJG9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsKICAgIAkJaWYgKGlzX2Z1bmN0aW9uKC8qc2VsZWN0Ki8gY3R4WzJdKC8qc2Nhbm5lciovIGN0eFszXS5uYW1lKSkpIC8qc2VsZWN0Ki8gY3R4WzJdKC8qc2Nhbm5lciovIGN0eFszXS5uYW1lKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgCX0pOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJY3JlYXRlX2NvbXBvbmVudChsaXN0Z3JvdXBpdGVtLiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChsaXN0Z3JvdXBpdGVtLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKG5ld19jdHgsIGRpcnR5KSB7CiAgICAJCQljdHggPSBuZXdfY3R4OwogICAgCQkJY29uc3QgbGlzdGdyb3VwaXRlbV9jaGFuZ2VzID0ge307CiAgICAJCQlpZiAoZGlydHkgJiAvKnNjYW5uZXJzLCB2YWx1ZSovIDMpIGxpc3Rncm91cGl0ZW1fY2hhbmdlcy5hY3RpdmUgPSAvKnNjYW5uZXIqLyBjdHhbM10ubmFtZSA9PSAvKnZhbHVlKi8gY3R4WzFdOwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSwgc2Nhbm5lcnMqLyA2NSkgewogICAgCQkJCWxpc3Rncm91cGl0ZW1fY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJbGlzdGdyb3VwaXRlbS4kc2V0KGxpc3Rncm91cGl0ZW1fY2hhbmdlcyk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihsaXN0Z3JvdXBpdGVtLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGxpc3Rncm91cGl0ZW0uJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KGxpc3Rncm91cGl0ZW0sIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2VhY2hfYmxvY2submFtZSwKICAgIAkJdHlwZTogImVhY2giLAogICAgCQlzb3VyY2U6ICIoMzI6NCkgeyNlYWNoIHNjYW5uZXJzIGFzIHNjYW5uZXIgfSIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDMxOjQpIDxMaXN0R3JvdXA+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90KGN0eCkgewogICAgCWxldCBlYWNoXzFfYW5jaG9yOwogICAgCWxldCBjdXJyZW50OwogICAgCWxldCBlYWNoX3ZhbHVlID0gLypzY2FubmVycyovIGN0eFswXTsKICAgIAl2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50KGVhY2hfdmFsdWUpOwogICAgCWxldCBlYWNoX2Jsb2NrcyA9IFtdOwoKICAgIAlmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfdmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJZWFjaF9ibG9ja3NbaV0gPSBjcmVhdGVfZWFjaF9ibG9jayhnZXRfZWFjaF9jb250ZXh0KGN0eCwgZWFjaF92YWx1ZSwgaSkpOwogICAgCX0KCiAgICAJY29uc3Qgb3V0ID0gaSA9PiB0cmFuc2l0aW9uX291dChlYWNoX2Jsb2Nrc1tpXSwgMSwgMSwgKCkgPT4gewogICAgCQllYWNoX2Jsb2Nrc1tpXSA9IG51bGw7CiAgICAJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfYmxvY2tzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCQkJZWFjaF9ibG9ja3NbaV0uYygpOwogICAgCQkJfQoKICAgIAkJCWVhY2hfMV9hbmNob3IgPSBlbXB0eSgpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX2Jsb2Nrcy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQkJCWVhY2hfYmxvY2tzW2ldLm0odGFyZ2V0LCBhbmNob3IpOwogICAgCQkJfQoKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBlYWNoXzFfYW5jaG9yLCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGlydHkgJiAvKnNjYW5uZXJzLCB2YWx1ZSwgc2VsZWN0Ki8gNykgewogICAgCQkJCWVhY2hfdmFsdWUgPSAvKnNjYW5uZXJzKi8gY3R4WzBdOwogICAgCQkJCXZhbGlkYXRlX2VhY2hfYXJndW1lbnQoZWFjaF92YWx1ZSk7CiAgICAJCQkJbGV0IGk7CgogICAgCQkJCWZvciAoaSA9IDA7IGkgPCBlYWNoX3ZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCQkJCWNvbnN0IGNoaWxkX2N0eCA9IGdldF9lYWNoX2NvbnRleHQoY3R4LCBlYWNoX3ZhbHVlLCBpKTsKCiAgICAJCQkJCWlmIChlYWNoX2Jsb2Nrc1tpXSkgewogICAgCQkJCQkJZWFjaF9ibG9ja3NbaV0ucChjaGlsZF9jdHgsIGRpcnR5KTsKICAgIAkJCQkJCXRyYW5zaXRpb25faW4oZWFjaF9ibG9ja3NbaV0sIDEpOwogICAgCQkJCQl9IGVsc2UgewogICAgCQkJCQkJZWFjaF9ibG9ja3NbaV0gPSBjcmVhdGVfZWFjaF9ibG9jayhjaGlsZF9jdHgpOwogICAgCQkJCQkJZWFjaF9ibG9ja3NbaV0uYygpOwogICAgCQkJCQkJdHJhbnNpdGlvbl9pbihlYWNoX2Jsb2Nrc1tpXSwgMSk7CiAgICAJCQkJCQllYWNoX2Jsb2Nrc1tpXS5tKGVhY2hfMV9hbmNob3IucGFyZW50Tm9kZSwgZWFjaF8xX2FuY2hvcik7CiAgICAJCQkJCX0KICAgIAkJCQl9CgogICAgCQkJCWdyb3VwX291dHJvcygpOwoKICAgIAkJCQlmb3IgKGkgPSBlYWNoX3ZhbHVlLmxlbmd0aDsgaSA8IGVhY2hfYmxvY2tzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCQkJCW91dChpKTsKICAgIAkJCQl9CgogICAgCQkJCWNoZWNrX291dHJvcygpOwogICAgCQkJfQogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKCiAgICAJCQlmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfdmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJCQl0cmFuc2l0aW9uX2luKGVhY2hfYmxvY2tzW2ldKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCWVhY2hfYmxvY2tzID0gZWFjaF9ibG9ja3MuZmlsdGVyKEJvb2xlYW4pOwoKICAgIAkJCWZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJCQl0cmFuc2l0aW9uX291dChlYWNoX2Jsb2Nrc1tpXSk7CiAgICAJCQl9CgogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJZGVzdHJveV9lYWNoKGVhY2hfYmxvY2tzLCBkZXRhY2hpbmcpOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihlYWNoXzFfYW5jaG9yKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90Lm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDMxOjQpIDxMaXN0R3JvdXA+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkZyhjdHgpIHsKICAgIAlsZXQgY3VycmVudF9ibG9ja190eXBlX2luZGV4OwogICAgCWxldCBpZl9ibG9jazsKICAgIAlsZXQgaWZfYmxvY2tfYW5jaG9yOwogICAgCWxldCBjdXJyZW50OwogICAgCWNvbnN0IGlmX2Jsb2NrX2NyZWF0b3JzID0gW2NyZWF0ZV9pZl9ibG9jayQ1LCBjcmVhdGVfZWxzZV9ibG9jayQ1XTsKICAgIAljb25zdCBpZl9ibG9ja3MgPSBbXTsKCiAgICAJZnVuY3Rpb24gc2VsZWN0X2Jsb2NrX3R5cGUoY3R4LCBkaXJ0eSkgewogICAgCQlpZiAoLypzY2FubmVycyovIGN0eFswXSkgcmV0dXJuIDA7CiAgICAJCXJldHVybiAxOwogICAgCX0KCiAgICAJY3VycmVudF9ibG9ja190eXBlX2luZGV4ID0gc2VsZWN0X2Jsb2NrX3R5cGUoY3R4KTsKICAgIAlpZl9ibG9jayA9IGlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdID0gaWZfYmxvY2tfY3JlYXRvcnNbY3VycmVudF9ibG9ja190eXBlX2luZGV4XShjdHgpOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaWZfYmxvY2suYygpOwogICAgCQkJaWZfYmxvY2tfYW5jaG9yID0gZW1wdHkoKTsKICAgIAkJfSwKICAgIAkJbDogZnVuY3Rpb24gY2xhaW0obm9kZXMpIHsKICAgIAkJCXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5oeWRyYXRlIG9ubHkgd29ya3MgaWYgdGhlIGNvbXBvbmVudCB3YXMgY29tcGlsZWQgd2l0aCB0aGUgYGh5ZHJhdGFibGU6IHRydWVgIG9wdGlvbiIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0ubSh0YXJnZXQsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgaWZfYmxvY2tfYW5jaG9yLCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIFtkaXJ0eV0pIHsKICAgIAkJCWxldCBwcmV2aW91c19ibG9ja19pbmRleCA9IGN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleDsKICAgIAkJCWN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleCA9IHNlbGVjdF9ibG9ja190eXBlKGN0eCk7CgogICAgCQkJaWYgKGN1cnJlbnRfYmxvY2tfdHlwZV9pbmRleCA9PT0gcHJldmlvdXNfYmxvY2tfaW5kZXgpIHsKICAgIAkJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5wKGN0eCwgZGlydHkpOwogICAgCQkJfSBlbHNlIHsKICAgIAkJCQlncm91cF9vdXRyb3MoKTsKCiAgICAJCQkJdHJhbnNpdGlvbl9vdXQoaWZfYmxvY2tzW3ByZXZpb3VzX2Jsb2NrX2luZGV4XSwgMSwgMSwgKCkgPT4gewogICAgCQkJCQlpZl9ibG9ja3NbcHJldmlvdXNfYmxvY2tfaW5kZXhdID0gbnVsbDsKICAgIAkJCQl9KTsKCiAgICAJCQkJY2hlY2tfb3V0cm9zKCk7CiAgICAJCQkJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XTsKCiAgICAJCQkJaWYgKCFpZl9ibG9jaykgewogICAgCQkJCQlpZl9ibG9jayA9IGlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdID0gaWZfYmxvY2tfY3JlYXRvcnNbY3VycmVudF9ibG9ja190eXBlX2luZGV4XShjdHgpOwogICAgCQkJCQlpZl9ibG9jay5jKCk7CiAgICAJCQkJfSBlbHNlIHsKICAgIAkJCQkJaWZfYmxvY2sucChjdHgsIGRpcnR5KTsKICAgIAkJCQl9CgogICAgCQkJCXRyYW5zaXRpb25faW4oaWZfYmxvY2ssIDEpOwogICAgCQkJCWlmX2Jsb2NrLm0oaWZfYmxvY2tfYW5jaG9yLnBhcmVudE5vZGUsIGlmX2Jsb2NrX2FuY2hvcik7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihpZl9ibG9jayk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGlmX2Jsb2NrKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdLmQoZGV0YWNoaW5nKTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoaWZfYmxvY2tfYW5jaG9yKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZnJhZ21lbnQkZy5uYW1lLAogICAgCQl0eXBlOiAiY29tcG9uZW50IiwKICAgIAkJc291cmNlOiAiIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnN0YW5jZSRnKCQkc2VsZiwgJCRwcm9wcywgJCRpbnZhbGlkYXRlKSB7CiAgICAJbGV0IHsgJCRzbG90czogc2xvdHMgPSB7fSwgJCRzY29wZSB9ID0gJCRwcm9wczsKICAgIAl2YWxpZGF0ZV9zbG90cygiU2Nhbm5lcnMiLCBzbG90cywgW10pOwogICAgCWxldCBzY2FubmVyczsKCiAgICAJb25Nb3VudChhc3luYyAoKSA9PiB7CiAgICAJCWF3YWl0IGZldGNoKGAvYXBpL2RldmljZXNgKS50aGVuKHIgPT4gci5qc29uKCkpLnRoZW4oZGF0YSA9PiB7CiAgICAJCQkkJGludmFsaWRhdGUoMCwgc2Nhbm5lcnMgPSBkYXRhKTsKCiAgICAJCQlpZiAoc2Nhbm5lcnMubGVuZ3RoID4gMCkgewogICAgCQkJCXNlbGVjdChzY2FubmVyc1swXS5uYW1lKTsKICAgIAkJCX0KICAgIAkJfSk7CiAgICAJfSk7CgogICAgCWZ1bmN0aW9uIHNlbGVjdChuYW1lKSB7CiAgICAJCXNjYW5uZXIuc2V0KG5hbWUpOwogICAgCQkkJGludmFsaWRhdGUoMSwgdmFsdWUgPSBuYW1lKTsKICAgIAl9CgogICAgCWxldCB2YWx1ZSA9ICIiOwogICAgCWNvbnN0IHdyaXRhYmxlX3Byb3BzID0gW107CgogICAgCU9iamVjdC5rZXlzKCQkcHJvcHMpLmZvckVhY2goa2V5ID0+IHsKICAgIAkJaWYgKCF+d3JpdGFibGVfcHJvcHMuaW5kZXhPZihrZXkpICYmIGtleS5zbGljZSgwLCAyKSAhPT0gIiQkIikgY29uc29sZS53YXJuKGA8U2Nhbm5lcnM+IHdhcyBjcmVhdGVkIHdpdGggdW5rbm93biBwcm9wICcke2tleX0nYCk7CiAgICAJfSk7CgogICAgCSQkc2VsZi4kY2FwdHVyZV9zdGF0ZSA9ICgpID0+ICh7CiAgICAJCUxpc3RHcm91cCwKICAgIAkJTGlzdEdyb3VwSXRlbSwKICAgIAkJU3Bpbm5lciwKICAgIAkJb25Nb3VudCwKICAgIAkJc2Nhbm5lcnMsCiAgICAJCXNjYW5uZXIsCiAgICAJCXNlbGVjdCwKICAgIAkJdmFsdWUKICAgIAl9KTsKCiAgICAJJCRzZWxmLiRpbmplY3Rfc3RhdGUgPSAkJHByb3BzID0+IHsKICAgIAkJaWYgKCJzY2FubmVycyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIHNjYW5uZXJzID0gJCRwcm9wcy5zY2FubmVycyk7CiAgICAJCWlmICgidmFsdWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgxLCB2YWx1ZSA9ICQkcHJvcHMudmFsdWUpOwogICAgCX07CgogICAgCWlmICgkJHByb3BzICYmICIkJGluamVjdCIgaW4gJCRwcm9wcykgewogICAgCQkkJHNlbGYuJGluamVjdF9zdGF0ZSgkJHByb3BzLiQkaW5qZWN0KTsKICAgIAl9CgogICAgCXJldHVybiBbc2Nhbm5lcnMsIHZhbHVlLCBzZWxlY3RdOwogICAgfQoKICAgIGNsYXNzIFNjYW5uZXJzIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHsKICAgIAljb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAJCXN1cGVyKG9wdGlvbnMpOwogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJGcsIGNyZWF0ZV9mcmFnbWVudCRnLCBzYWZlX25vdF9lcXVhbCwge30pOwoKICAgIAkJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckNvbXBvbmVudCIsIHsKICAgIAkJCWNvbXBvbmVudDogdGhpcywKICAgIAkJCXRhZ05hbWU6ICJTY2FubmVycyIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRnLm5hbWUKICAgIAkJfSk7CiAgICAJfQogICAgfQoKICAgIC8qIHNyYy9TY2FuUGFnZS5zdmVsdGUgZ2VuZXJhdGVkIGJ5IFN2ZWx0ZSB2My4zMS4yICovCiAgICBjb25zdCBmaWxlJGcgPSAic3JjL1NjYW5QYWdlLnN2ZWx0ZSI7CgogICAgLy8gKDY5OjIwKSA8QnV0dG9uIG91dGxpbmUgcHJpbWFyeSBvbjpjbGljaz17c2Nhbn0+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzkoY3R4KSB7CiAgICAJbGV0IHQ7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl0ID0gdGV4dCgiU2NhbiIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9kZWZhdWx0X3Nsb3RfOS5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIig2OToyMCkgPEJ1dHRvbiBvdXRsaW5lIHByaW1hcnkgb246Y2xpY2s9e3NjYW59PiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDcwOjIwKSA8QnV0dG9uIG91dGxpbmUgc3VjY2VzcyBkaXNhYmxlZD17IWltYWdlU2hvd259IG9uOmNsaWNrPXtkb3dubG9hZH0+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzgoY3R4KSB7CiAgICAJbGV0IHQ7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl0ID0gdGV4dCgiRG93bmxvYWQiKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0LCBhbmNob3IpOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0KTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzgubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoNzA6MjApIDxCdXR0b24gb3V0bGluZSBzdWNjZXNzIGRpc2FibGVkPXshaW1hZ2VTaG93bn0gb246Y2xpY2s9e2Rvd25sb2FkfT4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg3MToyMCkgPEJ1dHRvbiBvdXRsaW5lIG9uOmNsaWNrPXtjbGVhcn0+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzcoY3R4KSB7CiAgICAJbGV0IHQ7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl0ID0gdGV4dCgiQ2xlYXIiKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0LCBhbmNob3IpOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0KTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzcubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoNzE6MjApIDxCdXR0b24gb3V0bGluZSBvbjpjbGljaz17Y2xlYXJ9PiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDY4OjE2KSA8QnV0dG9uR3JvdXA+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzYoY3R4KSB7CiAgICAJbGV0IGJ1dHRvbjA7CiAgICAJbGV0IHQwOwogICAgCWxldCBidXR0b24xOwogICAgCWxldCB0MTsKICAgIAlsZXQgYnV0dG9uMjsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJYnV0dG9uMCA9IG5ldyBCdXR0b24oewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQlvdXRsaW5lOiB0cnVlLAogICAgCQkJCXByaW1hcnk6IHRydWUsCiAgICAJCQkJJCRzbG90czogeyBkZWZhdWx0OiBbY3JlYXRlX2RlZmF1bHRfc2xvdF85XSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJYnV0dG9uMC4kb24oImNsaWNrIiwgLypzY2FuKi8gY3R4WzddKTsKCiAgICAJYnV0dG9uMSA9IG5ldyBCdXR0b24oewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQlvdXRsaW5lOiB0cnVlLAogICAgCQkJCXN1Y2Nlc3M6IHRydWUsCiAgICAJCQkJZGlzYWJsZWQ6ICEvKmltYWdlU2hvd24qLyBjdHhbMF0sCiAgICAJCQkJJCRzbG90czogeyBkZWZhdWx0OiBbY3JlYXRlX2RlZmF1bHRfc2xvdF84XSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJYnV0dG9uMS4kb24oImNsaWNrIiwgLypkb3dubG9hZCovIGN0eFs4XSk7CgogICAgCWJ1dHRvbjIgPSBuZXcgQnV0dG9uKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJb3V0bGluZTogdHJ1ZSwKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzddIH0sCiAgICAJCQkJJCRzY29wZTogeyBjdHggfQogICAgCQkJfSwKICAgIAkJCSQkaW5saW5lOiB0cnVlCiAgICAJCX0pOwoKICAgIAlidXR0b24yLiRvbigiY2xpY2siLCAvKmNsZWFyKi8gY3R4WzZdKTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoYnV0dG9uMC4kJC5mcmFnbWVudCk7CiAgICAJCQl0MCA9IHNwYWNlKCk7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGJ1dHRvbjEuJCQuZnJhZ21lbnQpOwogICAgCQkJdDEgPSBzcGFjZSgpOwogICAgCQkJY3JlYXRlX2NvbXBvbmVudChidXR0b24yLiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChidXR0b24wLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdDAsIGFuY2hvcik7CiAgICAJCQltb3VudF9jb21wb25lbnQoYnV0dG9uMSwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQxLCBhbmNob3IpOwogICAgCQkJbW91bnRfY29tcG9uZW50KGJ1dHRvbjIsIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJY29uc3QgYnV0dG9uMF9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlKi8gODE5MikgewogICAgCQkJCWJ1dHRvbjBfY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJYnV0dG9uMC4kc2V0KGJ1dHRvbjBfY2hhbmdlcyk7CiAgICAJCQljb25zdCBidXR0b24xX2NoYW5nZXMgPSB7fTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qaW1hZ2VTaG93biovIDEpIGJ1dHRvbjFfY2hhbmdlcy5kaXNhYmxlZCA9ICEvKmltYWdlU2hvd24qLyBjdHhbMF07CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlKi8gODE5MikgewogICAgCQkJCWJ1dHRvbjFfY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJYnV0dG9uMS4kc2V0KGJ1dHRvbjFfY2hhbmdlcyk7CiAgICAJCQljb25zdCBidXR0b24yX2NoYW5nZXMgPSB7fTsKCiAgICAJCQlpZiAoZGlydHkgJiAvKiQkc2NvcGUqLyA4MTkyKSB7CiAgICAJCQkJYnV0dG9uMl9jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQlidXR0b24yLiRzZXQoYnV0dG9uMl9jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGJ1dHRvbjAuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25faW4oYnV0dG9uMS4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJdHJhbnNpdGlvbl9pbihidXR0b24yLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGJ1dHRvbjAuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGJ1dHRvbjEuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGJ1dHRvbjIuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KGJ1dHRvbjAsIGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQwKTsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KGJ1dHRvbjEsIGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQxKTsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KGJ1dHRvbjIsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdF82Lm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDY4OjE2KSA8QnV0dG9uR3JvdXA+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoNjc6MTIpIDxDb2w+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzUoY3R4KSB7CiAgICAJbGV0IGJ1dHRvbmdyb3VwOwogICAgCWxldCBjdXJyZW50OwoKICAgIAlidXR0b25ncm91cCA9IG5ldyBCdXR0b25Hcm91cCh7CiAgICAJCQlwcm9wczogewogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfNl0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGJ1dHRvbmdyb3VwLiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChidXR0b25ncm91cCwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQljb25zdCBidXR0b25ncm91cF9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBpbWFnZVNob3duKi8gODE5MykgewogICAgCQkJCWJ1dHRvbmdyb3VwX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCWJ1dHRvbmdyb3VwLiRzZXQoYnV0dG9uZ3JvdXBfY2hhbmdlcyk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihidXR0b25ncm91cC4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChidXR0b25ncm91cC4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJZGVzdHJveV9jb21wb25lbnQoYnV0dG9uZ3JvdXAsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdF81Lm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDY3OjEyKSA8Q29sPiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDY2OjgpIDxSb3c+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzQoY3R4KSB7CiAgICAJbGV0IGNvbDsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJY29sID0gbmV3IENvbCh7CiAgICAJCQlwcm9wczogewogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfNV0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGNvbC4kJC5mcmFnbWVudCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQltb3VudF9jb21wb25lbnQoY29sLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWNvbnN0IGNvbF9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBpbWFnZVNob3duKi8gODE5MykgewogICAgCQkJCWNvbF9jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQljb2wuJHNldChjb2xfY2hhbmdlcyk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihjb2wuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoY29sLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChjb2wsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdF80Lm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDY2OjgpIDxSb3c+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoNzY6MTIpIDxDb2w+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzMoY3R4KSB7CiAgICAJbGV0IGg1OwogICAgCWxldCB0MDsKICAgIAlsZXQgdDE7CiAgICAJbGV0IHQyOwogICAgCWxldCBpbWc7CiAgICAJbGV0IGltZ19jbGFzc192YWx1ZTsKICAgIAlsZXQgaW1nX3NyY192YWx1ZTsKICAgIAlsZXQgdDM7CiAgICAJbGV0IHNwaW5uZXI7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCXNwaW5uZXIgPSBuZXcgU3Bpbm5lcih7CiAgICAJCQlwcm9wczogeyBjbGFzczogLypzcGlubmVyQ2xhc3MqLyBjdHhbNV0gfSwKICAgIAkJCSQkaW5saW5lOiB0cnVlCiAgICAJCX0pOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaDUgPSBlbGVtZW50KCJoNSIpOwogICAgCQkJdDAgPSB0ZXh0KCJJbWFnZSBmcm9tICIpOwogICAgCQkJdDEgPSB0ZXh0KC8qc2Nhbm5lck5hbWUqLyBjdHhbMl0pOwogICAgCQkJdDIgPSBzcGFjZSgpOwogICAgCQkJaW1nID0gZWxlbWVudCgiaW1nIik7CiAgICAJCQl0MyA9IHNwYWNlKCk7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KHNwaW5uZXIuJCQuZnJhZ21lbnQpOwogICAgCQkJYXR0cl9kZXYoaDUsICJvYmplY3QiLCAiIik7CiAgICAJCQlhdHRyX2RldihoNSwgImNsYXNzIiwgLyppbWFnZUNsYXNzKi8gY3R4WzRdKTsKICAgIAkJCWFkZF9sb2NhdGlvbihoNSwgZmlsZSRnLCA3NiwgMTYsIDIwMjIpOwogICAgCQkJYXR0cl9kZXYoaW1nLCAiY2xhc3MiLCBpbWdfY2xhc3NfdmFsdWUgPSAiaW1nLWZsdWlkICIgKyAvKmltYWdlQ2xhc3MqLyBjdHhbNF0pOwogICAgCQkJaWYgKGltZy5zcmMgIT09IChpbWdfc3JjX3ZhbHVlID0gLyppbWFnZVNvdXJjZSovIGN0eFsxXSkpIGF0dHJfZGV2KGltZywgInNyYyIsIGltZ19zcmNfdmFsdWUpOwogICAgCQkJYWRkX2xvY2F0aW9uKGltZywgZmlsZSRnLCA3NywgMTYsIDIwOTgpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGg1LCBhbmNob3IpOwogICAgCQkJYXBwZW5kX2RldihoNSwgdDApOwogICAgCQkJYXBwZW5kX2RldihoNSwgdDEpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQyLCBhbmNob3IpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGltZywgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0MywgYW5jaG9yKTsKICAgIAkJCW1vdW50X2NvbXBvbmVudChzcGlubmVyLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWlmICghY3VycmVudCB8fCBkaXJ0eSAmIC8qc2Nhbm5lck5hbWUqLyA0KSBzZXRfZGF0YV9kZXYodDEsIC8qc2Nhbm5lck5hbWUqLyBjdHhbMl0pOwoKICAgIAkJCWlmICghY3VycmVudCB8fCBkaXJ0eSAmIC8qaW1hZ2VDbGFzcyovIDE2KSB7CiAgICAJCQkJYXR0cl9kZXYoaDUsICJjbGFzcyIsIC8qaW1hZ2VDbGFzcyovIGN0eFs0XSk7CiAgICAJCQl9CgogICAgCQkJaWYgKCFjdXJyZW50IHx8IGRpcnR5ICYgLyppbWFnZUNsYXNzKi8gMTYgJiYgaW1nX2NsYXNzX3ZhbHVlICE9PSAoaW1nX2NsYXNzX3ZhbHVlID0gImltZy1mbHVpZCAiICsgLyppbWFnZUNsYXNzKi8gY3R4WzRdKSkgewogICAgCQkJCWF0dHJfZGV2KGltZywgImNsYXNzIiwgaW1nX2NsYXNzX3ZhbHVlKTsKICAgIAkJCX0KCiAgICAJCQlpZiAoIWN1cnJlbnQgfHwgZGlydHkgJiAvKmltYWdlU291cmNlKi8gMiAmJiBpbWcuc3JjICE9PSAoaW1nX3NyY192YWx1ZSA9IC8qaW1hZ2VTb3VyY2UqLyBjdHhbMV0pKSB7CiAgICAJCQkJYXR0cl9kZXYoaW1nLCAic3JjIiwgaW1nX3NyY192YWx1ZSk7CiAgICAJCQl9CgogICAgCQkJY29uc3Qgc3Bpbm5lcl9jaGFuZ2VzID0ge307CiAgICAJCQlpZiAoZGlydHkgJiAvKnNwaW5uZXJDbGFzcyovIDMyKSBzcGlubmVyX2NoYW5nZXMuY2xhc3MgPSAvKnNwaW5uZXJDbGFzcyovIGN0eFs1XTsKICAgIAkJCXNwaW5uZXIuJHNldChzcGlubmVyX2NoYW5nZXMpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oc3Bpbm5lci4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChzcGlubmVyLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGg1KTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodDIpOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihpbWcpOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0Myk7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChzcGlubmVyLCBkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9kZWZhdWx0X3Nsb3RfMy5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIig3NjoxMikgPENvbD4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg3NTo4KSA8Um93PgogICAgZnVuY3Rpb24gY3JlYXRlX2RlZmF1bHRfc2xvdF8yKGN0eCkgewogICAgCWxldCBjb2w7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCWNvbCA9IG5ldyBDb2woewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzNdIH0sCiAgICAJCQkJJCRzY29wZTogeyBjdHggfQogICAgCQkJfSwKICAgIAkJCSQkaW5saW5lOiB0cnVlCiAgICAJCX0pOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJY3JlYXRlX2NvbXBvbmVudChjb2wuJCQuZnJhZ21lbnQpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJbW91bnRfY29tcG9uZW50KGNvbCwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQljb25zdCBjb2xfY2hhbmdlcyA9IHt9OwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSwgc3Bpbm5lckNsYXNzLCBpbWFnZUNsYXNzLCBpbWFnZVNvdXJjZSwgc2Nhbm5lck5hbWUqLyA4MjQ2KSB7CiAgICAJCQkJY29sX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCWNvbC4kc2V0KGNvbF9jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGNvbC4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChjb2wuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KGNvbCwgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzIubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoNzU6OCkgPFJvdz4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg2NTo0KSA8Q29sPgogICAgZnVuY3Rpb24gY3JlYXRlX2RlZmF1bHRfc2xvdF8xJDEoY3R4KSB7CiAgICAJbGV0IHJvdzA7CiAgICAJbGV0IHQ7CiAgICAJbGV0IHJvdzE7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCXJvdzAgPSBuZXcgUm93KHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJJCRzbG90czogeyBkZWZhdWx0OiBbY3JlYXRlX2RlZmF1bHRfc2xvdF80XSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJcm93MSA9IG5ldyBSb3coewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzJdIH0sCiAgICAJCQkJJCRzY29wZTogeyBjdHggfQogICAgCQkJfSwKICAgIAkJCSQkaW5saW5lOiB0cnVlCiAgICAJCX0pOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJY3JlYXRlX2NvbXBvbmVudChyb3cwLiQkLmZyYWdtZW50KTsKICAgIAkJCXQgPSBzcGFjZSgpOwogICAgCQkJY3JlYXRlX2NvbXBvbmVudChyb3cxLiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChyb3cwLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdCwgYW5jaG9yKTsKICAgIAkJCW1vdW50X2NvbXBvbmVudChyb3cxLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWNvbnN0IHJvdzBfY2hhbmdlcyA9IHt9OwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSwgaW1hZ2VTaG93biovIDgxOTMpIHsKICAgIAkJCQlyb3cwX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCXJvdzAuJHNldChyb3cwX2NoYW5nZXMpOwogICAgCQkJY29uc3Qgcm93MV9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBzcGlubmVyQ2xhc3MsIGltYWdlQ2xhc3MsIGltYWdlU291cmNlLCBzY2FubmVyTmFtZSovIDgyNDYpIHsKICAgIAkJCQlyb3cxX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCXJvdzEuJHNldChyb3cxX2NoYW5nZXMpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4ocm93MC4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJdHJhbnNpdGlvbl9pbihyb3cxLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KHJvdzAuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25fb3V0KHJvdzEuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KHJvdzAsIGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQpOwogICAgCQkJZGVzdHJveV9jb21wb25lbnQocm93MSwgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzEkMS5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIig2NTo0KSA8Q29sPiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDY0OjApIDxSb3cgY2xhc3M9e21haW5Sb3dDbGFzc30+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90JDEoY3R4KSB7CiAgICAJbGV0IGNvbDsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJY29sID0gbmV3IENvbCh7CiAgICAJCQlwcm9wczogewogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfMSQxXSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoY29sLiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChjb2wsIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJY29uc3QgY29sX2NoYW5nZXMgPSB7fTsKCiAgICAJCQlpZiAoZGlydHkgJiAvKiQkc2NvcGUsIHNwaW5uZXJDbGFzcywgaW1hZ2VDbGFzcywgaW1hZ2VTb3VyY2UsIHNjYW5uZXJOYW1lLCBpbWFnZVNob3duKi8gODI0NykgewogICAgCQkJCWNvbF9jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQljb2wuJHNldChjb2xfY2hhbmdlcyk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihjb2wuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoY29sLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChjb2wsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdCQxLm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDY0OjApIDxSb3cgY2xhc3M9e21haW5Sb3dDbGFzc30+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkaChjdHgpIHsKICAgIAlsZXQgcm93OwogICAgCWxldCBjdXJyZW50OwoKICAgIAlyb3cgPSBuZXcgUm93KHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJY2xhc3M6IC8qbWFpblJvd0NsYXNzKi8gY3R4WzNdLAogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3QkMV0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KHJvdy4kJC5mcmFnbWVudCk7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChyb3csIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBbZGlydHldKSB7CiAgICAJCQljb25zdCByb3dfY2hhbmdlcyA9IHt9OwogICAgCQkJaWYgKGRpcnR5ICYgLyptYWluUm93Q2xhc3MqLyA4KSByb3dfY2hhbmdlcy5jbGFzcyA9IC8qbWFpblJvd0NsYXNzKi8gY3R4WzNdOwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSwgc3Bpbm5lckNsYXNzLCBpbWFnZUNsYXNzLCBpbWFnZVNvdXJjZSwgc2Nhbm5lck5hbWUsIGltYWdlU2hvd24qLyA4MjQ3KSB7CiAgICAJCQkJcm93X2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCXJvdy4kc2V0KHJvd19jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKHJvdy4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChyb3cuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KHJvdywgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZnJhZ21lbnQkaC5uYW1lLAogICAgCQl0eXBlOiAiY29tcG9uZW50IiwKICAgIAkJc291cmNlOiAiIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnN0YW5jZSRoKCQkc2VsZiwgJCRwcm9wcywgJCRpbnZhbGlkYXRlKSB7CiAgICAJbGV0IG1haW5Sb3dDbGFzczsKICAgIAlsZXQgaW1hZ2VDbGFzczsKICAgIAlsZXQgc3Bpbm5lckNsYXNzOwogICAgCWxldCB7ICQkc2xvdHM6IHNsb3RzID0ge30sICQkc2NvcGUgfSA9ICQkcHJvcHM7CiAgICAJdmFsaWRhdGVfc2xvdHMoIlNjYW5QYWdlIiwgc2xvdHMsIFtdKTsKICAgIAlsZXQgeyBzZXR0aW5ncyA9IHt9IH0gPSAkJHByb3BzOwogICAgCWxldCB7IGFjdGl2ZSB9ID0gJCRwcm9wczsKICAgIAlsZXQgaW1hZ2VTb3VyY2UgPSAiIjsKICAgIAlsZXQgaW1hZ2VTaG93biA9IGZhbHNlOwogICAgCWxldCBzcGlubmVyU2hvd24gPSBmYWxzZTsKCiAgICAJY29uc3QgY2xlYXIgPSAoKSA9PiB7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCBpbWFnZVNvdXJjZSA9ICIiKTsKICAgIAkJJCRpbnZhbGlkYXRlKDAsIGltYWdlU2hvd24gPSBmYWxzZSk7CiAgICAJfTsKCiAgICAJbGV0IHNjYW5uZXJOYW1lOwoKICAgIAljb25zdCB1bnN1YnNjcmliZSA9IHNjYW5uZXIuc3Vic2NyaWJlKHZhbHVlID0+IHsKICAgIAkJJCRpbnZhbGlkYXRlKDIsIHNjYW5uZXJOYW1lID0gdmFsdWUpOwogICAgCQljbGVhcigpOwogICAgCX0pOwoKICAgIAljb25zdCBzY2FuID0gYXN5bmMgKCkgPT4gewogICAgCQkkJGludmFsaWRhdGUoMTEsIHNwaW5uZXJTaG93biA9IHRydWUpOwoKICAgIAkJYXdhaXQgZmV0Y2goYC9hcGkvZGV2aWNlcy9gICsgc2Nhbm5lck5hbWUgKyBgL3NjYW5gLCB7CiAgICAJCQltZXRob2Q6ICJQT1NUIiwKICAgIAkJCWhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiB9LAogICAgCQkJYm9keTogSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpCiAgICAJCX0pLnRoZW4ociA9PiByLmJsb2IoKSkudGhlbihibG9iID0+IHsKICAgIAkJCSQkaW52YWxpZGF0ZSgxMSwgc3Bpbm5lclNob3duID0gZmFsc2UpOwogICAgCQkJJCRpbnZhbGlkYXRlKDEsIGltYWdlU291cmNlID0gKHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpKTsKICAgIAkJCSQkaW52YWxpZGF0ZSgwLCBpbWFnZVNob3duID0gdHJ1ZSk7CiAgICAJCX0pOwogICAgCX07CgogICAgCWNvbnN0IGRvd25sb2FkID0gKCkgPT4gewogICAgCQl2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKCiAgICAJCWlmICh3aW5kb3cuVVJMICYmIHdpbmRvdy5CbG9iICYmICJkb3dubG9hZCIgaW4gYSAmJiB3aW5kb3cuYXRvYikgewogICAgCQkJYS5ocmVmID0gaW1hZ2VTb3VyY2U7CiAgICAJCQlhLmRvd25sb2FkID0gInNjYW5uZWQucG5nIjsKICAgIAkJCWEuY2xpY2soKTsKICAgIAkJCXdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKGltYWdlU291cmNlKTsKICAgIAkJfQogICAgCX07CgogICAgCWNvbnN0IHdyaXRhYmxlX3Byb3BzID0gWyJzZXR0aW5ncyIsICJhY3RpdmUiXTsKCiAgICAJT2JqZWN0LmtleXMoJCRwcm9wcykuZm9yRWFjaChrZXkgPT4gewogICAgCQlpZiAoIX53cml0YWJsZV9wcm9wcy5pbmRleE9mKGtleSkgJiYga2V5LnNsaWNlKDAsIDIpICE9PSAiJCQiKSBjb25zb2xlLndhcm4oYDxTY2FuUGFnZT4gd2FzIGNyZWF0ZWQgd2l0aCB1bmtub3duIHByb3AgJyR7a2V5fSdgKTsKICAgIAl9KTsKCiAgICAJJCRzZWxmLiQkc2V0ID0gJCRwcm9wcyA9PiB7CiAgICAJCWlmICgic2V0dGluZ3MiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSg5LCBzZXR0aW5ncyA9ICQkcHJvcHMuc2V0dGluZ3MpOwogICAgCQlpZiAoImFjdGl2ZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEwLCBhY3RpdmUgPSAkJHByb3BzLmFjdGl2ZSk7CiAgICAJfTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsKICAgIAkJQ29sLAogICAgCQlSb3csCiAgICAJCUJ1dHRvbiwKICAgIAkJTWVkaWEsCiAgICAJCUJ1dHRvbkdyb3VwLAogICAgCQlTcGlubmVyLAogICAgCQlzZXR0aW5ncywKICAgIAkJYWN0aXZlLAogICAgCQlpbWFnZVNvdXJjZSwKICAgIAkJaW1hZ2VTaG93biwKICAgIAkJc3Bpbm5lclNob3duLAogICAgCQljbGVhciwKICAgIAkJc2Nhbm5lciwKICAgIAkJc2Nhbm5lck5hbWUsCiAgICAJCXVuc3Vic2NyaWJlLAogICAgCQlzY2FuLAogICAgCQlkb3dubG9hZCwKICAgIAkJbWFpblJvd0NsYXNzLAogICAgCQlpbWFnZUNsYXNzLAogICAgCQlzcGlubmVyQ2xhc3MKICAgIAl9KTsKCiAgICAJJCRzZWxmLiRpbmplY3Rfc3RhdGUgPSAkJHByb3BzID0+IHsKICAgIAkJaWYgKCJzZXR0aW5ncyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDksIHNldHRpbmdzID0gJCRwcm9wcy5zZXR0aW5ncyk7CiAgICAJCWlmICgiYWN0aXZlIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMTAsIGFjdGl2ZSA9ICQkcHJvcHMuYWN0aXZlKTsKICAgIAkJaWYgKCJpbWFnZVNvdXJjZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDEsIGltYWdlU291cmNlID0gJCRwcm9wcy5pbWFnZVNvdXJjZSk7CiAgICAJCWlmICgiaW1hZ2VTaG93biIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIGltYWdlU2hvd24gPSAkJHByb3BzLmltYWdlU2hvd24pOwogICAgCQlpZiAoInNwaW5uZXJTaG93biIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDExLCBzcGlubmVyU2hvd24gPSAkJHByb3BzLnNwaW5uZXJTaG93bik7CiAgICAJCWlmICgic2Nhbm5lck5hbWUiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgyLCBzY2FubmVyTmFtZSA9ICQkcHJvcHMuc2Nhbm5lck5hbWUpOwogICAgCQlpZiAoIm1haW5Sb3dDbGFzcyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIG1haW5Sb3dDbGFzcyA9ICQkcHJvcHMubWFpblJvd0NsYXNzKTsKICAgIAkJaWYgKCJpbWFnZUNsYXNzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNCwgaW1hZ2VDbGFzcyA9ICQkcHJvcHMuaW1hZ2VDbGFzcyk7CiAgICAJCWlmICgic3Bpbm5lckNsYXNzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNSwgc3Bpbm5lckNsYXNzID0gJCRwcm9wcy5zcGlubmVyQ2xhc3MpOwogICAgCX07CgogICAgCWlmICgkJHByb3BzICYmICIkJGluamVjdCIgaW4gJCRwcm9wcykgewogICAgCQkkJHNlbGYuJGluamVjdF9zdGF0ZSgkJHByb3BzLiQkaW5qZWN0KTsKICAgIAl9CgogICAgCSQkc2VsZi4kJC51cGRhdGUgPSAoKSA9PiB7CiAgICAJCWlmICgkJHNlbGYuJCQuZGlydHkgJiAvKmFjdGl2ZSovIDEwMjQpIHsKICAgIAkJCSAkJGludmFsaWRhdGUoMywgbWFpblJvd0NsYXNzID0gYWN0aXZlID8gIiIgOiAiZC1ub25lIik7CiAgICAJCX0KCiAgICAJCWlmICgkJHNlbGYuJCQuZGlydHkgJiAvKmltYWdlU2hvd24qLyAxKSB7CiAgICAJCQkgJCRpbnZhbGlkYXRlKDQsIGltYWdlQ2xhc3MgPSBpbWFnZVNob3duID8gIiIgOiAiaW52aXNpYmxlIik7CiAgICAJCX0KCiAgICAJCWlmICgkJHNlbGYuJCQuZGlydHkgJiAvKnNwaW5uZXJTaG93biovIDIwNDgpIHsKICAgIAkJCSAkJGludmFsaWRhdGUoNSwgc3Bpbm5lckNsYXNzID0gc3Bpbm5lclNob3duID8gIiIgOiAiaW52aXNpYmxlIik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlyZXR1cm4gWwogICAgCQlpbWFnZVNob3duLAogICAgCQlpbWFnZVNvdXJjZSwKICAgIAkJc2Nhbm5lck5hbWUsCiAgICAJCW1haW5Sb3dDbGFzcywKICAgIAkJaW1hZ2VDbGFzcywKICAgIAkJc3Bpbm5lckNsYXNzLAogICAgCQljbGVhciwKICAgIAkJc2NhbiwKICAgIAkJZG93bmxvYWQsCiAgICAJCXNldHRpbmdzLAogICAgCQlhY3RpdmUsCiAgICAJCXNwaW5uZXJTaG93bgogICAgCV07CiAgICB9CgogICAgY2xhc3MgU2NhblBhZ2UgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CiAgICAJCWluaXQodGhpcywgb3B0aW9ucywgaW5zdGFuY2UkaCwgY3JlYXRlX2ZyYWdtZW50JGgsIHNhZmVfbm90X2VxdWFsLCB7IHNldHRpbmdzOiA5LCBhY3RpdmU6IDEwIH0pOwoKICAgIAkJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckNvbXBvbmVudCIsIHsKICAgIAkJCWNvbXBvbmVudDogdGhpcywKICAgIAkJCXRhZ05hbWU6ICJTY2FuUGFnZSIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRoLm5hbWUKICAgIAkJfSk7CgogICAgCQljb25zdCB7IGN0eCB9ID0gdGhpcy4kJDsKICAgIAkJY29uc3QgcHJvcHMgPSBvcHRpb25zLnByb3BzIHx8IHt9OwoKICAgIAkJaWYgKC8qYWN0aXZlKi8gY3R4WzEwXSA9PT0gdW5kZWZpbmVkICYmICEoImFjdGl2ZSIgaW4gcHJvcHMpKSB7CiAgICAJCQljb25zb2xlLndhcm4oIjxTY2FuUGFnZT4gd2FzIGNyZWF0ZWQgd2l0aG91dCBleHBlY3RlZCBwcm9wICdhY3RpdmUnIik7CiAgICAJCX0KICAgIAl9CgogICAgCWdldCBzZXR0aW5ncygpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U2NhblBhZ2U+OiBQcm9wcyBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlzZXQgc2V0dGluZ3ModmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U2NhblBhZ2U+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgYWN0aXZlKCkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxTY2FuUGFnZT46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBhY3RpdmUodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U2NhblBhZ2U+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQogICAgfQoKICAgIC8qIHNyYy9TZXR0aW5nc1BhZ2Uuc3ZlbHRlIGdlbmVyYXRlZCBieSBTdmVsdGUgdjMuMzEuMiAqLwoKICAgIGNvbnN0IHsgY29uc29sZTogY29uc29sZV8xIH0gPSBnbG9iYWxzOwogICAgY29uc3QgZmlsZSRoID0gInNyYy9TZXR0aW5nc1BhZ2Uuc3ZlbHRlIjsKCiAgICBmdW5jdGlvbiBnZXRfZWFjaF9jb250ZXh0JDEoY3R4LCBsaXN0LCBpKSB7CiAgICAJY29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7CiAgICAJY2hpbGRfY3R4WzE0XSA9IGxpc3RbaV07CiAgICAJY2hpbGRfY3R4WzE1XSA9IGxpc3Q7CiAgICAJY2hpbGRfY3R4WzE2XSA9IGk7CiAgICAJcmV0dXJuIGNoaWxkX2N0eDsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRfZWFjaF9jb250ZXh0XzEoY3R4LCBsaXN0LCBpKSB7CiAgICAJY29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7CiAgICAJY2hpbGRfY3R4WzE3XSA9IGxpc3RbaV07CiAgICAJcmV0dXJuIGNoaWxkX2N0eDsKICAgIH0KCiAgICAvLyAoOTA6MjApIHs6ZWxzZX0KICAgIGZ1bmN0aW9uIGNyZWF0ZV9lbHNlX2Jsb2NrJDYoY3R4KSB7CiAgICAJbGV0IHQ7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl0ID0gdGV4dCgiVW5kZWZpbmVkIG9wdGlvbiIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCXA6IG5vb3AsCiAgICAJCWk6IG5vb3AsCiAgICAJCW86IG5vb3AsCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9lbHNlX2Jsb2NrJDYubmFtZSwKICAgIAkJdHlwZTogImVsc2UiLAogICAgCQlzb3VyY2U6ICIoOTA6MjApIHs6ZWxzZX0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg4Mzo1MCkgCiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2tfNCQxKGN0eCkgewogICAgCWxldCBsYWJlbDsKICAgIAlsZXQgdDsKICAgIAlsZXQgaW5wdXQ7CiAgICAJbGV0IHVwZGF0aW5nX3ZhbHVlOwogICAgCWxldCBjdXJyZW50OwoKICAgIAlsYWJlbCA9IG5ldyBMYWJlbCh7CiAgICAJCQlwcm9wczogewogICAgCQkJCWZvcjogLypvcHRpb24qLyBjdHhbMTRdLm5hbWUsCiAgICAJCQkJJCRzbG90czogeyBkZWZhdWx0OiBbY3JlYXRlX2RlZmF1bHRfc2xvdF84JDFdIH0sCiAgICAJCQkJJCRzY29wZTogeyBjdHggfQogICAgCQkJfSwKICAgIAkJCSQkaW5saW5lOiB0cnVlCiAgICAJCX0pOwoKICAgIAlmdW5jdGlvbiBpbnB1dF92YWx1ZV9iaW5kaW5nXzIodmFsdWUpIHsKICAgIAkJLyppbnB1dF92YWx1ZV9iaW5kaW5nXzIqLyBjdHhbOV0uY2FsbChudWxsLCB2YWx1ZSwgLypvcHRpb24qLyBjdHhbMTRdKTsKICAgIAl9CgogICAgCWxldCBpbnB1dF9wcm9wcyA9IHsKICAgIAkJdHlwZTogInNlbGVjdCIsCiAgICAJCW5hbWU6IC8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lLAogICAgCQlpZDogLypvcHRpb24qLyBjdHhbMTRdLm5hbWUsCiAgICAJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfNyQxXSB9LAogICAgCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJfTsKCiAgICAJaWYgKC8qc2V0dGluZ3MqLyBjdHhbMF1bLypvcHRpb24qLyBjdHhbMTRdLm5hbWVdICE9PSB2b2lkIDApIHsKICAgIAkJaW5wdXRfcHJvcHMudmFsdWUgPSAvKnNldHRpbmdzKi8gY3R4WzBdWy8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lXTsKICAgIAl9CgogICAgCWlucHV0ID0gbmV3IElucHV0KHsgcHJvcHM6IGlucHV0X3Byb3BzLCAkJGlubGluZTogdHJ1ZSB9KTsKICAgIAliaW5kaW5nX2NhbGxiYWNrcy5wdXNoKCgpID0+IGJpbmQoaW5wdXQsICJ2YWx1ZSIsIGlucHV0X3ZhbHVlX2JpbmRpbmdfMikpOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJY3JlYXRlX2NvbXBvbmVudChsYWJlbC4kJC5mcmFnbWVudCk7CiAgICAJCQl0ID0gc3BhY2UoKTsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoaW5wdXQuJCQuZnJhZ21lbnQpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJbW91bnRfY29tcG9uZW50KGxhYmVsLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdCwgYW5jaG9yKTsKICAgIAkJCW1vdW50X2NvbXBvbmVudChpbnB1dCwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShuZXdfY3R4LCBkaXJ0eSkgewogICAgCQkJY3R4ID0gbmV3X2N0eDsKICAgIAkJCWNvbnN0IGxhYmVsX2NoYW5nZXMgPSB7fTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qb3B0aW9ucyovIDIpIGxhYmVsX2NoYW5nZXMuZm9yID0gLypvcHRpb24qLyBjdHhbMTRdLm5hbWU7CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBvcHRpb25zKi8gMTA0ODU3OCkgewogICAgCQkJCWxhYmVsX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCWxhYmVsLiRzZXQobGFiZWxfY2hhbmdlcyk7CiAgICAJCQljb25zdCBpbnB1dF9jaGFuZ2VzID0ge307CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyKSBpbnB1dF9jaGFuZ2VzLm5hbWUgPSAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qb3B0aW9ucyovIDIpIGlucHV0X2NoYW5nZXMuaWQgPSAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZTsKCiAgICAJCQlpZiAoZGlydHkgJiAvKiQkc2NvcGUsIG9wdGlvbnMqLyAxMDQ4NTc4KSB7CiAgICAJCQkJaW5wdXRfY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJaWYgKCF1cGRhdGluZ192YWx1ZSAmJiBkaXJ0eSAmIC8qc2V0dGluZ3MsIG9wdGlvbnMqLyAzKSB7CiAgICAJCQkJdXBkYXRpbmdfdmFsdWUgPSB0cnVlOwogICAgCQkJCWlucHV0X2NoYW5nZXMudmFsdWUgPSAvKnNldHRpbmdzKi8gY3R4WzBdWy8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lXTsKICAgIAkJCQlhZGRfZmx1c2hfY2FsbGJhY2soKCkgPT4gdXBkYXRpbmdfdmFsdWUgPSBmYWxzZSk7CiAgICAJCQl9CgogICAgCQkJaW5wdXQuJHNldChpbnB1dF9jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGxhYmVsLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQl0cmFuc2l0aW9uX2luKGlucHV0LiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGxhYmVsLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQl0cmFuc2l0aW9uX291dChpbnB1dC4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJZGVzdHJveV9jb21wb25lbnQobGFiZWwsIGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQpOwogICAgCQkJZGVzdHJveV9jb21wb25lbnQoaW5wdXQsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2lmX2Jsb2NrXzQkMS5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoODM6NTApICIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDgwOjcxKSAKICAgIGZ1bmN0aW9uIGNyZWF0ZV9pZl9ibG9ja18zJDMoY3R4KSB7CiAgICAJbGV0IGxhYmVsOwogICAgCWxldCB0OwogICAgCWxldCBpbnB1dDsKICAgIAlsZXQgdXBkYXRpbmdfdmFsdWU7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCWxhYmVsID0gbmV3IExhYmVsKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJZm9yOiAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZSwKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzYkMV0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWZ1bmN0aW9uIGlucHV0X3ZhbHVlX2JpbmRpbmdfMSh2YWx1ZSkgewogICAgCQkvKmlucHV0X3ZhbHVlX2JpbmRpbmdfMSovIGN0eFs4XS5jYWxsKG51bGwsIHZhbHVlLCAvKm9wdGlvbiovIGN0eFsxNF0pOwogICAgCX0KCiAgICAJbGV0IGlucHV0X3Byb3BzID0gewogICAgCQluYW1lOiAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZSwKICAgIAkJaWQ6IC8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lCiAgICAJfTsKCiAgICAJaWYgKC8qc2V0dGluZ3MqLyBjdHhbMF1bLypvcHRpb24qLyBjdHhbMTRdLm5hbWVdICE9PSB2b2lkIDApIHsKICAgIAkJaW5wdXRfcHJvcHMudmFsdWUgPSAvKnNldHRpbmdzKi8gY3R4WzBdWy8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lXTsKICAgIAl9CgogICAgCWlucHV0ID0gbmV3IElucHV0KHsgcHJvcHM6IGlucHV0X3Byb3BzLCAkJGlubGluZTogdHJ1ZSB9KTsKICAgIAliaW5kaW5nX2NhbGxiYWNrcy5wdXNoKCgpID0+IGJpbmQoaW5wdXQsICJ2YWx1ZSIsIGlucHV0X3ZhbHVlX2JpbmRpbmdfMSkpOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJY3JlYXRlX2NvbXBvbmVudChsYWJlbC4kJC5mcmFnbWVudCk7CiAgICAJCQl0ID0gc3BhY2UoKTsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoaW5wdXQuJCQuZnJhZ21lbnQpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJbW91bnRfY29tcG9uZW50KGxhYmVsLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdCwgYW5jaG9yKTsKICAgIAkJCW1vdW50X2NvbXBvbmVudChpbnB1dCwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShuZXdfY3R4LCBkaXJ0eSkgewogICAgCQkJY3R4ID0gbmV3X2N0eDsKICAgIAkJCWNvbnN0IGxhYmVsX2NoYW5nZXMgPSB7fTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qb3B0aW9ucyovIDIpIGxhYmVsX2NoYW5nZXMuZm9yID0gLypvcHRpb24qLyBjdHhbMTRdLm5hbWU7CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBvcHRpb25zKi8gMTA0ODU3OCkgewogICAgCQkJCWxhYmVsX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCWxhYmVsLiRzZXQobGFiZWxfY2hhbmdlcyk7CiAgICAJCQljb25zdCBpbnB1dF9jaGFuZ2VzID0ge307CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyKSBpbnB1dF9jaGFuZ2VzLm5hbWUgPSAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qb3B0aW9ucyovIDIpIGlucHV0X2NoYW5nZXMuaWQgPSAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZTsKCiAgICAJCQlpZiAoIXVwZGF0aW5nX3ZhbHVlICYmIGRpcnR5ICYgLypzZXR0aW5ncywgb3B0aW9ucyovIDMpIHsKICAgIAkJCQl1cGRhdGluZ192YWx1ZSA9IHRydWU7CiAgICAJCQkJaW5wdXRfY2hhbmdlcy52YWx1ZSA9IC8qc2V0dGluZ3MqLyBjdHhbMF1bLypvcHRpb24qLyBjdHhbMTRdLm5hbWVdOwogICAgCQkJCWFkZF9mbHVzaF9jYWxsYmFjaygoKSA9PiB1cGRhdGluZ192YWx1ZSA9IGZhbHNlKTsKICAgIAkJCX0KCiAgICAJCQlpbnB1dC4kc2V0KGlucHV0X2NoYW5nZXMpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4obGFiZWwuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25faW4oaW5wdXQuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQobGFiZWwuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGlucHV0LiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChsYWJlbCwgZGV0YWNoaW5nKTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodCk7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChpbnB1dCwgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2tfMyQzLm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIig4MDo3MSkgIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoNzU6OTQpIAogICAgZnVuY3Rpb24gY3JlYXRlX2lmX2Jsb2NrXzEkNChjdHgpIHsKICAgIAlsZXQgbGFiZWw7CiAgICAJbGV0IHQ7CiAgICAJbGV0IGlucHV0OwogICAgCWxldCB1cGRhdGluZ192YWx1ZTsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJbGFiZWwgPSBuZXcgTGFiZWwoewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQlmb3I6IC8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lLAogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfNSQxXSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJZnVuY3Rpb24gaW5wdXRfdmFsdWVfYmluZGluZyh2YWx1ZSkgewogICAgCQkvKmlucHV0X3ZhbHVlX2JpbmRpbmcqLyBjdHhbN10uY2FsbChudWxsLCB2YWx1ZSwgLypvcHRpb24qLyBjdHhbMTRdKTsKICAgIAl9CgogICAgCWxldCBpbnB1dF9wcm9wcyA9IHsKICAgIAkJdHlwZTogIm51bWJlciIsCiAgICAJCW5hbWU6IC8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lLAogICAgCQlpZDogLypvcHRpb24qLyBjdHhbMTRdLm5hbWUKICAgIAl9OwoKICAgIAlpZiAoLypzZXR0aW5ncyovIGN0eFswXVsvKm9wdGlvbiovIGN0eFsxNF0ubmFtZV0gIT09IHZvaWQgMCkgewogICAgCQlpbnB1dF9wcm9wcy52YWx1ZSA9IC8qc2V0dGluZ3MqLyBjdHhbMF1bLypvcHRpb24qLyBjdHhbMTRdLm5hbWVdOwogICAgCX0KCiAgICAJaW5wdXQgPSBuZXcgSW5wdXQoeyBwcm9wczogaW5wdXRfcHJvcHMsICQkaW5saW5lOiB0cnVlIH0pOwogICAgCWJpbmRpbmdfY2FsbGJhY2tzLnB1c2goKCkgPT4gYmluZChpbnB1dCwgInZhbHVlIiwgaW5wdXRfdmFsdWVfYmluZGluZykpOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJY3JlYXRlX2NvbXBvbmVudChsYWJlbC4kJC5mcmFnbWVudCk7CiAgICAJCQl0ID0gc3BhY2UoKTsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoaW5wdXQuJCQuZnJhZ21lbnQpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJbW91bnRfY29tcG9uZW50KGxhYmVsLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdCwgYW5jaG9yKTsKICAgIAkJCW1vdW50X2NvbXBvbmVudChpbnB1dCwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShuZXdfY3R4LCBkaXJ0eSkgewogICAgCQkJY3R4ID0gbmV3X2N0eDsKICAgIAkJCWNvbnN0IGxhYmVsX2NoYW5nZXMgPSB7fTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qb3B0aW9ucyovIDIpIGxhYmVsX2NoYW5nZXMuZm9yID0gLypvcHRpb24qLyBjdHhbMTRdLm5hbWU7CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBvcHRpb25zKi8gMTA0ODU3OCkgewogICAgCQkJCWxhYmVsX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCWxhYmVsLiRzZXQobGFiZWxfY2hhbmdlcyk7CiAgICAJCQljb25zdCBpbnB1dF9jaGFuZ2VzID0ge307CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyKSBpbnB1dF9jaGFuZ2VzLm5hbWUgPSAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qb3B0aW9ucyovIDIpIGlucHV0X2NoYW5nZXMuaWQgPSAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZTsKCiAgICAJCQlpZiAoIXVwZGF0aW5nX3ZhbHVlICYmIGRpcnR5ICYgLypzZXR0aW5ncywgb3B0aW9ucyovIDMpIHsKICAgIAkJCQl1cGRhdGluZ192YWx1ZSA9IHRydWU7CiAgICAJCQkJaW5wdXRfY2hhbmdlcy52YWx1ZSA9IC8qc2V0dGluZ3MqLyBjdHhbMF1bLypvcHRpb24qLyBjdHhbMTRdLm5hbWVdOwogICAgCQkJCWFkZF9mbHVzaF9jYWxsYmFjaygoKSA9PiB1cGRhdGluZ192YWx1ZSA9IGZhbHNlKTsKICAgIAkJCX0KCiAgICAJCQlpbnB1dC4kc2V0KGlucHV0X2NoYW5nZXMpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4obGFiZWwuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25faW4oaW5wdXQuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQobGFiZWwuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGlucHV0LiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChsYWJlbCwgZGV0YWNoaW5nKTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodCk7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChpbnB1dCwgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2tfMSQ0Lm5hbWUsCiAgICAJCXR5cGU6ICJpZiIsCiAgICAJCXNvdXJjZTogIig3NTo5NCkgIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoNzA6MjApIHsjaWYgb3B0aW9uLnR5cGUgPT09IDB9CiAgICBmdW5jdGlvbiBjcmVhdGVfaWZfYmxvY2skNihjdHgpIHsKICAgIAlsZXQgbGFiZWw7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCWxhYmVsID0gbmV3IExhYmVsKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJZm9yOiAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZSwKICAgIAkJCQljaGVjazogdHJ1ZSwKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzQkMV0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGxhYmVsLiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChsYWJlbCwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQljb25zdCBsYWJlbF9jaGFuZ2VzID0ge307CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyKSBsYWJlbF9jaGFuZ2VzLmZvciA9IC8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lOwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSwgb3B0aW9ucywgc2V0dGluZ3MqLyAxMDQ4NTc5KSB7CiAgICAJCQkJbGFiZWxfY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJbGFiZWwuJHNldChsYWJlbF9jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGxhYmVsLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGxhYmVsLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChsYWJlbCwgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfaWZfYmxvY2skNi5uYW1lLAogICAgCQl0eXBlOiAiaWYiLAogICAgCQlzb3VyY2U6ICIoNzA6MjApIHsjaWYgb3B0aW9uLnR5cGUgPT09IDB9IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoODQ6MjQpIDxMYWJlbCBmb3I9e29wdGlvbi5uYW1lfT4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfOCQxKGN0eCkgewogICAgCWxldCB0X3ZhbHVlID0gLypvcHRpb24qLyBjdHhbMTRdLnRpdGxlICsgIiI7CiAgICAJbGV0IHQ7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl0ID0gdGV4dCh0X3ZhbHVlKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0LCBhbmNob3IpOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJaWYgKGRpcnR5ICYgLypvcHRpb25zKi8gMiAmJiB0X3ZhbHVlICE9PSAodF92YWx1ZSA9IC8qb3B0aW9uKi8gY3R4WzE0XS50aXRsZSArICIiKSkgc2V0X2RhdGFfZGV2KHQsIHRfdmFsdWUpOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0KTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzgkMS5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIig4NDoyNCkgPExhYmVsIGZvcj17b3B0aW9uLm5hbWV9PiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDg2OjI4KSB7I2VhY2ggb3B0aW9uLnNldCBhcyBpdGVtfQogICAgZnVuY3Rpb24gY3JlYXRlX2VhY2hfYmxvY2tfMShjdHgpIHsKICAgIAlsZXQgb3B0aW9uOwogICAgCWxldCB0X3ZhbHVlID0gLyppdGVtKi8gY3R4WzE3XSArICIiOwogICAgCWxldCB0OwogICAgCWxldCBvcHRpb25fdmFsdWVfdmFsdWU7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQlvcHRpb24gPSBlbGVtZW50KCJvcHRpb24iKTsKICAgIAkJCXQgPSB0ZXh0KHRfdmFsdWUpOwogICAgCQkJb3B0aW9uLl9fdmFsdWUgPSBvcHRpb25fdmFsdWVfdmFsdWUgPSAvKml0ZW0qLyBjdHhbMTddOwogICAgCQkJb3B0aW9uLnZhbHVlID0gb3B0aW9uLl9fdmFsdWU7CiAgICAJCQlhZGRfbG9jYXRpb24ob3B0aW9uLCBmaWxlJGgsIDg2LCAzMiwgMjgzMyk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgb3B0aW9uLCBhbmNob3IpOwogICAgCQkJYXBwZW5kX2RldihvcHRpb24sIHQpOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJaWYgKGRpcnR5ICYgLypvcHRpb25zKi8gMiAmJiB0X3ZhbHVlICE9PSAodF92YWx1ZSA9IC8qaXRlbSovIGN0eFsxN10gKyAiIikpIHNldF9kYXRhX2Rldih0LCB0X3ZhbHVlKTsKCiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyICYmIG9wdGlvbl92YWx1ZV92YWx1ZSAhPT0gKG9wdGlvbl92YWx1ZV92YWx1ZSA9IC8qaXRlbSovIGN0eFsxN10pKSB7CiAgICAJCQkJcHJvcF9kZXYob3B0aW9uLCAiX192YWx1ZSIsIG9wdGlvbl92YWx1ZV92YWx1ZSk7CiAgICAJCQkJb3B0aW9uLnZhbHVlID0gb3B0aW9uLl9fdmFsdWU7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KG9wdGlvbik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2VhY2hfYmxvY2tfMS5uYW1lLAogICAgCQl0eXBlOiAiZWFjaCIsCiAgICAJCXNvdXJjZTogIig4NjoyOCkgeyNlYWNoIG9wdGlvbi5zZXQgYXMgaXRlbX0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg4NToyNCkgPElucHV0IHR5cGU9InNlbGVjdCIgbmFtZT17b3B0aW9uLm5hbWV9IGlkPXtvcHRpb24ubmFtZX0gYmluZDp2YWx1ZT17c2V0dGluZ3Nbb3B0aW9uLm5hbWVdfT4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfNyQxKGN0eCkgewogICAgCWxldCBlYWNoXzFfYW5jaG9yOwogICAgCWxldCBlYWNoX3ZhbHVlXzEgPSAvKm9wdGlvbiovIGN0eFsxNF0uc2V0OwogICAgCXZhbGlkYXRlX2VhY2hfYXJndW1lbnQoZWFjaF92YWx1ZV8xKTsKICAgIAlsZXQgZWFjaF9ibG9ja3MgPSBbXTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX3ZhbHVlXzEubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJZWFjaF9ibG9ja3NbaV0gPSBjcmVhdGVfZWFjaF9ibG9ja18xKGdldF9lYWNoX2NvbnRleHRfMShjdHgsIGVhY2hfdmFsdWVfMSwgaSkpOwogICAgCX0KCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJCQllYWNoX2Jsb2Nrc1tpXS5jKCk7CiAgICAJCQl9CgogICAgCQkJZWFjaF8xX2FuY2hvciA9IGVtcHR5KCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfYmxvY2tzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCQkJZWFjaF9ibG9ja3NbaV0ubSh0YXJnZXQsIGFuY2hvcik7CiAgICAJCQl9CgogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGVhY2hfMV9hbmNob3IsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyKSB7CiAgICAJCQkJZWFjaF92YWx1ZV8xID0gLypvcHRpb24qLyBjdHhbMTRdLnNldDsKICAgIAkJCQl2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50KGVhY2hfdmFsdWVfMSk7CiAgICAJCQkJbGV0IGk7CgogICAgCQkJCWZvciAoaSA9IDA7IGkgPCBlYWNoX3ZhbHVlXzEubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJCQkJY29uc3QgY2hpbGRfY3R4ID0gZ2V0X2VhY2hfY29udGV4dF8xKGN0eCwgZWFjaF92YWx1ZV8xLCBpKTsKCiAgICAJCQkJCWlmIChlYWNoX2Jsb2Nrc1tpXSkgewogICAgCQkJCQkJZWFjaF9ibG9ja3NbaV0ucChjaGlsZF9jdHgsIGRpcnR5KTsKICAgIAkJCQkJfSBlbHNlIHsKICAgIAkJCQkJCWVhY2hfYmxvY2tzW2ldID0gY3JlYXRlX2VhY2hfYmxvY2tfMShjaGlsZF9jdHgpOwogICAgCQkJCQkJZWFjaF9ibG9ja3NbaV0uYygpOwogICAgCQkJCQkJZWFjaF9ibG9ja3NbaV0ubShlYWNoXzFfYW5jaG9yLnBhcmVudE5vZGUsIGVhY2hfMV9hbmNob3IpOwogICAgCQkJCQl9CiAgICAJCQkJfQoKICAgIAkJCQlmb3IgKDsgaSA8IGVhY2hfYmxvY2tzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCQkJCWVhY2hfYmxvY2tzW2ldLmQoMSk7CiAgICAJCQkJfQoKICAgIAkJCQllYWNoX2Jsb2Nrcy5sZW5ndGggPSBlYWNoX3ZhbHVlXzEubGVuZ3RoOwogICAgCQkJfQogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJZGVzdHJveV9lYWNoKGVhY2hfYmxvY2tzLCBkZXRhY2hpbmcpOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2RldihlYWNoXzFfYW5jaG9yKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzckMS5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIig4NToyNCkgPElucHV0IHR5cGU9XFxcInNlbGVjdFxcXCIgbmFtZT17b3B0aW9uLm5hbWV9IGlkPXtvcHRpb24ubmFtZX0gYmluZDp2YWx1ZT17c2V0dGluZ3Nbb3B0aW9uLm5hbWVdfT4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg4MToyNCkgPExhYmVsIGZvcj17b3B0aW9uLm5hbWV9PgogICAgZnVuY3Rpb24gY3JlYXRlX2RlZmF1bHRfc2xvdF82JDEoY3R4KSB7CiAgICAJbGV0IHRfdmFsdWUgPSAvKm9wdGlvbiovIGN0eFsxNF0udGl0bGUgKyAiIjsKICAgIAlsZXQgdDsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCXQgPSB0ZXh0KHRfdmFsdWUpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyICYmIHRfdmFsdWUgIT09ICh0X3ZhbHVlID0gLypvcHRpb24qLyBjdHhbMTRdLnRpdGxlICsgIiIpKSBzZXRfZGF0YV9kZXYodCwgdF92YWx1ZSk7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9kZWZhdWx0X3Nsb3RfNiQxLm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDgxOjI0KSA8TGFiZWwgZm9yPXtvcHRpb24ubmFtZX0+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoNzc6MjgpIHsjaWYgb3B0aW9uLnJhbmdlICE9PSBudWxsfQogICAgZnVuY3Rpb24gY3JlYXRlX2lmX2Jsb2NrXzIkMyhjdHgpIHsKICAgIAlsZXQgdDA7CiAgICAJbGV0IHQxX3ZhbHVlID0gLypvcHRpb24qLyBjdHhbMTRdLnJhbmdlLm1pbiArICIiOwogICAgCWxldCB0MTsKICAgIAlsZXQgdDI7CiAgICAJbGV0IHQzX3ZhbHVlID0gLypvcHRpb24qLyBjdHhbMTRdLnJhbmdlLm1heCArICIiOwogICAgCWxldCB0MzsKICAgIAlsZXQgdDQ7CiAgICAJbGV0IHQ1X3ZhbHVlID0gLypvcHRpb24qLyBjdHhbMTRdLnJhbmdlLnF1YW50ICsgIiI7CiAgICAJbGV0IHQ1OwogICAgCWxldCB0NjsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCXQwID0gdGV4dCgiKFJhbmdlOiAiKTsKICAgIAkJCXQxID0gdGV4dCh0MV92YWx1ZSk7CiAgICAJCQl0MiA9IHRleHQoIi0iKTsKICAgIAkJCXQzID0gdGV4dCh0M192YWx1ZSk7CiAgICAJCQl0NCA9IHRleHQoIiwgc3RlcDogIik7CiAgICAJCQl0NSA9IHRleHQodDVfdmFsdWUpOwogICAgCQkJdDYgPSB0ZXh0KCIpIik7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdDAsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdDEsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdDIsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdDMsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdDQsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdDUsIGFuY2hvcik7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdDYsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyICYmIHQxX3ZhbHVlICE9PSAodDFfdmFsdWUgPSAvKm9wdGlvbiovIGN0eFsxNF0ucmFuZ2UubWluICsgIiIpKSBzZXRfZGF0YV9kZXYodDEsIHQxX3ZhbHVlKTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qb3B0aW9ucyovIDIgJiYgdDNfdmFsdWUgIT09ICh0M192YWx1ZSA9IC8qb3B0aW9uKi8gY3R4WzE0XS5yYW5nZS5tYXggKyAiIikpIHNldF9kYXRhX2Rldih0MywgdDNfdmFsdWUpOwogICAgCQkJaWYgKGRpcnR5ICYgLypvcHRpb25zKi8gMiAmJiB0NV92YWx1ZSAhPT0gKHQ1X3ZhbHVlID0gLypvcHRpb24qLyBjdHhbMTRdLnJhbmdlLnF1YW50ICsgIiIpKSBzZXRfZGF0YV9kZXYodDUsIHQ1X3ZhbHVlKTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodDApOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0MSk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQyKTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodDMpOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0NCk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQ1KTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodDYpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9pZl9ibG9ja18yJDMubmFtZSwKICAgIAkJdHlwZTogImlmIiwKICAgIAkJc291cmNlOiAiKDc3OjI4KSB7I2lmIG9wdGlvbi5yYW5nZSAhPT0gbnVsbH0iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg3NjoyNCkgPExhYmVsIGZvcj17b3B0aW9uLm5hbWV9PgogICAgZnVuY3Rpb24gY3JlYXRlX2RlZmF1bHRfc2xvdF81JDEoY3R4KSB7CiAgICAJbGV0IHQwX3ZhbHVlID0gLypvcHRpb24qLyBjdHhbMTRdLnRpdGxlICsgIiI7CiAgICAJbGV0IHQwOwogICAgCWxldCB0MTsKICAgIAlsZXQgaWZfYmxvY2tfYW5jaG9yOwogICAgCWxldCBpZl9ibG9jayA9IC8qb3B0aW9uKi8gY3R4WzE0XS5yYW5nZSAhPT0gbnVsbCAmJiBjcmVhdGVfaWZfYmxvY2tfMiQzKGN0eCk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQl0MCA9IHRleHQodDBfdmFsdWUpOwogICAgCQkJdDEgPSBzcGFjZSgpOwogICAgCQkJaWYgKGlmX2Jsb2NrKSBpZl9ibG9jay5jKCk7CiAgICAJCQlpZl9ibG9ja19hbmNob3IgPSBlbXB0eSgpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQwLCBhbmNob3IpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQxLCBhbmNob3IpOwogICAgCQkJaWYgKGlmX2Jsb2NrKSBpZl9ibG9jay5tKHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBpZl9ibG9ja19hbmNob3IsIGFuY2hvcik7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyICYmIHQwX3ZhbHVlICE9PSAodDBfdmFsdWUgPSAvKm9wdGlvbiovIGN0eFsxNF0udGl0bGUgKyAiIikpIHNldF9kYXRhX2Rldih0MCwgdDBfdmFsdWUpOwoKICAgIAkJCWlmICgvKm9wdGlvbiovIGN0eFsxNF0ucmFuZ2UgIT09IG51bGwpIHsKICAgIAkJCQlpZiAoaWZfYmxvY2spIHsKICAgIAkJCQkJaWZfYmxvY2sucChjdHgsIGRpcnR5KTsKICAgIAkJCQl9IGVsc2UgewogICAgCQkJCQlpZl9ibG9jayA9IGNyZWF0ZV9pZl9ibG9ja18yJDMoY3R4KTsKICAgIAkJCQkJaWZfYmxvY2suYygpOwogICAgCQkJCQlpZl9ibG9jay5tKGlmX2Jsb2NrX2FuY2hvci5wYXJlbnROb2RlLCBpZl9ibG9ja19hbmNob3IpOwogICAgCQkJCX0KICAgIAkJCX0gZWxzZSBpZiAoaWZfYmxvY2spIHsKICAgIAkJCQlpZl9ibG9jay5kKDEpOwogICAgCQkJCWlmX2Jsb2NrID0gbnVsbDsKICAgIAkJCX0KICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodDApOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0MSk7CiAgICAJCQlpZiAoaWZfYmxvY2spIGlmX2Jsb2NrLmQoZGV0YWNoaW5nKTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYoaWZfYmxvY2tfYW5jaG9yKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzUkMS5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIig3NjoyNCkgPExhYmVsIGZvcj17b3B0aW9uLm5hbWV9PiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDcxOjI0KSA8TGFiZWwgZm9yPXtvcHRpb24ubmFtZX0gY2hlY2s+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzQkMShjdHgpIHsKICAgIAlsZXQgaW5wdXQ7CiAgICAJbGV0IHVwZGF0aW5nX2NoZWNrZWQ7CiAgICAJbGV0IHQwOwogICAgCWxldCB0MV92YWx1ZSA9IC8qb3B0aW9uKi8gY3R4WzE0XS50aXRsZSArICIiOwogICAgCWxldCB0MTsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJZnVuY3Rpb24gaW5wdXRfY2hlY2tlZF9iaW5kaW5nKHZhbHVlKSB7CiAgICAJCS8qaW5wdXRfY2hlY2tlZF9iaW5kaW5nKi8gY3R4WzZdLmNhbGwobnVsbCwgdmFsdWUsIC8qb3B0aW9uKi8gY3R4WzE0XSk7CiAgICAJfQoKICAgIAlsZXQgaW5wdXRfcHJvcHMgPSB7CiAgICAJCWlkOiAvKm9wdGlvbiovIGN0eFsxNF0ubmFtZSwKICAgIAkJcGxhY2Vob2xkZXI6IC8qb3B0aW9uKi8gY3R4WzE0XS5kZXNjcmlwdGlvbiwKICAgIAkJdHlwZTogImNoZWNrYm94IgogICAgCX07CgogICAgCWlmICgvKnNldHRpbmdzKi8gY3R4WzBdWy8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lXSAhPT0gdm9pZCAwKSB7CiAgICAJCWlucHV0X3Byb3BzLmNoZWNrZWQgPSAvKnNldHRpbmdzKi8gY3R4WzBdWy8qb3B0aW9uKi8gY3R4WzE0XS5uYW1lXTsKICAgIAl9CgogICAgCWlucHV0ID0gbmV3IElucHV0KHsgcHJvcHM6IGlucHV0X3Byb3BzLCAkJGlubGluZTogdHJ1ZSB9KTsKICAgIAliaW5kaW5nX2NhbGxiYWNrcy5wdXNoKCgpID0+IGJpbmQoaW5wdXQsICJjaGVja2VkIiwgaW5wdXRfY2hlY2tlZF9iaW5kaW5nKSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGlucHV0LiQkLmZyYWdtZW50KTsKICAgIAkJCXQwID0gc3BhY2UoKTsKICAgIAkJCXQxID0gdGV4dCh0MV92YWx1ZSk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQltb3VudF9jb21wb25lbnQoaW5wdXQsIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0MCwgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0MSwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUobmV3X2N0eCwgZGlydHkpIHsKICAgIAkJCWN0eCA9IG5ld19jdHg7CiAgICAJCQljb25zdCBpbnB1dF9jaGFuZ2VzID0ge307CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyKSBpbnB1dF9jaGFuZ2VzLmlkID0gLypvcHRpb24qLyBjdHhbMTRdLm5hbWU7CiAgICAJCQlpZiAoZGlydHkgJiAvKm9wdGlvbnMqLyAyKSBpbnB1dF9jaGFuZ2VzLnBsYWNlaG9sZGVyID0gLypvcHRpb24qLyBjdHhbMTRdLmRlc2NyaXB0aW9uOwoKICAgIAkJCWlmICghdXBkYXRpbmdfY2hlY2tlZCAmJiBkaXJ0eSAmIC8qc2V0dGluZ3MsIG9wdGlvbnMqLyAzKSB7CiAgICAJCQkJdXBkYXRpbmdfY2hlY2tlZCA9IHRydWU7CiAgICAJCQkJaW5wdXRfY2hhbmdlcy5jaGVja2VkID0gLypzZXR0aW5ncyovIGN0eFswXVsvKm9wdGlvbiovIGN0eFsxNF0ubmFtZV07CiAgICAJCQkJYWRkX2ZsdXNoX2NhbGxiYWNrKCgpID0+IHVwZGF0aW5nX2NoZWNrZWQgPSBmYWxzZSk7CiAgICAJCQl9CgogICAgCQkJaW5wdXQuJHNldChpbnB1dF9jaGFuZ2VzKTsKICAgIAkJCWlmICgoIWN1cnJlbnQgfHwgZGlydHkgJiAvKm9wdGlvbnMqLyAyKSAmJiB0MV92YWx1ZSAhPT0gKHQxX3ZhbHVlID0gLypvcHRpb24qLyBjdHhbMTRdLnRpdGxlICsgIiIpKSBzZXRfZGF0YV9kZXYodDEsIHQxX3ZhbHVlKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKGlucHV0LiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGlucHV0LiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChpbnB1dCwgZGV0YWNoaW5nKTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodDApOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0MSk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdF80JDEubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoNzE6MjQpIDxMYWJlbCBmb3I9e29wdGlvbi5uYW1lfSBjaGVjaz4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg2OToxNikgPEZvcm1Hcm91cD4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfMyQxKGN0eCkgewogICAgCWxldCBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7CiAgICAJbGV0IGlmX2Jsb2NrOwogICAgCWxldCB0OwogICAgCWxldCBjdXJyZW50OwoKICAgIAljb25zdCBpZl9ibG9ja19jcmVhdG9ycyA9IFsKICAgIAkJY3JlYXRlX2lmX2Jsb2NrJDYsCiAgICAJCWNyZWF0ZV9pZl9ibG9ja18xJDQsCiAgICAJCWNyZWF0ZV9pZl9ibG9ja18zJDMsCiAgICAJCWNyZWF0ZV9pZl9ibG9ja180JDEsCiAgICAJCWNyZWF0ZV9lbHNlX2Jsb2NrJDYKICAgIAldOwoKICAgIAljb25zdCBpZl9ibG9ja3MgPSBbXTsKCiAgICAJZnVuY3Rpb24gc2VsZWN0X2Jsb2NrX3R5cGUoY3R4LCBkaXJ0eSkgewogICAgCQlpZiAoLypvcHRpb24qLyBjdHhbMTRdLnR5cGUgPT09IDApIHJldHVybiAwOwogICAgCQlpZiAoKC8qb3B0aW9uKi8gY3R4WzE0XS50eXBlID09PSAxIHx8IC8qb3B0aW9uKi8gY3R4WzE0XS50eXBlID09PSAyKSAmJiAvKm9wdGlvbiovIGN0eFsxNF0uc2V0ID09PSBudWxsKSByZXR1cm4gMTsKICAgIAkJaWYgKC8qb3B0aW9uKi8gY3R4WzE0XS50eXBlID09PSAzICYmIC8qb3B0aW9uKi8gY3R4WzE0XS5zZXQgPT09IG51bGwpIHJldHVybiAyOwogICAgCQlpZiAoLypvcHRpb24qLyBjdHhbMTRdLnNldCAhPT0gbnVsbCkgcmV0dXJuIDM7CiAgICAJCXJldHVybiA0OwogICAgCX0KCiAgICAJY3VycmVudF9ibG9ja190eXBlX2luZGV4ID0gc2VsZWN0X2Jsb2NrX3R5cGUoY3R4KTsKICAgIAlpZl9ibG9jayA9IGlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdID0gaWZfYmxvY2tfY3JlYXRvcnNbY3VycmVudF9ibG9ja190eXBlX2luZGV4XShjdHgpOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJaWZfYmxvY2suYygpOwogICAgCQkJdCA9IHNwYWNlKCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XS5tKHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQlsZXQgcHJldmlvdXNfYmxvY2tfaW5kZXggPSBjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXg7CiAgICAJCQljdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPSBzZWxlY3RfYmxvY2tfdHlwZShjdHgpOwoKICAgIAkJCWlmIChjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXggPT09IHByZXZpb3VzX2Jsb2NrX2luZGV4KSB7CiAgICAJCQkJaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0ucChjdHgsIGRpcnR5KTsKICAgIAkJCX0gZWxzZSB7CiAgICAJCQkJZ3JvdXBfb3V0cm9zKCk7CgogICAgCQkJCXRyYW5zaXRpb25fb3V0KGlmX2Jsb2Nrc1twcmV2aW91c19ibG9ja19pbmRleF0sIDEsIDEsICgpID0+IHsKICAgIAkJCQkJaWZfYmxvY2tzW3ByZXZpb3VzX2Jsb2NrX2luZGV4XSA9IG51bGw7CiAgICAJCQkJfSk7CgogICAgCQkJCWNoZWNrX291dHJvcygpOwogICAgCQkJCWlmX2Jsb2NrID0gaWZfYmxvY2tzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF07CgogICAgCQkJCWlmICghaWZfYmxvY2spIHsKICAgIAkJCQkJaWZfYmxvY2sgPSBpZl9ibG9ja3NbY3VycmVudF9ibG9ja190eXBlX2luZGV4XSA9IGlmX2Jsb2NrX2NyZWF0b3JzW2N1cnJlbnRfYmxvY2tfdHlwZV9pbmRleF0oY3R4KTsKICAgIAkJCQkJaWZfYmxvY2suYygpOwogICAgCQkJCX0gZWxzZSB7CiAgICAJCQkJCWlmX2Jsb2NrLnAoY3R4LCBkaXJ0eSk7CiAgICAJCQkJfQoKICAgIAkJCQl0cmFuc2l0aW9uX2luKGlmX2Jsb2NrLCAxKTsKICAgIAkJCQlpZl9ibG9jay5tKHQucGFyZW50Tm9kZSwgdCk7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihpZl9ibG9jayk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGlmX2Jsb2NrKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmX2Jsb2Nrc1tjdXJyZW50X2Jsb2NrX3R5cGVfaW5kZXhdLmQoZGV0YWNoaW5nKTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodCk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdF8zJDEubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoNjk6MTYpIDxGb3JtR3JvdXA+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoNjg6MTIpIHsjZWFjaCBvcHRpb25zIGFzIG9wdGlvbn0KICAgIGZ1bmN0aW9uIGNyZWF0ZV9lYWNoX2Jsb2NrJDEoY3R4KSB7CiAgICAJbGV0IGZvcm1ncm91cDsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJZm9ybWdyb3VwID0gbmV3IEZvcm1Hcm91cCh7CiAgICAJCQlwcm9wczogewogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfMyQxXSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoZm9ybWdyb3VwLiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChmb3JtZ3JvdXAsIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJY29uc3QgZm9ybWdyb3VwX2NoYW5nZXMgPSB7fTsKCiAgICAJCQlpZiAoZGlydHkgJiAvKiQkc2NvcGUsIG9wdGlvbnMsIHNldHRpbmdzKi8gMTA0ODU3OSkgewogICAgCQkJCWZvcm1ncm91cF9jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQlmb3JtZ3JvdXAuJHNldChmb3JtZ3JvdXBfY2hhbmdlcyk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihmb3JtZ3JvdXAuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoZm9ybWdyb3VwLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChmb3JtZ3JvdXAsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2VhY2hfYmxvY2skMS5uYW1lLAogICAgCQl0eXBlOiAiZWFjaCIsCiAgICAJCXNvdXJjZTogIig2ODoxMikgeyNlYWNoIG9wdGlvbnMgYXMgb3B0aW9ufSIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDY3OjgpIDxGb3JtPgogICAgZnVuY3Rpb24gY3JlYXRlX2RlZmF1bHRfc2xvdF8yJDEoY3R4KSB7CiAgICAJbGV0IGVhY2hfMV9hbmNob3I7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJbGV0IGVhY2hfdmFsdWUgPSAvKm9wdGlvbnMqLyBjdHhbMV07CiAgICAJdmFsaWRhdGVfZWFjaF9hcmd1bWVudChlYWNoX3ZhbHVlKTsKICAgIAlsZXQgZWFjaF9ibG9ja3MgPSBbXTsKCiAgICAJZm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX3ZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCWVhY2hfYmxvY2tzW2ldID0gY3JlYXRlX2VhY2hfYmxvY2skMShnZXRfZWFjaF9jb250ZXh0JDEoY3R4LCBlYWNoX3ZhbHVlLCBpKSk7CiAgICAJfQoKICAgIAljb25zdCBvdXQgPSBpID0+IHRyYW5zaXRpb25fb3V0KGVhY2hfYmxvY2tzW2ldLCAxLCAxLCAoKSA9PiB7CiAgICAJCWVhY2hfYmxvY2tzW2ldID0gbnVsbDsKICAgIAl9KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJCQllYWNoX2Jsb2Nrc1tpXS5jKCk7CiAgICAJCQl9CgogICAgCQkJZWFjaF8xX2FuY2hvciA9IGVtcHR5KCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlmb3IgKGxldCBpID0gMDsgaSA8IGVhY2hfYmxvY2tzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAJCQkJZWFjaF9ibG9ja3NbaV0ubSh0YXJnZXQsIGFuY2hvcik7CiAgICAJCQl9CgogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIGVhY2hfMV9hbmNob3IsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWlmIChkaXJ0eSAmIC8qb3B0aW9ucywgc2V0dGluZ3MqLyAzKSB7CiAgICAJCQkJZWFjaF92YWx1ZSA9IC8qb3B0aW9ucyovIGN0eFsxXTsKICAgIAkJCQl2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50KGVhY2hfdmFsdWUpOwogICAgCQkJCWxldCBpOwoKICAgIAkJCQlmb3IgKGkgPSAwOyBpIDwgZWFjaF92YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgCQkJCQljb25zdCBjaGlsZF9jdHggPSBnZXRfZWFjaF9jb250ZXh0JDEoY3R4LCBlYWNoX3ZhbHVlLCBpKTsKCiAgICAJCQkJCWlmIChlYWNoX2Jsb2Nrc1tpXSkgewogICAgCQkJCQkJZWFjaF9ibG9ja3NbaV0ucChjaGlsZF9jdHgsIGRpcnR5KTsKICAgIAkJCQkJCXRyYW5zaXRpb25faW4oZWFjaF9ibG9ja3NbaV0sIDEpOwogICAgCQkJCQl9IGVsc2UgewogICAgCQkJCQkJZWFjaF9ibG9ja3NbaV0gPSBjcmVhdGVfZWFjaF9ibG9jayQxKGNoaWxkX2N0eCk7CiAgICAJCQkJCQllYWNoX2Jsb2Nrc1tpXS5jKCk7CiAgICAJCQkJCQl0cmFuc2l0aW9uX2luKGVhY2hfYmxvY2tzW2ldLCAxKTsKICAgIAkJCQkJCWVhY2hfYmxvY2tzW2ldLm0oZWFjaF8xX2FuY2hvci5wYXJlbnROb2RlLCBlYWNoXzFfYW5jaG9yKTsKICAgIAkJCQkJfQogICAgCQkJCX0KCiAgICAJCQkJZ3JvdXBfb3V0cm9zKCk7CgogICAgCQkJCWZvciAoaSA9IGVhY2hfdmFsdWUubGVuZ3RoOyBpIDwgZWFjaF9ibG9ja3MubGVuZ3RoOyBpICs9IDEpIHsKICAgIAkJCQkJb3V0KGkpOwogICAgCQkJCX0KCiAgICAJCQkJY2hlY2tfb3V0cm9zKCk7CiAgICAJCQl9CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwoKICAgIAkJCWZvciAobGV0IGkgPSAwOyBpIDwgZWFjaF92YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgCQkJCXRyYW5zaXRpb25faW4oZWFjaF9ibG9ja3NbaV0pOwogICAgCQkJfQoKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJZWFjaF9ibG9ja3MgPSBlYWNoX2Jsb2Nrcy5maWx0ZXIoQm9vbGVhbik7CgogICAgCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBlYWNoX2Jsb2Nrcy5sZW5ndGg7IGkgKz0gMSkgewogICAgCQkJCXRyYW5zaXRpb25fb3V0KGVhY2hfYmxvY2tzW2ldKTsKICAgIAkJCX0KCiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2VhY2goZWFjaF9ibG9ja3MsIGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KGVhY2hfMV9hbmNob3IpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9kZWZhdWx0X3Nsb3RfMiQxLm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDY3OjgpIDxGb3JtPiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDY1OjQpIDxDb2w+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzEkMihjdHgpIHsKICAgIAlsZXQgc3Bpbm5lcjsKICAgIAlsZXQgdDsKICAgIAlsZXQgZm9ybTsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJc3Bpbm5lciA9IG5ldyBTcGlubmVyKHsKICAgIAkJCXByb3BzOiB7IGNsYXNzOiAvKnNwaW5uZXJDbGFzcyovIGN0eFszXSB9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWZvcm0gPSBuZXcgRm9ybSh7CiAgICAJCQlwcm9wczogewogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfMiQxXSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoc3Bpbm5lci4kJC5mcmFnbWVudCk7CiAgICAJCQl0ID0gc3BhY2UoKTsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoZm9ybS4kJC5mcmFnbWVudCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQltb3VudF9jb21wb25lbnQoc3Bpbm5lciwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQsIGFuY2hvcik7CiAgICAJCQltb3VudF9jb21wb25lbnQoZm9ybSwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQljb25zdCBzcGlubmVyX2NoYW5nZXMgPSB7fTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qc3Bpbm5lckNsYXNzKi8gOCkgc3Bpbm5lcl9jaGFuZ2VzLmNsYXNzID0gLypzcGlubmVyQ2xhc3MqLyBjdHhbM107CiAgICAJCQlzcGlubmVyLiRzZXQoc3Bpbm5lcl9jaGFuZ2VzKTsKICAgIAkJCWNvbnN0IGZvcm1fY2hhbmdlcyA9IHt9OwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSwgb3B0aW9ucywgc2V0dGluZ3MqLyAxMDQ4NTc5KSB7CiAgICAJCQkJZm9ybV9jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQlmb3JtLiRzZXQoZm9ybV9jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKHNwaW5uZXIuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25faW4oZm9ybS4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChzcGlubmVyLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQl0cmFuc2l0aW9uX291dChmb3JtLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChzcGlubmVyLCBkZXRhY2hpbmcpOwogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0KTsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KGZvcm0sIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdF8xJDIubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoNjU6NCkgPENvbD4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg2NDowKSA8Um93IGNsYXNzPXttYWluUm93Q2xhc3N9PgogICAgZnVuY3Rpb24gY3JlYXRlX2RlZmF1bHRfc2xvdCQyKGN0eCkgewogICAgCWxldCBjb2w7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCWNvbCA9IG5ldyBDb2woewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzEkMl0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGNvbC4kJC5mcmFnbWVudCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQltb3VudF9jb21wb25lbnQoY29sLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWNvbnN0IGNvbF9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBvcHRpb25zLCBzZXR0aW5ncywgc3Bpbm5lckNsYXNzKi8gMTA0ODU4NykgewogICAgCQkJCWNvbF9jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQljb2wuJHNldChjb2xfY2hhbmdlcyk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihjb2wuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoY29sLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChjb2wsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdCQyLm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDY0OjApIDxSb3cgY2xhc3M9e21haW5Sb3dDbGFzc30+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkaShjdHgpIHsKICAgIAlsZXQgcm93OwogICAgCWxldCBjdXJyZW50OwoKICAgIAlyb3cgPSBuZXcgUm93KHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJY2xhc3M6IC8qbWFpblJvd0NsYXNzKi8gY3R4WzJdLAogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3QkMl0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KHJvdy4kJC5mcmFnbWVudCk7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChyb3csIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBbZGlydHldKSB7CiAgICAJCQljb25zdCByb3dfY2hhbmdlcyA9IHt9OwogICAgCQkJaWYgKGRpcnR5ICYgLyptYWluUm93Q2xhc3MqLyA0KSByb3dfY2hhbmdlcy5jbGFzcyA9IC8qbWFpblJvd0NsYXNzKi8gY3R4WzJdOwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSwgb3B0aW9ucywgc2V0dGluZ3MsIHNwaW5uZXJDbGFzcyovIDEwNDg1ODcpIHsKICAgIAkJCQlyb3dfY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJcm93LiRzZXQocm93X2NoYW5nZXMpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4ocm93LiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KHJvdy4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJZGVzdHJveV9jb21wb25lbnQocm93LCBkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRpLm5hbWUsCiAgICAJCXR5cGU6ICJjb21wb25lbnQiLAogICAgCQlzb3VyY2U6ICIiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RhbmNlJGkoJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHsKICAgIAlsZXQgbWFpblJvd0NsYXNzOwogICAgCWxldCBzcGlubmVyQ2xhc3M7CiAgICAJbGV0IHsgJCRzbG90czogc2xvdHMgPSB7fSwgJCRzY29wZSB9ID0gJCRwcm9wczsKICAgIAl2YWxpZGF0ZV9zbG90cygiU2V0dGluZ3NQYWdlIiwgc2xvdHMsIFtdKTsKICAgIAlsZXQgeyBhY3RpdmUgfSA9ICQkcHJvcHM7CiAgICAJbGV0IHNwaW5uZXJTaG93biA9IGZhbHNlOwogICAgCWxldCBvcHRpb25zID0gW107CiAgICAJbGV0IHsgc2V0dGluZ3MgPSB7fSB9ID0gJCRwcm9wczsKCiAgICAJY29uc3QgY2xlYXIgPSAoKSA9PiB7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCBvcHRpb25zID0gW10pOwogICAgCX07CgogICAgCWNvbnN0IGxvYWQgPSBhc3luYyBkYXRhID0+IHsKICAgIAkJY2xlYXIoKTsKICAgIAkJJCRpbnZhbGlkYXRlKDUsIHNwaW5uZXJTaG93biA9IHRydWUpOwoKICAgIAkJYXdhaXQgZmV0Y2goYC9hcGkvZGV2aWNlcy9gICsgc2Nhbm5lck5hbWUgKyBgL29wdGlvbnNgLCB7CiAgICAJCQltZXRob2Q6ICJHRVQiLAogICAgCQkJYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSkKICAgIAkJfSkudGhlbihyID0+IHIuanNvbigpKS50aGVuKGRhdGEgPT4gewogICAgCQkJJCRpbnZhbGlkYXRlKDUsIHNwaW5uZXJTaG93biA9IGZhbHNlKTsKICAgIAkJCSQkaW52YWxpZGF0ZSgxLCBvcHRpb25zID0gZGF0YSk7CiAgICAJCQljb25zb2xlLmxvZyhvcHRpb25zKTsKCiAgICAJCQlvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbikgewogICAgCQkJCSQkaW52YWxpZGF0ZSgwLCBzZXR0aW5nc1tvcHRpb24ubmFtZV0gPSBvcHRpb24uZGVmYXVsdCwgc2V0dGluZ3MpOwogICAgCQkJfSk7CiAgICAJCX0pOwogICAgCX07CgogICAgCWxldCBzY2FubmVyTmFtZTsKCiAgICAJY29uc3QgdW5zdWJzY3JpYmUgPSBzY2FubmVyLnN1YnNjcmliZSh2YWx1ZSA9PiB7CiAgICAJCXNjYW5uZXJOYW1lID0gdmFsdWU7CgogICAgCQlpZiAoc2Nhbm5lck5hbWUgIT09ICIiKSB7CiAgICAJCQlsb2FkKCk7CiAgICAJCX0KICAgIAl9KTsKCiAgICAJb25Nb3VudChhc3luYyAoKSA9PiB7CiAgICAJCWlmIChzY2FubmVyTmFtZSAhPT0gIiIpIHsKICAgIAkJCWF3YWl0IGxvYWQoKTsKICAgIAkJfQogICAgCX0pOwoKICAgIAljb25zdCB3cml0YWJsZV9wcm9wcyA9IFsiYWN0aXZlIiwgInNldHRpbmdzIl07CgogICAgCU9iamVjdC5rZXlzKCQkcHJvcHMpLmZvckVhY2goa2V5ID0+IHsKICAgIAkJaWYgKCF+d3JpdGFibGVfcHJvcHMuaW5kZXhPZihrZXkpICYmIGtleS5zbGljZSgwLCAyKSAhPT0gIiQkIikgY29uc29sZV8xLndhcm4oYDxTZXR0aW5nc1BhZ2U+IHdhcyBjcmVhdGVkIHdpdGggdW5rbm93biBwcm9wICcke2tleX0nYCk7CiAgICAJfSk7CgogICAgCWZ1bmN0aW9uIGlucHV0X2NoZWNrZWRfYmluZGluZyh2YWx1ZSwgb3B0aW9uKSB7CiAgICAJCXNldHRpbmdzW29wdGlvbi5uYW1lXSA9IHZhbHVlOwogICAgCQkkJGludmFsaWRhdGUoMCwgc2V0dGluZ3MpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfdmFsdWVfYmluZGluZyh2YWx1ZSwgb3B0aW9uKSB7CiAgICAJCXNldHRpbmdzW29wdGlvbi5uYW1lXSA9IHZhbHVlOwogICAgCQkkJGludmFsaWRhdGUoMCwgc2V0dGluZ3MpOwogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5wdXRfdmFsdWVfYmluZGluZ18xKHZhbHVlLCBvcHRpb24pIHsKICAgIAkJc2V0dGluZ3Nbb3B0aW9uLm5hbWVdID0gdmFsdWU7CiAgICAJCSQkaW52YWxpZGF0ZSgwLCBzZXR0aW5ncyk7CiAgICAJfQoKICAgIAlmdW5jdGlvbiBpbnB1dF92YWx1ZV9iaW5kaW5nXzIodmFsdWUsIG9wdGlvbikgewogICAgCQlzZXR0aW5nc1tvcHRpb24ubmFtZV0gPSB2YWx1ZTsKICAgIAkJJCRpbnZhbGlkYXRlKDAsIHNldHRpbmdzKTsKICAgIAl9CgogICAgCSQkc2VsZi4kJHNldCA9ICQkcHJvcHMgPT4gewogICAgCQlpZiAoImFjdGl2ZSIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDQsIGFjdGl2ZSA9ICQkcHJvcHMuYWN0aXZlKTsKICAgIAkJaWYgKCJzZXR0aW5ncyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDAsIHNldHRpbmdzID0gJCRwcm9wcy5zZXR0aW5ncyk7CiAgICAJfTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsKICAgIAkJQ29sLAogICAgCQlSb3csCiAgICAJCVNwaW5uZXIsCiAgICAJCUZvcm0sCiAgICAJCUZvcm1Hcm91cCwKICAgIAkJSW5wdXQsCiAgICAJCUxhYmVsLAogICAgCQlvbk1vdW50LAogICAgCQlzY2FubmVyLAogICAgCQlhY3RpdmUsCiAgICAJCXNwaW5uZXJTaG93biwKICAgIAkJb3B0aW9ucywKICAgIAkJc2V0dGluZ3MsCiAgICAJCWNsZWFyLAogICAgCQlsb2FkLAogICAgCQlzY2FubmVyTmFtZSwKICAgIAkJdW5zdWJzY3JpYmUsCiAgICAJCW1haW5Sb3dDbGFzcywKICAgIAkJc3Bpbm5lckNsYXNzCiAgICAJfSk7CgogICAgCSQkc2VsZi4kaW5qZWN0X3N0YXRlID0gJCRwcm9wcyA9PiB7CiAgICAJCWlmICgiYWN0aXZlIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoNCwgYWN0aXZlID0gJCRwcm9wcy5hY3RpdmUpOwogICAgCQlpZiAoInNwaW5uZXJTaG93biIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDUsIHNwaW5uZXJTaG93biA9ICQkcHJvcHMuc3Bpbm5lclNob3duKTsKICAgIAkJaWYgKCJvcHRpb25zIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMSwgb3B0aW9ucyA9ICQkcHJvcHMub3B0aW9ucyk7CiAgICAJCWlmICgic2V0dGluZ3MiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBzZXR0aW5ncyA9ICQkcHJvcHMuc2V0dGluZ3MpOwogICAgCQlpZiAoInNjYW5uZXJOYW1lIiBpbiAkJHByb3BzKSBzY2FubmVyTmFtZSA9ICQkcHJvcHMuc2Nhbm5lck5hbWU7CiAgICAJCWlmICgibWFpblJvd0NsYXNzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMiwgbWFpblJvd0NsYXNzID0gJCRwcm9wcy5tYWluUm93Q2xhc3MpOwogICAgCQlpZiAoInNwaW5uZXJDbGFzcyIgaW4gJCRwcm9wcykgJCRpbnZhbGlkYXRlKDMsIHNwaW5uZXJDbGFzcyA9ICQkcHJvcHMuc3Bpbm5lckNsYXNzKTsKICAgIAl9OwoKICAgIAlpZiAoJCRwcm9wcyAmJiAiJCRpbmplY3QiIGluICQkcHJvcHMpIHsKICAgIAkJJCRzZWxmLiRpbmplY3Rfc3RhdGUoJCRwcm9wcy4kJGluamVjdCk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCQudXBkYXRlID0gKCkgPT4gewogICAgCQlpZiAoJCRzZWxmLiQkLmRpcnR5ICYgLyphY3RpdmUqLyAxNikgewogICAgCQkJICQkaW52YWxpZGF0ZSgyLCBtYWluUm93Q2xhc3MgPSBhY3RpdmUgPyAiIiA6ICJkLW5vbmUiKTsKICAgIAkJfQoKICAgIAkJaWYgKCQkc2VsZi4kJC5kaXJ0eSAmIC8qc3Bpbm5lclNob3duKi8gMzIpIHsKICAgIAkJCSAkJGludmFsaWRhdGUoMywgc3Bpbm5lckNsYXNzID0gc3Bpbm5lclNob3duID8gIiIgOiAiZC1ub25lIik7CiAgICAJCX0KICAgIAl9OwoKICAgIAlyZXR1cm4gWwogICAgCQlzZXR0aW5ncywKICAgIAkJb3B0aW9ucywKICAgIAkJbWFpblJvd0NsYXNzLAogICAgCQlzcGlubmVyQ2xhc3MsCiAgICAJCWFjdGl2ZSwKICAgIAkJc3Bpbm5lclNob3duLAogICAgCQlpbnB1dF9jaGVja2VkX2JpbmRpbmcsCiAgICAJCWlucHV0X3ZhbHVlX2JpbmRpbmcsCiAgICAJCWlucHV0X3ZhbHVlX2JpbmRpbmdfMSwKICAgIAkJaW5wdXRfdmFsdWVfYmluZGluZ18yCiAgICAJXTsKICAgIH0KCiAgICBjbGFzcyBTZXR0aW5nc1BhZ2UgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYgewogICAgCWNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIAkJc3VwZXIob3B0aW9ucyk7CiAgICAJCWluaXQodGhpcywgb3B0aW9ucywgaW5zdGFuY2UkaSwgY3JlYXRlX2ZyYWdtZW50JGksIHNhZmVfbm90X2VxdWFsLCB7IGFjdGl2ZTogNCwgc2V0dGluZ3M6IDAgfSk7CgogICAgCQlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQ29tcG9uZW50IiwgewogICAgCQkJY29tcG9uZW50OiB0aGlzLAogICAgCQkJdGFnTmFtZTogIlNldHRpbmdzUGFnZSIsCiAgICAJCQlvcHRpb25zLAogICAgCQkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRpLm5hbWUKICAgIAkJfSk7CgogICAgCQljb25zdCB7IGN0eCB9ID0gdGhpcy4kJDsKICAgIAkJY29uc3QgcHJvcHMgPSBvcHRpb25zLnByb3BzIHx8IHt9OwoKICAgIAkJaWYgKC8qYWN0aXZlKi8gY3R4WzRdID09PSB1bmRlZmluZWQgJiYgISgiYWN0aXZlIiBpbiBwcm9wcykpIHsKICAgIAkJCWNvbnNvbGVfMS53YXJuKCI8U2V0dGluZ3NQYWdlPiB3YXMgY3JlYXRlZCB3aXRob3V0IGV4cGVjdGVkIHByb3AgJ2FjdGl2ZSciKTsKICAgIAkJfQogICAgCX0KCiAgICAJZ2V0IGFjdGl2ZSgpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U2V0dGluZ3NQYWdlPjogUHJvcHMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVubGVzcyBjb21waWxpbmcgd2l0aCAnYWNjZXNzb3JzOiB0cnVlJyBvciAnPHN2ZWx0ZTpvcHRpb25zIGFjY2Vzc29ycy8+JyIpOwogICAgCX0KCiAgICAJc2V0IGFjdGl2ZSh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxTZXR0aW5nc1BhZ2U+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQoKICAgIAlnZXQgc2V0dGluZ3MoKSB7CiAgICAJCXRocm93IG5ldyBFcnJvcigiPFNldHRpbmdzUGFnZT46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBzZXR0aW5ncyh2YWx1ZSkgewogICAgCQl0aHJvdyBuZXcgRXJyb3IoIjxTZXR0aW5nc1BhZ2U+OiBQcm9wcyBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdW5sZXNzIGNvbXBpbGluZyB3aXRoICdhY2Nlc3NvcnM6IHRydWUnIG9yICc8c3ZlbHRlOm9wdGlvbnMgYWNjZXNzb3JzLz4nIik7CiAgICAJfQogICAgfQoKICAgIC8qIHNyYy9TY2FubmVyLnN2ZWx0ZSBnZW5lcmF0ZWQgYnkgU3ZlbHRlIHYzLjMxLjIgKi8KCiAgICAvLyAoMzA6OCkgPENvbCBzbT0iNiIgbWQ9IjIiPgogICAgZnVuY3Rpb24gY3JlYXRlX2RlZmF1bHRfc2xvdF8xMChjdHgpIHsKICAgIAlsZXQgc2Nhbm5lcnM7CiAgICAJbGV0IGN1cnJlbnQ7CiAgICAJc2Nhbm5lcnMgPSBuZXcgU2Nhbm5lcnMoeyAkJGlubGluZTogdHJ1ZSB9KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoc2Nhbm5lcnMuJCQuZnJhZ21lbnQpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJbW91bnRfY29tcG9uZW50KHNjYW5uZXJzLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKHNjYW5uZXJzLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KHNjYW5uZXJzLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChzY2FubmVycywgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzEwLm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDMwOjgpIDxDb2wgc209XFxcIjZcXFwiIG1kPVxcXCIyXFxcIj4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgzODoyOCkgPE5hdkxpbmsgYWN0aXZlPXsic2NhbiIgPT09IGFjdGl2ZVRhYn0gb246Y2xpY2s9e3NlbGVjdFRhYigic2NhbiIpfT4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfOSQxKGN0eCkgewogICAgCWxldCB0OwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJdCA9IHRleHQoIlNjYW4iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0LCBhbmNob3IpOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJaWYgKGRldGFjaGluZykgZGV0YWNoX2Rldih0KTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzkkMS5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIigzODoyOCkgPE5hdkxpbmsgYWN0aXZlPXtcXFwic2NhblxcXCIgPT09IGFjdGl2ZVRhYn0gb246Y2xpY2s9e3NlbGVjdFRhYihcXFwic2NhblxcXCIpfT4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgzNzoyNCkgPE5hdkl0ZW0+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzgkMihjdHgpIHsKICAgIAlsZXQgbmF2bGluazsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJbmF2bGluayA9IG5ldyBOYXZMaW5rKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJYWN0aXZlOiAic2NhbiIgPT09IC8qYWN0aXZlVGFiKi8gY3R4WzBdLAogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfOSQxXSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJbmF2bGluay4kb24oImNsaWNrIiwgLypzZWxlY3RUYWIqLyBjdHhbMl0oInNjYW4iKSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KG5hdmxpbmsuJCQuZnJhZ21lbnQpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJbW91bnRfY29tcG9uZW50KG5hdmxpbmssIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJY29uc3QgbmF2bGlua19jaGFuZ2VzID0ge307CiAgICAJCQlpZiAoZGlydHkgJiAvKmFjdGl2ZVRhYiovIDEpIG5hdmxpbmtfY2hhbmdlcy5hY3RpdmUgPSAic2NhbiIgPT09IC8qYWN0aXZlVGFiKi8gY3R4WzBdOwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSovIDY0KSB7CiAgICAJCQkJbmF2bGlua19jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQluYXZsaW5rLiRzZXQobmF2bGlua19jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKG5hdmxpbmsuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQobmF2bGluay4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJZGVzdHJveV9jb21wb25lbnQobmF2bGluaywgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzgkMi5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIigzNzoyNCkgPE5hdkl0ZW0+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoNDE6MjgpIDxOYXZMaW5rIGFjdGl2ZT17InNldHRpbmdzIiA9PT0gYWN0aXZlVGFifSBvbjpjbGljaz17c2VsZWN0VGFiKCJzZXR0aW5ncyIpfT4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfNyQyKGN0eCkgewogICAgCWxldCB0OwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJdCA9IHRleHQoIlNldHRpbmdzIik7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQlpbnNlcnRfZGV2KHRhcmdldCwgdCwgYW5jaG9yKTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodCk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdF83JDIubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoNDE6MjgpIDxOYXZMaW5rIGFjdGl2ZT17XFxcInNldHRpbmdzXFxcIiA9PT0gYWN0aXZlVGFifSBvbjpjbGljaz17c2VsZWN0VGFiKFxcXCJzZXR0aW5nc1xcXCIpfT4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICg0MDoyNCkgPE5hdkl0ZW0+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzYkMihjdHgpIHsKICAgIAlsZXQgbmF2bGluazsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJbmF2bGluayA9IG5ldyBOYXZMaW5rKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJYWN0aXZlOiAic2V0dGluZ3MiID09PSAvKmFjdGl2ZVRhYiovIGN0eFswXSwKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzckMl0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCW5hdmxpbmsuJG9uKCJjbGljayIsIC8qc2VsZWN0VGFiKi8gY3R4WzJdKCJzZXR0aW5ncyIpKTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQobmF2bGluay4kJC5mcmFnbWVudCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQltb3VudF9jb21wb25lbnQobmF2bGluaywgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQljb25zdCBuYXZsaW5rX2NoYW5nZXMgPSB7fTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qYWN0aXZlVGFiKi8gMSkgbmF2bGlua19jaGFuZ2VzLmFjdGl2ZSA9ICJzZXR0aW5ncyIgPT09IC8qYWN0aXZlVGFiKi8gY3R4WzBdOwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSovIDY0KSB7CiAgICAJCQkJbmF2bGlua19jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQluYXZsaW5rLiRzZXQobmF2bGlua19jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKG5hdmxpbmsuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQobmF2bGluay4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJZGVzdHJveV9jb21wb25lbnQobmF2bGluaywgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzYkMi5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIig0MDoyNCkgPE5hdkl0ZW0+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoMzY6MjApIDxOYXYgdGFicz4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfNSQyKGN0eCkgewogICAgCWxldCBuYXZpdGVtMDsKICAgIAlsZXQgdDsKICAgIAlsZXQgbmF2aXRlbTE7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCW5hdml0ZW0wID0gbmV3IE5hdkl0ZW0oewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzgkMl0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCW5hdml0ZW0xID0gbmV3IE5hdkl0ZW0oewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzYkMl0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KG5hdml0ZW0wLiQkLmZyYWdtZW50KTsKICAgIAkJCXQgPSBzcGFjZSgpOwogICAgCQkJY3JlYXRlX2NvbXBvbmVudChuYXZpdGVtMS4kJC5mcmFnbWVudCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQltb3VudF9jb21wb25lbnQobmF2aXRlbTAsIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0LCBhbmNob3IpOwogICAgCQkJbW91bnRfY29tcG9uZW50KG5hdml0ZW0xLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWNvbnN0IG5hdml0ZW0wX2NoYW5nZXMgPSB7fTsKCiAgICAJCQlpZiAoZGlydHkgJiAvKiQkc2NvcGUsIGFjdGl2ZVRhYiovIDY1KSB7CiAgICAJCQkJbmF2aXRlbTBfY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJbmF2aXRlbTAuJHNldChuYXZpdGVtMF9jaGFuZ2VzKTsKICAgIAkJCWNvbnN0IG5hdml0ZW0xX2NoYW5nZXMgPSB7fTsKCiAgICAJCQlpZiAoZGlydHkgJiAvKiQkc2NvcGUsIGFjdGl2ZVRhYiovIDY1KSB7CiAgICAJCQkJbmF2aXRlbTFfY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJbmF2aXRlbTEuJHNldChuYXZpdGVtMV9jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKG5hdml0ZW0wLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQl0cmFuc2l0aW9uX2luKG5hdml0ZW0xLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KG5hdml0ZW0wLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQl0cmFuc2l0aW9uX291dChuYXZpdGVtMS4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJZGVzdHJveV9jb21wb25lbnQobmF2aXRlbTAsIGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQpOwogICAgCQkJZGVzdHJveV9jb21wb25lbnQobmF2aXRlbTEsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdF81JDIubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoMzY6MjApIDxOYXYgdGFicz4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgzNToxNikgPENvbD4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfNCQyKGN0eCkgewogICAgCWxldCBuYXY7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCW5hdiA9IG5ldyBOYXYoewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQl0YWJzOiB0cnVlLAogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfNSQyXSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQobmF2LiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChuYXYsIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJY29uc3QgbmF2X2NoYW5nZXMgPSB7fTsKCiAgICAJCQlpZiAoZGlydHkgJiAvKiQkc2NvcGUsIGFjdGl2ZVRhYiovIDY1KSB7CiAgICAJCQkJbmF2X2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCW5hdi4kc2V0KG5hdl9jaGFuZ2VzKTsKICAgIAkJfSwKICAgIAkJaTogZnVuY3Rpb24gaW50cm8obG9jYWwpIHsKICAgIAkJCWlmIChjdXJyZW50KSByZXR1cm47CiAgICAJCQl0cmFuc2l0aW9uX2luKG5hdi4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChuYXYuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KG5hdiwgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzQkMi5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIigzNToxNikgPENvbD4iLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8vICgzNDoxMikgPFJvdz4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfMyQyKGN0eCkgewogICAgCWxldCBjb2w7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCWNvbCA9IG5ldyBDb2woewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzQkMl0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGNvbC4kJC5mcmFnbWVudCk7CiAgICAJCX0sCiAgICAJCW06IGZ1bmN0aW9uIG1vdW50KHRhcmdldCwgYW5jaG9yKSB7CiAgICAJCQltb3VudF9jb21wb25lbnQoY29sLCB0YXJnZXQsIGFuY2hvcik7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJcDogZnVuY3Rpb24gdXBkYXRlKGN0eCwgZGlydHkpIHsKICAgIAkJCWNvbnN0IGNvbF9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBhY3RpdmVUYWIqLyA2NSkgewogICAgCQkJCWNvbF9jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQljb2wuJHNldChjb2xfY2hhbmdlcyk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihjb2wuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQoY29sLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChjb2wsIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdF8zJDIubmFtZSwKICAgIAkJdHlwZTogInNsb3QiLAogICAgCQlzb3VyY2U6ICIoMzQ6MTIpIDxSb3c+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICAvLyAoMzM6OCkgPENvbCBzbT0iNiIgbWQ9IjEwIj4KICAgIGZ1bmN0aW9uIGNyZWF0ZV9kZWZhdWx0X3Nsb3RfMiQyKGN0eCkgewogICAgCWxldCByb3c7CiAgICAJbGV0IHQwOwogICAgCWxldCBzY2FucGFnZTsKICAgIAlsZXQgdDE7CiAgICAJbGV0IHNldHRpbmdzcGFnZTsKICAgIAlsZXQgdXBkYXRpbmdfc2V0dGluZ3M7CiAgICAJbGV0IGN1cnJlbnQ7CgogICAgCXJvdyA9IG5ldyBSb3coewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzMkMl0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCXNjYW5wYWdlID0gbmV3IFNjYW5QYWdlKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJYWN0aXZlOiAic2NhbiIgPT09IC8qYWN0aXZlVGFiKi8gY3R4WzBdLAogICAgCQkJCXNldHRpbmdzOiAvKnNldHRpbmdzKi8gY3R4WzFdCiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWZ1bmN0aW9uIHNldHRpbmdzcGFnZV9zZXR0aW5nc19iaW5kaW5nKHZhbHVlKSB7CiAgICAJCS8qc2V0dGluZ3NwYWdlX3NldHRpbmdzX2JpbmRpbmcqLyBjdHhbM10uY2FsbChudWxsLCB2YWx1ZSk7CiAgICAJfQoKICAgIAlsZXQgc2V0dGluZ3NwYWdlX3Byb3BzID0gewogICAgCQlhY3RpdmU6ICJzZXR0aW5ncyIgPT09IC8qYWN0aXZlVGFiKi8gY3R4WzBdCiAgICAJfTsKCiAgICAJaWYgKC8qc2V0dGluZ3MqLyBjdHhbMV0gIT09IHZvaWQgMCkgewogICAgCQlzZXR0aW5nc3BhZ2VfcHJvcHMuc2V0dGluZ3MgPSAvKnNldHRpbmdzKi8gY3R4WzFdOwogICAgCX0KCiAgICAJc2V0dGluZ3NwYWdlID0gbmV3IFNldHRpbmdzUGFnZSh7CiAgICAJCQlwcm9wczogc2V0dGluZ3NwYWdlX3Byb3BzLAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWJpbmRpbmdfY2FsbGJhY2tzLnB1c2goKCkgPT4gYmluZChzZXR0aW5nc3BhZ2UsICJzZXR0aW5ncyIsIHNldHRpbmdzcGFnZV9zZXR0aW5nc19iaW5kaW5nKSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KHJvdy4kJC5mcmFnbWVudCk7CiAgICAJCQl0MCA9IHNwYWNlKCk7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KHNjYW5wYWdlLiQkLmZyYWdtZW50KTsKICAgIAkJCXQxID0gc3BhY2UoKTsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoc2V0dGluZ3NwYWdlLiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChyb3csIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0MCwgYW5jaG9yKTsKICAgIAkJCW1vdW50X2NvbXBvbmVudChzY2FucGFnZSwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJaW5zZXJ0X2Rldih0YXJnZXQsIHQxLCBhbmNob3IpOwogICAgCQkJbW91bnRfY29tcG9uZW50KHNldHRpbmdzcGFnZSwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIGRpcnR5KSB7CiAgICAJCQljb25zdCByb3dfY2hhbmdlcyA9IHt9OwoKICAgIAkJCWlmIChkaXJ0eSAmIC8qJCRzY29wZSwgYWN0aXZlVGFiKi8gNjUpIHsKICAgIAkJCQlyb3dfY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJcm93LiRzZXQocm93X2NoYW5nZXMpOwogICAgCQkJY29uc3Qgc2NhbnBhZ2VfY2hhbmdlcyA9IHt9OwogICAgCQkJaWYgKGRpcnR5ICYgLyphY3RpdmVUYWIqLyAxKSBzY2FucGFnZV9jaGFuZ2VzLmFjdGl2ZSA9ICJzY2FuIiA9PT0gLyphY3RpdmVUYWIqLyBjdHhbMF07CiAgICAJCQlpZiAoZGlydHkgJiAvKnNldHRpbmdzKi8gMikgc2NhbnBhZ2VfY2hhbmdlcy5zZXR0aW5ncyA9IC8qc2V0dGluZ3MqLyBjdHhbMV07CiAgICAJCQlzY2FucGFnZS4kc2V0KHNjYW5wYWdlX2NoYW5nZXMpOwogICAgCQkJY29uc3Qgc2V0dGluZ3NwYWdlX2NoYW5nZXMgPSB7fTsKICAgIAkJCWlmIChkaXJ0eSAmIC8qYWN0aXZlVGFiKi8gMSkgc2V0dGluZ3NwYWdlX2NoYW5nZXMuYWN0aXZlID0gInNldHRpbmdzIiA9PT0gLyphY3RpdmVUYWIqLyBjdHhbMF07CgogICAgCQkJaWYgKCF1cGRhdGluZ19zZXR0aW5ncyAmJiBkaXJ0eSAmIC8qc2V0dGluZ3MqLyAyKSB7CiAgICAJCQkJdXBkYXRpbmdfc2V0dGluZ3MgPSB0cnVlOwogICAgCQkJCXNldHRpbmdzcGFnZV9jaGFuZ2VzLnNldHRpbmdzID0gLypzZXR0aW5ncyovIGN0eFsxXTsKICAgIAkJCQlhZGRfZmx1c2hfY2FsbGJhY2soKCkgPT4gdXBkYXRpbmdfc2V0dGluZ3MgPSBmYWxzZSk7CiAgICAJCQl9CgogICAgCQkJc2V0dGluZ3NwYWdlLiRzZXQoc2V0dGluZ3NwYWdlX2NoYW5nZXMpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4ocm93LiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQl0cmFuc2l0aW9uX2luKHNjYW5wYWdlLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQl0cmFuc2l0aW9uX2luKHNldHRpbmdzcGFnZS4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCW86IGZ1bmN0aW9uIG91dHJvKGxvY2FsKSB7CiAgICAJCQl0cmFuc2l0aW9uX291dChyb3cuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25fb3V0KHNjYW5wYWdlLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQl0cmFuc2l0aW9uX291dChzZXR0aW5nc3BhZ2UuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KHJvdywgZGV0YWNoaW5nKTsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYodDApOwogICAgCQkJZGVzdHJveV9jb21wb25lbnQoc2NhbnBhZ2UsIGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQxKTsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KHNldHRpbmdzcGFnZSwgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzIkMi5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIigzMzo4KSA8Q29sIHNtPVxcXCI2XFxcIiBtZD1cXFwiMTBcXFwiPiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDI5OjQpIDxSb3c+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90XzEkMyhjdHgpIHsKICAgIAlsZXQgY29sMDsKICAgIAlsZXQgdDsKICAgIAlsZXQgY29sMTsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJY29sMCA9IG5ldyBDb2woewogICAgCQkJcHJvcHM6IHsKICAgIAkJCQlzbTogIjYiLAogICAgCQkJCW1kOiAiMiIsCiAgICAJCQkJJCRzbG90czogeyBkZWZhdWx0OiBbY3JlYXRlX2RlZmF1bHRfc2xvdF8xMF0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbDEgPSBuZXcgQ29sKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJc206ICI2IiwKICAgIAkJCQltZDogIjEwIiwKICAgIAkJCQkkJHNsb3RzOiB7IGRlZmF1bHQ6IFtjcmVhdGVfZGVmYXVsdF9zbG90XzIkMl0gfSwKICAgIAkJCQkkJHNjb3BlOiB7IGN0eCB9CiAgICAJCQl9LAogICAgCQkJJCRpbmxpbmU6IHRydWUKICAgIAkJfSk7CgogICAgCWNvbnN0IGJsb2NrID0gewogICAgCQljOiBmdW5jdGlvbiBjcmVhdGUoKSB7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGNvbDAuJCQuZnJhZ21lbnQpOwogICAgCQkJdCA9IHNwYWNlKCk7CiAgICAJCQljcmVhdGVfY29tcG9uZW50KGNvbDEuJCQuZnJhZ21lbnQpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJbW91bnRfY29tcG9uZW50KGNvbDAsIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCB0LCBhbmNob3IpOwogICAgCQkJbW91bnRfY29tcG9uZW50KGNvbDEsIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJY29uc3QgY29sMF9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlKi8gNjQpIHsKICAgIAkJCQljb2wwX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCWNvbDAuJHNldChjb2wwX2NoYW5nZXMpOwogICAgCQkJY29uc3QgY29sMV9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBhY3RpdmVUYWIsIHNldHRpbmdzKi8gNjcpIHsKICAgIAkJCQljb2wxX2NoYW5nZXMuJCRzY29wZSA9IHsgZGlydHksIGN0eCB9OwogICAgCQkJfQoKICAgIAkJCWNvbDEuJHNldChjb2wxX2NoYW5nZXMpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oY29sMC4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJdHJhbnNpdGlvbl9pbihjb2wxLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGNvbDAuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGNvbDEuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWRlc3Ryb3lfY29tcG9uZW50KGNvbDAsIGRldGFjaGluZyk7CiAgICAJCQlpZiAoZGV0YWNoaW5nKSBkZXRhY2hfZGV2KHQpOwogICAgCQkJZGVzdHJveV9jb21wb25lbnQoY29sMSwgZGV0YWNoaW5nKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZGVmYXVsdF9zbG90XzEkMy5uYW1lLAogICAgCQl0eXBlOiAic2xvdCIsCiAgICAJCXNvdXJjZTogIigyOTo0KSA8Um93PiIsCiAgICAJCWN0eAogICAgCX0pOwoKICAgIAlyZXR1cm4gYmxvY2s7CiAgICB9CgogICAgLy8gKDI4OjApIDxDb250YWluZXI+CiAgICBmdW5jdGlvbiBjcmVhdGVfZGVmYXVsdF9zbG90JDMoY3R4KSB7CiAgICAJbGV0IHJvdzsKICAgIAlsZXQgY3VycmVudDsKCiAgICAJcm93ID0gbmV3IFJvdyh7CiAgICAJCQlwcm9wczogewogICAgCQkJCSQkc2xvdHM6IHsgZGVmYXVsdDogW2NyZWF0ZV9kZWZhdWx0X3Nsb3RfMSQzXSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQocm93LiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCW1vdW50X2NvbXBvbmVudChyb3csIHRhcmdldCwgYW5jaG9yKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlwOiBmdW5jdGlvbiB1cGRhdGUoY3R4LCBkaXJ0eSkgewogICAgCQkJY29uc3Qgcm93X2NoYW5nZXMgPSB7fTsKCiAgICAJCQlpZiAoZGlydHkgJiAvKiQkc2NvcGUsIGFjdGl2ZVRhYiwgc2V0dGluZ3MqLyA2NykgewogICAgCQkJCXJvd19jaGFuZ2VzLiQkc2NvcGUgPSB7IGRpcnR5LCBjdHggfTsKICAgIAkJCX0KCiAgICAJCQlyb3cuJHNldChyb3dfY2hhbmdlcyk7CiAgICAJCX0sCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihyb3cuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSB0cnVlOwogICAgCQl9LAogICAgCQlvOiBmdW5jdGlvbiBvdXRybyhsb2NhbCkgewogICAgCQkJdHJhbnNpdGlvbl9vdXQocm93LiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gZmFsc2U7CiAgICAJCX0sCiAgICAJCWQ6IGZ1bmN0aW9uIGRlc3Ryb3koZGV0YWNoaW5nKSB7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChyb3csIGRldGFjaGluZyk7CiAgICAJCX0KICAgIAl9OwoKICAgIAlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQmxvY2siLCB7CiAgICAJCWJsb2NrLAogICAgCQlpZDogY3JlYXRlX2RlZmF1bHRfc2xvdCQzLm5hbWUsCiAgICAJCXR5cGU6ICJzbG90IiwKICAgIAkJc291cmNlOiAiKDI4OjApIDxDb250YWluZXI+IiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVfZnJhZ21lbnQkaihjdHgpIHsKICAgIAlsZXQgY29udGFpbmVyOwogICAgCWxldCBjdXJyZW50OwoKICAgIAljb250YWluZXIgPSBuZXcgQ29udGFpbmVyKHsKICAgIAkJCXByb3BzOiB7CiAgICAJCQkJJCRzbG90czogeyBkZWZhdWx0OiBbY3JlYXRlX2RlZmF1bHRfc2xvdCQzXSB9LAogICAgCQkJCSQkc2NvcGU6IHsgY3R4IH0KICAgIAkJCX0sCiAgICAJCQkkJGlubGluZTogdHJ1ZQogICAgCQl9KTsKCiAgICAJY29uc3QgYmxvY2sgPSB7CiAgICAJCWM6IGZ1bmN0aW9uIGNyZWF0ZSgpIHsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoY29udGFpbmVyLiQkLmZyYWdtZW50KTsKICAgIAkJfSwKICAgIAkJbDogZnVuY3Rpb24gY2xhaW0obm9kZXMpIHsKICAgIAkJCXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5oeWRyYXRlIG9ubHkgd29ya3MgaWYgdGhlIGNvbXBvbmVudCB3YXMgY29tcGlsZWQgd2l0aCB0aGUgYGh5ZHJhdGFibGU6IHRydWVgIG9wdGlvbiIpOwogICAgCQl9LAogICAgCQltOiBmdW5jdGlvbiBtb3VudCh0YXJnZXQsIGFuY2hvcikgewogICAgCQkJbW91bnRfY29tcG9uZW50KGNvbnRhaW5lciwgdGFyZ2V0LCBhbmNob3IpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IGZ1bmN0aW9uIHVwZGF0ZShjdHgsIFtkaXJ0eV0pIHsKICAgIAkJCWNvbnN0IGNvbnRhaW5lcl9jaGFuZ2VzID0ge307CgogICAgCQkJaWYgKGRpcnR5ICYgLyokJHNjb3BlLCBhY3RpdmVUYWIsIHNldHRpbmdzKi8gNjcpIHsKICAgIAkJCQljb250YWluZXJfY2hhbmdlcy4kJHNjb3BlID0geyBkaXJ0eSwgY3R4IH07CiAgICAJCQl9CgogICAgCQkJY29udGFpbmVyLiRzZXQoY29udGFpbmVyX2NoYW5nZXMpOwogICAgCQl9LAogICAgCQlpOiBmdW5jdGlvbiBpbnRybyhsb2NhbCkgewogICAgCQkJaWYgKGN1cnJlbnQpIHJldHVybjsKICAgIAkJCXRyYW5zaXRpb25faW4oY29udGFpbmVyLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KGNvbnRhaW5lci4kJC5mcmFnbWVudCwgbG9jYWwpOwogICAgCQkJY3VycmVudCA9IGZhbHNlOwogICAgCQl9LAogICAgCQlkOiBmdW5jdGlvbiBkZXN0cm95KGRldGFjaGluZykgewogICAgCQkJZGVzdHJveV9jb21wb25lbnQoY29udGFpbmVyLCBkZXRhY2hpbmcpOwogICAgCQl9CiAgICAJfTsKCiAgICAJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckJsb2NrIiwgewogICAgCQlibG9jaywKICAgIAkJaWQ6IGNyZWF0ZV9mcmFnbWVudCRqLm5hbWUsCiAgICAJCXR5cGU6ICJjb21wb25lbnQiLAogICAgCQlzb3VyY2U6ICIiLAogICAgCQljdHgKICAgIAl9KTsKCiAgICAJcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc3RhbmNlJGooJCRzZWxmLCAkJHByb3BzLCAkJGludmFsaWRhdGUpIHsKICAgIAlsZXQgeyAkJHNsb3RzOiBzbG90cyA9IHt9LCAkJHNjb3BlIH0gPSAkJHByb3BzOwogICAgCXZhbGlkYXRlX3Nsb3RzKCJTY2FubmVyIiwgc2xvdHMsIFtdKTsKICAgIAlsZXQgc2Nhbm5lck5hbWU7CiAgICAJbGV0IHNldHRpbmdzID0ge307CgogICAgCWNvbnN0IHVuc3Vic2NyaWJlID0gc2Nhbm5lci5zdWJzY3JpYmUodmFsdWUgPT4gewogICAgCQlzY2FubmVyTmFtZSA9IHZhbHVlOwogICAgCX0pOwoKICAgIAlsZXQgeyBhY3RpdmVUYWIgPSAic2NhbiIgfSA9ICQkcHJvcHM7CiAgICAJY29uc3Qgc2VsZWN0VGFiID0gbmFtZSA9PiAoKSA9PiAkJGludmFsaWRhdGUoMCwgYWN0aXZlVGFiID0gbmFtZSk7CiAgICAJY29uc3Qgd3JpdGFibGVfcHJvcHMgPSBbImFjdGl2ZVRhYiJdOwoKICAgIAlPYmplY3Qua2V5cygkJHByb3BzKS5mb3JFYWNoKGtleSA9PiB7CiAgICAJCWlmICghfndyaXRhYmxlX3Byb3BzLmluZGV4T2Yoa2V5KSAmJiBrZXkuc2xpY2UoMCwgMikgIT09ICIkJCIpIGNvbnNvbGUud2FybihgPFNjYW5uZXI+IHdhcyBjcmVhdGVkIHdpdGggdW5rbm93biBwcm9wICcke2tleX0nYCk7CiAgICAJfSk7CgogICAgCWZ1bmN0aW9uIHNldHRpbmdzcGFnZV9zZXR0aW5nc19iaW5kaW5nKHZhbHVlKSB7CiAgICAJCXNldHRpbmdzID0gdmFsdWU7CiAgICAJCSQkaW52YWxpZGF0ZSgxLCBzZXR0aW5ncyk7CiAgICAJfQoKICAgIAkkJHNlbGYuJCRzZXQgPSAkJHByb3BzID0+IHsKICAgIAkJaWYgKCJhY3RpdmVUYWIiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBhY3RpdmVUYWIgPSAkJHByb3BzLmFjdGl2ZVRhYik7CiAgICAJfTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsKICAgIAkJQ29sLAogICAgCQlDb250YWluZXIsCiAgICAJCVJvdywKICAgIAkJTmF2LAogICAgCQlOYXZJdGVtLAogICAgCQlOYXZMaW5rLAogICAgCQlTY2FubmVycywKICAgIAkJU2NhblBhZ2UsCiAgICAJCVNldHRpbmdzUGFnZSwKICAgIAkJc2Nhbm5lck5hbWUsCiAgICAJCXNldHRpbmdzLAogICAgCQlzY2FubmVyLAogICAgCQl1bnN1YnNjcmliZSwKICAgIAkJYWN0aXZlVGFiLAogICAgCQlzZWxlY3RUYWIKICAgIAl9KTsKCiAgICAJJCRzZWxmLiRpbmplY3Rfc3RhdGUgPSAkJHByb3BzID0+IHsKICAgIAkJaWYgKCJzY2FubmVyTmFtZSIgaW4gJCRwcm9wcykgc2Nhbm5lck5hbWUgPSAkJHByb3BzLnNjYW5uZXJOYW1lOwogICAgCQlpZiAoInNldHRpbmdzIiBpbiAkJHByb3BzKSAkJGludmFsaWRhdGUoMSwgc2V0dGluZ3MgPSAkJHByb3BzLnNldHRpbmdzKTsKICAgIAkJaWYgKCJhY3RpdmVUYWIiIGluICQkcHJvcHMpICQkaW52YWxpZGF0ZSgwLCBhY3RpdmVUYWIgPSAkJHByb3BzLmFjdGl2ZVRhYik7CiAgICAJfTsKCiAgICAJaWYgKCQkcHJvcHMgJiYgIiQkaW5qZWN0IiBpbiAkJHByb3BzKSB7CiAgICAJCSQkc2VsZi4kaW5qZWN0X3N0YXRlKCQkcHJvcHMuJCRpbmplY3QpOwogICAgCX0KCiAgICAJcmV0dXJuIFthY3RpdmVUYWIsIHNldHRpbmdzLCBzZWxlY3RUYWIsIHNldHRpbmdzcGFnZV9zZXR0aW5nc19iaW5kaW5nXTsKICAgIH0KCiAgICBjbGFzcyBTY2FubmVyIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHsKICAgIAljb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAJCXN1cGVyKG9wdGlvbnMpOwogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJGosIGNyZWF0ZV9mcmFnbWVudCRqLCBzYWZlX25vdF9lcXVhbCwgeyBhY3RpdmVUYWI6IDAgfSk7CgogICAgCQlkaXNwYXRjaF9kZXYoIlN2ZWx0ZVJlZ2lzdGVyQ29tcG9uZW50IiwgewogICAgCQkJY29tcG9uZW50OiB0aGlzLAogICAgCQkJdGFnTmFtZTogIlNjYW5uZXIiLAogICAgCQkJb3B0aW9ucywKICAgIAkJCWlkOiBjcmVhdGVfZnJhZ21lbnQkai5uYW1lCiAgICAJCX0pOwogICAgCX0KCiAgICAJZ2V0IGFjdGl2ZVRhYigpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U2Nhbm5lcj46IFByb3BzIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CgogICAgCXNldCBhY3RpdmVUYWIodmFsdWUpIHsKICAgIAkJdGhyb3cgbmV3IEVycm9yKCI8U2Nhbm5lcj46IFByb3BzIGNhbm5vdCBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB1bmxlc3MgY29tcGlsaW5nIHdpdGggJ2FjY2Vzc29yczogdHJ1ZScgb3IgJzxzdmVsdGU6b3B0aW9ucyBhY2Nlc3NvcnMvPiciKTsKICAgIAl9CiAgICB9CgogICAgLyogc3JjL0FwcC5zdmVsdGUgZ2VuZXJhdGVkIGJ5IFN2ZWx0ZSB2My4zMS4yICovCiAgICBjb25zdCBmaWxlJGkgPSAic3JjL0FwcC5zdmVsdGUiOwoKICAgIGZ1bmN0aW9uIGNyZWF0ZV9mcmFnbWVudCRrKGN0eCkgewogICAgCWxldCBtYWluOwogICAgCWxldCBzY2FubmVyOwogICAgCWxldCBjdXJyZW50OwogICAgCXNjYW5uZXIgPSBuZXcgU2Nhbm5lcih7ICQkaW5saW5lOiB0cnVlIH0pOwoKICAgIAljb25zdCBibG9jayA9IHsKICAgIAkJYzogZnVuY3Rpb24gY3JlYXRlKCkgewogICAgCQkJbWFpbiA9IGVsZW1lbnQoIm1haW4iKTsKICAgIAkJCWNyZWF0ZV9jb21wb25lbnQoc2Nhbm5lci4kJC5mcmFnbWVudCk7CiAgICAJCQlhZGRfbG9jYXRpb24obWFpbiwgZmlsZSRpLCA0LCAwLCA2MSk7CiAgICAJCX0sCiAgICAJCWw6IGZ1bmN0aW9uIGNsYWltKG5vZGVzKSB7CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMuaHlkcmF0ZSBvbmx5IHdvcmtzIGlmIHRoZSBjb21wb25lbnQgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGBoeWRyYXRhYmxlOiB0cnVlYCBvcHRpb24iKTsKICAgIAkJfSwKICAgIAkJbTogZnVuY3Rpb24gbW91bnQodGFyZ2V0LCBhbmNob3IpIHsKICAgIAkJCWluc2VydF9kZXYodGFyZ2V0LCBtYWluLCBhbmNob3IpOwogICAgCQkJbW91bnRfY29tcG9uZW50KHNjYW5uZXIsIG1haW4sIG51bGwpOwogICAgCQkJY3VycmVudCA9IHRydWU7CiAgICAJCX0sCiAgICAJCXA6IG5vb3AsCiAgICAJCWk6IGZ1bmN0aW9uIGludHJvKGxvY2FsKSB7CiAgICAJCQlpZiAoY3VycmVudCkgcmV0dXJuOwogICAgCQkJdHJhbnNpdGlvbl9pbihzY2FubmVyLiQkLmZyYWdtZW50LCBsb2NhbCk7CiAgICAJCQljdXJyZW50ID0gdHJ1ZTsKICAgIAkJfSwKICAgIAkJbzogZnVuY3Rpb24gb3V0cm8obG9jYWwpIHsKICAgIAkJCXRyYW5zaXRpb25fb3V0KHNjYW5uZXIuJCQuZnJhZ21lbnQsIGxvY2FsKTsKICAgIAkJCWN1cnJlbnQgPSBmYWxzZTsKICAgIAkJfSwKICAgIAkJZDogZnVuY3Rpb24gZGVzdHJveShkZXRhY2hpbmcpIHsKICAgIAkJCWlmIChkZXRhY2hpbmcpIGRldGFjaF9kZXYobWFpbik7CiAgICAJCQlkZXN0cm95X2NvbXBvbmVudChzY2FubmVyKTsKICAgIAkJfQogICAgCX07CgogICAgCWRpc3BhdGNoX2RldigiU3ZlbHRlUmVnaXN0ZXJCbG9jayIsIHsKICAgIAkJYmxvY2ssCiAgICAJCWlkOiBjcmVhdGVfZnJhZ21lbnQkay5uYW1lLAogICAgCQl0eXBlOiAiY29tcG9uZW50IiwKICAgIAkJc291cmNlOiAiIiwKICAgIAkJY3R4CiAgICAJfSk7CgogICAgCXJldHVybiBibG9jazsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnN0YW5jZSRrKCQkc2VsZiwgJCRwcm9wcywgJCRpbnZhbGlkYXRlKSB7CiAgICAJbGV0IHsgJCRzbG90czogc2xvdHMgPSB7fSwgJCRzY29wZSB9ID0gJCRwcm9wczsKICAgIAl2YWxpZGF0ZV9zbG90cygiQXBwIiwgc2xvdHMsIFtdKTsKICAgIAljb25zdCB3cml0YWJsZV9wcm9wcyA9IFtdOwoKICAgIAlPYmplY3Qua2V5cygkJHByb3BzKS5mb3JFYWNoKGtleSA9PiB7CiAgICAJCWlmICghfndyaXRhYmxlX3Byb3BzLmluZGV4T2Yoa2V5KSAmJiBrZXkuc2xpY2UoMCwgMikgIT09ICIkJCIpIGNvbnNvbGUud2FybihgPEFwcD4gd2FzIGNyZWF0ZWQgd2l0aCB1bmtub3duIHByb3AgJyR7a2V5fSdgKTsKICAgIAl9KTsKCiAgICAJJCRzZWxmLiRjYXB0dXJlX3N0YXRlID0gKCkgPT4gKHsgU2Nhbm5lciB9KTsKICAgIAlyZXR1cm4gW107CiAgICB9CgogICAgY2xhc3MgQXBwIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHsKICAgIAljb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAJCXN1cGVyKG9wdGlvbnMpOwogICAgCQlpbml0KHRoaXMsIG9wdGlvbnMsIGluc3RhbmNlJGssIGNyZWF0ZV9mcmFnbWVudCRrLCBzYWZlX25vdF9lcXVhbCwge30pOwoKICAgIAkJZGlzcGF0Y2hfZGV2KCJTdmVsdGVSZWdpc3RlckNvbXBvbmVudCIsIHsKICAgIAkJCWNvbXBvbmVudDogdGhpcywKICAgIAkJCXRhZ05hbWU6ICJBcHAiLAogICAgCQkJb3B0aW9ucywKICAgIAkJCWlkOiBjcmVhdGVfZnJhZ21lbnQkay5uYW1lCiAgICAJCX0pOwogICAgCX0KICAgIH0KCiAgICBjb25zdCBhcHAgPSBuZXcgQXBwKHsKICAgIAl0YXJnZXQ6IGRvY3VtZW50LmJvZHksCiAgICAJcHJvcHM6IHsKICAgIAkJbmFtZTogJ3dvcmxkJwogICAgCX0KICAgIH0pOwoKICAgIHJldHVybiBhcHA7Cgp9KCkpOwovLyMgc291cmNlTWFwcGluZ1VSTD1idW5kbGUuanMubWFwCg==\"") - packr.PackJSONBytes("../../web/public", "build/bundle.js.map", "\"eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlL2ludGVybmFsL2luZGV4Lm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvdXRpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL0J1dHRvbi5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlL3N0b3JlL2luZGV4Lm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvQnV0dG9uR3JvdXAuc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Db2wuc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Db250YWluZXIuc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Gb3JtLnN2ZWx0ZSIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvRm9ybUdyb3VwLnN2ZWx0ZSIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvSW5wdXQuc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9MYWJlbC5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL0xpc3RHcm91cC5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL0xpc3RHcm91cEl0ZW0uc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9NZWRpYS5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL05hdi5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL05hdkl0ZW0uc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9OYXZMaW5rLnN2ZWx0ZSIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvUm93LnN2ZWx0ZSIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvU3Bpbm5lci5zdmVsdGUiLCIuLi8uLi9zcmMvc3RvcmVzLmpzIiwiLi4vLi4vc3JjL1NjYW5uZXJzLnN2ZWx0ZSIsIi4uLy4uL3NyYy9TY2FuUGFnZS5zdmVsdGUiLCIuLi8uLi9zcmMvU2V0dGluZ3NQYWdlLnN2ZWx0ZSIsIi4uLy4uL3NyYy9TY2FubmVyLnN2ZWx0ZSIsIi4uLy4uL3NyYy9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIG5vb3AoKSB7IH1cbmNvbnN0IGlkZW50aXR5ID0geCA9PiB4O1xuZnVuY3Rpb24gYXNzaWduKHRhciwgc3JjKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGZvciAoY29uc3QgayBpbiBzcmMpXG4gICAgICAgIHRhcltrXSA9IHNyY1trXTtcbiAgICByZXR1cm4gdGFyO1xufVxuZnVuY3Rpb24gaXNfcHJvbWlzZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gYWRkX2xvY2F0aW9uKGVsZW1lbnQsIGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhcikge1xuICAgIGVsZW1lbnQuX19zdmVsdGVfbWV0YSA9IHtcbiAgICAgICAgbG9jOiB7IGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhciB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJ1bihmbikge1xuICAgIHJldHVybiBmbigpO1xufVxuZnVuY3Rpb24gYmxhbmtfb2JqZWN0KCkge1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuZnVuY3Rpb24gcnVuX2FsbChmbnMpIHtcbiAgICBmbnMuZm9yRWFjaChydW4pO1xufVxuZnVuY3Rpb24gaXNfZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gc2FmZV9ub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiIHx8ICgoYSAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHx8IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIG5vdF9lcXVhbChhLCBiKSB7XG4gICAgcmV0dXJuIGEgIT0gYSA/IGIgPT0gYiA6IGEgIT09IGI7XG59XG5mdW5jdGlvbiBpc19lbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9zdG9yZShzdG9yZSwgbmFtZSkge1xuICAgIGlmIChzdG9yZSAhPSBudWxsICYmIHR5cGVvZiBzdG9yZS5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgc3RvcmUgd2l0aCBhICdzdWJzY3JpYmUnIG1ldGhvZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN1YnNjcmliZShzdG9yZSwgLi4uY2FsbGJhY2tzKSB7XG4gICAgaWYgKHN0b3JlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfVxuICAgIGNvbnN0IHVuc3ViID0gc3RvcmUuc3Vic2NyaWJlKC4uLmNhbGxiYWNrcyk7XG4gICAgcmV0dXJuIHVuc3ViLnVuc3Vic2NyaWJlID8gKCkgPT4gdW5zdWIudW5zdWJzY3JpYmUoKSA6IHVuc3ViO1xufVxuZnVuY3Rpb24gZ2V0X3N0b3JlX3ZhbHVlKHN0b3JlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIHN1YnNjcmliZShzdG9yZSwgXyA9PiB2YWx1ZSA9IF8pKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY29tcG9uZW50X3N1YnNjcmliZShjb21wb25lbnQsIHN0b3JlLCBjYWxsYmFjaykge1xuICAgIGNvbXBvbmVudC4kJC5vbl9kZXN0cm95LnB1c2goc3Vic2NyaWJlKHN0b3JlLCBjYWxsYmFjaykpO1xufVxuZnVuY3Rpb24gY3JlYXRlX3Nsb3QoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNsb3RfY3R4ID0gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKTtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25bMF0oc2xvdF9jdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIHJldHVybiBkZWZpbml0aW9uWzFdICYmIGZuXG4gICAgICAgID8gYXNzaWduKCQkc2NvcGUuY3R4LnNsaWNlKCksIGRlZmluaXRpb25bMV0oZm4oY3R4KSkpXG4gICAgICAgIDogJCRzY29wZS5jdHg7XG59XG5mdW5jdGlvbiBnZXRfc2xvdF9jaGFuZ2VzKGRlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uWzJdICYmIGZuKSB7XG4gICAgICAgIGNvbnN0IGxldHMgPSBkZWZpbml0aW9uWzJdKGZuKGRpcnR5KSk7XG4gICAgICAgIGlmICgkJHNjb3BlLmRpcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGV0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gTWF0aC5tYXgoJCRzY29wZS5kaXJ0eS5sZW5ndGgsIGxldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBtZXJnZWRbaV0gPSAkJHNjb3BlLmRpcnR5W2ldIHwgbGV0c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQkc2NvcGUuZGlydHkgfCBsZXRzO1xuICAgIH1cbiAgICByZXR1cm4gJCRzY29wZS5kaXJ0eTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9zbG90KHNsb3QsIHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBkaXJ0eSwgZ2V0X3Nsb3RfY2hhbmdlc19mbiwgZ2V0X3Nsb3RfY29udGV4dF9mbikge1xuICAgIGNvbnN0IHNsb3RfY2hhbmdlcyA9IGdldF9zbG90X2NoYW5nZXMoc2xvdF9kZWZpbml0aW9uLCAkJHNjb3BlLCBkaXJ0eSwgZ2V0X3Nsb3RfY2hhbmdlc19mbik7XG4gICAgaWYgKHNsb3RfY2hhbmdlcykge1xuICAgICAgICBjb25zdCBzbG90X2NvbnRleHQgPSBnZXRfc2xvdF9jb250ZXh0KHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBnZXRfc2xvdF9jb250ZXh0X2ZuKTtcbiAgICAgICAgc2xvdC5wKHNsb3RfY29udGV4dCwgc2xvdF9jaGFuZ2VzKTtcbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVfc2xvdF9zcHJlYWQoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuLCBnZXRfc2xvdF9zcHJlYWRfY2hhbmdlc19mbiwgZ2V0X3Nsb3RfY29udGV4dF9mbikge1xuICAgIGNvbnN0IHNsb3RfY2hhbmdlcyA9IGdldF9zbG90X3NwcmVhZF9jaGFuZ2VzX2ZuKGRpcnR5KSB8IGdldF9zbG90X2NoYW5nZXMoc2xvdF9kZWZpbml0aW9uLCAkJHNjb3BlLCBkaXJ0eSwgZ2V0X3Nsb3RfY2hhbmdlc19mbik7XG4gICAgaWYgKHNsb3RfY2hhbmdlcykge1xuICAgICAgICBjb25zdCBzbG90X2NvbnRleHQgPSBnZXRfc2xvdF9jb250ZXh0KHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBnZXRfc2xvdF9jb250ZXh0X2ZuKTtcbiAgICAgICAgc2xvdC5wKHNsb3RfY29udGV4dCwgc2xvdF9jaGFuZ2VzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBleGNsdWRlX2ludGVybmFsX3Byb3BzKHByb3BzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIHByb3BzKVxuICAgICAgICBpZiAoa1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdWx0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVfcmVzdF9wcm9wcyhwcm9wcywga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSB7fTtcbiAgICBrZXlzID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpXG4gICAgICAgIGlmICgha2V5cy5oYXMoaykgJiYga1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdFtrXSA9IHByb3BzW2tdO1xuICAgIHJldHVybiByZXN0O1xufVxuZnVuY3Rpb24gY29tcHV0ZV9zbG90cyhzbG90cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgICBsZXQgcmFuID0gZmFsc2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChyYW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgIGZuLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG51bGxfdG9fZW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzZXRfc3RvcmVfdmFsdWUoc3RvcmUsIHJldCwgdmFsdWUgPSByZXQpIHtcbiAgICBzdG9yZS5zZXQodmFsdWUpO1xuICAgIHJldHVybiByZXQ7XG59XG5jb25zdCBoYXNfcHJvcCA9IChvYmosIHByb3ApID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xuZnVuY3Rpb24gYWN0aW9uX2Rlc3Ryb3llcihhY3Rpb25fcmVzdWx0KSB7XG4gICAgcmV0dXJuIGFjdGlvbl9yZXN1bHQgJiYgaXNfZnVuY3Rpb24oYWN0aW9uX3Jlc3VsdC5kZXN0cm95KSA/IGFjdGlvbl9yZXN1bHQuZGVzdHJveSA6IG5vb3A7XG59XG5cbmNvbnN0IGlzX2NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xubGV0IG5vdyA9IGlzX2NsaWVudFxuICAgID8gKCkgPT4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpXG4gICAgOiAoKSA9PiBEYXRlLm5vdygpO1xubGV0IHJhZiA9IGlzX2NsaWVudCA/IGNiID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShjYikgOiBub29wO1xuLy8gdXNlZCBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nXG5mdW5jdGlvbiBzZXRfbm93KGZuKSB7XG4gICAgbm93ID0gZm47XG59XG5mdW5jdGlvbiBzZXRfcmFmKGZuKSB7XG4gICAgcmFmID0gZm47XG59XG5cbmNvbnN0IHRhc2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gcnVuX3Rhc2tzKG5vdykge1xuICAgIHRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgIGlmICghdGFzay5jKG5vdykpIHtcbiAgICAgICAgICAgIHRhc2tzLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgICAgIHRhc2suZigpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRhc2tzLnNpemUgIT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xufVxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5IVxuICovXG5mdW5jdGlvbiBjbGVhcl9sb29wcygpIHtcbiAgICB0YXNrcy5jbGVhcigpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRhc2sgdGhhdCBydW5zIG9uIGVhY2ggcmFmIGZyYW1lXG4gKiB1bnRpbCBpdCByZXR1cm5zIGEgZmFsc3kgdmFsdWUgb3IgaXMgYWJvcnRlZFxuICovXG5mdW5jdGlvbiBsb29wKGNhbGxiYWNrKSB7XG4gICAgbGV0IHRhc2s7XG4gICAgaWYgKHRhc2tzLnNpemUgPT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bGZpbGwgPT4ge1xuICAgICAgICAgICAgdGFza3MuYWRkKHRhc2sgPSB7IGM6IGNhbGxiYWNrLCBmOiBmdWxmaWxsIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgYWJvcnQoKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhcHBlbmQodGFyZ2V0LCBub2RlKSB7XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKG5vZGUpO1xufVxuZnVuY3Rpb24gaW5zZXJ0KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgdGFyZ2V0Lmluc2VydEJlZm9yZShub2RlLCBhbmNob3IgfHwgbnVsbCk7XG59XG5mdW5jdGlvbiBkZXRhY2gobm9kZSkge1xuICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfZWFjaChpdGVyYXRpb25zLCBkZXRhY2hpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnNbaV0pXG4gICAgICAgICAgICBpdGVyYXRpb25zW2ldLmQoZGV0YWNoaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBlbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRfaXMobmFtZSwgaXMpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lLCB7IGlzIH0pO1xufVxuZnVuY3Rpb24gb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcyhvYmosIGV4Y2x1ZGUpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChoYXNfcHJvcChvYmosIGspXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAmJiBleGNsdWRlLmluZGV4T2YoaykgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0YXJnZXRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHN2Z19lbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIG5hbWUpO1xufVxuZnVuY3Rpb24gdGV4dChkYXRhKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpO1xufVxuZnVuY3Rpb24gc3BhY2UoKSB7XG4gICAgcmV0dXJuIHRleHQoJyAnKTtcbn1cbmZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0ZXh0KCcnKTtcbn1cbmZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBwcmV2ZW50X2RlZmF1bHQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzdG9wX3Byb3BhZ2F0aW9uKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNlbGYoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcylcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICBlbHNlIGlmIChub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpICE9PSB2YWx1ZSlcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBzZXRfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobm9kZS5fX3Byb3RvX18pO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ19fdmFsdWUnKSB7XG4gICAgICAgICAgICBub2RlLnZhbHVlID0gbm9kZVtrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlc2NyaXB0b3JzW2tleV0gJiYgZGVzY3JpcHRvcnNba2V5XS5zZXQpIHtcbiAgICAgICAgICAgIG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0X3N2Z19hdHRyaWJ1dGVzKG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9jdXN0b21fZWxlbWVudF9kYXRhKG5vZGUsIHByb3AsIHZhbHVlKSB7XG4gICAgaWYgKHByb3AgaW4gbm9kZSkge1xuICAgICAgICBub2RlW3Byb3BdID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhdHRyKG5vZGUsIHByb3AsIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB4bGlua19hdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBnZXRfYmluZGluZ19ncm91cF92YWx1ZShncm91cCwgX192YWx1ZSwgY2hlY2tlZCkge1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IFNldCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGdyb3VwW2ldLmNoZWNrZWQpXG4gICAgICAgICAgICB2YWx1ZS5hZGQoZ3JvdXBbaV0uX192YWx1ZSk7XG4gICAgfVxuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgICB2YWx1ZS5kZWxldGUoX192YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHRvX251bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJycgPyBudWxsIDogK3ZhbHVlO1xufVxuZnVuY3Rpb24gdGltZV9yYW5nZXNfdG9fYXJyYXkocmFuZ2VzKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJheS5wdXNoKHsgc3RhcnQ6IHJhbmdlcy5zdGFydChpKSwgZW5kOiByYW5nZXMuZW5kKGkpIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5mdW5jdGlvbiBjaGlsZHJlbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMsIHN2Zykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlID0gW107XG4gICAgICAgICAgICB3aGlsZSAoaiA8IG5vZGUuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBub2RlLmF0dHJpYnV0ZXNbaisrXTtcbiAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZS5wdXNoKGF0dHJpYnV0ZS5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHJlbW92ZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKHJlbW92ZVtrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZXMuc3BsaWNlKGksIDEpWzBdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdmcgPyBzdmdfZWxlbWVudChuYW1lKSA6IGVsZW1lbnQobmFtZSk7XG59XG5mdW5jdGlvbiBjbGFpbV90ZXh0KG5vZGVzLCBkYXRhKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSAnJyArIGRhdGE7XG4gICAgICAgICAgICByZXR1cm4gbm9kZXMuc3BsaWNlKGksIDEpWzBdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXh0KGRhdGEpO1xufVxuZnVuY3Rpb24gY2xhaW1fc3BhY2Uobm9kZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fdGV4dChub2RlcywgJyAnKTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhKHRleHQsIGRhdGEpIHtcbiAgICBkYXRhID0gJycgKyBkYXRhO1xuICAgIGlmICh0ZXh0Lndob2xlVGV4dCAhPT0gZGF0YSlcbiAgICAgICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF92YWx1ZShpbnB1dCwgdmFsdWUpIHtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xufVxuZnVuY3Rpb24gc2V0X2lucHV0X3R5cGUoaW5wdXQsIHR5cGUpIHtcbiAgICB0cnkge1xuICAgICAgICBpbnB1dC50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdHlsZShub2RlLCBrZXksIHZhbHVlLCBpbXBvcnRhbnQpIHtcbiAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUsIGltcG9ydGFudCA/ICdpbXBvcnRhbnQnIDogJycpO1xufVxuZnVuY3Rpb24gc2VsZWN0X29wdGlvbihzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgaWYgKG9wdGlvbi5fX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF9vcHRpb25zKHNlbGVjdCwgdmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHNlbGVjdC5vcHRpb25zW2ldO1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB+dmFsdWUuaW5kZXhPZihvcHRpb24uX192YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2VsZWN0X3ZhbHVlKHNlbGVjdCkge1xuICAgIGNvbnN0IHNlbGVjdGVkX29wdGlvbiA9IHNlbGVjdC5xdWVyeVNlbGVjdG9yKCc6Y2hlY2tlZCcpIHx8IHNlbGVjdC5vcHRpb25zWzBdO1xuICAgIHJldHVybiBzZWxlY3RlZF9vcHRpb24gJiYgc2VsZWN0ZWRfb3B0aW9uLl9fdmFsdWU7XG59XG5mdW5jdGlvbiBzZWxlY3RfbXVsdGlwbGVfdmFsdWUoc2VsZWN0KSB7XG4gICAgcmV0dXJuIFtdLm1hcC5jYWxsKHNlbGVjdC5xdWVyeVNlbGVjdG9yQWxsKCc6Y2hlY2tlZCcpLCBvcHRpb24gPT4gb3B0aW9uLl9fdmFsdWUpO1xufVxuLy8gdW5mb3J0dW5hdGVseSB0aGlzIGNhbid0IGJlIGEgY29uc3RhbnQgYXMgdGhhdCB3b3VsZG4ndCBiZSB0cmVlLXNoYWtlYWJsZVxuLy8gc28gd2UgY2FjaGUgdGhlIHJlc3VsdCBpbnN0ZWFkXG5sZXQgY3Jvc3NvcmlnaW47XG5mdW5jdGlvbiBpc19jcm9zc29yaWdpbigpIHtcbiAgICBpZiAoY3Jvc3NvcmlnaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjcm9zc29yaWdpbiA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICB2b2lkIHdpbmRvdy5wYXJlbnQuZG9jdW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjcm9zc29yaWdpbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNyb3Nzb3JpZ2luO1xufVxuZnVuY3Rpb24gYWRkX3Jlc2l6ZV9saXN0ZW5lcihub2RlLCBmbikge1xuICAgIGNvbnN0IGNvbXB1dGVkX3N0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoY29tcHV0ZWRfc3R5bGUucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIH1cbiAgICBjb25zdCBpZnJhbWUgPSBlbGVtZW50KCdpZnJhbWUnKTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7ICcgK1xuICAgICAgICAnb3ZlcmZsb3c6IGhpZGRlbjsgYm9yZGVyOiAwOyBvcGFjaXR5OiAwOyBwb2ludGVyLWV2ZW50czogbm9uZTsgei1pbmRleDogLTE7Jyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIGlmcmFtZS50YWJJbmRleCA9IC0xO1xuICAgIGNvbnN0IGNyb3Nzb3JpZ2luID0gaXNfY3Jvc3NvcmlnaW4oKTtcbiAgICBsZXQgdW5zdWJzY3JpYmU7XG4gICAgaWYgKGNyb3Nzb3JpZ2luKSB7XG4gICAgICAgIGlmcmFtZS5zcmMgPSBcImRhdGE6dGV4dC9odG1sLDxzY3JpcHQ+b25yZXNpemU9ZnVuY3Rpb24oKXtwYXJlbnQucG9zdE1lc3NhZ2UoMCwnKicpfTwvc2NyaXB0PlwiO1xuICAgICAgICB1bnN1YnNjcmliZSA9IGxpc3Rlbih3aW5kb3csICdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBpZnJhbWUuY29udGVudFdpbmRvdylcbiAgICAgICAgICAgICAgICBmbigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmcmFtZS5zcmMgPSAnYWJvdXQ6YmxhbmsnO1xuICAgICAgICBpZnJhbWUub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4oaWZyYW1lLmNvbnRlbnRXaW5kb3csICdyZXNpemUnLCBmbik7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGFwcGVuZChub2RlLCBpZnJhbWUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1bnN1YnNjcmliZSAmJiBpZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBkZXRhY2goaWZyYW1lKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdG9nZ2xlX2NsYXNzKGVsZW1lbnQsIG5hbWUsIHRvZ2dsZSkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0W3RvZ2dsZSA/ICdhZGQnIDogJ3JlbW92ZSddKG5hbWUpO1xufVxuZnVuY3Rpb24gY3VzdG9tX2V2ZW50KHR5cGUsIGRldGFpbCkge1xuICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIGRldGFpbCk7XG4gICAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBxdWVyeV9zZWxlY3Rvcl9hbGwoc2VsZWN0b3IsIHBhcmVudCA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShwYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xufVxuY2xhc3MgSHRtbFRhZyB7XG4gICAgY29uc3RydWN0b3IoYW5jaG9yID0gbnVsbCkge1xuICAgICAgICB0aGlzLmEgPSBhbmNob3I7XG4gICAgICAgIHRoaXMuZSA9IHRoaXMubiA9IG51bGw7XG4gICAgfVxuICAgIG0oaHRtbCwgdGFyZ2V0LCBhbmNob3IgPSBudWxsKSB7XG4gICAgICAgIGlmICghdGhpcy5lKSB7XG4gICAgICAgICAgICB0aGlzLmUgPSBlbGVtZW50KHRhcmdldC5ub2RlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnQgPSB0YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmgoaHRtbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pKGFuY2hvcik7XG4gICAgfVxuICAgIGgoaHRtbCkge1xuICAgICAgICB0aGlzLmUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgdGhpcy5uID0gQXJyYXkuZnJvbSh0aGlzLmUuY2hpbGROb2Rlcyk7XG4gICAgfVxuICAgIGkoYW5jaG9yKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpbnNlcnQodGhpcy50LCB0aGlzLm5baV0sIGFuY2hvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcChodG1sKSB7XG4gICAgICAgIHRoaXMuZCgpO1xuICAgICAgICB0aGlzLmgoaHRtbCk7XG4gICAgICAgIHRoaXMuaSh0aGlzLmEpO1xuICAgIH1cbiAgICBkKCkge1xuICAgICAgICB0aGlzLm4uZm9yRWFjaChkZXRhY2gpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGF0dHJpYnV0ZV90b19vYmplY3QoYXR0cmlidXRlcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmVzdWx0W2F0dHJpYnV0ZS5uYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldF9jdXN0b21fZWxlbWVudHNfc2xvdHMoZWxlbWVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGVsZW1lbnQuY2hpbGROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIHJlc3VsdFtub2RlLnNsb3QgfHwgJ2RlZmF1bHQnXSA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgYWN0aXZlX2RvY3MgPSBuZXcgU2V0KCk7XG5sZXQgYWN0aXZlID0gMDtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJrc2t5YXBwL3N0cmluZy1oYXNoL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG5mdW5jdGlvbiBoYXNoKHN0cikge1xuICAgIGxldCBoYXNoID0gNTM4MTtcbiAgICBsZXQgaSA9IHN0ci5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSlcbiAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpIF4gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGhhc2ggPj4+IDA7XG59XG5mdW5jdGlvbiBjcmVhdGVfcnVsZShub2RlLCBhLCBiLCBkdXJhdGlvbiwgZGVsYXksIGVhc2UsIGZuLCB1aWQgPSAwKSB7XG4gICAgY29uc3Qgc3RlcCA9IDE2LjY2NiAvIGR1cmF0aW9uO1xuICAgIGxldCBrZXlmcmFtZXMgPSAne1xcbic7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPD0gMTsgcCArPSBzdGVwKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhICsgKGIgLSBhKSAqIGVhc2UocCk7XG4gICAgICAgIGtleWZyYW1lcyArPSBwICogMTAwICsgYCV7JHtmbih0LCAxIC0gdCl9fVxcbmA7XG4gICAgfVxuICAgIGNvbnN0IHJ1bGUgPSBrZXlmcmFtZXMgKyBgMTAwJSB7JHtmbihiLCAxIC0gYil9fVxcbn1gO1xuICAgIGNvbnN0IG5hbWUgPSBgX19zdmVsdGVfJHtoYXNoKHJ1bGUpfV8ke3VpZH1gO1xuICAgIGNvbnN0IGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICBhY3RpdmVfZG9jcy5hZGQoZG9jKTtcbiAgICBjb25zdCBzdHlsZXNoZWV0ID0gZG9jLl9fc3ZlbHRlX3N0eWxlc2hlZXQgfHwgKGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0ID0gZG9jLmhlYWQuYXBwZW5kQ2hpbGQoZWxlbWVudCgnc3R5bGUnKSkuc2hlZXQpO1xuICAgIGNvbnN0IGN1cnJlbnRfcnVsZXMgPSBkb2MuX19zdmVsdGVfcnVsZXMgfHwgKGRvYy5fX3N2ZWx0ZV9ydWxlcyA9IHt9KTtcbiAgICBpZiAoIWN1cnJlbnRfcnVsZXNbbmFtZV0pIHtcbiAgICAgICAgY3VycmVudF9ydWxlc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShgQGtleWZyYW1lcyAke25hbWV9ICR7cnVsZX1gLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGFuaW1hdGlvbiA9IG5vZGUuc3R5bGUuYW5pbWF0aW9uIHx8ICcnO1xuICAgIG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gYCR7YW5pbWF0aW9uID8gYCR7YW5pbWF0aW9ufSwgYCA6ICcnfSR7bmFtZX0gJHtkdXJhdGlvbn1tcyBsaW5lYXIgJHtkZWxheX1tcyAxIGJvdGhgO1xuICAgIGFjdGl2ZSArPSAxO1xuICAgIHJldHVybiBuYW1lO1xufVxuZnVuY3Rpb24gZGVsZXRlX3J1bGUobm9kZSwgbmFtZSkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gKG5vZGUuc3R5bGUuYW5pbWF0aW9uIHx8ICcnKS5zcGxpdCgnLCAnKTtcbiAgICBjb25zdCBuZXh0ID0gcHJldmlvdXMuZmlsdGVyKG5hbWVcbiAgICAgICAgPyBhbmltID0+IGFuaW0uaW5kZXhPZihuYW1lKSA8IDAgLy8gcmVtb3ZlIHNwZWNpZmljIGFuaW1hdGlvblxuICAgICAgICA6IGFuaW0gPT4gYW5pbS5pbmRleE9mKCdfX3N2ZWx0ZScpID09PSAtMSAvLyByZW1vdmUgYWxsIFN2ZWx0ZSBhbmltYXRpb25zXG4gICAgKTtcbiAgICBjb25zdCBkZWxldGVkID0gcHJldmlvdXMubGVuZ3RoIC0gbmV4dC5sZW5ndGg7XG4gICAgaWYgKGRlbGV0ZWQpIHtcbiAgICAgICAgbm9kZS5zdHlsZS5hbmltYXRpb24gPSBuZXh0LmpvaW4oJywgJyk7XG4gICAgICAgIGFjdGl2ZSAtPSBkZWxldGVkO1xuICAgICAgICBpZiAoIWFjdGl2ZSlcbiAgICAgICAgICAgIGNsZWFyX3J1bGVzKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2xlYXJfcnVsZXMoKSB7XG4gICAgcmFmKCgpID0+IHtcbiAgICAgICAgaWYgKGFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgYWN0aXZlX2RvY3MuZm9yRWFjaChkb2MgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVzaGVldCA9IGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0O1xuICAgICAgICAgICAgbGV0IGkgPSBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChpLS0pXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldC5kZWxldGVSdWxlKGkpO1xuICAgICAgICAgICAgZG9jLl9fc3ZlbHRlX3J1bGVzID0ge307XG4gICAgICAgIH0pO1xuICAgICAgICBhY3RpdmVfZG9jcy5jbGVhcigpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVfYW5pbWF0aW9uKG5vZGUsIGZyb20sIGZuLCBwYXJhbXMpIHtcbiAgICBpZiAoIWZyb20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHRvID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoZnJvbS5sZWZ0ID09PSB0by5sZWZ0ICYmIGZyb20ucmlnaHQgPT09IHRvLnJpZ2h0ICYmIGZyb20udG9wID09PSB0by50b3AgJiYgZnJvbS5ib3R0b20gPT09IHRvLmJvdHRvbSlcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgXG4gICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBzaG91bGQgdGhpcyBiZSBzZXBhcmF0ZWQgZnJvbSBkZXN0cnVjdHVyaW5nPyBPciBzdGFydC9lbmQgYWRkZWQgdG8gcHVibGljIGFwaSBhbmQgZG9jdW1lbnRhdGlvbj9cbiAgICBzdGFydDogc3RhcnRfdGltZSA9IG5vdygpICsgZGVsYXksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzpcbiAgICBlbmQgPSBzdGFydF90aW1lICsgZHVyYXRpb24sIHRpY2sgPSBub29wLCBjc3MgfSA9IGZuKG5vZGUsIHsgZnJvbSwgdG8gfSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IHRydWU7XG4gICAgbGV0IHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBsZXQgbmFtZTtcbiAgICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDAsIDEsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGVsYXkpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBuYW1lKTtcbiAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgIGlmICghc3RhcnRlZCAmJiBub3cgPj0gc3RhcnRfdGltZSkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgbm93ID49IGVuZCkge1xuICAgICAgICAgICAgdGljaygxLCAwKTtcbiAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgICAgICAgY29uc3QgcCA9IG5vdyAtIHN0YXJ0X3RpbWU7XG4gICAgICAgICAgICBjb25zdCB0ID0gMCArIDEgKiBlYXNpbmcocCAvIGR1cmF0aW9uKTtcbiAgICAgICAgICAgIHRpY2sodCwgMSAtIHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIHN0YXJ0KCk7XG4gICAgdGljaygwLCAxKTtcbiAgICByZXR1cm4gc3RvcDtcbn1cbmZ1bmN0aW9uIGZpeF9wb3NpdGlvbihub2RlKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgIGlmIChzdHlsZS5wb3NpdGlvbiAhPT0gJ2Fic29sdXRlJyAmJiBzdHlsZS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHN0eWxlO1xuICAgICAgICBjb25zdCBhID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIG5vZGUuc3R5bGUud2lkdGggPSB3aWR0aDtcbiAgICAgICAgbm9kZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGFkZF90cmFuc2Zvcm0obm9kZSwgYSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkX3RyYW5zZm9ybShub2RlLCBhKSB7XG4gICAgY29uc3QgYiA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGEubGVmdCAhPT0gYi5sZWZ0IHx8IGEudG9wICE9PSBiLnRvcCkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBzdHlsZS50cmFuc2Zvcm07XG4gICAgICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gYCR7dHJhbnNmb3JtfSB0cmFuc2xhdGUoJHthLmxlZnQgLSBiLmxlZnR9cHgsICR7YS50b3AgLSBiLnRvcH1weClgO1xuICAgIH1cbn1cblxubGV0IGN1cnJlbnRfY29tcG9uZW50O1xuZnVuY3Rpb24gc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCkge1xuICAgIGN1cnJlbnRfY29tcG9uZW50ID0gY29tcG9uZW50O1xufVxuZnVuY3Rpb24gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkge1xuICAgIGlmICghY3VycmVudF9jb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY2FsbGVkIG91dHNpZGUgY29tcG9uZW50IGluaXRpYWxpemF0aW9uJyk7XG4gICAgcmV0dXJuIGN1cnJlbnRfY29tcG9uZW50O1xufVxuZnVuY3Rpb24gYmVmb3JlVXBkYXRlKGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuYmVmb3JlX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uTW91bnQoZm4pIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5vbl9tb3VudC5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIGFmdGVyVXBkYXRlKGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuYWZ0ZXJfdXBkYXRlLnB1c2goZm4pO1xufVxuZnVuY3Rpb24gb25EZXN0cm95KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fZGVzdHJveS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlcigpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBnZXRfY3VycmVudF9jb21wb25lbnQoKTtcbiAgICByZXR1cm4gKHR5cGUsIGRldGFpbCkgPT4ge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBjb21wb25lbnQuJCQuY2FsbGJhY2tzW3R5cGVdO1xuICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAvLyBUT0RPIGFyZSB0aGVyZSBzaXR1YXRpb25zIHdoZXJlIGV2ZW50cyBjb3VsZCBiZSBkaXNwYXRjaGVkXG4gICAgICAgICAgICAvLyBpbiBhIHNlcnZlciAobm9uLURPTSkgZW52aXJvbm1lbnQ/XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwpO1xuICAgICAgICAgICAgY2FsbGJhY2tzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiB7XG4gICAgICAgICAgICAgICAgZm4uY2FsbChjb21wb25lbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNldENvbnRleHQoa2V5LCBjb250ZXh0KSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5zZXQoa2V5LCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGdldENvbnRleHQoa2V5KSB7XG4gICAgcmV0dXJuIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuZ2V0KGtleSk7XG59XG5mdW5jdGlvbiBoYXNDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmhhcyhrZXkpO1xufVxuLy8gVE9ETyBmaWd1cmUgb3V0IGlmIHdlIHN0aWxsIHdhbnQgdG8gc3VwcG9ydFxuLy8gc2hvcnRoYW5kIGV2ZW50cywgb3IgaWYgd2Ugd2FudCB0byBpbXBsZW1lbnRcbi8vIGEgcmVhbCBidWJibGluZyBtZWNoYW5pc21cbmZ1bmN0aW9uIGJ1YmJsZShjb21wb25lbnQsIGV2ZW50KSB7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1tldmVudC50eXBlXTtcbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4gZm4oZXZlbnQpKTtcbiAgICB9XG59XG5cbmNvbnN0IGRpcnR5X2NvbXBvbmVudHMgPSBbXTtcbmNvbnN0IGludHJvcyA9IHsgZW5hYmxlZDogZmFsc2UgfTtcbmNvbnN0IGJpbmRpbmdfY2FsbGJhY2tzID0gW107XG5jb25zdCByZW5kZXJfY2FsbGJhY2tzID0gW107XG5jb25zdCBmbHVzaF9jYWxsYmFja3MgPSBbXTtcbmNvbnN0IHJlc29sdmVkX3Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbmxldCB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZV91cGRhdGUoKSB7XG4gICAgaWYgKCF1cGRhdGVfc2NoZWR1bGVkKSB7XG4gICAgICAgIHVwZGF0ZV9zY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICByZXNvbHZlZF9wcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRpY2soKSB7XG4gICAgc2NoZWR1bGVfdXBkYXRlKCk7XG4gICAgcmV0dXJuIHJlc29sdmVkX3Byb21pc2U7XG59XG5mdW5jdGlvbiBhZGRfcmVuZGVyX2NhbGxiYWNrKGZuKSB7XG4gICAgcmVuZGVyX2NhbGxiYWNrcy5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIGFkZF9mbHVzaF9jYWxsYmFjayhmbikge1xuICAgIGZsdXNoX2NhbGxiYWNrcy5wdXNoKGZuKTtcbn1cbmxldCBmbHVzaGluZyA9IGZhbHNlO1xuY29uc3Qgc2Vlbl9jYWxsYmFja3MgPSBuZXcgU2V0KCk7XG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICBpZiAoZmx1c2hpbmcpXG4gICAgICAgIHJldHVybjtcbiAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgZG8ge1xuICAgICAgICAvLyBmaXJzdCwgY2FsbCBiZWZvcmVVcGRhdGUgZnVuY3Rpb25zXG4gICAgICAgIC8vIGFuZCB1cGRhdGUgY29tcG9uZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGRpcnR5X2NvbXBvbmVudHNbaV07XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShjb21wb25lbnQuJCQpO1xuICAgICAgICB9XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgZGlydHlfY29tcG9uZW50cy5sZW5ndGggPSAwO1xuICAgICAgICB3aGlsZSAoYmluZGluZ19jYWxsYmFja3MubGVuZ3RoKVxuICAgICAgICAgICAgYmluZGluZ19jYWxsYmFja3MucG9wKCkoKTtcbiAgICAgICAgLy8gdGhlbiwgb25jZSBjb21wb25lbnRzIGFyZSB1cGRhdGVkLCBjYWxsXG4gICAgICAgIC8vIGFmdGVyVXBkYXRlIGZ1bmN0aW9ucy4gVGhpcyBtYXkgY2F1c2VcbiAgICAgICAgLy8gc3Vic2VxdWVudCB1cGRhdGVzLi4uXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSByZW5kZXJfY2FsbGJhY2tzW2ldO1xuICAgICAgICAgICAgaWYgKCFzZWVuX2NhbGxiYWNrcy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICAgICAgLy8gLi4uc28gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBsb29wc1xuICAgICAgICAgICAgICAgIHNlZW5fY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXJfY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgfSB3aGlsZSAoZGlydHlfY29tcG9uZW50cy5sZW5ndGgpO1xuICAgIHdoaWxlIChmbHVzaF9jYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGZsdXNoX2NhbGxiYWNrcy5wb3AoKSgpO1xuICAgIH1cbiAgICB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgZmx1c2hpbmcgPSBmYWxzZTtcbiAgICBzZWVuX2NhbGxiYWNrcy5jbGVhcigpO1xufVxuZnVuY3Rpb24gdXBkYXRlKCQkKSB7XG4gICAgaWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICQkLnVwZGF0ZSgpO1xuICAgICAgICBydW5fYWxsKCQkLmJlZm9yZV91cGRhdGUpO1xuICAgICAgICBjb25zdCBkaXJ0eSA9ICQkLmRpcnR5O1xuICAgICAgICAkJC5kaXJ0eSA9IFstMV07XG4gICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LnAoJCQuY3R4LCBkaXJ0eSk7XG4gICAgICAgICQkLmFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xuICAgIH1cbn1cblxubGV0IHByb21pc2U7XG5mdW5jdGlvbiB3YWl0KCkge1xuICAgIGlmICghcHJvbWlzZSkge1xuICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gZGlzcGF0Y2gobm9kZSwgZGlyZWN0aW9uLCBraW5kKSB7XG4gICAgbm9kZS5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudChgJHtkaXJlY3Rpb24gPyAnaW50cm8nIDogJ291dHJvJ30ke2tpbmR9YCkpO1xufVxuY29uc3Qgb3V0cm9pbmcgPSBuZXcgU2V0KCk7XG5sZXQgb3V0cm9zO1xuZnVuY3Rpb24gZ3JvdXBfb3V0cm9zKCkge1xuICAgIG91dHJvcyA9IHtcbiAgICAgICAgcjogMCxcbiAgICAgICAgYzogW10sXG4gICAgICAgIHA6IG91dHJvcyAvLyBwYXJlbnQgZ3JvdXBcbiAgICB9O1xufVxuZnVuY3Rpb24gY2hlY2tfb3V0cm9zKCkge1xuICAgIGlmICghb3V0cm9zLnIpIHtcbiAgICAgICAgcnVuX2FsbChvdXRyb3MuYyk7XG4gICAgfVxuICAgIG91dHJvcyA9IG91dHJvcy5wO1xufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9pbihibG9jaywgbG9jYWwpIHtcbiAgICBpZiAoYmxvY2sgJiYgYmxvY2suaSkge1xuICAgICAgICBvdXRyb2luZy5kZWxldGUoYmxvY2spO1xuICAgICAgICBibG9jay5pKGxvY2FsKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmFuc2l0aW9uX291dChibG9jaywgbG9jYWwsIGRldGFjaCwgY2FsbGJhY2spIHtcbiAgICBpZiAoYmxvY2sgJiYgYmxvY2subykge1xuICAgICAgICBpZiAob3V0cm9pbmcuaGFzKGJsb2NrKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgb3V0cm9pbmcuYWRkKGJsb2NrKTtcbiAgICAgICAgb3V0cm9zLmMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICBvdXRyb2luZy5kZWxldGUoYmxvY2spO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRldGFjaClcbiAgICAgICAgICAgICAgICAgICAgYmxvY2suZCgxKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYmxvY2subyhsb2NhbCk7XG4gICAgfVxufVxuY29uc3QgbnVsbF90cmFuc2l0aW9uID0geyBkdXJhdGlvbjogMCB9O1xuZnVuY3Rpb24gY3JlYXRlX2luX3RyYW5zaXRpb24obm9kZSwgZm4sIHBhcmFtcykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lO1xuICAgIGxldCB0YXNrO1xuICAgIGxldCB1aWQgPSAwO1xuICAgIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ28oKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDAsIDEsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MsIHVpZCsrKTtcbiAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnRfdGltZSA9IG5vdygpICsgZGVsYXk7XG4gICAgICAgIGNvbnN0IGVuZF90aW1lID0gc3RhcnRfdGltZSArIGR1cmF0aW9uO1xuICAgICAgICBpZiAodGFzaylcbiAgICAgICAgICAgIHRhc2suYWJvcnQoKTtcbiAgICAgICAgcnVubmluZyA9IHRydWU7XG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgdHJ1ZSwgJ3N0YXJ0JykpO1xuICAgICAgICB0YXNrID0gbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93ID49IGVuZF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHRydWUsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2sodCwgMSAtIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5uaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV0IHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydCgpIHtcbiAgICAgICAgICAgIGlmIChzdGFydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbihnbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX291dF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IHRydWU7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lO1xuICAgIGNvbnN0IGdyb3VwID0gb3V0cm9zO1xuICAgIGdyb3VwLnIgKz0gMTtcbiAgICBmdW5jdGlvbiBnbygpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMSwgMCwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBmYWxzZSwgJ3N0YXJ0JykpO1xuICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gZW5kX3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEtLWdyb3VwLnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCByZXN1bHQgaW4gYGVuZCgpYCBiZWluZyBjYWxsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNsZWFuIHVwIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwoZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMSAtIHQsIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5uaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICBnbygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdvKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGVuZChyZXNldCkge1xuICAgICAgICAgICAgaWYgKHJlc2V0ICYmIGNvbmZpZy50aWNrKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnRpY2soMSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVfYmlkaXJlY3Rpb25hbF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMsIGludHJvKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHQgPSBpbnRybyA/IDAgOiAxO1xuICAgIGxldCBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBhbmltYXRpb25fbmFtZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gY2xlYXJfYW5pbWF0aW9uKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluaXQocHJvZ3JhbSwgZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgZCA9IHByb2dyYW0uYiAtIHQ7XG4gICAgICAgIGR1cmF0aW9uICo9IE1hdGguYWJzKGQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYTogdCxcbiAgICAgICAgICAgIGI6IHByb2dyYW0uYixcbiAgICAgICAgICAgIGQsXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0OiBwcm9ncmFtLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBwcm9ncmFtLnN0YXJ0ICsgZHVyYXRpb24sXG4gICAgICAgICAgICBncm91cDogcHJvZ3JhbS5ncm91cFxuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnbyhiKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB7XG4gICAgICAgICAgICBzdGFydDogbm93KCkgKyBkZWxheSxcbiAgICAgICAgICAgIGJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFiKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgcHJvZ3JhbS5ncm91cCA9IG91dHJvcztcbiAgICAgICAgICAgIG91dHJvcy5yICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbSB8fCBwZW5kaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgIHBlbmRpbmdfcHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGludHJvLCBhbmQgdGhlcmUncyBhIGRlbGF5LCB3ZSBuZWVkIHRvIGRvXG4gICAgICAgICAgICAvLyBhbiBpbml0aWFsIHRpY2sgYW5kL29yIGFwcGx5IENTUyBhbmltYXRpb24gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIHQsIGIsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGIpXG4gICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IGluaXQocHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBiLCAnc3RhcnQnKSk7XG4gICAgICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdfcHJvZ3JhbSAmJiBub3cgPiBwZW5kaW5nX3Byb2dyYW0uc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwZW5kaW5nX3Byb2dyYW0sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdzdGFydCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgcnVubmluZ19wcm9ncmFtLmIsIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbiwgMCwgZWFzaW5nLCBjb25maWcuY3NzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0ID0gcnVubmluZ19wcm9ncmFtLmIsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHJ1bm5pbmdfcHJvZ3JhbS5iLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtLmIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm8g4oCUIHdlIGNhbiB0aWR5IHVwIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cm8g4oCUIG5lZWRzIHRvIGJlIGNvb3JkaW5hdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghLS1ydW5uaW5nX3Byb2dyYW0uZ3JvdXAucilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwocnVubmluZ19wcm9ncmFtLmdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm93ID49IHJ1bm5pbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IG5vdyAtIHJ1bm5pbmdfcHJvZ3JhbS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBydW5uaW5nX3Byb2dyYW0uYSArIHJ1bm5pbmdfcHJvZ3JhbS5kICogZWFzaW5nKHAgLyBydW5uaW5nX3Byb2dyYW0uZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0LCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhKHJ1bm5pbmdfcHJvZ3JhbSB8fCBwZW5kaW5nX3Byb2dyYW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcnVuKGIpIHtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgICAgICAgICBnbyhiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVfcHJvbWlzZShwcm9taXNlLCBpbmZvKSB7XG4gICAgY29uc3QgdG9rZW4gPSBpbmZvLnRva2VuID0ge307XG4gICAgZnVuY3Rpb24gdXBkYXRlKHR5cGUsIGluZGV4LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChpbmZvLnRva2VuICE9PSB0b2tlbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaW5mby5yZXNvbHZlZCA9IHZhbHVlO1xuICAgICAgICBsZXQgY2hpbGRfY3R4ID0gaW5mby5jdHg7XG4gICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2hpbGRfY3R4ID0gY2hpbGRfY3R4LnNsaWNlKCk7XG4gICAgICAgICAgICBjaGlsZF9jdHhba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJsb2NrID0gdHlwZSAmJiAoaW5mby5jdXJyZW50ID0gdHlwZSkoY2hpbGRfY3R4KTtcbiAgICAgICAgbGV0IG5lZWRzX2ZsdXNoID0gZmFsc2U7XG4gICAgICAgIGlmIChpbmZvLmJsb2NrKSB7XG4gICAgICAgICAgICBpZiAoaW5mby5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrcy5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gaW5kZXggJiYgYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5ibG9ja3NbaV0gPT09IGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYmxvY2tzW2ldID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2NrLmQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBibG9jay5jKCk7XG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGJsb2NrLCAxKTtcbiAgICAgICAgICAgIGJsb2NrLm0oaW5mby5tb3VudCgpLCBpbmZvLmFuY2hvcik7XG4gICAgICAgICAgICBuZWVkc19mbHVzaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5ibG9jayA9IGJsb2NrO1xuICAgICAgICBpZiAoaW5mby5ibG9ja3MpXG4gICAgICAgICAgICBpbmZvLmJsb2Nrc1tpbmRleF0gPSBibG9jaztcbiAgICAgICAgaWYgKG5lZWRzX2ZsdXNoKSB7XG4gICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc19wcm9taXNlKHByb21pc2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRfY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgICAgIHByb21pc2UudGhlbih2YWx1ZSA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8uY2F0Y2gsIDIsIGluZm8uZXJyb3IsIGVycm9yKTtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgICAgIGlmICghaW5mby5oYXNDYXRjaCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgd2UgcHJldmlvdXNseSBoYWQgYSB0aGVuL2NhdGNoIGJsb2NrLCBkZXN0cm95IGl0XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8ucGVuZGluZykge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8ucGVuZGluZywgMCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGluZm8uY3VycmVudCAhPT0gaW5mby50aGVuKSB7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8ucmVzb2x2ZWQgPSBwcm9taXNlO1xuICAgIH1cbn1cblxuY29uc3QgZ2xvYmFscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gd2luZG93XG4gICAgOiB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBnbG9iYWxUaGlzXG4gICAgICAgIDogZ2xvYmFsKTtcblxuZnVuY3Rpb24gZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZCgxKTtcbiAgICBsb29rdXAuZGVsZXRlKGJsb2NrLmtleSk7XG59XG5mdW5jdGlvbiBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZml4X2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmYoKTtcbiAgICBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9rZXllZF9lYWNoKG9sZF9ibG9ja3MsIGRpcnR5LCBnZXRfa2V5LCBkeW5hbWljLCBjdHgsIGxpc3QsIGxvb2t1cCwgbm9kZSwgZGVzdHJveSwgY3JlYXRlX2VhY2hfYmxvY2ssIG5leHQsIGdldF9jb250ZXh0KSB7XG4gICAgbGV0IG8gPSBvbGRfYmxvY2tzLmxlbmd0aDtcbiAgICBsZXQgbiA9IGxpc3QubGVuZ3RoO1xuICAgIGxldCBpID0gbztcbiAgICBjb25zdCBvbGRfaW5kZXhlcyA9IHt9O1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIG9sZF9pbmRleGVzW29sZF9ibG9ja3NbaV0ua2V5XSA9IGk7XG4gICAgY29uc3QgbmV3X2Jsb2NrcyA9IFtdO1xuICAgIGNvbnN0IG5ld19sb29rdXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGVsdGFzID0gbmV3IE1hcCgpO1xuICAgIGkgPSBuO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY29uc3QgY2hpbGRfY3R4ID0gZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgYmxvY2sgPSBsb29rdXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gY3JlYXRlX2VhY2hfYmxvY2soa2V5LCBjaGlsZF9jdHgpO1xuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR5bmFtaWMpIHtcbiAgICAgICAgICAgIGJsb2NrLnAoY2hpbGRfY3R4LCBkaXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3X2xvb2t1cC5zZXQoa2V5LCBuZXdfYmxvY2tzW2ldID0gYmxvY2spO1xuICAgICAgICBpZiAoa2V5IGluIG9sZF9pbmRleGVzKVxuICAgICAgICAgICAgZGVsdGFzLnNldChrZXksIE1hdGguYWJzKGkgLSBvbGRfaW5kZXhlc1trZXldKSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbGxfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBkaWRfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBmdW5jdGlvbiBpbnNlcnQoYmxvY2spIHtcbiAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgIGJsb2NrLm0obm9kZSwgbmV4dCk7XG4gICAgICAgIGxvb2t1cC5zZXQoYmxvY2sua2V5LCBibG9jayk7XG4gICAgICAgIG5leHQgPSBibG9jay5maXJzdDtcbiAgICAgICAgbi0tO1xuICAgIH1cbiAgICB3aGlsZSAobyAmJiBuKSB7XG4gICAgICAgIGNvbnN0IG5ld19ibG9jayA9IG5ld19ibG9ja3NbbiAtIDFdO1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW28gLSAxXTtcbiAgICAgICAgY29uc3QgbmV3X2tleSA9IG5ld19ibG9jay5rZXk7XG4gICAgICAgIGNvbnN0IG9sZF9rZXkgPSBvbGRfYmxvY2sua2V5O1xuICAgICAgICBpZiAobmV3X2Jsb2NrID09PSBvbGRfYmxvY2spIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIG5leHQgPSBuZXdfYmxvY2suZmlyc3Q7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgICAgICBuLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgb2xkIGJsb2NrXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbG9va3VwLmhhcyhuZXdfa2V5KSB8fCB3aWxsX21vdmUuaGFzKG5ld19rZXkpKSB7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaWRfbW92ZS5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWx0YXMuZ2V0KG5ld19rZXkpID4gZGVsdGFzLmdldChvbGRfa2V5KSkge1xuICAgICAgICAgICAgZGlkX21vdmUuYWRkKG5ld19rZXkpO1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWxsX21vdmUuYWRkKG9sZF9rZXkpO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChvLS0pIHtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvXTtcbiAgICAgICAgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfYmxvY2sua2V5KSlcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgIH1cbiAgICB3aGlsZSAobilcbiAgICAgICAgaW5zZXJ0KG5ld19ibG9ja3NbbiAtIDFdKTtcbiAgICByZXR1cm4gbmV3X2Jsb2Nrcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2VhY2hfa2V5cyhjdHgsIGxpc3QsIGdldF9jb250ZXh0LCBnZXRfa2V5KSB7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShnZXRfY29udGV4dChjdHgsIGxpc3QsIGkpKTtcbiAgICAgICAgaWYgKGtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgZHVwbGljYXRlIGtleXMgaW4gYSBrZXllZCBlYWNoJyk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldF9zcHJlYWRfdXBkYXRlKGxldmVscywgdXBkYXRlcykge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHt9O1xuICAgIGNvbnN0IHRvX251bGxfb3V0ID0ge307XG4gICAgY29uc3QgYWNjb3VudGVkX2ZvciA9IHsgJCRzY29wZTogMSB9O1xuICAgIGxldCBpID0gbGV2ZWxzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IG8gPSBsZXZlbHNbaV07XG4gICAgICAgIGNvbnN0IG4gPSB1cGRhdGVzW2ldO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBuKSlcbiAgICAgICAgICAgICAgICAgICAgdG9fbnVsbF9vdXRba2V5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50ZWRfZm9yW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlW2tleV0gPSBuW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWxzW2ldID0gbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRvX251bGxfb3V0KSB7XG4gICAgICAgIGlmICghKGtleSBpbiB1cGRhdGUpKVxuICAgICAgICAgICAgdXBkYXRlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBnZXRfc3ByZWFkX29iamVjdChzcHJlYWRfcHJvcHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNwcmVhZF9wcm9wcyA9PT0gJ29iamVjdCcgJiYgc3ByZWFkX3Byb3BzICE9PSBudWxsID8gc3ByZWFkX3Byb3BzIDoge307XG59XG5cbi8vIHNvdXJjZTogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sXG5jb25zdCBib29sZWFuX2F0dHJpYnV0ZXMgPSBuZXcgU2V0KFtcbiAgICAnYWxsb3dmdWxsc2NyZWVuJyxcbiAgICAnYWxsb3dwYXltZW50cmVxdWVzdCcsXG4gICAgJ2FzeW5jJyxcbiAgICAnYXV0b2ZvY3VzJyxcbiAgICAnYXV0b3BsYXknLFxuICAgICdjaGVja2VkJyxcbiAgICAnY29udHJvbHMnLFxuICAgICdkZWZhdWx0JyxcbiAgICAnZGVmZXInLFxuICAgICdkaXNhYmxlZCcsXG4gICAgJ2Zvcm1ub3ZhbGlkYXRlJyxcbiAgICAnaGlkZGVuJyxcbiAgICAnaXNtYXAnLFxuICAgICdsb29wJyxcbiAgICAnbXVsdGlwbGUnLFxuICAgICdtdXRlZCcsXG4gICAgJ25vbW9kdWxlJyxcbiAgICAnbm92YWxpZGF0ZScsXG4gICAgJ29wZW4nLFxuICAgICdwbGF5c2lubGluZScsXG4gICAgJ3JlYWRvbmx5JyxcbiAgICAncmVxdWlyZWQnLFxuICAgICdyZXZlcnNlZCcsXG4gICAgJ3NlbGVjdGVkJ1xuXSk7XG5cbmNvbnN0IGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyID0gL1tcXHMnXCI+Lz1cXHV7RkREMH0tXFx1e0ZERUZ9XFx1e0ZGRkV9XFx1e0ZGRkZ9XFx1ezFGRkZFfVxcdXsxRkZGRn1cXHV7MkZGRkV9XFx1ezJGRkZGfVxcdXszRkZGRX1cXHV7M0ZGRkZ9XFx1ezRGRkZFfVxcdXs0RkZGRn1cXHV7NUZGRkV9XFx1ezVGRkZGfVxcdXs2RkZGRX1cXHV7NkZGRkZ9XFx1ezdGRkZFfVxcdXs3RkZGRn1cXHV7OEZGRkV9XFx1ezhGRkZGfVxcdXs5RkZGRX1cXHV7OUZGRkZ9XFx1e0FGRkZFfVxcdXtBRkZGRn1cXHV7QkZGRkV9XFx1e0JGRkZGfVxcdXtDRkZGRX1cXHV7Q0ZGRkZ9XFx1e0RGRkZFfVxcdXtERkZGRn1cXHV7RUZGRkV9XFx1e0VGRkZGfVxcdXtGRkZGRX1cXHV7RkZGRkZ9XFx1ezEwRkZGRX1cXHV7MTBGRkZGfV0vdTtcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI25vbmNoYXJhY3RlclxuZnVuY3Rpb24gc3ByZWFkKGFyZ3MsIGNsYXNzZXNfdG9fYWRkKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpO1xuICAgIGlmIChjbGFzc2VzX3RvX2FkZCkge1xuICAgICAgICBpZiAoYXR0cmlidXRlcy5jbGFzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3Nlc190b19hZGQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzICs9ICcgJyArIGNsYXNzZXNfdG9fYWRkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdHIgPSAnJztcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBpZiAoaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIudGVzdChuYW1lKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICBzdHIgKz0gJyAnICsgbmFtZTtcbiAgICAgICAgZWxzZSBpZiAoYm9vbGVhbl9hdHRyaWJ1dGVzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgJyArIG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3RyICs9IGAgJHtuYW1lfT1cIiR7U3RyaW5nKHZhbHVlKS5yZXBsYWNlKC9cIi9nLCAnJiMzNDsnKS5yZXBsYWNlKC8nL2csICcmIzM5OycpfVwiYDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdHI7XG59XG5jb25zdCBlc2NhcGVkID0ge1xuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnLFxuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7J1xufTtcbmZ1bmN0aW9uIGVzY2FwZShodG1sKSB7XG4gICAgcmV0dXJuIFN0cmluZyhodG1sKS5yZXBsYWNlKC9bXCInJjw+XS9nLCBtYXRjaCA9PiBlc2NhcGVkW21hdGNoXSk7XG59XG5mdW5jdGlvbiBlYWNoKGl0ZW1zLCBmbikge1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBmbihpdGVtc1tpXSwgaSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5jb25zdCBtaXNzaW5nX2NvbXBvbmVudCA9IHtcbiAgICAkJHJlbmRlcjogKCkgPT4gJydcbn07XG5mdW5jdGlvbiB2YWxpZGF0ZV9jb21wb25lbnQoY29tcG9uZW50LCBuYW1lKSB7XG4gICAgaWYgKCFjb21wb25lbnQgfHwgIWNvbXBvbmVudC4kJHJlbmRlcikge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3N2ZWx0ZTpjb21wb25lbnQnKVxuICAgICAgICAgICAgbmFtZSArPSAnIHRoaXM9ey4uLn0nO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYDwke25hbWV9PiBpcyBub3QgYSB2YWxpZCBTU1IgY29tcG9uZW50LiBZb3UgbWF5IG5lZWQgdG8gcmV2aWV3IHlvdXIgYnVpbGQgY29uZmlnIHRvIGVuc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQsIHJhdGhlciB0aGFuIGltcG9ydGVkIGFzIHByZS1jb21waWxlZCBtb2R1bGVzYCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5mdW5jdGlvbiBkZWJ1ZyhmaWxlLCBsaW5lLCBjb2x1bW4sIHZhbHVlcykge1xuICAgIGNvbnNvbGUubG9nKGB7QGRlYnVnfSAke2ZpbGUgPyBmaWxlICsgJyAnIDogJyd9KCR7bGluZX06JHtjb2x1bW59KWApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyh2YWx1ZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICByZXR1cm4gJyc7XG59XG5sZXQgb25fZGVzdHJveTtcbmZ1bmN0aW9uIGNyZWF0ZV9zc3JfY29tcG9uZW50KGZuKSB7XG4gICAgZnVuY3Rpb24gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICAgICAgY29uc3QgJCQgPSB7XG4gICAgICAgICAgICBvbl9kZXN0cm95LFxuICAgICAgICAgICAgY29udGV4dDogbmV3IE1hcChwYXJlbnRfY29tcG9uZW50ID8gcGFyZW50X2NvbXBvbmVudC4kJC5jb250ZXh0IDogW10pLFxuICAgICAgICAgICAgLy8gdGhlc2Ugd2lsbCBiZSBpbW1lZGlhdGVseSBkaXNjYXJkZWRcbiAgICAgICAgICAgIG9uX21vdW50OiBbXSxcbiAgICAgICAgICAgIGJlZm9yZV91cGRhdGU6IFtdLFxuICAgICAgICAgICAgYWZ0ZXJfdXBkYXRlOiBbXSxcbiAgICAgICAgICAgIGNhbGxiYWNrczogYmxhbmtfb2JqZWN0KClcbiAgICAgICAgfTtcbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHsgJCQgfSk7XG4gICAgICAgIGNvbnN0IGh0bWwgPSBmbihyZXN1bHQsIHByb3BzLCBiaW5kaW5ncywgc2xvdHMpO1xuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQocGFyZW50X2NvbXBvbmVudCk7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICByZW5kZXI6IChwcm9wcyA9IHt9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgICAgIG9uX2Rlc3Ryb3kgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdGl0bGU6ICcnLCBoZWFkOiAnJywgY3NzOiBuZXcgU2V0KCkgfTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSAkJHJlbmRlcihyZXN1bHQsIHByb3BzLCB7fSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBydW5fYWxsKG9uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBodG1sLFxuICAgICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBBcnJheS5mcm9tKHJlc3VsdC5jc3MpLm1hcChjc3MgPT4gY3NzLmNvZGUpLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IG51bGwgLy8gVE9ET1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGVhZDogcmVzdWx0LnRpdGxlICsgcmVzdWx0LmhlYWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgICQkcmVuZGVyXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFkZF9hdHRyaWJ1dGUobmFtZSwgdmFsdWUsIGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCAoYm9vbGVhbiAmJiAhdmFsdWUpKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGAgJHtuYW1lfSR7dmFsdWUgPT09IHRydWUgPyAnJyA6IGA9JHt0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkoZXNjYXBlKHZhbHVlKSkgOiBgXCIke3ZhbHVlfVwiYH1gfWA7XG59XG5mdW5jdGlvbiBhZGRfY2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMgPyBgIGNsYXNzPVwiJHtjbGFzc2VzfVwiYCA6ICcnO1xufVxuXG5mdW5jdGlvbiBiaW5kKGNvbXBvbmVudCwgbmFtZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbXBvbmVudC4kJC5wcm9wc1tuYW1lXTtcbiAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb21wb25lbnQuJCQuYm91bmRbaW5kZXhdID0gY2FsbGJhY2s7XG4gICAgICAgIGNhbGxiYWNrKGNvbXBvbmVudC4kJC5jdHhbaW5kZXhdKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVfY29tcG9uZW50KGJsb2NrKSB7XG4gICAgYmxvY2sgJiYgYmxvY2suYygpO1xufVxuZnVuY3Rpb24gY2xhaW1fY29tcG9uZW50KGJsb2NrLCBwYXJlbnRfbm9kZXMpIHtcbiAgICBibG9jayAmJiBibG9jay5sKHBhcmVudF9ub2Rlcyk7XG59XG5mdW5jdGlvbiBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCB0YXJnZXQsIGFuY2hvcikge1xuICAgIGNvbnN0IHsgZnJhZ21lbnQsIG9uX21vdW50LCBvbl9kZXN0cm95LCBhZnRlcl91cGRhdGUgfSA9IGNvbXBvbmVudC4kJDtcbiAgICBmcmFnbWVudCAmJiBmcmFnbWVudC5tKHRhcmdldCwgYW5jaG9yKTtcbiAgICAvLyBvbk1vdW50IGhhcHBlbnMgYmVmb3JlIHRoZSBpbml0aWFsIGFmdGVyVXBkYXRlXG4gICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld19vbl9kZXN0cm95ID0gb25fbW91bnQubWFwKHJ1bikuZmlsdGVyKGlzX2Z1bmN0aW9uKTtcbiAgICAgICAgaWYgKG9uX2Rlc3Ryb3kpIHtcbiAgICAgICAgICAgIG9uX2Rlc3Ryb3kucHVzaCguLi5uZXdfb25fZGVzdHJveSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBFZGdlIGNhc2UgLSBjb21wb25lbnQgd2FzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSxcbiAgICAgICAgICAgIC8vIG1vc3QgbGlrZWx5IGFzIGEgcmVzdWx0IG9mIGEgYmluZGluZyBpbml0aWFsaXNpbmdcbiAgICAgICAgICAgIHJ1bl9hbGwobmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBvbmVudC4kJC5vbl9tb3VudCA9IFtdO1xuICAgIH0pO1xuICAgIGFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZGVzdHJveV9jb21wb25lbnQoY29tcG9uZW50LCBkZXRhY2hpbmcpIHtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJDtcbiAgICBpZiAoJCQuZnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgcnVuX2FsbCgkJC5vbl9kZXN0cm95KTtcbiAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuZChkZXRhY2hpbmcpO1xuICAgICAgICAvLyBUT0RPIG51bGwgb3V0IG90aGVyIHJlZnMsIGluY2x1ZGluZyBjb21wb25lbnQuJCQgKGJ1dCBuZWVkIHRvXG4gICAgICAgIC8vIHByZXNlcnZlIGZpbmFsIHN0YXRlPylcbiAgICAgICAgJCQub25fZGVzdHJveSA9ICQkLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgICAgJCQuY3R4ID0gW107XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpIHtcbiAgICBpZiAoY29tcG9uZW50LiQkLmRpcnR5WzBdID09PSAtMSkge1xuICAgICAgICBkaXJ0eV9jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgc2NoZWR1bGVfdXBkYXRlKCk7XG4gICAgICAgIGNvbXBvbmVudC4kJC5kaXJ0eS5maWxsKDApO1xuICAgIH1cbiAgICBjb21wb25lbnQuJCQuZGlydHlbKGkgLyAzMSkgfCAwXSB8PSAoMSA8PCAoaSAlIDMxKSk7XG59XG5mdW5jdGlvbiBpbml0KGNvbXBvbmVudCwgb3B0aW9ucywgaW5zdGFuY2UsIGNyZWF0ZV9mcmFnbWVudCwgbm90X2VxdWFsLCBwcm9wcywgZGlydHkgPSBbLTFdKSB7XG4gICAgY29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpO1xuICAgIGNvbnN0IHByb3BfdmFsdWVzID0gb3B0aW9ucy5wcm9wcyB8fCB7fTtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJCA9IHtcbiAgICAgICAgZnJhZ21lbnQ6IG51bGwsXG4gICAgICAgIGN0eDogbnVsbCxcbiAgICAgICAgLy8gc3RhdGVcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHVwZGF0ZTogbm9vcCxcbiAgICAgICAgbm90X2VxdWFsLFxuICAgICAgICBib3VuZDogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIC8vIGxpZmVjeWNsZVxuICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgIG9uX2Rlc3Ryb3k6IFtdLFxuICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgYWZ0ZXJfdXBkYXRlOiBbXSxcbiAgICAgICAgY29udGV4dDogbmV3IE1hcChwYXJlbnRfY29tcG9uZW50ID8gcGFyZW50X2NvbXBvbmVudC4kJC5jb250ZXh0IDogW10pLFxuICAgICAgICAvLyBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgZGlydHksXG4gICAgICAgIHNraXBfYm91bmQ6IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICAkJC5jdHggPSBpbnN0YW5jZVxuICAgICAgICA/IGluc3RhbmNlKGNvbXBvbmVudCwgcHJvcF92YWx1ZXMsIChpLCByZXQsIC4uLnJlc3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzdC5sZW5ndGggPyByZXN0WzBdIDogcmV0O1xuICAgICAgICAgICAgaWYgKCQkLmN0eCAmJiBub3RfZXF1YWwoJCQuY3R4W2ldLCAkJC5jdHhbaV0gPSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoISQkLnNraXBfYm91bmQgJiYgJCQuYm91bmRbaV0pXG4gICAgICAgICAgICAgICAgICAgICQkLmJvdW5kW2ldKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVhZHkpXG4gICAgICAgICAgICAgICAgICAgIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pXG4gICAgICAgIDogW107XG4gICAgJCQudXBkYXRlKCk7XG4gICAgcmVhZHkgPSB0cnVlO1xuICAgIHJ1bl9hbGwoJCQuYmVmb3JlX3VwZGF0ZSk7XG4gICAgLy8gYGZhbHNlYCBhcyBhIHNwZWNpYWwgY2FzZSBvZiBubyBET00gY29tcG9uZW50XG4gICAgJCQuZnJhZ21lbnQgPSBjcmVhdGVfZnJhZ21lbnQgPyBjcmVhdGVfZnJhZ21lbnQoJCQuY3R4KSA6IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLnRhcmdldCkge1xuICAgICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IGNoaWxkcmVuKG9wdGlvbnMudGFyZ2V0KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5sKG5vZGVzKTtcbiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goZGV0YWNoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW50cm8pXG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGNvbXBvbmVudC4kJC5mcmFnbWVudCk7XG4gICAgICAgIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIG9wdGlvbnMudGFyZ2V0LCBvcHRpb25zLmFuY2hvcik7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgfVxuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbn1cbmxldCBTdmVsdGVFbGVtZW50O1xuaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFN2ZWx0ZUVsZW1lbnQgPSBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy4kJC5zbG90dGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuJCQuc2xvdHRlZFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYXR0ciwgX29sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpc1thdHRyXSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgICRkZXN0cm95KCkge1xuICAgICAgICAgICAgZGVzdHJveV9jb21wb25lbnQodGhpcywgMSk7XG4gICAgICAgICAgICB0aGlzLiRkZXN0cm95ID0gbm9vcDtcbiAgICAgICAgfVxuICAgICAgICAkb24odHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHRoaXMgZGVsZWdhdGUgdG8gYWRkRXZlbnRMaXN0ZW5lcj9cbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSB8fCAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gPSBbXSkpO1xuICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgJHNldCgkJHByb3BzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4kJHNldCAmJiAhaXNfZW1wdHkoJCRwcm9wcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuJCRzZXQoJCRwcm9wcyk7XG4gICAgICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBTdmVsdGUgY29tcG9uZW50cy4gVXNlZCB3aGVuIGRldj1mYWxzZS5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50IHtcbiAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgZGVzdHJveV9jb21wb25lbnQodGhpcywgMSk7XG4gICAgICAgIHRoaXMuJGRlc3Ryb3kgPSBub29wO1xuICAgIH1cbiAgICAkb24odHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdIHx8ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSA9IFtdKSk7XG4gICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgJHNldCgkJHByb3BzKSB7XG4gICAgICAgIGlmICh0aGlzLiQkc2V0ICYmICFpc19lbXB0eSgkJHByb3BzKSkge1xuICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuJCRzZXQoJCRwcm9wcyk7XG4gICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hfZGV2KHR5cGUsIGRldGFpbCkge1xuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tX2V2ZW50KHR5cGUsIE9iamVjdC5hc3NpZ24oeyB2ZXJzaW9uOiAnMy4zMS4yJyB9LCBkZXRhaWwpKSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfZGV2KHRhcmdldCwgbm9kZSkge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUgfSk7XG4gICAgYXBwZW5kKHRhcmdldCwgbm9kZSk7XG59XG5mdW5jdGlvbiBpbnNlcnRfZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcik7XG59XG5mdW5jdGlvbiBkZXRhY2hfZGV2KG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVJlbW92ZScsIHsgbm9kZSB9KTtcbiAgICBkZXRhY2gobm9kZSk7XG59XG5mdW5jdGlvbiBkZXRhY2hfYmV0d2Vlbl9kZXYoYmVmb3JlLCBhZnRlcikge1xuICAgIHdoaWxlIChiZWZvcmUubmV4dFNpYmxpbmcgJiYgYmVmb3JlLm5leHRTaWJsaW5nICE9PSBhZnRlcikge1xuICAgICAgICBkZXRhY2hfZGV2KGJlZm9yZS5uZXh0U2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZGV0YWNoX2JlZm9yZV9kZXYoYWZ0ZXIpIHtcbiAgICB3aGlsZSAoYWZ0ZXIucHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYWZ0ZXIucHJldmlvdXNTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2hfYWZ0ZXJfZGV2KGJlZm9yZSkge1xuICAgIHdoaWxlIChiZWZvcmUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgZGV0YWNoX2RldihiZWZvcmUubmV4dFNpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxpc3Rlbl9kZXYobm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMsIGhhc19wcmV2ZW50X2RlZmF1bHQsIGhhc19zdG9wX3Byb3BhZ2F0aW9uKSB7XG4gICAgY29uc3QgbW9kaWZpZXJzID0gb3B0aW9ucyA9PT0gdHJ1ZSA/IFsnY2FwdHVyZSddIDogb3B0aW9ucyA/IEFycmF5LmZyb20oT2JqZWN0LmtleXMob3B0aW9ucykpIDogW107XG4gICAgaWYgKGhhc19wcmV2ZW50X2RlZmF1bHQpXG4gICAgICAgIG1vZGlmaWVycy5wdXNoKCdwcmV2ZW50RGVmYXVsdCcpO1xuICAgIGlmIChoYXNfc3RvcF9wcm9wYWdhdGlvbilcbiAgICAgICAgbW9kaWZpZXJzLnB1c2goJ3N0b3BQcm9wYWdhdGlvbicpO1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NQWRkRXZlbnRMaXN0ZW5lcicsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICBjb25zdCBkaXNwb3NlID0gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVJlbW92ZUV2ZW50TGlzdGVuZXInLCB7IG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBtb2RpZmllcnMgfSk7XG4gICAgICAgIGRpc3Bvc2UoKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gYXR0cl9kZXYobm9kZSwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGF0dHIobm9kZSwgYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlQXR0cmlidXRlJywgeyBub2RlLCBhdHRyaWJ1dGUgfSk7XG4gICAgZWxzZVxuICAgICAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldEF0dHJpYnV0ZScsIHsgbm9kZSwgYXR0cmlidXRlLCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIHByb3BfZGV2KG5vZGUsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIG5vZGVbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXRQcm9wZXJ0eScsIHsgbm9kZSwgcHJvcGVydHksIHZhbHVlIH0pO1xufVxuZnVuY3Rpb24gZGF0YXNldF9kZXYobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgbm9kZS5kYXRhc2V0W3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0RGF0YXNldCcsIHsgbm9kZSwgcHJvcGVydHksIHZhbHVlIH0pO1xufVxuZnVuY3Rpb24gc2V0X2RhdGFfZGV2KHRleHQsIGRhdGEpIHtcbiAgICBkYXRhID0gJycgKyBkYXRhO1xuICAgIGlmICh0ZXh0Lndob2xlVGV4dCA9PT0gZGF0YSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0RGF0YScsIHsgbm9kZTogdGV4dCwgZGF0YSB9KTtcbiAgICB0ZXh0LmRhdGEgPSBkYXRhO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVfZWFjaF9hcmd1bWVudChhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ3N0cmluZycgJiYgIShhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gYXJnKSkge1xuICAgICAgICBsZXQgbXNnID0gJ3sjZWFjaH0gb25seSBpdGVyYXRlcyBvdmVyIGFycmF5LWxpa2Ugb2JqZWN0cy4nO1xuICAgICAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBhcmcgJiYgU3ltYm9sLml0ZXJhdG9yIGluIGFyZykge1xuICAgICAgICAgICAgbXNnICs9ICcgWW91IGNhbiB1c2UgYSBzcHJlYWQgdG8gY29udmVydCB0aGlzIGl0ZXJhYmxlIGludG8gYW4gYXJyYXkuJztcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9zbG90cyhuYW1lLCBzbG90LCBrZXlzKSB7XG4gICAgZm9yIChjb25zdCBzbG90X2tleSBvZiBPYmplY3Qua2V5cyhzbG90KSkge1xuICAgICAgICBpZiAoIX5rZXlzLmluZGV4T2Yoc2xvdF9rZXkpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYDwke25hbWV9PiByZWNlaXZlZCBhbiB1bmV4cGVjdGVkIHNsb3QgXCIke3Nsb3Rfa2V5fVwiLmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBTdmVsdGUgY29tcG9uZW50cyB3aXRoIHNvbWUgbWlub3IgZGV2LWVuaGFuY2VtZW50cy4gVXNlZCB3aGVuIGRldj10cnVlLlxuICovXG5jbGFzcyBTdmVsdGVDb21wb25lbnREZXYgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8ICghb3B0aW9ucy50YXJnZXQgJiYgIW9wdGlvbnMuJCRpbmxpbmUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIndGFyZ2V0JyBpcyBhIHJlcXVpcmVkIG9wdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuJGRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy4kZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ29tcG9uZW50IHdhcyBhbHJlYWR5IGRlc3Ryb3llZCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgJGNhcHR1cmVfc3RhdGUoKSB7IH1cbiAgICAkaW5qZWN0X3N0YXRlKCkgeyB9XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgdG8gY3JlYXRlIHN0cm9uZ2x5IHR5cGVkIFN2ZWx0ZSBjb21wb25lbnRzLlxuICogVGhpcyBvbmx5IGV4aXN0cyBmb3IgdHlwaW5nIHB1cnBvc2VzIGFuZCBzaG91bGQgYmUgdXNlZCBpbiBgLmQudHNgIGZpbGVzLlxuICpcbiAqICMjIyBFeGFtcGxlOlxuICpcbiAqIFlvdSBoYXZlIGNvbXBvbmVudCBsaWJyYXJ5IG9uIG5wbSBjYWxsZWQgYGNvbXBvbmVudC1saWJyYXJ5YCwgZnJvbSB3aGljaFxuICogeW91IGV4cG9ydCBhIGNvbXBvbmVudCBjYWxsZWQgYE15Q29tcG9uZW50YC4gRm9yIFN2ZWx0ZStUeXBlU2NyaXB0IHVzZXJzLFxuICogeW91IHdhbnQgdG8gcHJvdmlkZSB0eXBpbmdzLiBUaGVyZWZvcmUgeW91IGNyZWF0ZSBhIGBpbmRleC5kLnRzYDpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBTdmVsdGVDb21wb25lbnRUeXBlZCB9IGZyb20gXCJzdmVsdGVcIjtcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudFR5cGVkPHtmb286IHN0cmluZ30+IHt9XG4gKiBgYGBcbiAqIFR5cGluZyB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBJREVzIGxpa2UgVlMgQ29kZSB3aXRoIHRoZSBTdmVsdGUgZXh0ZW5zaW9uXG4gKiB0byBwcm92aWRlIGludGVsbGlzZW5zZSBhbmQgdG8gdXNlIHRoZSBjb21wb25lbnQgbGlrZSB0aGlzIGluIGEgU3ZlbHRlIGZpbGVcbiAqIHdpdGggVHlwZVNjcmlwdDpcbiAqIGBgYHN2ZWx0ZVxuICogPHNjcmlwdCBsYW5nPVwidHNcIj5cbiAqIFx0aW1wb3J0IHsgTXlDb21wb25lbnQgfSBmcm9tIFwiY29tcG9uZW50LWxpYnJhcnlcIjtcbiAqIDwvc2NyaXB0PlxuICogPE15Q29tcG9uZW50IGZvbz17J2Jhcid9IC8+XG4gKiBgYGBcbiAqXG4gKiAjIyMjIFdoeSBub3QgbWFrZSB0aGlzIHBhcnQgb2YgYFN2ZWx0ZUNvbXBvbmVudChEZXYpYD9cbiAqIEJlY2F1c2VcbiAqIGBgYHRzXG4gKiBjbGFzcyBBU3ViY2xhc3NPZlN2ZWx0ZUNvbXBvbmVudCBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudDx7Zm9vOiBzdHJpbmd9PiB7fVxuICogY29uc3QgY29tcG9uZW50OiB0eXBlb2YgU3ZlbHRlQ29tcG9uZW50ID0gQVN1YmNsYXNzT2ZTdmVsdGVDb21wb25lbnQ7XG4gKiBgYGBcbiAqIHdpbGwgdGhyb3cgYSB0eXBlIGVycm9yLCBzbyB3ZSBuZWVkIHRvIHNlcGVyYXRlIHRoZSBtb3JlIHN0cmljdGx5IHR5cGVkIGNsYXNzLlxuICovXG5jbGFzcyBTdmVsdGVDb21wb25lbnRUeXBlZCBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudERldiB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBsb29wX2d1YXJkKHRpbWVvdXQpIHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydCA+IHRpbWVvdXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5maW5pdGUgbG9vcCBkZXRlY3RlZCcpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZXhwb3J0IHsgSHRtbFRhZywgU3ZlbHRlQ29tcG9uZW50LCBTdmVsdGVDb21wb25lbnREZXYsIFN2ZWx0ZUNvbXBvbmVudFR5cGVkLCBTdmVsdGVFbGVtZW50LCBhY3Rpb25fZGVzdHJveWVyLCBhZGRfYXR0cmlidXRlLCBhZGRfY2xhc3NlcywgYWRkX2ZsdXNoX2NhbGxiYWNrLCBhZGRfbG9jYXRpb24sIGFkZF9yZW5kZXJfY2FsbGJhY2ssIGFkZF9yZXNpemVfbGlzdGVuZXIsIGFkZF90cmFuc2Zvcm0sIGFmdGVyVXBkYXRlLCBhcHBlbmQsIGFwcGVuZF9kZXYsIGFzc2lnbiwgYXR0ciwgYXR0cl9kZXYsIGF0dHJpYnV0ZV90b19vYmplY3QsIGJlZm9yZVVwZGF0ZSwgYmluZCwgYmluZGluZ19jYWxsYmFja3MsIGJsYW5rX29iamVjdCwgYnViYmxlLCBjaGVja19vdXRyb3MsIGNoaWxkcmVuLCBjbGFpbV9jb21wb25lbnQsIGNsYWltX2VsZW1lbnQsIGNsYWltX3NwYWNlLCBjbGFpbV90ZXh0LCBjbGVhcl9sb29wcywgY29tcG9uZW50X3N1YnNjcmliZSwgY29tcHV0ZV9yZXN0X3Byb3BzLCBjb21wdXRlX3Nsb3RzLCBjcmVhdGVFdmVudERpc3BhdGNoZXIsIGNyZWF0ZV9hbmltYXRpb24sIGNyZWF0ZV9iaWRpcmVjdGlvbmFsX3RyYW5zaXRpb24sIGNyZWF0ZV9jb21wb25lbnQsIGNyZWF0ZV9pbl90cmFuc2l0aW9uLCBjcmVhdGVfb3V0X3RyYW5zaXRpb24sIGNyZWF0ZV9zbG90LCBjcmVhdGVfc3NyX2NvbXBvbmVudCwgY3VycmVudF9jb21wb25lbnQsIGN1c3RvbV9ldmVudCwgZGF0YXNldF9kZXYsIGRlYnVnLCBkZXN0cm95X2Jsb2NrLCBkZXN0cm95X2NvbXBvbmVudCwgZGVzdHJveV9lYWNoLCBkZXRhY2gsIGRldGFjaF9hZnRlcl9kZXYsIGRldGFjaF9iZWZvcmVfZGV2LCBkZXRhY2hfYmV0d2Vlbl9kZXYsIGRldGFjaF9kZXYsIGRpcnR5X2NvbXBvbmVudHMsIGRpc3BhdGNoX2RldiwgZWFjaCwgZWxlbWVudCwgZWxlbWVudF9pcywgZW1wdHksIGVzY2FwZSwgZXNjYXBlZCwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcywgZml4X2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfcG9zaXRpb24sIGZsdXNoLCBnZXRDb250ZXh0LCBnZXRfYmluZGluZ19ncm91cF92YWx1ZSwgZ2V0X2N1cnJlbnRfY29tcG9uZW50LCBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzLCBnZXRfc2xvdF9jaGFuZ2VzLCBnZXRfc2xvdF9jb250ZXh0LCBnZXRfc3ByZWFkX29iamVjdCwgZ2V0X3NwcmVhZF91cGRhdGUsIGdldF9zdG9yZV92YWx1ZSwgZ2xvYmFscywgZ3JvdXBfb3V0cm9zLCBoYW5kbGVfcHJvbWlzZSwgaGFzQ29udGV4dCwgaGFzX3Byb3AsIGlkZW50aXR5LCBpbml0LCBpbnNlcnQsIGluc2VydF9kZXYsIGludHJvcywgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIsIGlzX2NsaWVudCwgaXNfY3Jvc3NvcmlnaW4sIGlzX2VtcHR5LCBpc19mdW5jdGlvbiwgaXNfcHJvbWlzZSwgbGlzdGVuLCBsaXN0ZW5fZGV2LCBsb29wLCBsb29wX2d1YXJkLCBtaXNzaW5nX2NvbXBvbmVudCwgbW91bnRfY29tcG9uZW50LCBub29wLCBub3RfZXF1YWwsIG5vdywgbnVsbF90b19lbXB0eSwgb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcywgb25EZXN0cm95LCBvbk1vdW50LCBvbmNlLCBvdXRyb19hbmRfZGVzdHJveV9ibG9jaywgcHJldmVudF9kZWZhdWx0LCBwcm9wX2RldiwgcXVlcnlfc2VsZWN0b3JfYWxsLCByYWYsIHJ1biwgcnVuX2FsbCwgc2FmZV9ub3RfZXF1YWwsIHNjaGVkdWxlX3VwZGF0ZSwgc2VsZWN0X211bHRpcGxlX3ZhbHVlLCBzZWxlY3Rfb3B0aW9uLCBzZWxlY3Rfb3B0aW9ucywgc2VsZWN0X3ZhbHVlLCBzZWxmLCBzZXRDb250ZXh0LCBzZXRfYXR0cmlidXRlcywgc2V0X2N1cnJlbnRfY29tcG9uZW50LCBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YSwgc2V0X2RhdGEsIHNldF9kYXRhX2Rldiwgc2V0X2lucHV0X3R5cGUsIHNldF9pbnB1dF92YWx1ZSwgc2V0X25vdywgc2V0X3JhZiwgc2V0X3N0b3JlX3ZhbHVlLCBzZXRfc3R5bGUsIHNldF9zdmdfYXR0cmlidXRlcywgc3BhY2UsIHNwcmVhZCwgc3RvcF9wcm9wYWdhdGlvbiwgc3Vic2NyaWJlLCBzdmdfZWxlbWVudCwgdGV4dCwgdGljaywgdGltZV9yYW5nZXNfdG9fYXJyYXksIHRvX251bWJlciwgdG9nZ2xlX2NsYXNzLCB0cmFuc2l0aW9uX2luLCB0cmFuc2l0aW9uX291dCwgdXBkYXRlX2tleWVkX2VhY2gsIHVwZGF0ZV9zbG90LCB1cGRhdGVfc2xvdF9zcHJlYWQsIHZhbGlkYXRlX2NvbXBvbmVudCwgdmFsaWRhdGVfZWFjaF9hcmd1bWVudCwgdmFsaWRhdGVfZWFjaF9rZXlzLCB2YWxpZGF0ZV9zbG90cywgdmFsaWRhdGVfc3RvcmUsIHhsaW5rX2F0dHIgfTtcbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRPcmlnaW5hbEJvZHlQYWRkaW5nKCkge1xuICBjb25zdCBzdHlsZSA9IHdpbmRvdyA/IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHksIG51bGwpIDoge307XG5cbiAgcmV0dXJuIHBhcnNlSW50KChzdHlsZSAmJiBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXJpZ2h0JykpIHx8IDAsIDEwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjcm9sbGJhcldpZHRoKCkge1xuICBsZXQgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIC8vIC5tb2RhbC1zY3JvbGxiYXItbWVhc3VyZSBzdHlsZXMgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvdjQuMC4wLWFscGhhLjQvc2Nzcy9fbW9kYWwuc2NzcyNMMTA2LUwxMTNcbiAgc2Nyb2xsRGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgc2Nyb2xsRGl2LnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgc2Nyb2xsRGl2LnN0eWxlLndpZHRoID0gJzUwcHgnO1xuICBzY3JvbGxEaXYuc3R5bGUuaGVpZ2h0ID0gJzUwcHgnO1xuICBzY3JvbGxEaXYuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JvbGxEaXYpO1xuICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHNjcm9sbERpdi5vZmZzZXRXaWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JvbGxEaXYpO1xuICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRTY3JvbGxiYXJXaWR0aChwYWRkaW5nKSB7XG4gIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gcGFkZGluZyA+IDAgPyBgJHtwYWRkaW5nfXB4YCA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JvZHlPdmVyZmxvd2luZygpIHtcbiAgcmV0dXJuIHdpbmRvdyA/IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCB3aW5kb3cuaW5uZXJXaWR0aCA6IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsbHlVcGRhdGVTY3JvbGxiYXIoKSB7XG4gIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gZ2V0U2Nyb2xsYmFyV2lkdGgoKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvdjQuMC4wLWFscGhhLjYvanMvc3JjL21vZGFsLmpzI0w0MzNcbiAgY29uc3QgZml4ZWRDb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCdcbiAgKVswXTtcbiAgY29uc3QgYm9keVBhZGRpbmcgPSBmaXhlZENvbnRlbnRcbiAgICA/IHBhcnNlSW50KGZpeGVkQ29udGVudC5zdHlsZS5wYWRkaW5nUmlnaHQgfHwgMCwgMTApXG4gICAgOiAwO1xuXG4gIGlmIChpc0JvZHlPdmVyZmxvd2luZygpKSB7XG4gICAgc2V0U2Nyb2xsYmFyV2lkdGgoYm9keVBhZGRpbmcgKyBzY3JvbGxiYXJXaWR0aCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtblNpemVDbGFzcyhpc1hzLCBjb2xXaWR0aCwgY29sU2l6ZSkge1xuICBpZiAoY29sU2l6ZSA9PT0gdHJ1ZSB8fCBjb2xTaXplID09PSAnJykge1xuICAgIHJldHVybiBpc1hzID8gJ2NvbCcgOiBgY29sLSR7Y29sV2lkdGh9YDtcbiAgfSBlbHNlIGlmIChjb2xTaXplID09PSAnYXV0bycpIHtcbiAgICByZXR1cm4gaXNYcyA/ICdjb2wtYXV0bycgOiBgY29sLSR7Y29sV2lkdGh9LWF1dG9gO1xuICB9XG5cbiAgcmV0dXJuIGlzWHMgPyBgY29sLSR7Y29sU2l6ZX1gIDogYGNvbC0ke2NvbFdpZHRofS0ke2NvbFNpemV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuKCQkcHJvcHMpIHtcbiAgLy8gVE9ETyBzdXBwb3J0IGtleXNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGNvbnN0IHsgY2hpbGRyZW4sICQkc2NvcGUsICQkc2xvdHMgfSA9ICQkcHJvcHM7XG4gIGNvbnN0IHJlc3QgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoJCRwcm9wcykpIHtcbiAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJyQkc2NvcGUnICYmIGtleSAhPT0gJyQkc2xvdHMnKSB7XG4gICAgICByZXN0W2tleV0gPSAkJHByb3BzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJvd3NlckV2ZW50KHRhcmdldCwgLi4uYXJncykge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lciguLi5hcmdzKTtcblxuICByZXR1cm4gKCkgPT4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoLi4uYXJncyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdDYXJvdXNlbEFjdGl2ZUluZGV4KGRpcmVjdGlvbiwgaXRlbXMsIGFjdGl2ZUluZGV4KSB7XG4gIGlmIChkaXJlY3Rpb24gPT09ICdwcmV2Jykge1xuICAgIHJldHVybiBhY3RpdmVJbmRleCA9PT0gMCA/IGl0ZW1zLmxlbmd0aCAtIDEgOiBhY3RpdmVJbmRleCAtIDE7XG4gIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnbmV4dCcpIHtcbiAgICByZXR1cm4gYWN0aXZlSW5kZXggPT09IGl0ZW1zLmxlbmd0aCAtIDEgPyAwIDogYWN0aXZlSW5kZXggKyAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2xhc3NOYW1lKHZhbHVlKSB7XG4gIGxldCByZXN1bHQgPSAnJztcblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0ICs9IHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlLm1hcCh0b0NsYXNzTmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZVtrZXldKSB7XG4gICAgICAgICAgcmVzdWx0ICYmIChyZXN1bHQgKz0gJyAnKTtcbiAgICAgICAgICByZXN1bHQgKz0ga2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xhc3NuYW1lcyguLi5hcmdzKSB7XG4gIHJldHVybiBhcmdzLm1hcCh0b0NsYXNzTmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbn1cbiIsIjxzY3JpcHQ+XG4gIGltcG9ydCBjbGFzc25hbWVzIGZyb20gJy4vdXRpbHMnO1xuXG4gIGxldCBjbGFzc05hbWUgPSAnJztcbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG4gIGV4cG9ydCBsZXQgYWN0aXZlID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgYmxvY2sgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBjaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgZXhwb3J0IGxldCBjbG9zZSA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGNvbG9yID0gJ3NlY29uZGFyeSc7XG4gIGV4cG9ydCBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBocmVmID0gJyc7XG4gIGV4cG9ydCBsZXQgb3V0bGluZSA9IGZhbHNlO1xuICBleHBvcnQgbGV0IHNpemUgPSBudWxsO1xuICBleHBvcnQgbGV0IHN0eWxlID0gJyc7XG4gIGV4cG9ydCBsZXQgdmFsdWUgPSAnJztcblxuICAkOiBhcmlhTGFiZWwgPSAkJHByb3BzWydhcmlhLWxhYmVsJ107XG5cbiAgJDogY2xhc3NlcyA9IGNsYXNzbmFtZXMoXG4gICAgY2xhc3NOYW1lLFxuICAgIHsgY2xvc2UgfSxcbiAgICBjbG9zZSB8fCAnYnRuJyxcbiAgICBjbG9zZSB8fCBgYnRuJHtvdXRsaW5lID8gJy1vdXRsaW5lJyA6ICcnfS0ke2NvbG9yfWAsXG4gICAgc2l6ZSA/IGBidG4tJHtzaXplfWAgOiBmYWxzZSxcbiAgICBibG9jayA/ICdidG4tYmxvY2snIDogZmFsc2UsXG4gICAgeyBhY3RpdmUgfVxuICApO1xuXG4gICQ6IGRlZmF1bHRBcmlhTGFiZWwgPSBjbG9zZSA/ICdDbG9zZScgOiBudWxsO1xuPC9zY3JpcHQ+XG5cbnsjaWYgaHJlZn1cbiAgPGFcbiAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgY2xhc3M9e2NsYXNzZXN9XG4gICAge2Rpc2FibGVkfVxuICAgIG9uOmNsaWNrXG4gICAge2hyZWZ9XG4gICAgYXJpYS1sYWJlbD17YXJpYUxhYmVsIHx8IGRlZmF1bHRBcmlhTGFiZWx9XG4gICAge3N0eWxlfT5cbiAgICB7I2lmIGNoaWxkcmVufVxuICAgICAge2NoaWxkcmVufVxuICAgIHs6ZWxzZX1cbiAgICAgIDxzbG90IC8+XG4gICAgey9pZn1cbiAgPC9hPlxuezplbHNlfVxuICA8YnV0dG9uXG4gICAgey4uLiQkcmVzdFByb3BzfVxuICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgIHtkaXNhYmxlZH1cbiAgICBvbjpjbGlja1xuICAgIHt2YWx1ZX1cbiAgICBhcmlhLWxhYmVsPXthcmlhTGFiZWwgfHwgZGVmYXVsdEFyaWFMYWJlbH1cbiAgICB7c3R5bGV9PlxuICAgIDxzbG90PlxuICAgICAgeyNpZiBjbG9zZX1cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+w5c8L3NwYW4+XG4gICAgICB7OmVsc2UgaWYgY2hpbGRyZW59XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIHs6ZWxzZX1cbiAgICAgICAgPHNsb3QgLz5cbiAgICAgIHsvaWZ9XG4gICAgPC9zbG90PlxuICA8L2J1dHRvbj5cbnsvaWZ9XG4iLCJpbXBvcnQgeyBub29wLCBzYWZlX25vdF9lcXVhbCwgc3Vic2NyaWJlLCBydW5fYWxsLCBpc19mdW5jdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2luZGV4Lm1qcyc7XG5leHBvcnQgeyBnZXRfc3RvcmVfdmFsdWUgYXMgZ2V0IH0gZnJvbSAnLi4vaW50ZXJuYWwvaW5kZXgubWpzJztcblxuY29uc3Qgc3Vic2NyaWJlcl9xdWV1ZSA9IFtdO1xuLyoqXG4gKiBDcmVhdGVzIGEgYFJlYWRhYmxlYCBzdG9yZSB0aGF0IGFsbG93cyByZWFkaW5nIGJ5IHN1YnNjcmlwdGlvbi5cbiAqIEBwYXJhbSB2YWx1ZSBpbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0ge1N0YXJ0U3RvcE5vdGlmaWVyfXN0YXJ0IHN0YXJ0IGFuZCBzdG9wIG5vdGlmaWNhdGlvbnMgZm9yIHN1YnNjcmlwdGlvbnNcbiAqL1xuZnVuY3Rpb24gcmVhZGFibGUodmFsdWUsIHN0YXJ0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3Vic2NyaWJlOiB3cml0YWJsZSh2YWx1ZSwgc3RhcnQpLnN1YnNjcmliZVxuICAgIH07XG59XG4vKipcbiAqIENyZWF0ZSBhIGBXcml0YWJsZWAgc3RvcmUgdGhhdCBhbGxvd3MgYm90aCB1cGRhdGluZyBhbmQgcmVhZGluZyBieSBzdWJzY3JpcHRpb24uXG4gKiBAcGFyYW0geyo9fXZhbHVlIGluaXRpYWwgdmFsdWVcbiAqIEBwYXJhbSB7U3RhcnRTdG9wTm90aWZpZXI9fXN0YXJ0IHN0YXJ0IGFuZCBzdG9wIG5vdGlmaWNhdGlvbnMgZm9yIHN1YnNjcmlwdGlvbnNcbiAqL1xuZnVuY3Rpb24gd3JpdGFibGUodmFsdWUsIHN0YXJ0ID0gbm9vcCkge1xuICAgIGxldCBzdG9wO1xuICAgIGNvbnN0IHN1YnNjcmliZXJzID0gW107XG4gICAgZnVuY3Rpb24gc2V0KG5ld192YWx1ZSkge1xuICAgICAgICBpZiAoc2FmZV9ub3RfZXF1YWwodmFsdWUsIG5ld192YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3X3ZhbHVlO1xuICAgICAgICAgICAgaWYgKHN0b3ApIHsgLy8gc3RvcmUgaXMgcmVhZHlcbiAgICAgICAgICAgICAgICBjb25zdCBydW5fcXVldWUgPSAhc3Vic2NyaWJlcl9xdWV1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJzY3JpYmVycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gc3Vic2NyaWJlcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIHNbMV0oKTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl9xdWV1ZS5wdXNoKHMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bl9xdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YnNjcmliZXJfcXVldWUubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfcXVldWVbaV1bMF0oc3Vic2NyaWJlcl9xdWV1ZVtpICsgMV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfcXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlKGZuKSB7XG4gICAgICAgIHNldChmbih2YWx1ZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdWJzY3JpYmUocnVuLCBpbnZhbGlkYXRlID0gbm9vcCkge1xuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gW3J1biwgaW52YWxpZGF0ZV07XG4gICAgICAgIHN1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgICAgIGlmIChzdWJzY3JpYmVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHN0b3AgPSBzdGFydChzZXQpIHx8IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgcnVuKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3Vic2NyaWJlcnMuaW5kZXhPZihzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgICAgICAgICBzdG9wID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2V0LCB1cGRhdGUsIHN1YnNjcmliZSB9O1xufVxuZnVuY3Rpb24gZGVyaXZlZChzdG9yZXMsIGZuLCBpbml0aWFsX3ZhbHVlKSB7XG4gICAgY29uc3Qgc2luZ2xlID0gIUFycmF5LmlzQXJyYXkoc3RvcmVzKTtcbiAgICBjb25zdCBzdG9yZXNfYXJyYXkgPSBzaW5nbGVcbiAgICAgICAgPyBbc3RvcmVzXVxuICAgICAgICA6IHN0b3JlcztcbiAgICBjb25zdCBhdXRvID0gZm4ubGVuZ3RoIDwgMjtcbiAgICByZXR1cm4gcmVhZGFibGUoaW5pdGlhbF92YWx1ZSwgKHNldCkgPT4ge1xuICAgICAgICBsZXQgaW5pdGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgcGVuZGluZyA9IDA7XG4gICAgICAgIGxldCBjbGVhbnVwID0gbm9vcDtcbiAgICAgICAgY29uc3Qgc3luYyA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oc2luZ2xlID8gdmFsdWVzWzBdIDogdmFsdWVzLCBzZXQpO1xuICAgICAgICAgICAgaWYgKGF1dG8pIHtcbiAgICAgICAgICAgICAgICBzZXQocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsZWFudXAgPSBpc19mdW5jdGlvbihyZXN1bHQpID8gcmVzdWx0IDogbm9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmVycyA9IHN0b3Jlc19hcnJheS5tYXAoKHN0b3JlLCBpKSA9PiBzdWJzY3JpYmUoc3RvcmUsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdmFsdWVzW2ldID0gdmFsdWU7XG4gICAgICAgICAgICBwZW5kaW5nICY9IH4oMSA8PCBpKTtcbiAgICAgICAgICAgIGlmIChpbml0ZWQpIHtcbiAgICAgICAgICAgICAgICBzeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmcgfD0gKDEgPDwgaSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgaW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgc3luYygpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgICAgICAgIHJ1bl9hbGwodW5zdWJzY3JpYmVycyk7XG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmV4cG9ydCB7IGRlcml2ZWQsIHJlYWRhYmxlLCB3cml0YWJsZSB9O1xuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCBzaXplID0gJyc7XG4gIGV4cG9ydCBsZXQgdmVydGljYWwgPSBmYWxzZTtcblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhcbiAgICBjbGFzc05hbWUsXG4gICAgc2l6ZSA/IGBidG4tZ3JvdXAtJHtzaXplfWAgOiBmYWxzZSxcbiAgICB2ZXJ0aWNhbCA/ICdidG4tZ3JvdXAtdmVydGljYWwnIDogJ2J0bi1ncm91cCdcbiAgKTtcbjwvc2NyaXB0PlxuXG48ZGl2IHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NsYXNzZXN9PlxuICA8c2xvdCAvPlxuPC9kaXY+XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgeyBnZXRDb2x1bW5TaXplQ2xhc3MsIGlzT2JqZWN0IH0gZnJvbSAnLi91dGlscyc7XG5cbiAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCB4cyA9IHVuZGVmaW5lZDtcbiAgZXhwb3J0IGxldCBzbSA9IHVuZGVmaW5lZDtcbiAgZXhwb3J0IGxldCBtZCA9IHVuZGVmaW5lZDtcbiAgZXhwb3J0IGxldCBsZyA9IHVuZGVmaW5lZDtcbiAgZXhwb3J0IGxldCB4bCA9IHVuZGVmaW5lZDtcblxuICBjb25zdCBjb2xDbGFzc2VzID0gW107XG4gIGNvbnN0IGxvb2t1cCA9IHtcbiAgICB4cyxcbiAgICBzbSxcbiAgICBtZCxcbiAgICBsZyxcbiAgICB4bFxuICB9O1xuXG4gIE9iamVjdC5rZXlzKGxvb2t1cCkuZm9yRWFjaCgoY29sV2lkdGgpID0+IHtcbiAgICBjb25zdCBjb2x1bW5Qcm9wID0gbG9va3VwW2NvbFdpZHRoXTtcbiAgICBpZiAoIWNvbHVtblByb3AgJiYgY29sdW1uUHJvcCAhPT0gJycpIHtcbiAgICAgIHJldHVybjsgLy9ubyB2YWx1ZSBmb3IgdGhpcyB3aWR0aFxuICAgIH1cblxuICAgIGNvbnN0IGlzWHMgPSBjb2xXaWR0aCA9PT0gJ3hzJztcblxuICAgIGlmIChpc09iamVjdChjb2x1bW5Qcm9wKSkge1xuICAgICAgY29uc3QgY29sU2l6ZUludGVyZml4ID0gaXNYcyA/ICctJyA6IGAtJHtjb2xXaWR0aH0tYDtcbiAgICAgIGNvbnN0IGNvbENsYXNzID0gZ2V0Q29sdW1uU2l6ZUNsYXNzKGlzWHMsIGNvbFdpZHRoLCBjb2x1bW5Qcm9wLnNpemUpO1xuXG4gICAgICBpZiAoY29sdW1uUHJvcC5zaXplIHx8IGNvbHVtblByb3Auc2l6ZSA9PT0gJycpIHtcbiAgICAgICAgY29sQ2xhc3Nlcy5wdXNoKGNvbENsYXNzKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2x1bW5Qcm9wLnB1c2gpIHtcbiAgICAgICAgY29sQ2xhc3Nlcy5wdXNoKGBwdXNoJHtjb2xTaXplSW50ZXJmaXh9JHtjb2x1bW5Qcm9wLnB1c2h9YCk7XG4gICAgICB9XG4gICAgICBpZiAoY29sdW1uUHJvcC5wdWxsKSB7XG4gICAgICAgIGNvbENsYXNzZXMucHVzaChgcHVsbCR7Y29sU2l6ZUludGVyZml4fSR7Y29sdW1uUHJvcC5wdWxsfWApO1xuICAgICAgfVxuICAgICAgaWYgKGNvbHVtblByb3Aub2Zmc2V0KSB7XG4gICAgICAgIGNvbENsYXNzZXMucHVzaChgb2Zmc2V0JHtjb2xTaXplSW50ZXJmaXh9JHtjb2x1bW5Qcm9wLm9mZnNldH1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29sQ2xhc3Nlcy5wdXNoKGdldENvbHVtblNpemVDbGFzcyhpc1hzLCBjb2xXaWR0aCwgY29sdW1uUHJvcCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKCFjb2xDbGFzc2VzLmxlbmd0aCkge1xuICAgIGNvbENsYXNzZXMucHVzaCgnY29sJyk7XG4gIH1cblxuICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgY29sQ2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4gIH1cbjwvc2NyaXB0PlxuXG48ZGl2IHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NvbENsYXNzZXMuam9pbignICcpfT5cbiAgPHNsb3QgLz5cbjwvZGl2PlxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCBmbHVpZCA9IGZhbHNlO1xuXG4gICQ6IGNsYXNzZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgZmx1aWQgPyAnY29udGFpbmVyLWZsdWlkJyA6ICdjb250YWluZXInKTtcbjwvc2NyaXB0PlxuXG48ZGl2IHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NsYXNzZXN9PlxuICA8c2xvdCAvPlxuPC9kaXY+XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IGlubGluZSA9IGZhbHNlO1xuXG4gICQ6IGNsYXNzZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgaW5saW5lID8gJ2Zvcm0taW5saW5lJyA6IGZhbHNlKTtcbjwvc2NyaXB0PlxuXG48Zm9ybSB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfSBvbjpzdWJtaXQ+XG4gIDxzbG90IC8+XG48L2Zvcm0+XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBleHBvcnQgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCByb3cgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBjaGVjayA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGlubGluZSA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGRpc2FibGVkID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgdGFnID0gbnVsbDtcblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhcbiAgICBjbGFzc05hbWUsXG4gICAgcm93ID8gJ3JvdycgOiBmYWxzZSxcbiAgICBjaGVjayA/ICdmb3JtLWNoZWNrJyA6ICdmb3JtLWdyb3VwJyxcbiAgICBjaGVjayAmJiBpbmxpbmUgPyAnZm9ybS1jaGVjay1pbmxpbmUnIDogZmFsc2UsXG4gICAgY2hlY2sgJiYgZGlzYWJsZWQgPyAnZGlzYWJsZWQnIDogZmFsc2VcbiAgKTtcbjwvc2NyaXB0PlxuXG57I2lmIHRhZyA9PT0gJ2ZpZWxkc2V0J31cbiAgPGZpZWxkc2V0IHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NsYXNzZXN9PlxuICAgIDxzbG90IC8+XG4gIDwvZmllbGRzZXQ+XG57OmVsc2V9XG4gIDxkaXYgey4uLiQkcmVzdFByb3BzfSBjbGFzcz17Y2xhc3Nlc30+XG4gICAgPHNsb3QgLz5cbiAgPC9kaXY+XG57L2lmfVxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcblxuICBleHBvcnQgbGV0IHR5cGUgPSAndGV4dCc7XG4gIGV4cG9ydCBsZXQgc2l6ZSA9IHVuZGVmaW5lZDtcbiAgZXhwb3J0IGxldCBic1NpemUgPSB1bmRlZmluZWQ7XG4gIGV4cG9ydCBsZXQgY29sb3IgPSB1bmRlZmluZWQ7XG4gIGV4cG9ydCBsZXQgY2hlY2tlZCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IHZhbGlkID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgaW52YWxpZCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IHBsYWludGV4dCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGFkZG9uID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgdmFsdWUgPSAnJztcbiAgZXhwb3J0IGxldCBmaWxlcyA9ICcnO1xuICBleHBvcnQgbGV0IHJlYWRvbmx5ID0gdW5kZWZpbmVkO1xuICBleHBvcnQgbGV0IG11bHRpcGxlID0gdW5kZWZpbmVkO1xuICBleHBvcnQgbGV0IG5hbWUgPSAnJztcbiAgZXhwb3J0IGxldCBwbGFjZWhvbGRlciA9ICcnO1xuICBleHBvcnQgbGV0IGRpc2FibGVkID0gdW5kZWZpbmVkO1xuXG4gIGxldCBjbGFzc2VzO1xuICBsZXQgdGFnO1xuICAkOiB7XG4gICAgY29uc3QgY2hlY2tJbnB1dCA9IFsncmFkaW8nLCAnY2hlY2tib3gnXS5pbmRleE9mKHR5cGUpID4gLTE7XG4gICAgY29uc3QgaXNOb3RhTnVtYmVyID0gbmV3IFJlZ0V4cCgnXFxcXEQnLCAnZycpO1xuXG4gICAgY29uc3QgZmlsZUlucHV0ID0gdHlwZSA9PT0gJ2ZpbGUnO1xuICAgIGNvbnN0IHRleHRhcmVhSW5wdXQgPSB0eXBlID09PSAndGV4dGFyZWEnO1xuICAgIGNvbnN0IHJhbmdlSW5wdXQgPSB0eXBlID09PSAncmFuZ2UnO1xuICAgIGNvbnN0IHNlbGVjdElucHV0ID0gdHlwZSA9PT0gJ3NlbGVjdCc7XG4gICAgY29uc3QgYnV0dG9uSW5wdXQgPVxuICAgICAgdHlwZSA9PT0gJ2J1dHRvbicgfHwgdHlwZSA9PT0gJ3Jlc2V0JyB8fCB0eXBlID09PSAnc3VibWl0JztcbiAgICBjb25zdCB1bnN1cHBvcnRlZElucHV0ID0gdHlwZSA9PT0gJ2hpZGRlbicgfHwgdHlwZSA9PT0gJ2ltYWdlJztcbiAgICB0YWcgPSBzZWxlY3RJbnB1dCB8fCB0ZXh0YXJlYUlucHV0ID8gdHlwZSA6ICdpbnB1dCc7XG5cbiAgICBsZXQgZm9ybUNvbnRyb2xDbGFzcyA9ICdmb3JtLWNvbnRyb2wnO1xuXG4gICAgaWYgKHBsYWludGV4dCkge1xuICAgICAgZm9ybUNvbnRyb2xDbGFzcyA9IGAke2Zvcm1Db250cm9sQ2xhc3N9LXBsYWludGV4dGA7XG4gICAgICB0YWcgPSAnaW5wdXQnO1xuICAgIH0gZWxzZSBpZiAoZmlsZUlucHV0KSB7XG4gICAgICBmb3JtQ29udHJvbENsYXNzID0gYCR7Zm9ybUNvbnRyb2xDbGFzc30tZmlsZWA7XG4gICAgfSBlbHNlIGlmIChjaGVja0lucHV0KSB7XG4gICAgICBpZiAoYWRkb24pIHtcbiAgICAgICAgZm9ybUNvbnRyb2xDbGFzcyA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtQ29udHJvbENsYXNzID0gJ2Zvcm0tY2hlY2staW5wdXQnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYnV0dG9uSW5wdXQpIHtcbiAgICAgIGZvcm1Db250cm9sQ2xhc3MgPSBgYnRuIGJ0bi0ke2NvbG9yIHx8ICdzZWNvbmRhcnknfWA7XG4gICAgfSBlbHNlIGlmIChyYW5nZUlucHV0KSB7XG4gICAgICBmb3JtQ29udHJvbENsYXNzID0gJ2Zvcm0tY29udHJvbC1yYW5nZSc7XG4gICAgfSBlbHNlIGlmICh1bnN1cHBvcnRlZElucHV0KSB7XG4gICAgICBmb3JtQ29udHJvbENsYXNzID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgJiYgaXNOb3RhTnVtYmVyLnRlc3Qoc2l6ZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1BsZWFzZSB1c2UgdGhlIHByb3AgXCJic1NpemVcIiBpbnN0ZWFkIG9mIHRoZSBcInNpemVcIiB0byBib290c3RyYXBcXCdzIGlucHV0IHNpemluZy4nXG4gICAgICApO1xuICAgICAgYnNTaXplID0gc2l6ZTtcbiAgICAgIHNpemUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY2xhc3NlcyA9IGNsYXNzbmFtZXMoXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBpbnZhbGlkICYmICdpcy1pbnZhbGlkJyxcbiAgICAgIHZhbGlkICYmICdpcy12YWxpZCcsXG4gICAgICBic1NpemUgPyBgZm9ybS1jb250cm9sLSR7YnNTaXplfWAgOiBmYWxzZSxcbiAgICAgIGZvcm1Db250cm9sQ2xhc3NcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlSW5wdXQgPSAoZXZlbnQpID0+IHtcbiAgICB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfTtcbjwvc2NyaXB0PlxuXG57I2lmIHRhZyA9PT0gJ2lucHV0J31cbiAgeyNpZiB0eXBlID09PSAndGV4dCd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ3Bhc3N3b3JkJ31cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ2VtYWlsJ31cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHR5cGU9XCJlbWFpbFwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ2ZpbGUnfVxuICAgIDxpbnB1dFxuICAgICAgey4uLiQkcmVzdFByb3BzfVxuICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDpmaWxlc1xuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdjaGVja2JveCd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDpjaGVja2VkXG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ3JhZGlvJ31cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ3VybCd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwidXJsXCJcbiAgICAgIG9uOmJsdXJcbiAgICAgIG9uOmZvY3VzXG4gICAgICBvbjprZXlkb3duXG4gICAgICBvbjprZXlwcmVzc1xuICAgICAgb246a2V5dXBcbiAgICAgIG9uOmNoYW5nZVxuICAgICAgb246aW5wdXRcbiAgICAgIGJpbmQ6dmFsdWVcbiAgICAgIHtyZWFkb25seX1cbiAgICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgICAge25hbWV9XG4gICAgICB7ZGlzYWJsZWR9XG4gICAgICB7cGxhY2Vob2xkZXJ9IC8+XG4gIHs6ZWxzZSBpZiB0eXBlID09PSAnbnVtYmVyJ31cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdkYXRlJ31cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHR5cGU9XCJkYXRlXCJcbiAgICAgIG9uOmJsdXJcbiAgICAgIG9uOmZvY3VzXG4gICAgICBvbjprZXlkb3duXG4gICAgICBvbjprZXlwcmVzc1xuICAgICAgb246a2V5dXBcbiAgICAgIG9uOmNoYW5nZVxuICAgICAgb246aW5wdXRcbiAgICAgIGJpbmQ6dmFsdWVcbiAgICAgIHtyZWFkb25seX1cbiAgICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgICAge25hbWV9XG4gICAgICB7ZGlzYWJsZWR9XG4gICAgICB7cGxhY2Vob2xkZXJ9IC8+XG4gIHs6ZWxzZSBpZiB0eXBlID09PSAndGltZSd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwidGltZVwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ2RhdGV0aW1lJ31cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHR5cGU9XCJkYXRldGltZVwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ2NvbG9yJ31cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ3JhbmdlJ31cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ3NlYXJjaCd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgIG9uOmJsdXJcbiAgICAgIG9uOmZvY3VzXG4gICAgICBvbjprZXlkb3duXG4gICAgICBvbjprZXlwcmVzc1xuICAgICAgb246a2V5dXBcbiAgICAgIG9uOmNoYW5nZVxuICAgICAgb246aW5wdXRcbiAgICAgIGJpbmQ6dmFsdWVcbiAgICAgIHtyZWFkb25seX1cbiAgICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgICAge25hbWV9XG4gICAgICB7ZGlzYWJsZWR9XG4gICAgICB7cGxhY2Vob2xkZXJ9IC8+XG4gIHs6ZWxzZX1cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHt0eXBlfVxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246aW5wdXQ9e2hhbmRsZUlucHV0fVxuICAgICAgb246Y2hhbmdlPXtoYW5kbGVJbnB1dH1cbiAgICAgIHtyZWFkb25seX1cbiAgICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgICAge25hbWV9XG4gICAgICB7ZGlzYWJsZWR9XG4gICAgICB7cGxhY2Vob2xkZXJ9XG4gICAgICB7dmFsdWV9IC8+XG4gIHsvaWZ9XG57OmVsc2UgaWYgdGFnID09PSAndGV4dGFyZWEnfVxuICA8dGV4dGFyZWFcbiAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgb246Ymx1clxuICAgIG9uOmZvY3VzXG4gICAgb246a2V5ZG93blxuICAgIG9uOmtleXByZXNzXG4gICAgb246a2V5dXBcbiAgICBvbjpjaGFuZ2VcbiAgICBvbjppbnB1dFxuICAgIGJpbmQ6dmFsdWVcbiAgICB7bmFtZX1cbiAgICB7ZGlzYWJsZWR9XG4gICAge3BsYWNlaG9sZGVyfVxuICAgIHtyZWFkb25seX0gLz5cbns6ZWxzZSBpZiB0YWcgPT09ICdzZWxlY3QnICYmICFtdWx0aXBsZX1cbiAgPHNlbGVjdFxuICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICBvbjpibHVyXG4gICAgb246Zm9jdXNcbiAgICBvbjpjaGFuZ2VcbiAgICBvbjppbnB1dFxuICAgIGJpbmQ6dmFsdWVcbiAgICB7bmFtZX1cbiAgICB7ZGlzYWJsZWR9XG4gICAge3JlYWRvbmx5fT5cbiAgICA8c2xvdCAvPlxuICA8L3NlbGVjdD5cblxuICA8IS0tIHs6ZWxzZSBpZiB0YWcgPT09ICdzZWxlY3QnICYmIG11bHRpcGxlfVxuICA8c2VsZWN0XG4gICAgey4uLiQkcmVzdFByb3BzfVxuICAgIG11bHRpcGxlXG4gICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgb246Ymx1clxuICAgIG9uOmZvY3VzXG4gICAgb246Y2hhbmdlXG4gICAgb246aW5wdXRcbiAgICBiaW5kOnZhbHVlXG4gICAge25hbWV9XG4gICAge2Rpc2FibGVkfT5cbiAgICA8c2xvdCAvPlxuICA8L3NlbGVjdD4gLS0+XG57L2lmfVxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgaW1wb3J0IHsgZ2V0Q29sdW1uU2l6ZUNsYXNzLCBpc09iamVjdCB9IGZyb20gJy4vdXRpbHMnO1xuXG4gIGxldCBjbGFzc05hbWUgPSAnJztcblxuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCBoaWRkZW4gPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBjaGVjayA9IGZhbHNlO1xuICBleHBvcnQgbGV0IHNpemUgPSAnJztcbiAgZXhwb3J0IGxldCBmb3JlID0gbnVsbDtcbiAgZXhwb3J0IHsgZm9yZSBhcyBmb3IgfTtcbiAgZXhwb3J0IGxldCB4cyA9ICcnO1xuICBleHBvcnQgbGV0IHNtID0gJyc7XG4gIGV4cG9ydCBsZXQgbWQgPSAnJztcbiAgZXhwb3J0IGxldCBsZyA9ICcnO1xuICBleHBvcnQgbGV0IHhsID0gJyc7XG5cbiAgY29uc3QgY29sV2lkdGhzID0ge1xuICAgIHhzLFxuICAgIHNtLFxuICAgIG1kLFxuICAgIGxnLFxuICAgIHhsXG4gIH07XG4gIGV4cG9ydCBsZXQgd2lkdGhzID0gT2JqZWN0LmtleXMoY29sV2lkdGhzKTtcblxuICBjb25zdCBjb2xDbGFzc2VzID0gW107XG5cbiAgd2lkdGhzLmZvckVhY2goKGNvbFdpZHRoKSA9PiB7XG4gICAgbGV0IGNvbHVtblByb3AgPSAkJHByb3BzW2NvbFdpZHRoXTtcblxuICAgIGlmICghY29sdW1uUHJvcCAmJiBjb2x1bW5Qcm9wICE9PSAnJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzWHMgPSBjb2xXaWR0aCA9PT0gJ3hzJztcbiAgICBsZXQgY29sQ2xhc3M7XG5cbiAgICBpZiAoaXNPYmplY3QoY29sdW1uUHJvcCkpIHtcbiAgICAgIGNvbnN0IGNvbFNpemVJbnRlcmZpeCA9IGlzWHMgPyAnLScgOiBgLSR7Y29sV2lkdGh9LWA7XG4gICAgICBjb2xDbGFzcyA9IGdldENvbHVtblNpemVDbGFzcyhpc1hzLCBjb2xXaWR0aCwgY29sdW1uUHJvcC5zaXplKTtcblxuICAgICAgY29sQ2xhc3Nlcy5wdXNoKFxuICAgICAgICBjbGFzc25hbWVzKHtcbiAgICAgICAgICBbY29sQ2xhc3NdOiBjb2x1bW5Qcm9wLnNpemUgfHwgY29sdW1uUHJvcC5zaXplID09PSAnJyxcbiAgICAgICAgICBbYG9yZGVyJHtjb2xTaXplSW50ZXJmaXh9JHtjb2x1bW5Qcm9wLm9yZGVyfWBdOlxuICAgICAgICAgICAgY29sdW1uUHJvcC5vcmRlciB8fCBjb2x1bW5Qcm9wLm9yZGVyID09PSAwLFxuICAgICAgICAgIFtgb2Zmc2V0JHtjb2xTaXplSW50ZXJmaXh9JHtjb2x1bW5Qcm9wLm9mZnNldH1gXTpcbiAgICAgICAgICAgIGNvbHVtblByb3Aub2Zmc2V0IHx8IGNvbHVtblByb3Aub2Zmc2V0ID09PSAwXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2xDbGFzcyA9IGdldENvbHVtblNpemVDbGFzcyhpc1hzLCBjb2xXaWR0aCwgY29sdW1uUHJvcCk7XG4gICAgICBjb2xDbGFzc2VzLnB1c2goY29sQ2xhc3MpO1xuICAgIH1cbiAgfSk7XG5cbiAgJDogY2xhc3NlcyA9IGNsYXNzbmFtZXMoXG4gICAgY2xhc3NOYW1lLFxuICAgIGhpZGRlbiA/ICdzci1vbmx5JyA6IGZhbHNlLFxuICAgIGNoZWNrID8gJ2Zvcm0tY2hlY2stbGFiZWwnIDogZmFsc2UsXG4gICAgc2l6ZSA/IGBjb2wtZm9ybS1sYWJlbC0ke3NpemV9YCA6IGZhbHNlLFxuICAgIGNvbENsYXNzZXMsXG4gICAgY29sQ2xhc3Nlcy5sZW5ndGggPyAnY29sLWZvcm0tbGFiZWwnIDogZmFsc2VcbiAgKTtcbjwvc2NyaXB0PlxuXG48bGFiZWwgey4uLiQkcmVzdFByb3BzfSBjbGFzcz17Y2xhc3Nlc30gZm9yPXtmb3JlfT5cbiAgPHNsb3QgLz5cbjwvbGFiZWw+XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IGZsdXNoID0gZmFsc2U7XG5cbiAgJDogY2xhc3NlcyA9IGNsYXNzbmFtZXMoXG4gICAgY2xhc3NOYW1lLFxuICAgICdsaXN0LWdyb3VwJyxcbiAgICBmbHVzaCA/ICdsaXN0LWdyb3VwLWZsdXNoJyA6IGZhbHNlXG4gICk7XG48L3NjcmlwdD5cblxuPHVsIHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NsYXNzZXN9PlxuICA8c2xvdCAvPlxuPC91bD5cbiIsIjxzY3JpcHQ+XG4gIGltcG9ydCBjbGFzc25hbWVzIGZyb20gJy4vdXRpbHMnO1xuXG4gIGxldCBjbGFzc05hbWUgPSAnJztcbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG4gIGV4cG9ydCBsZXQgYWN0aXZlID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBjb2xvciA9ICcnO1xuICBleHBvcnQgbGV0IGFjdGlvbiA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGhyZWYgPSBudWxsO1xuICBleHBvcnQgbGV0IHRhZyA9IG51bGw7XG5cbiAgJDogY2xhc3NlcyA9IGNsYXNzbmFtZXMoXG4gICAgY2xhc3NOYW1lLFxuICAgIGFjdGl2ZSA/ICdhY3RpdmUnIDogZmFsc2UsXG4gICAgZGlzYWJsZWQgPyAnZGlzYWJsZWQnIDogZmFsc2UsXG4gICAgYWN0aW9uID8gJ2xpc3QtZ3JvdXAtaXRlbS1hY3Rpb24nIDogZmFsc2UsXG4gICAgY29sb3IgPyBgbGlzdC1ncm91cC1pdGVtLSR7Y29sb3J9YCA6IGZhbHNlLFxuICAgICdsaXN0LWdyb3VwLWl0ZW0nXG4gICk7XG48L3NjcmlwdD5cblxueyNpZiBocmVmfVxuICA8YSB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfSB7aHJlZn0ge2Rpc2FibGVkfSB7YWN0aXZlfT5cbiAgICA8c2xvdCAvPlxuICA8L2E+XG57OmVsc2UgaWYgdGFnID09PSAnYnV0dG9uJ31cbiAgPGJ1dHRvblxuICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBvbjpjbGlja1xuICAgIHtkaXNhYmxlZH1cbiAgICB7YWN0aXZlfT5cbiAgICA8c2xvdCAvPlxuICA8L2J1dHRvbj5cbns6ZWxzZX1cbiAgPGxpIHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NsYXNzZXN9IHtkaXNhYmxlZH0ge2FjdGl2ZX0+XG4gICAgPHNsb3QgLz5cbiAgPC9saT5cbnsvaWZ9XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IGJvZHkgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBib3R0b20gPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBoZWFkaW5nID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgbGVmdCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGxpc3QgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBtaWRkbGUgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBvYmplY3QgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCByaWdodCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IHRvcCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGhyZWYgPSAnJztcbiAgZXhwb3J0IGxldCBzcmMgPSAnJztcbiAgZXhwb3J0IGxldCBhbHQgPSAnJztcblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsIHtcbiAgICAnbWVkaWEtYm9keSc6IGJvZHksXG4gICAgJ21lZGlhLWhlYWRpbmcnOiBoZWFkaW5nLFxuICAgICdtZWRpYS1sZWZ0JzogbGVmdCxcbiAgICAnbWVkaWEtcmlnaHQnOiByaWdodCxcbiAgICAnbWVkaWEtdG9wJzogdG9wLFxuICAgICdtZWRpYS1ib3R0b20nOiBib3R0b20sXG4gICAgJ21lZGlhLW1pZGRsZSc6IG1pZGRsZSxcbiAgICAnbWVkaWEtb2JqZWN0Jzogb2JqZWN0LFxuICAgICdtZWRpYS1saXN0JzogbGlzdCxcbiAgICBtZWRpYTpcbiAgICAgICFib2R5ICYmXG4gICAgICAhaGVhZGluZyAmJlxuICAgICAgIWxlZnQgJiZcbiAgICAgICFyaWdodCAmJlxuICAgICAgIXRvcCAmJlxuICAgICAgIWJvdHRvbSAmJlxuICAgICAgIW1pZGRsZSAmJlxuICAgICAgIW9iamVjdCAmJlxuICAgICAgIWxpc3RcbiAgfSk7XG48L3NjcmlwdD5cblxueyNpZiBoZWFkaW5nfVxuICA8aDQgey4uLiQkcmVzdFByb3BzfSBjbGFzcz17Y2xhc3Nlc30+XG4gICAgPHNsb3QgLz5cbiAgPC9oND5cbns6ZWxzZSBpZiBocmVmfVxuICA8YSB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfSB7aHJlZn0+XG4gICAgPHNsb3QgLz5cbiAgPC9hPlxuezplbHNlIGlmIHNyYyB8fCBvYmplY3R9XG4gIDxpbWcgey4uLiQkcmVzdFByb3BzfSBjbGFzcz17Y2xhc3Nlc30ge3NyY30ge2FsdH0gLz5cbns6ZWxzZSBpZiBsaXN0fVxuICA8dWwgey4uLiQkcmVzdFByb3BzfSBjbGFzcz17Y2xhc3Nlc30+XG4gICAgPHNsb3QgLz5cbiAgPC91bD5cbns6ZWxzZX1cbiAgPGRpdiB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfT5cbiAgICA8c2xvdCAvPlxuICA8L2Rpdj5cbnsvaWZ9XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IHRhYnMgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBwaWxscyA9IGZhbHNlO1xuICBleHBvcnQgbGV0IHZlcnRpY2FsID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgaG9yaXpvbnRhbCA9ICcnO1xuICBleHBvcnQgbGV0IGp1c3RpZmllZCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGZpbGwgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBuYXZiYXIgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBjYXJkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZ2V0VmVydGljYWxDbGFzcyh2ZXJ0aWNhbCkge1xuICAgIGlmICh2ZXJ0aWNhbCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHZlcnRpY2FsID09PSB0cnVlIHx8IHZlcnRpY2FsID09PSAneHMnKSB7XG4gICAgICByZXR1cm4gJ2ZsZXgtY29sdW1uJztcbiAgICB9XG4gICAgcmV0dXJuIGBmbGV4LSR7dmVydGljYWx9LWNvbHVtbmA7XG4gIH1cblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhcbiAgICBjbGFzc05hbWUsXG4gICAgbmF2YmFyID8gJ25hdmJhci1uYXYnIDogJ25hdicsXG4gICAgaG9yaXpvbnRhbCA/IGBqdXN0aWZ5LWNvbnRlbnQtJHtob3Jpem9udGFsfWAgOiBmYWxzZSxcbiAgICBnZXRWZXJ0aWNhbENsYXNzKHZlcnRpY2FsKSxcbiAgICB7XG4gICAgICAnbmF2LXRhYnMnOiB0YWJzLFxuICAgICAgJ2NhcmQtaGVhZGVyLXRhYnMnOiBjYXJkICYmIHRhYnMsXG4gICAgICAnbmF2LXBpbGxzJzogcGlsbHMsXG4gICAgICAnY2FyZC1oZWFkZXItcGlsbHMnOiBjYXJkICYmIHBpbGxzLFxuICAgICAgJ25hdi1qdXN0aWZpZWQnOiBqdXN0aWZpZWQsXG4gICAgICAnbmF2LWZpbGwnOiBmaWxsXG4gICAgfVxuICApO1xuPC9zY3JpcHQ+XG5cbjx1bCB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfT5cbiAgPHNsb3QgLz5cbjwvdWw+XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuXG4gICQ6IGNsYXNzZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgJ25hdi1pdGVtJywgYWN0aXZlID8gJ2FjdGl2ZScgOiBmYWxzZSk7XG48L3NjcmlwdD5cblxuPGxpIHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NsYXNzZXN9PlxuICA8c2xvdCAvPlxuPC9saT5cbiIsIjxzY3JpcHQ+XG4gIGltcG9ydCBjbGFzc25hbWVzIGZyb20gJy4vdXRpbHMnO1xuXG4gIGxldCBjbGFzc05hbWUgPSAnJztcbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG4gIGV4cG9ydCBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBocmVmID0gJyMnO1xuXG4gICQ6IGNsYXNzZXMgPSBjbGFzc25hbWVzKGNsYXNzTmFtZSwgJ25hdi1saW5rJywge1xuICAgIGRpc2FibGVkLFxuICAgIGFjdGl2ZVxuICB9KTtcblxuICBmdW5jdGlvbiBoYW5kbGVDbGljayhlKSB7XG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChocmVmID09PSAnIycpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbjwvc2NyaXB0PlxuXG48YSB7Li4uJCRyZXN0UHJvcHN9IHtocmVmfSBvbjpjbGljayBvbjpjbGljaz17aGFuZGxlQ2xpY2t9IGNsYXNzPXtjbGFzc2VzfT5cbiAgPHNsb3QgLz5cbjwvYT5cbiIsIjxzY3JpcHQ+XG4gIGltcG9ydCBjbGFzc25hbWVzIGZyb20gJy4vdXRpbHMnO1xuXG4gIGxldCBjbGFzc05hbWUgPSAnJztcbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG4gIGV4cG9ydCBsZXQgbm9HdXR0ZXJzID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgZm9ybSA9IGZhbHNlO1xuXG4gICQ6IGNsYXNzZXMgPSBjbGFzc25hbWVzKFxuICAgIGNsYXNzTmFtZSxcbiAgICBub0d1dHRlcnMgPyAnbm8tZ3V0dGVycycgOiBudWxsLFxuICAgIGZvcm0gPyAnZm9ybS1yb3cnIDogJ3JvdydcbiAgKTtcbjwvc2NyaXB0PlxuXG48ZGl2IHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NsYXNzZXN9PlxuICA8c2xvdCAvPlxuPC9kaXY+XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IHR5cGUgPSAnYm9yZGVyJztcbiAgZXhwb3J0IGxldCBzaXplID0gJyc7XG4gIGV4cG9ydCBsZXQgY29sb3IgPSAnJztcblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhcbiAgICBjbGFzc05hbWUsXG4gICAgc2l6ZSA/IGBzcGlubmVyLSR7dHlwZX0tJHtzaXplfWAgOiBmYWxzZSxcbiAgICBgc3Bpbm5lci0ke3R5cGV9YCxcbiAgICBjb2xvciA/IGB0ZXh0LSR7Y29sb3J9YCA6IGZhbHNlXG4gICk7XG48L3NjcmlwdD5cblxuPGRpdiB7Li4uJCRyZXN0UHJvcHN9IHJvbGU9XCJzdGF0dXNcIiBjbGFzcz17Y2xhc3Nlc30+XG4gIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPlxuICAgIDxzbG90PkxvYWRpbmcuLi48L3Nsb3Q+XG4gIDwvc3Bhbj5cbjwvZGl2PlxuIiwiaW1wb3J0IHt3cml0YWJsZX0gZnJvbSBcInN2ZWx0ZS9zdG9yZVwiO1xuXG5leHBvcnQgY29uc3Qgc2Nhbm5lciA9IHdyaXRhYmxlKFwiXCIpOyIsIjxzY3JpcHQ+XG4gICAgaW1wb3J0IHsgTGlzdEdyb3VwLCBMaXN0R3JvdXBJdGVtLCBTcGlubmVyIH0gZnJvbSAnc3ZlbHRlc3RyYXAnO1xuXG4gICAgaW1wb3J0IHsgb25Nb3VudCB9IGZyb20gXCJzdmVsdGVcIjtcblxuICAgIGxldCBzY2FubmVycztcblxuICAgIG9uTW91bnQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBmZXRjaChgL2FwaS9kZXZpY2VzYClcbiAgICAgICAgICAgIC50aGVuKHIgPT4gci5qc29uKCkpXG4gICAgICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBzY2FubmVycyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKHNjYW5uZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHNjYW5uZXJzWzBdLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaW1wb3J0IHsgc2Nhbm5lciB9IGZyb20gJy4vc3RvcmVzLmpzJztcblxuICAgIGZ1bmN0aW9uIHNlbGVjdChuYW1lKSB7XG4gICAgICAgIHNjYW5uZXIuc2V0KG5hbWUpXG4gICAgICAgIHZhbHVlID0gbmFtZVxuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9ICcnO1xuXG48L3NjcmlwdD5cblxueyNpZiBzY2FubmVyc31cbiAgICA8TGlzdEdyb3VwPlxuICAgIHsjZWFjaCBzY2FubmVycyBhcyBzY2FubmVyIH1cbiAgICAgICAgPExpc3RHcm91cEl0ZW0gYWN0aXZlPXtzY2FubmVyLm5hbWUgPT0gdmFsdWV9IGFjdGlvbiB0YWc9XCJidXR0b25cIiBvbjpjbGljaz17c2VsZWN0KHNjYW5uZXIubmFtZSl9PntzY2FubmVyLm5hbWV9PC9MaXN0R3JvdXBJdGVtPlxuICAgIHsvZWFjaH1cbiAgICA8L0xpc3RHcm91cD5cbns6ZWxzZX1cbiAgICA8U3Bpbm5lci8+XG57L2lmfSIsIjxzY3JpcHQ+XG4gICAgaW1wb3J0IHtcbiAgICAgICAgQ29sLFxuICAgICAgICBSb3csXG4gICAgICAgIEJ1dHRvbixcbiAgICAgICAgTWVkaWEsXG4gICAgICAgIEJ1dHRvbkdyb3VwLFxuICAgICAgICBTcGlubmVyLFxuICAgIH0gZnJvbSAnc3ZlbHRlc3RyYXAnO1xuXG4gICAgZXhwb3J0IGxldCBzZXR0aW5ncyA9IHt9O1xuXG4gICAgZXhwb3J0IGxldCBhY3RpdmU7XG4gICAgJDogbWFpblJvd0NsYXNzID0gYWN0aXZlID8gJycgOiAnZC1ub25lJztcblxuICAgIGxldCBpbWFnZVNvdXJjZSA9ICcnO1xuICAgIGxldCBpbWFnZVNob3duID0gZmFsc2U7XG4gICAgJDogaW1hZ2VDbGFzcyA9IGltYWdlU2hvd24gPyAnJyA6ICdpbnZpc2libGUnO1xuXG4gICAgbGV0IHNwaW5uZXJTaG93biA9IGZhbHNlO1xuICAgICQ6IHNwaW5uZXJDbGFzcyA9IHNwaW5uZXJTaG93biA/ICcnIDogJ2ludmlzaWJsZSc7XG5cbiAgICBjb25zdCBjbGVhciA9ICgpID0+IHtcbiAgICAgICAgaW1hZ2VTb3VyY2UgPSBcIlwiO1xuICAgICAgICBpbWFnZVNob3duID0gZmFsc2U7XG4gICAgfTtcblxuICAgIGltcG9ydCB7IHNjYW5uZXIgfSBmcm9tICcuL3N0b3Jlcy5qcyc7XG4gICAgbGV0IHNjYW5uZXJOYW1lO1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc2Nhbm5lci5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICBzY2FubmVyTmFtZSA9IHZhbHVlO1xuICAgICAgICBjbGVhcigpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2NhbiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgc3Bpbm5lclNob3duID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgZmV0Y2goYC9hcGkvZGV2aWNlcy9gKyBzY2FubmVyTmFtZSArYC9zY2FuYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKVxuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ociA9PiByLmJsb2IoKSlcbiAgICAgICAgICAgIC50aGVuKGJsb2IgPT4ge1xuICAgICAgICAgICAgICAgIHNwaW5uZXJTaG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGltYWdlU291cmNlID0gKHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgICAgICAgIGltYWdlU2hvd24gPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRvd25sb2FkID0gKCkgPT4ge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgaWYgKHdpbmRvdy5VUkwgJiYgd2luZG93LkJsb2IgJiYgKCdkb3dubG9hZCcgaW4gYSkgJiYgd2luZG93LmF0b2IpIHtcbiAgICAgICAgICAgIGEuaHJlZiA9IGltYWdlU291cmNlO1xuICAgICAgICAgICAgYS5kb3dubG9hZCA9IFwic2Nhbm5lZC5wbmdcIjtcbiAgICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKGltYWdlU291cmNlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbjwvc2NyaXB0PlxuXG48Um93IGNsYXNzPXttYWluUm93Q2xhc3N9PlxuICAgIDxDb2w+XG4gICAgICAgIDxSb3c+XG4gICAgICAgICAgICA8Q29sPlxuICAgICAgICAgICAgICAgIDxCdXR0b25Hcm91cD5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBvdXRsaW5lIHByaW1hcnkgb246Y2xpY2s9e3NjYW59PlNjYW48L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBvdXRsaW5lIHN1Y2Nlc3MgZGlzYWJsZWQ9eyFpbWFnZVNob3dufSBvbjpjbGljaz17ZG93bmxvYWR9PkRvd25sb2FkPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gb3V0bGluZSBvbjpjbGljaz17Y2xlYXJ9PkNsZWFyPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC9CdXR0b25Hcm91cD5cbiAgICAgICAgICAgIDwvQ29sPlxuICAgICAgICA8L1Jvdz5cbiAgICAgICAgPFJvdz5cbiAgICAgICAgICAgIDxDb2w+XG4gICAgICAgICAgICAgICAgPGg1IG9iamVjdCBjbGFzcz17aW1hZ2VDbGFzc30+SW1hZ2UgZnJvbSB7c2Nhbm5lck5hbWV9PC9oNT5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLWZsdWlkIHtpbWFnZUNsYXNzfVwiIHNyYz17aW1hZ2VTb3VyY2V9Lz5cbiAgICAgICAgICAgICAgICA8U3Bpbm5lciBjbGFzcz17c3Bpbm5lckNsYXNzfS8+XG4gICAgICAgICAgICA8L0NvbD5cbiAgICAgICAgPC9Sb3c+XG4gICAgPC9Db2w+XG48L1Jvdz4iLCI8c2NyaXB0PlxuICAgIGltcG9ydCB7XG4gICAgICAgIENvbCxcbiAgICAgICAgUm93LFxuICAgICAgICBTcGlubmVyLFxuICAgICAgICBGb3JtLFxuICAgICAgICBGb3JtR3JvdXAsXG4gICAgICAgIElucHV0LFxuICAgICAgICBMYWJlbCxcbiAgICB9IGZyb20gJ3N2ZWx0ZXN0cmFwJztcblxuICAgIGltcG9ydCB7b25Nb3VudH0gZnJvbSBcInN2ZWx0ZVwiO1xuXG4gICAgaW1wb3J0IHsgc2Nhbm5lciB9IGZyb20gJy4vc3RvcmVzLmpzJztcblxuICAgIGV4cG9ydCBsZXQgYWN0aXZlO1xuICAgICQ6IG1haW5Sb3dDbGFzcyA9IGFjdGl2ZSA/ICcnIDogJ2Qtbm9uZSc7XG5cbiAgICBsZXQgc3Bpbm5lclNob3duID0gZmFsc2U7XG4gICAgJDogc3Bpbm5lckNsYXNzID0gc3Bpbm5lclNob3duID8gJycgOiAnZC1ub25lJztcblxuICAgIGxldCBvcHRpb25zID0gW107XG4gICAgZXhwb3J0IGxldCBzZXR0aW5ncyA9IHt9O1xuXG4gICAgY29uc3QgY2xlYXIgPSAoKSA9PiB7XG4gICAgICAgIG9wdGlvbnMgPSBbXTtcbiAgICB9O1xuXG4gICAgY29uc3QgbG9hZCA9IGFzeW5jIChkYXRhKSA9PiB7XG4gICAgICAgIGNsZWFyKCk7XG4gICAgICAgIHNwaW5uZXJTaG93biA9IHRydWU7XG4gICAgICAgIGF3YWl0IGZldGNoKGAvYXBpL2RldmljZXMvYCsgc2Nhbm5lck5hbWUgK2Avb3B0aW9uc2AsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ociA9PiByLmpzb24oKSlcbiAgICAgICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIHNwaW5uZXJTaG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1tvcHRpb24ubmFtZV0gPSBvcHRpb24uZGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGxldCBzY2FubmVyTmFtZTtcbiAgICBjb25zdCB1bnN1YnNjcmliZSA9IHNjYW5uZXIuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgc2Nhbm5lck5hbWUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHNjYW5uZXJOYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG9uTW91bnQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoc2Nhbm5lck5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvYWQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG48L3NjcmlwdD5cblxuPFJvdyBjbGFzcz17bWFpblJvd0NsYXNzfT5cbiAgICA8Q29sPlxuICAgICAgICA8U3Bpbm5lciBjbGFzcz17c3Bpbm5lckNsYXNzfS8+XG4gICAgICAgIDxGb3JtPlxuICAgICAgICAgICAgeyNlYWNoIG9wdGlvbnMgYXMgb3B0aW9ufVxuICAgICAgICAgICAgICAgIDxGb3JtR3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIHsjaWYgb3B0aW9uLnR5cGUgPT09IDB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8TGFiZWwgZm9yPXtvcHRpb24ubmFtZX0gY2hlY2s+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0IGlkPXtvcHRpb24ubmFtZX0gcGxhY2Vob2xkZXI9e29wdGlvbi5kZXNjcmlwdGlvbn0gdHlwZT1cImNoZWNrYm94XCIgYmluZDpjaGVja2VkPXtzZXR0aW5nc1tvcHRpb24ubmFtZV19IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge29wdGlvbi50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHs6ZWxzZSBpZiAob3B0aW9uLnR5cGUgPT09IDEgfHwgb3B0aW9uLnR5cGUgPT09IDIpICYmIG9wdGlvbi5zZXQgPT09IG51bGx9XG4gICAgICAgICAgICAgICAgICAgICAgICA8TGFiZWwgZm9yPXtvcHRpb24ubmFtZX0+e29wdGlvbi50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7I2lmIG9wdGlvbi5yYW5nZSAhPT0gbnVsbH0gKFJhbmdlOiB7b3B0aW9uLnJhbmdlLm1pbn0te29wdGlvbi5yYW5nZS5tYXh9LCBzdGVwOiB7b3B0aW9uLnJhbmdlLnF1YW50fSkgey9pZn1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXQgdHlwZT1cIm51bWJlclwiIG5hbWU9e29wdGlvbi5uYW1lfSBpZD17b3B0aW9uLm5hbWV9IGJpbmQ6dmFsdWU9e3NldHRpbmdzW29wdGlvbi5uYW1lXX0vPlxuICAgICAgICAgICAgICAgICAgICB7OmVsc2UgaWYgb3B0aW9uLnR5cGUgPT09IDMgJiYgb3B0aW9uLnNldCA9PT0gbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxMYWJlbCBmb3I9e29wdGlvbi5uYW1lfT57b3B0aW9uLnRpdGxlfTwvTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXQgbmFtZT17b3B0aW9uLm5hbWV9IGlkPXtvcHRpb24ubmFtZX0gYmluZDp2YWx1ZT17c2V0dGluZ3Nbb3B0aW9uLm5hbWVdfS8+XG4gICAgICAgICAgICAgICAgICAgIHs6ZWxzZSBpZiBvcHRpb24uc2V0ICE9PSBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgPExhYmVsIGZvcj17b3B0aW9uLm5hbWV9PntvcHRpb24udGl0bGV9PC9MYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dCB0eXBlPVwic2VsZWN0XCIgbmFtZT17b3B0aW9uLm5hbWV9IGlkPXtvcHRpb24ubmFtZX0gYmluZDp2YWx1ZT17c2V0dGluZ3Nbb3B0aW9uLm5hbWVdfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7I2VhY2ggb3B0aW9uLnNldCBhcyBpdGVtfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtpdGVtfT57aXRlbX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7L2VhY2h9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0lucHV0PlxuICAgICAgICAgICAgICAgICAgICB7OmVsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBVbmRlZmluZWQgb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIHsvaWZ9XG4gICAgICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICAgICAgICB7L2VhY2h9XG4gICAgICAgIDwvRm9ybT5cbiAgICA8L0NvbD5cbjwvUm93PiIsIjxzY3JpcHQ+XG4gICAgaW1wb3J0IHtcbiAgICAgICAgQ29sLFxuICAgICAgICBDb250YWluZXIsXG4gICAgICAgIFJvdyxcbiAgICAgICAgTmF2LFxuICAgICAgICBOYXZJdGVtLFxuICAgICAgICBOYXZMaW5rXG4gICAgfSBmcm9tICdzdmVsdGVzdHJhcCc7XG4gICAgaW1wb3J0IFNjYW5uZXJzIGZyb20gJy4vU2Nhbm5lcnMuc3ZlbHRlJztcbiAgICBpbXBvcnQgU2NhblBhZ2UgZnJvbSAnLi9TY2FuUGFnZS5zdmVsdGUnXG4gICAgaW1wb3J0IFNldHRpbmdzUGFnZSBmcm9tICcuL1NldHRpbmdzUGFnZS5zdmVsdGUnXG5cbiAgICBsZXQgc2Nhbm5lck5hbWU7XG5cbiAgICBsZXQgc2V0dGluZ3MgPSB7fTtcblxuICAgIGltcG9ydCB7IHNjYW5uZXIgfSBmcm9tICcuL3N0b3Jlcy5qcyc7XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzY2FubmVyLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgIHNjYW5uZXJOYW1lID0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICBleHBvcnQgbGV0IGFjdGl2ZVRhYiA9ICdzY2FuJztcblxuICAgIGNvbnN0IHNlbGVjdFRhYiA9IG5hbWUgPT4gKCkgPT4gYWN0aXZlVGFiID0gbmFtZTtcbjwvc2NyaXB0PlxuXG48Q29udGFpbmVyPlxuICAgIDxSb3c+XG4gICAgICAgIDxDb2wgc209XCI2XCIgbWQ9XCIyXCI+XG4gICAgICAgICAgICA8U2Nhbm5lcnMvPlxuICAgICAgICA8L0NvbD5cbiAgICAgICAgPENvbCBzbT1cIjZcIiBtZD1cIjEwXCI+XG4gICAgICAgICAgICA8Um93PlxuICAgICAgICAgICAgICAgIDxDb2w+XG4gICAgICAgICAgICAgICAgICAgIDxOYXYgdGFicz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxOYXZJdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxOYXZMaW5rIGFjdGl2ZT17XCJzY2FuXCIgPT09IGFjdGl2ZVRhYn0gb246Y2xpY2s9e3NlbGVjdFRhYihcInNjYW5cIil9PlNjYW48L05hdkxpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L05hdkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TmF2SXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TmF2TGluayBhY3RpdmU9e1wic2V0dGluZ3NcIiA9PT0gYWN0aXZlVGFifSBvbjpjbGljaz17c2VsZWN0VGFiKFwic2V0dGluZ3NcIil9PlNldHRpbmdzPC9OYXZMaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9OYXZJdGVtPlxuICAgICAgICAgICAgICAgICAgICA8L05hdj5cbiAgICAgICAgICAgICAgICA8L0NvbD5cbiAgICAgICAgICAgIDwvUm93PlxuICAgICAgICAgICAgPFNjYW5QYWdlIGFjdGl2ZT17XCJzY2FuXCIgPT09IGFjdGl2ZVRhYn0gc2V0dGluZ3M9e3NldHRpbmdzfS8+XG4gICAgICAgICAgICA8U2V0dGluZ3NQYWdlIGFjdGl2ZT17XCJzZXR0aW5nc1wiID09PSBhY3RpdmVUYWJ9IGJpbmQ6c2V0dGluZ3M9e3NldHRpbmdzfS8+XG4gICAgICAgIDwvQ29sPlxuICAgIDwvUm93PlxuPC9Db250YWluZXI+IiwiaW1wb3J0IEFwcCBmcm9tICcuL0FwcC5zdmVsdGUnO1xuXG5pbXBvcnQgJ2Jvb3RzdHJhcC9kaXN0L2Nzcy9ib290c3RyYXAubWluLmNzcyc7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoe1xuXHR0YXJnZXQ6IGRvY3VtZW50LmJvZHksXG5cdHByb3BzOiB7XG5cdFx0bmFtZTogJ3dvcmxkJ1xuXHR9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwOyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztJQUFBLFNBQVMsSUFBSSxHQUFHLEdBQUc7SUFFbkIsU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtJQUMxQjtJQUNBLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHO0lBQ3ZCLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUlELFNBQVMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJ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Ozs7Ozs7Ozs7O3NCQTVCVixHQUFXOzs7OzJCQVdSLEdBQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJEQVhWLEdBQVc7Ozs7MkRBV1IsR0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkE1QlYsR0FBVzs7OzsyQkFXUixHQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyREFYVixHQUFXOzs7OzJEQVdSLEdBQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0JBNUJWLEdBQVc7Ozs7MkJBV1IsR0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkRBWFYsR0FBVzs7OzsyREFXUixHQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQTVCVixHQUFXOzs7OzJCQVdSLEdBQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJEQVhWLEdBQVc7Ozs7MkRBV1IsR0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkE3QlYsR0FBVzs7Ozs7MkJBWVIsR0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkRBWlYsR0FBVzs7Ozs7MkRBWVIsR0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkE3QlYsR0FBVzs7OzsyQkFXUixHQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJEQVhWLEdBQVc7Ozs7MkRBV1IsR0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQTVCVixHQUFXOzs7OzJCQVdSLEdBQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJEQVhWLEdBQVc7Ozs7MkRBV1IsR0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkE1QlYsR0FBVzs7OzsyQkFXUixHQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7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\"") + packr.PackJSONBytes("../../web/public", "build/bundle.js", "\"dmFyIGFwcD1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KCl7fWZ1bmN0aW9uIGUodCxlKXtmb3IoY29uc3QgbiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBuKHQpe3JldHVybiB0KCl9ZnVuY3Rpb24gbCgpe3JldHVybiBPYmplY3QuY3JlYXRlKG51bGwpfWZ1bmN0aW9uIGModCl7dC5mb3JFYWNoKG4pfWZ1bmN0aW9uIHModCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gbyh0LGUpe3JldHVybiB0IT10P2U9PWU6dCE9PWV8fHQmJiJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gaSh0LGUsbixsKXtpZih0KXtjb25zdCBjPXIodCxlLG4sbCk7cmV0dXJuIHRbMF0oYyl9fWZ1bmN0aW9uIHIodCxuLGwsYyl7cmV0dXJuIHRbMV0mJmM/ZShsLmN0eC5zbGljZSgpLHRbMV0oYyhuKSkpOmwuY3R4fWZ1bmN0aW9uIGEodCxlLG4sbCxjLHMsbyl7Y29uc3QgaT1mdW5jdGlvbih0LGUsbixsKXtpZih0WzJdJiZsKXtjb25zdCBjPXRbMl0obChuKSk7aWYodm9pZCAwPT09ZS5kaXJ0eSlyZXR1cm4gYztpZigib2JqZWN0Ij09dHlwZW9mIGMpe2NvbnN0IHQ9W10sbj1NYXRoLm1heChlLmRpcnR5Lmxlbmd0aCxjLmxlbmd0aCk7Zm9yKGxldCBsPTA7bDxuO2wrPTEpdFtsXT1lLmRpcnR5W2xdfGNbbF07cmV0dXJuIHR9cmV0dXJuIGUuZGlydHl8Y31yZXR1cm4gZS5kaXJ0eX0oZSxsLGMscyk7aWYoaSl7Y29uc3QgYz1yKGUsbixsLG8pO3QucChjLGkpfX1mdW5jdGlvbiB1KHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdCkiJCIhPT1uWzBdJiYoZVtuXT10W25dKTtyZXR1cm4gZX1mdW5jdGlvbiBmKHQsZSl7Y29uc3Qgbj17fTtlPW5ldyBTZXQoZSk7Zm9yKGNvbnN0IGwgaW4gdCllLmhhcyhsKXx8IiQiPT09bFswXXx8KG5bbF09dFtsXSk7cmV0dXJuIG59ZnVuY3Rpb24gJCh0LGUpe3QuYXBwZW5kQ2hpbGQoZSl9ZnVuY3Rpb24gZCh0LGUsbil7dC5pbnNlcnRCZWZvcmUoZSxufHxudWxsKX1mdW5jdGlvbiBwKHQpe3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX1mdW5jdGlvbiBtKHQsZSl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0xKXRbbl0mJnRbbl0uZChlKX1mdW5jdGlvbiBoKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpfWZ1bmN0aW9uIGcodCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpfWZ1bmN0aW9uIHkoKXtyZXR1cm4gZygiICIpfWZ1bmN0aW9uIGIoKXtyZXR1cm4gZygiIil9ZnVuY3Rpb24gdih0LGUsbixsKXtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKGUsbixsKSwoKT0+dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbixsKX1mdW5jdGlvbiB4KHQsZSxuKXtudWxsPT1uP3QucmVtb3ZlQXR0cmlidXRlKGUpOnQuZ2V0QXR0cmlidXRlKGUpIT09biYmdC5zZXRBdHRyaWJ1dGUoZSxuKX1mdW5jdGlvbiBrKHQsZSl7Y29uc3Qgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0Ll9fcHJvdG9fXyk7Zm9yKGNvbnN0IGwgaW4gZSludWxsPT1lW2xdP3QucmVtb3ZlQXR0cmlidXRlKGwpOiJzdHlsZSI9PT1sP3Quc3R5bGUuY3NzVGV4dD1lW2xdOiJfX3ZhbHVlIj09PWw/dC52YWx1ZT10W2xdPWVbbF06bltsXSYmbltsXS5zZXQ/dFtsXT1lW2xdOngodCxsLGVbbF0pfWZ1bmN0aW9uIHcodCl7cmV0dXJuIiI9PT10P251bGw6K3R9ZnVuY3Rpb24gTyh0LGUpe2U9IiIrZSx0Lndob2xlVGV4dCE9PWUmJih0LmRhdGE9ZSl9ZnVuY3Rpb24geih0LGUpe3QudmFsdWU9bnVsbD09ZT8iIjplfWZ1bmN0aW9uIF8odCxlKXtmb3IobGV0IG49MDtuPHQub3B0aW9ucy5sZW5ndGg7bis9MSl7Y29uc3QgbD10Lm9wdGlvbnNbbl07aWYobC5fX3ZhbHVlPT09ZSlyZXR1cm4gdm9pZChsLnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gaih0LGUpe2ZvcihsZXQgbj0wO248dC5vcHRpb25zLmxlbmd0aDtuKz0xKXtjb25zdCBsPXQub3B0aW9uc1tuXTtsLnNlbGVjdGVkPX5lLmluZGV4T2YobC5fX3ZhbHVlKX19bGV0IE47ZnVuY3Rpb24gUyh0KXtOPXR9ZnVuY3Rpb24gRSh0KXsoZnVuY3Rpb24oKXtpZighTil0aHJvdyBuZXcgRXJyb3IoIkZ1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiIpO3JldHVybiBOfSkoKS4kJC5vbl9tb3VudC5wdXNoKHQpfWZ1bmN0aW9uIFQodCxlKXtjb25zdCBuPXQuJCQuY2FsbGJhY2tzW2UudHlwZV07biYmbi5zbGljZSgpLmZvckVhY2goKHQ9PnQoZSkpKX1jb25zdCBMPVtdLFI9W10sQT1bXSxVPVtdLEI9UHJvbWlzZS5yZXNvbHZlKCk7bGV0IEM9ITE7ZnVuY3Rpb24gRyh0KXtBLnB1c2godCl9ZnVuY3Rpb24gRCh0KXtVLnB1c2godCl9bGV0IFA9ITE7Y29uc3QgcT1uZXcgU2V0O2Z1bmN0aW9uIEkoKXtpZighUCl7UD0hMDtkb3tmb3IobGV0IHQ9MDt0PEwubGVuZ3RoO3QrPTEpe2NvbnN0IGU9TFt0XTtTKGUpLEooZS4kJCl9Zm9yKFMobnVsbCksTC5sZW5ndGg9MDtSLmxlbmd0aDspUi5wb3AoKSgpO2ZvcihsZXQgdD0wO3Q8QS5sZW5ndGg7dCs9MSl7Y29uc3QgZT1BW3RdO3EuaGFzKGUpfHwocS5hZGQoZSksZSgpKX1BLmxlbmd0aD0wfXdoaWxlKEwubGVuZ3RoKTtmb3IoO1UubGVuZ3RoOylVLnBvcCgpKCk7Qz0hMSxQPSExLHEuY2xlYXIoKX19ZnVuY3Rpb24gSih0KXtpZihudWxsIT09dC5mcmFnbWVudCl7dC51cGRhdGUoKSxjKHQuYmVmb3JlX3VwZGF0ZSk7Y29uc3QgZT10LmRpcnR5O3QuZGlydHk9Wy0xXSx0LmZyYWdtZW50JiZ0LmZyYWdtZW50LnAodC5jdHgsZSksdC5hZnRlcl91cGRhdGUuZm9yRWFjaChHKX19Y29uc3QgTT1uZXcgU2V0O2xldCBGO2Z1bmN0aW9uIEgoKXtGPXtyOjAsYzpbXSxwOkZ9fWZ1bmN0aW9uIEsoKXtGLnJ8fGMoRi5jKSxGPUYucH1mdW5jdGlvbiBRKHQsZSl7dCYmdC5pJiYoTS5kZWxldGUodCksdC5pKGUpKX1mdW5jdGlvbiBWKHQsZSxuLGwpe2lmKHQmJnQubyl7aWYoTS5oYXModCkpcmV0dXJuO00uYWRkKHQpLEYuYy5wdXNoKCgoKT0+e00uZGVsZXRlKHQpLGwmJihuJiZ0LmQoMSksbCgpKX0pKSx0Lm8oZSl9fWZ1bmN0aW9uIFcodCxlKXtjb25zdCBuPXt9LGw9e30sYz17JCRzY29wZToxfTtsZXQgcz10Lmxlbmd0aDtmb3IoO3MtLTspe2NvbnN0IG89dFtzXSxpPWVbc107aWYoaSl7Zm9yKGNvbnN0IHQgaW4gbyl0IGluIGl8fChsW3RdPTEpO2Zvcihjb25zdCB0IGluIGkpY1t0XXx8KG5bdF09aVt0XSxjW3RdPTEpO3Rbc109aX1lbHNlIGZvcihjb25zdCB0IGluIG8pY1t0XT0xfWZvcihjb25zdCB0IGluIGwpdCBpbiBufHwoblt0XT12b2lkIDApO3JldHVybiBufWZ1bmN0aW9uIFgodCxlLG4pe2NvbnN0IGw9dC4kJC5wcm9wc1tlXTt2b2lkIDAhPT1sJiYodC4kJC5ib3VuZFtsXT1uLG4odC4kJC5jdHhbbF0pKX1mdW5jdGlvbiBZKHQpe3QmJnQuYygpfWZ1bmN0aW9uIFoodCxlLGwpe2NvbnN0e2ZyYWdtZW50Om8sb25fbW91bnQ6aSxvbl9kZXN0cm95OnIsYWZ0ZXJfdXBkYXRlOmF9PXQuJCQ7byYmby5tKGUsbCksRygoKCk9Pntjb25zdCBlPWkubWFwKG4pLmZpbHRlcihzKTtyP3IucHVzaCguLi5lKTpjKGUpLHQuJCQub25fbW91bnQ9W119KSksYS5mb3JFYWNoKEcpfWZ1bmN0aW9uIHR0KHQsZSl7Y29uc3Qgbj10LiQkO251bGwhPT1uLmZyYWdtZW50JiYoYyhuLm9uX2Rlc3Ryb3kpLG4uZnJhZ21lbnQmJm4uZnJhZ21lbnQuZChlKSxuLm9uX2Rlc3Ryb3k9bi5mcmFnbWVudD1udWxsLG4uY3R4PVtdKX1mdW5jdGlvbiBldCh0LGUpey0xPT09dC4kJC5kaXJ0eVswXSYmKEwucHVzaCh0KSxDfHwoQz0hMCxCLnRoZW4oSSkpLHQuJCQuZGlydHkuZmlsbCgwKSksdC4kJC5kaXJ0eVtlLzMxfDBdfD0xPDxlJTMxfWZ1bmN0aW9uIG50KGUsbixzLG8saSxyLGE9Wy0xXSl7Y29uc3QgdT1OO1MoZSk7Y29uc3QgZj1uLnByb3BzfHx7fSwkPWUuJCQ9e2ZyYWdtZW50Om51bGwsY3R4Om51bGwscHJvcHM6cix1cGRhdGU6dCxub3RfZXF1YWw6aSxib3VuZDpsKCksb25fbW91bnQ6W10sb25fZGVzdHJveTpbXSxiZWZvcmVfdXBkYXRlOltdLGFmdGVyX3VwZGF0ZTpbXSxjb250ZXh0Om5ldyBNYXAodT91LiQkLmNvbnRleHQ6W10pLGNhbGxiYWNrczpsKCksZGlydHk6YSxza2lwX2JvdW5kOiExfTtsZXQgZD0hMTtpZigkLmN0eD1zP3MoZSxmLCgodCxuLC4uLmwpPT57Y29uc3QgYz1sLmxlbmd0aD9sWzBdOm47cmV0dXJuICQuY3R4JiZpKCQuY3R4W3RdLCQuY3R4W3RdPWMpJiYoISQuc2tpcF9ib3VuZCYmJC5ib3VuZFt0XSYmJC5ib3VuZFt0XShjKSxkJiZldChlLHQpKSxufSkpOltdLCQudXBkYXRlKCksZD0hMCxjKCQuYmVmb3JlX3VwZGF0ZSksJC5mcmFnbWVudD0hIW8mJm8oJC5jdHgpLG4udGFyZ2V0KXtpZihuLmh5ZHJhdGUpe2NvbnN0IHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmZyb20odC5jaGlsZE5vZGVzKX0obi50YXJnZXQpOyQuZnJhZ21lbnQmJiQuZnJhZ21lbnQubCh0KSx0LmZvckVhY2gocCl9ZWxzZSAkLmZyYWdtZW50JiYkLmZyYWdtZW50LmMoKTtuLmludHJvJiZRKGUuJCQuZnJhZ21lbnQpLFooZSxuLnRhcmdldCxuLmFuY2hvciksSSgpfVModSl9Y2xhc3MgbHR7JGRlc3Ryb3koKXt0dCh0aGlzLDEpLHRoaXMuJGRlc3Ryb3k9dH0kb24odCxlKXtjb25zdCBuPXRoaXMuJCQuY2FsbGJhY2tzW3RdfHwodGhpcy4kJC5jYWxsYmFja3NbdF09W10pO3JldHVybiBuLnB1c2goZSksKCk9Pntjb25zdCB0PW4uaW5kZXhPZihlKTstMSE9PXQmJm4uc3BsaWNlKHQsMSl9fSRzZXQodCl7dmFyIGU7dGhpcy4kJHNldCYmKGU9dCwwIT09T2JqZWN0LmtleXMoZSkubGVuZ3RoKSYmKHRoaXMuJCQuc2tpcF9ib3VuZD0hMCx0aGlzLiQkc2V0KHQpLHRoaXMuJCQuc2tpcF9ib3VuZD0hMSl9fWZ1bmN0aW9uIGN0KHQpe2NvbnN0IGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9ZnVuY3Rpb24gc3QodCxlLG4pe3JldHVybiEwPT09bnx8IiI9PT1uP3Q/ImNvbCI6YGNvbC0ke2V9YDoiYXV0byI9PT1uP3Q/ImNvbC1hdXRvIjpgY29sLSR7ZX0tYXV0b2A6dD9gY29sLSR7bn1gOmBjb2wtJHtlfS0ke259YH1mdW5jdGlvbiBvdCh0KXtsZXQgZT0iIjtpZigic3RyaW5nIj09dHlwZW9mIHR8fCJudW1iZXIiPT10eXBlb2YgdCllKz10O2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0KWlmKEFycmF5LmlzQXJyYXkodCkpZT10Lm1hcChvdCkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKTtlbHNlIGZvcihsZXQgbiBpbiB0KXRbbl0mJihlJiYoZSs9IiAiKSxlKz1uKTtyZXR1cm4gZX1mdW5jdGlvbiBpdCguLi50KXtyZXR1cm4gdC5tYXAob3QpLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIil9ZnVuY3Rpb24gcnQodCl7bGV0IG4sbCxjLHMsbztjb25zdCByPXRbMTddLmRlZmF1bHQsdT1pKHIsdCx0WzE2XSxudWxsKSxmPXV8fGZ1bmN0aW9uKHQpe2xldCBlLG4sbCxjO2NvbnN0IHM9WyR0LGZ0LHV0XSxvPVtdO2Z1bmN0aW9uIGkodCxlKXtyZXR1cm4gdFsxXT8wOnRbMF0/MToyfXJldHVybiBlPWkodCksbj1vW2VdPXNbZV0odCkse2MoKXtuLmMoKSxsPWIoKX0sbSh0LG4pe29bZV0ubSh0LG4pLGQodCxsLG4pLGM9ITB9LHAodCxjKXtsZXQgcj1lO2U9aSh0KSxlPT09cj9vW2VdLnAodCxjKTooSCgpLFYob1tyXSwxLDEsKCgpPT57b1tyXT1udWxsfSkpLEsoKSxuPW9bZV0sbj9uLnAodCxjKToobj1vW2VdPXNbZV0odCksbi5jKCkpLFEobiwxKSxuLm0obC5wYXJlbnROb2RlLGwpKX0saSh0KXtjfHwoUShuKSxjPSEwKX0sbyh0KXtWKG4pLGM9ITF9LGQodCl7b1tlXS5kKHQpLHQmJnAobCl9fX0odCk7bGV0ICQ9W3RbOV0se2NsYXNzOnRbN119LHtkaXNhYmxlZDp0WzJdfSx7dmFsdWU6dFs1XX0seyJhcmlhLWxhYmVsIjpsPXRbNl18fHRbOF19LHtzdHlsZTp0WzRdfV0sbT17fTtmb3IobGV0IHQ9MDt0PCQubGVuZ3RoO3QrPTEpbT1lKG0sJFt0XSk7cmV0dXJue2MoKXtuPWgoImJ1dHRvbiIpLGYmJmYuYygpLGsobixtKX0sbShlLGwpe2QoZSxuLGwpLGYmJmYubShuLG51bGwpLGM9ITAsc3x8KG89dihuLCJjbGljayIsdFsxOV0pLHM9ITApfSxwKHQsZSl7dT91LnAmJjY1NTM2JmUmJmEodSxyLHQsdFsxNl0sZSxudWxsLG51bGwpOmYmJmYucCYmNjU1MzkmZSYmZi5wKHQsZSksayhuLG09VygkLFs1MTImZSYmdFs5XSwoIWN8fDEyOCZlKSYme2NsYXNzOnRbN119LCghY3x8NCZlKSYme2Rpc2FibGVkOnRbMl19LCghY3x8MzImZSkmJnt2YWx1ZTp0WzVdfSwoIWN8fDMyMCZlJiZsIT09KGw9dFs2XXx8dFs4XSkpJiZ7ImFyaWEtbGFiZWwiOmx9LCghY3x8MTYmZSkmJntzdHlsZTp0WzRdfV0pKX0saSh0KXtjfHwoUShmLHQpLGM9ITApfSxvKHQpe1YoZix0KSxjPSExfSxkKHQpe3QmJnAobiksZiYmZi5kKHQpLHM9ITEsbygpfX19ZnVuY3Rpb24gYXQodCl7bGV0IG4sbCxjLHMsbyxpLHI7Y29uc3QgYT1bcHQsZHRdLHU9W107ZnVuY3Rpb24gZih0LGUpe3JldHVybiB0WzBdPzA6MX1sPWYodCksYz11W2xdPWFbbF0odCk7bGV0ICQ9W3RbOV0se2NsYXNzOnRbN119LHtkaXNhYmxlZDp0WzJdfSx7aHJlZjp0WzNdfSx7ImFyaWEtbGFiZWwiOnM9dFs2XXx8dFs4XX0se3N0eWxlOnRbNF19XSxtPXt9O2ZvcihsZXQgdD0wO3Q8JC5sZW5ndGg7dCs9MSltPWUobSwkW3RdKTtyZXR1cm57Yygpe249aCgiYSIpLGMuYygpLGsobixtKX0sbShlLGMpe2QoZSxuLGMpLHVbbF0ubShuLG51bGwpLG89ITAsaXx8KHI9dihuLCJjbGljayIsdFsxOF0pLGk9ITApfSxwKHQsZSl7bGV0IGk9bDtsPWYodCksbD09PWk/dVtsXS5wKHQsZSk6KEgoKSxWKHVbaV0sMSwxLCgoKT0+e3VbaV09bnVsbH0pKSxLKCksYz11W2xdLGM/Yy5wKHQsZSk6KGM9dVtsXT1hW2xdKHQpLGMuYygpKSxRKGMsMSksYy5tKG4sbnVsbCkpLGsobixtPVcoJCxbNTEyJmUmJnRbOV0sKCFvfHwxMjgmZSkmJntjbGFzczp0WzddfSwoIW98fDQmZSkmJntkaXNhYmxlZDp0WzJdfSwoIW98fDgmZSkmJntocmVmOnRbM119LCghb3x8MzIwJmUmJnMhPT0ocz10WzZdfHx0WzhdKSkmJnsiYXJpYS1sYWJlbCI6c30sKCFvfHwxNiZlKSYme3N0eWxlOnRbNF19XSkpfSxpKHQpe298fChRKGMpLG89ITApfSxvKHQpe1YoYyksbz0hMX0sZCh0KXt0JiZwKG4pLHVbbF0uZCgpLGk9ITEscigpfX19ZnVuY3Rpb24gdXQodCl7bGV0IGU7Y29uc3Qgbj10WzE3XS5kZWZhdWx0LGw9aShuLHQsdFsxNl0sbnVsbCk7cmV0dXJue2MoKXtsJiZsLmMoKX0sbSh0LG4pe2wmJmwubSh0LG4pLGU9ITB9LHAodCxlKXtsJiZsLnAmJjY1NTM2JmUmJmEobCxuLHQsdFsxNl0sZSxudWxsLG51bGwpfSxpKHQpe2V8fChRKGwsdCksZT0hMCl9LG8odCl7VihsLHQpLGU9ITF9LGQodCl7bCYmbC5kKHQpfX19ZnVuY3Rpb24gZnQoZSl7bGV0IG47cmV0dXJue2MoKXtuPWcoZVswXSl9LG0odCxlKXtkKHQsbixlKX0scCh0LGUpezEmZSYmTyhuLHRbMF0pfSxpOnQsbzp0LGQodCl7dCYmcChuKX19fWZ1bmN0aW9uICR0KGUpe2xldCBuO3JldHVybntjKCl7bj1oKCJzcGFuIiksbi50ZXh0Q29udGVudD0iw5ciLHgobiwiYXJpYS1oaWRkZW4iLCJ0cnVlIil9LG0odCxlKXtkKHQsbixlKX0scDp0LGk6dCxvOnQsZCh0KXt0JiZwKG4pfX19ZnVuY3Rpb24gZHQodCl7bGV0IGU7Y29uc3Qgbj10WzE3XS5kZWZhdWx0LGw9aShuLHQsdFsxNl0sbnVsbCk7cmV0dXJue2MoKXtsJiZsLmMoKX0sbSh0LG4pe2wmJmwubSh0LG4pLGU9ITB9LHAodCxlKXtsJiZsLnAmJjY1NTM2JmUmJmEobCxuLHQsdFsxNl0sZSxudWxsLG51bGwpfSxpKHQpe2V8fChRKGwsdCksZT0hMCl9LG8odCl7VihsLHQpLGU9ITF9LGQodCl7bCYmbC5kKHQpfX19ZnVuY3Rpb24gcHQoZSl7bGV0IG47cmV0dXJue2MoKXtuPWcoZVswXSl9LG0odCxlKXtkKHQsbixlKX0scCh0LGUpezEmZSYmTyhuLHRbMF0pfSxpOnQsbzp0LGQodCl7dCYmcChuKX19fWZ1bmN0aW9uIG10KHQpe2xldCBlLG4sbCxjO2NvbnN0IHM9W2F0LHJ0XSxvPVtdO2Z1bmN0aW9uIGkodCxlKXtyZXR1cm4gdFszXT8wOjF9cmV0dXJuIGU9aSh0KSxuPW9bZV09c1tlXSh0KSx7Yygpe24uYygpLGw9YigpfSxtKHQsbil7b1tlXS5tKHQsbiksZCh0LGwsbiksYz0hMH0scCh0LFtjXSl7bGV0IHI9ZTtlPWkodCksZT09PXI/b1tlXS5wKHQsYyk6KEgoKSxWKG9bcl0sMSwxLCgoKT0+e29bcl09bnVsbH0pKSxLKCksbj1vW2VdLG4/bi5wKHQsYyk6KG49b1tlXT1zW2VdKHQpLG4uYygpKSxRKG4sMSksbi5tKGwucGFyZW50Tm9kZSxsKSl9LGkodCl7Y3x8KFEobiksYz0hMCl9LG8odCl7VihuKSxjPSExfSxkKHQpe29bZV0uZCh0KSx0JiZwKGwpfX19ZnVuY3Rpb24gaHQodCxuLGwpe2xldCBjLHMsbztjb25zdCBpPVsiY2xhc3MiLCJhY3RpdmUiLCJibG9jayIsImNoaWxkcmVuIiwiY2xvc2UiLCJjb2xvciIsImRpc2FibGVkIiwiaHJlZiIsIm91dGxpbmUiLCJzaXplIiwic3R5bGUiLCJ2YWx1ZSJdO2xldCByPWYobixpKSx7JCRzbG90czphPXt9LCQkc2NvcGU6JH09bix7Y2xhc3M6ZD0iIn09bix7YWN0aXZlOnA9ITF9PW4se2Jsb2NrOm09ITF9PW4se2NoaWxkcmVuOmh9PW4se2Nsb3NlOmc9ITF9PW4se2NvbG9yOnk9InNlY29uZGFyeSJ9PW4se2Rpc2FibGVkOmI9ITF9PW4se2hyZWY6dj0iIn09bix7b3V0bGluZTp4PSExfT1uLHtzaXplOms9bnVsbH09bix7c3R5bGU6dz0iIn09bix7dmFsdWU6Tz0iIn09bjtyZXR1cm4gdC4kJHNldD10PT57bCgyMCxuPWUoZSh7fSxuKSx1KHQpKSksbCg5LHI9ZihuLGkpKSwiY2xhc3MiaW4gdCYmbCgxMCxkPXQuY2xhc3MpLCJhY3RpdmUiaW4gdCYmbCgxMSxwPXQuYWN0aXZlKSwiYmxvY2siaW4gdCYmbCgxMixtPXQuYmxvY2spLCJjaGlsZHJlbiJpbiB0JiZsKDAsaD10LmNoaWxkcmVuKSwiY2xvc2UiaW4gdCYmbCgxLGc9dC5jbG9zZSksImNvbG9yImluIHQmJmwoMTMseT10LmNvbG9yKSwiZGlzYWJsZWQiaW4gdCYmbCgyLGI9dC5kaXNhYmxlZCksImhyZWYiaW4gdCYmbCgzLHY9dC5ocmVmKSwib3V0bGluZSJpbiB0JiZsKDE0LHg9dC5vdXRsaW5lKSwic2l6ZSJpbiB0JiZsKDE1LGs9dC5zaXplKSwic3R5bGUiaW4gdCYmbCg0LHc9dC5zdHlsZSksInZhbHVlImluIHQmJmwoNSxPPXQudmFsdWUpLCIkJHNjb3BlImluIHQmJmwoMTYsJD10LiQkc2NvcGUpfSx0LiQkLnVwZGF0ZT0oKT0+e2woNixjPW5bImFyaWEtbGFiZWwiXSksNjQ1MTQmdC4kJC5kaXJ0eSYmbCg3LHM9aXQoZCx7Y2xvc2U6Z30sZ3x8ImJ0biIsZ3x8YGJ0biR7eD8iLW91dGxpbmUiOiIifS0ke3l9YCwhIWsmJmBidG4tJHtrfWAsISFtJiYiYnRuLWJsb2NrIix7YWN0aXZlOnB9KSksMiZ0LiQkLmRpcnR5JiZsKDgsbz1nPyJDbG9zZSI6bnVsbCl9LG49dShuKSxbaCxnLGIsdix3LE8sYyxzLG8scixkLHAsbSx5LHgsaywkLGEsZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9XX1jbGFzcyBndCBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksbnQodGhpcyx0LGh0LG10LG8se2NsYXNzOjEwLGFjdGl2ZToxMSxibG9jazoxMixjaGlsZHJlbjowLGNsb3NlOjEsY29sb3I6MTMsZGlzYWJsZWQ6MixocmVmOjMsb3V0bGluZToxNCxzaXplOjE1LHN0eWxlOjQsdmFsdWU6NX0pfX1jb25zdCB5dD1bXTtmdW5jdGlvbiBidCh0KXtsZXQgbixsO2NvbnN0IGM9dFs2XS5kZWZhdWx0LHM9aShjLHQsdFs1XSxudWxsKTtsZXQgbz1bdFsxXSx7Y2xhc3M6dFswXX1dLHI9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKXI9ZShyLG9bdF0pO3JldHVybntjKCl7bj1oKCJkaXYiKSxzJiZzLmMoKSxrKG4scil9LG0odCxlKXtkKHQsbixlKSxzJiZzLm0obixudWxsKSxsPSEwfSxwKHQsW2VdKXtzJiZzLnAmJjMyJmUmJmEocyxjLHQsdFs1XSxlLG51bGwsbnVsbCksayhuLHI9VyhvLFsyJmUmJnRbMV0sKCFsfHwxJmUpJiZ7Y2xhc3M6dFswXX1dKSl9LGkodCl7bHx8KFEocyx0KSxsPSEwKX0sbyh0KXtWKHMsdCksbD0hMX0sZCh0KXt0JiZwKG4pLHMmJnMuZCh0KX19fWZ1bmN0aW9uIHZ0KHQsbixsKXtsZXQgYztjb25zdCBzPVsiY2xhc3MiLCJzaXplIiwidmVydGljYWwiXTtsZXQgbz1mKG4scykseyQkc2xvdHM6aT17fSwkJHNjb3BlOnJ9PW4se2NsYXNzOmE9IiJ9PW4se3NpemU6JD0iIn09bix7dmVydGljYWw6ZD0hMX09bjtyZXR1cm4gdC4kJHNldD10PT57bj1lKGUoe30sbiksdSh0KSksbCgxLG89ZihuLHMpKSwiY2xhc3MiaW4gdCYmbCgyLGE9dC5jbGFzcyksInNpemUiaW4gdCYmbCgzLCQ9dC5zaXplKSwidmVydGljYWwiaW4gdCYmbCg0LGQ9dC52ZXJ0aWNhbCksIiQkc2NvcGUiaW4gdCYmbCg1LHI9dC4kJHNjb3BlKX0sdC4kJC51cGRhdGU9KCk9PnsyOCZ0LiQkLmRpcnR5JiZsKDAsYz1pdChhLCEhJCYmYGJ0bi1ncm91cC0keyR9YCxkPyJidG4tZ3JvdXAtdmVydGljYWwiOiJidG4tZ3JvdXAiKSl9LFtjLG8sYSwkLGQscixpXX1jbGFzcyB4dCBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksbnQodGhpcyx0LHZ0LGJ0LG8se2NsYXNzOjIsc2l6ZTozLHZlcnRpY2FsOjR9KX19ZnVuY3Rpb24ga3QodCl7bGV0IG4sbCxjO2NvbnN0IHM9dFs5XS5kZWZhdWx0LG89aShzLHQsdFs4XSxudWxsKTtsZXQgcj1bdFsxXSx7Y2xhc3M6bD10WzBdLmpvaW4oIiAiKX1dLHU9e307Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kz0xKXU9ZSh1LHJbdF0pO3JldHVybntjKCl7bj1oKCJkaXYiKSxvJiZvLmMoKSxrKG4sdSl9LG0odCxlKXtkKHQsbixlKSxvJiZvLm0obixudWxsKSxjPSEwfSxwKHQsW2VdKXtvJiZvLnAmJjI1NiZlJiZhKG8scyx0LHRbOF0sZSxudWxsLG51bGwpLGsobix1PVcocixbMiZlJiZ0WzFdLHtjbGFzczpsfV0pKX0saSh0KXtjfHwoUShvLHQpLGM9ITApfSxvKHQpe1Yobyx0KSxjPSExfSxkKHQpe3QmJnAobiksbyYmby5kKHQpfX19ZnVuY3Rpb24gd3QodCxuLGwpe2NvbnN0IGM9WyJjbGFzcyIsInhzIiwic20iLCJtZCIsImxnIiwieGwiXTtsZXQgcz1mKG4sYykseyQkc2xvdHM6bz17fSwkJHNjb3BlOml9PW4se2NsYXNzOnI9IiJ9PW4se3hzOmF9PW4se3NtOiR9PW4se21kOmR9PW4se2xnOnB9PW4se3hsOm19PW47Y29uc3QgaD1bXSxnPXt4czphLHNtOiQsbWQ6ZCxsZzpwLHhsOm19O3JldHVybiBPYmplY3Qua2V5cyhnKS5mb3JFYWNoKCh0PT57Y29uc3QgZT1nW3RdO2lmKCFlJiYiIiE9PWUpcmV0dXJuO2NvbnN0IG49InhzIj09PXQ7aWYoY3QoZSkpe2NvbnN0IGw9bj8iLSI6YC0ke3R9LWAsYz1zdChuLHQsZS5zaXplKTsoZS5zaXplfHwiIj09PWUuc2l6ZSkmJmgucHVzaChjKSxlLnB1c2gmJmgucHVzaChgcHVzaCR7bH0ke2UucHVzaH1gKSxlLnB1bGwmJmgucHVzaChgcHVsbCR7bH0ke2UucHVsbH1gKSxlLm9mZnNldCYmaC5wdXNoKGBvZmZzZXQke2x9JHtlLm9mZnNldH1gKX1lbHNlIGgucHVzaChzdChuLHQsZSkpfSkpLGgubGVuZ3RofHxoLnB1c2goImNvbCIpLHImJmgucHVzaChyKSx0LiQkc2V0PXQ9PntuPWUoZSh7fSxuKSx1KHQpKSxsKDEscz1mKG4sYykpLCJjbGFzcyJpbiB0JiZsKDIscj10LmNsYXNzKSwieHMiaW4gdCYmbCgzLGE9dC54cyksInNtImluIHQmJmwoNCwkPXQuc20pLCJtZCJpbiB0JiZsKDUsZD10Lm1kKSwibGciaW4gdCYmbCg2LHA9dC5sZyksInhsImluIHQmJmwoNyxtPXQueGwpLCIkJHNjb3BlImluIHQmJmwoOCxpPXQuJCRzY29wZSl9LFtoLHMscixhLCQsZCxwLG0saSxvXX1jbGFzcyBPdCBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksbnQodGhpcyx0LHd0LGt0LG8se2NsYXNzOjIseHM6MyxzbTo0LG1kOjUsbGc6Nix4bDo3fSl9fWZ1bmN0aW9uIHp0KHQpe2xldCBuLGw7Y29uc3QgYz10WzVdLmRlZmF1bHQscz1pKGMsdCx0WzRdLG51bGwpO2xldCBvPVt0WzFdLHtjbGFzczp0WzBdfV0scj17fTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTEpcj1lKHIsb1t0XSk7cmV0dXJue2MoKXtuPWgoImRpdiIpLHMmJnMuYygpLGsobixyKX0sbSh0LGUpe2QodCxuLGUpLHMmJnMubShuLG51bGwpLGw9ITB9LHAodCxbZV0pe3MmJnMucCYmMTYmZSYmYShzLGMsdCx0WzRdLGUsbnVsbCxudWxsKSxrKG4scj1XKG8sWzImZSYmdFsxXSwoIWx8fDEmZSkmJntjbGFzczp0WzBdfV0pKX0saSh0KXtsfHwoUShzLHQpLGw9ITApfSxvKHQpe1Yocyx0KSxsPSExfSxkKHQpe3QmJnAobikscyYmcy5kKHQpfX19ZnVuY3Rpb24gX3QodCxuLGwpe2xldCBjO2NvbnN0IHM9WyJjbGFzcyIsImZsdWlkIl07bGV0IG89ZihuLHMpLHskJHNsb3RzOmk9e30sJCRzY29wZTpyfT1uLHtjbGFzczphPSIifT1uLHtmbHVpZDokPSExfT1uO3JldHVybiB0LiQkc2V0PXQ9PntuPWUoZSh7fSxuKSx1KHQpKSxsKDEsbz1mKG4scykpLCJjbGFzcyJpbiB0JiZsKDIsYT10LmNsYXNzKSwiZmx1aWQiaW4gdCYmbCgzLCQ9dC5mbHVpZCksIiQkc2NvcGUiaW4gdCYmbCg0LHI9dC4kJHNjb3BlKX0sdC4kJC51cGRhdGU9KCk9PnsxMiZ0LiQkLmRpcnR5JiZsKDAsYz1pdChhLCQ/ImNvbnRhaW5lci1mbHVpZCI6ImNvbnRhaW5lciIpKX0sW2MsbyxhLCQscixpXX1jbGFzcyBqdCBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksbnQodGhpcyx0LF90LHp0LG8se2NsYXNzOjIsZmx1aWQ6M30pfX1mdW5jdGlvbiBOdCh0KXtsZXQgbixsLGMscztjb25zdCBvPXRbNV0uZGVmYXVsdCxyPWkobyx0LHRbNF0sbnVsbCk7bGV0IHU9W3RbMV0se2NsYXNzOnRbMF19XSxmPXt9O2ZvcihsZXQgdD0wO3Q8dS5sZW5ndGg7dCs9MSlmPWUoZix1W3RdKTtyZXR1cm57Yygpe249aCgiZm9ybSIpLHImJnIuYygpLGsobixmKX0sbShlLG8pe2QoZSxuLG8pLHImJnIubShuLG51bGwpLGw9ITAsY3x8KHM9dihuLCJzdWJtaXQiLHRbNl0pLGM9ITApfSxwKHQsW2VdKXtyJiZyLnAmJjE2JmUmJmEocixvLHQsdFs0XSxlLG51bGwsbnVsbCksayhuLGY9Vyh1LFsyJmUmJnRbMV0sKCFsfHwxJmUpJiZ7Y2xhc3M6dFswXX1dKSl9LGkodCl7bHx8KFEocix0KSxsPSEwKX0sbyh0KXtWKHIsdCksbD0hMX0sZCh0KXt0JiZwKG4pLHImJnIuZCh0KSxjPSExLHMoKX19fWZ1bmN0aW9uIFN0KHQsbixsKXtsZXQgYztjb25zdCBzPVsiY2xhc3MiLCJpbmxpbmUiXTtsZXQgbz1mKG4scykseyQkc2xvdHM6aT17fSwkJHNjb3BlOnJ9PW4se2NsYXNzOmE9IiJ9PW4se2lubGluZTokPSExfT1uO3JldHVybiB0LiQkc2V0PXQ9PntuPWUoZSh7fSxuKSx1KHQpKSxsKDEsbz1mKG4scykpLCJjbGFzcyJpbiB0JiZsKDIsYT10LmNsYXNzKSwiaW5saW5lImluIHQmJmwoMywkPXQuaW5saW5lKSwiJCRzY29wZSJpbiB0JiZsKDQscj10LiQkc2NvcGUpfSx0LiQkLnVwZGF0ZT0oKT0+ezEyJnQuJCQuZGlydHkmJmwoMCxjPWl0KGEsISEkJiYiZm9ybS1pbmxpbmUiKSl9LFtjLG8sYSwkLHIsaSxmdW5jdGlvbihlKXtUKHQsZSl9XX1jbGFzcyBFdCBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksbnQodGhpcyx0LFN0LE50LG8se2NsYXNzOjIsaW5saW5lOjN9KX19ZnVuY3Rpb24gVHQodCl7bGV0IG4sbDtjb25zdCBjPXRbOV0uZGVmYXVsdCxzPWkoYyx0LHRbOF0sbnVsbCk7bGV0IG89W3RbMl0se2NsYXNzOnRbMV19XSxyPXt9O2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCs9MSlyPWUocixvW3RdKTtyZXR1cm57Yygpe249aCgiZGl2IikscyYmcy5jKCksayhuLHIpfSxtKHQsZSl7ZCh0LG4sZSkscyYmcy5tKG4sbnVsbCksbD0hMH0scCh0LGUpe3MmJnMucCYmMjU2JmUmJmEocyxjLHQsdFs4XSxlLG51bGwsbnVsbCksayhuLHI9VyhvLFs0JmUmJnRbMl0sKCFsfHwyJmUpJiZ7Y2xhc3M6dFsxXX1dKSl9LGkodCl7bHx8KFEocyx0KSxsPSEwKX0sbyh0KXtWKHMsdCksbD0hMX0sZCh0KXt0JiZwKG4pLHMmJnMuZCh0KX19fWZ1bmN0aW9uIEx0KHQpe2xldCBuLGw7Y29uc3QgYz10WzldLmRlZmF1bHQscz1pKGMsdCx0WzhdLG51bGwpO2xldCBvPVt0WzJdLHtjbGFzczp0WzFdfV0scj17fTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTEpcj1lKHIsb1t0XSk7cmV0dXJue2MoKXtuPWgoImZpZWxkc2V0IikscyYmcy5jKCksayhuLHIpfSxtKHQsZSl7ZCh0LG4sZSkscyYmcy5tKG4sbnVsbCksbD0hMH0scCh0LGUpe3MmJnMucCYmMjU2JmUmJmEocyxjLHQsdFs4XSxlLG51bGwsbnVsbCksayhuLHI9VyhvLFs0JmUmJnRbMl0sKCFsfHwyJmUpJiZ7Y2xhc3M6dFsxXX1dKSl9LGkodCl7bHx8KFEocyx0KSxsPSEwKX0sbyh0KXtWKHMsdCksbD0hMX0sZCh0KXt0JiZwKG4pLHMmJnMuZCh0KX19fWZ1bmN0aW9uIFJ0KHQpe2xldCBlLG4sbCxjO2NvbnN0IHM9W0x0LFR0XSxvPVtdO2Z1bmN0aW9uIGkodCxlKXtyZXR1cm4iZmllbGRzZXQiPT09dFswXT8wOjF9cmV0dXJuIGU9aSh0KSxuPW9bZV09c1tlXSh0KSx7Yygpe24uYygpLGw9YigpfSxtKHQsbil7b1tlXS5tKHQsbiksZCh0LGwsbiksYz0hMH0scCh0LFtjXSl7bGV0IHI9ZTtlPWkodCksZT09PXI/b1tlXS5wKHQsYyk6KEgoKSxWKG9bcl0sMSwxLCgoKT0+e29bcl09bnVsbH0pKSxLKCksbj1vW2VdLG4/bi5wKHQsYyk6KG49b1tlXT1zW2VdKHQpLG4uYygpKSxRKG4sMSksbi5tKGwucGFyZW50Tm9kZSxsKSl9LGkodCl7Y3x8KFEobiksYz0hMCl9LG8odCl7VihuKSxjPSExfSxkKHQpe29bZV0uZCh0KSx0JiZwKGwpfX19ZnVuY3Rpb24gQXQodCxuLGwpe2xldCBjO2NvbnN0IHM9WyJjbGFzcyIsInJvdyIsImNoZWNrIiwiaW5saW5lIiwiZGlzYWJsZWQiLCJ0YWciXTtsZXQgbz1mKG4scykseyQkc2xvdHM6aT17fSwkJHNjb3BlOnJ9PW4se2NsYXNzOmE9IiJ9PW4se3JvdzokPSExfT1uLHtjaGVjazpkPSExfT1uLHtpbmxpbmU6cD0hMX09bix7ZGlzYWJsZWQ6bT0hMX09bix7dGFnOmg9bnVsbH09bjtyZXR1cm4gdC4kJHNldD10PT57bj1lKGUoe30sbiksdSh0KSksbCgyLG89ZihuLHMpKSwiY2xhc3MiaW4gdCYmbCgzLGE9dC5jbGFzcyksInJvdyJpbiB0JiZsKDQsJD10LnJvdyksImNoZWNrImluIHQmJmwoNSxkPXQuY2hlY2spLCJpbmxpbmUiaW4gdCYmbCg2LHA9dC5pbmxpbmUpLCJkaXNhYmxlZCJpbiB0JiZsKDcsbT10LmRpc2FibGVkKSwidGFnImluIHQmJmwoMCxoPXQudGFnKSwiJCRzY29wZSJpbiB0JiZsKDgscj10LiQkc2NvcGUpfSx0LiQkLnVwZGF0ZT0oKT0+ezI0OCZ0LiQkLmRpcnR5JiZsKDEsYz1pdChhLCEhJCYmInJvdyIsZD8iZm9ybS1jaGVjayI6ImZvcm0tZ3JvdXAiLCEoIWR8fCFwKSYmImZvcm0tY2hlY2staW5saW5lIiwhKCFkfHwhbSkmJiJkaXNhYmxlZCIpKX0sW2gsYyxvLGEsJCxkLHAsbSxyLGldfWNsYXNzIFV0IGV4dGVuZHMgbHR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSxudCh0aGlzLHQsQXQsUnQsbyx7Y2xhc3M6Myxyb3c6NCxjaGVjazo1LGlubGluZTo2LGRpc2FibGVkOjcsdGFnOjB9KX19ZnVuY3Rpb24gQnQodCl7bGV0IG4sbCxzLG87Y29uc3Qgcj10WzIyXS5kZWZhdWx0LHU9aShyLHQsdFsyMV0sbnVsbCk7bGV0IGY9W3RbMTJdLHtjbGFzczp0WzldfSx7bmFtZTp0WzZdfSx7ZGlzYWJsZWQ6dFs4XX0se3JlYWRvbmx5OnRbNF19XSwkPXt9O2ZvcihsZXQgdD0wO3Q8Zi5sZW5ndGg7dCs9MSkkPWUoJCxmW3RdKTtyZXR1cm57Yygpe249aCgic2VsZWN0IiksdSYmdS5jKCksayhuLCQpLHZvaWQgMD09PXRbMV0mJkcoKCgpPT50WzE1Ml0uY2FsbChuKSkpfSxtKGUsYyl7ZChlLG4sYyksdSYmdS5tKG4sbnVsbCksJC5tdWx0aXBsZSYmaihuLCQudmFsdWUpLF8obix0WzFdKSxsPSEwLHN8fChvPVt2KG4sImJsdXIiLHRbMTMzXSksdihuLCJmb2N1cyIsdFsxMzRdKSx2KG4sImNoYW5nZSIsdFsxMzVdKSx2KG4sImlucHV0Iix0WzEzNl0pLHYobiwiY2hhbmdlIix0WzE1Ml0pXSxzPSEwKX0scCh0LGUpe3UmJnUucCYmMjA5NzE1MiZlWzBdJiZhKHUscix0LHRbMjFdLGUsbnVsbCxudWxsKSxrKG4sJD1XKGYsWzQwOTYmZVswXSYmdFsxMl0sKCFsfHw1MTImZVswXSkmJntjbGFzczp0WzldfSwoIWx8fDY0JmVbMF0pJiZ7bmFtZTp0WzZdfSwoIWx8fDI1NiZlWzBdKSYme2Rpc2FibGVkOnRbOF19LCghbHx8MTYmZVswXSkmJntyZWFkb25seTp0WzRdfV0pKSw0OTQ0JmVbMF0mJiQubXVsdGlwbGUmJmoobiwkLnZhbHVlKSwyJmVbMF0mJl8obix0WzFdKX0saSh0KXtsfHwoUSh1LHQpLGw9ITApfSxvKHQpe1YodSx0KSxsPSExfSxkKHQpe3QmJnAobiksdSYmdS5kKHQpLHM9ITEsYyhvKX19fWZ1bmN0aW9uIEN0KG4pe2xldCBsLHMsbyxpPVtuWzEyXSx7Y2xhc3M6bls5XX0se25hbWU6bls2XX0se2Rpc2FibGVkOm5bOF19LHtwbGFjZWhvbGRlcjpuWzddfSx7cmVhZE9ubHk6bls0XX1dLHI9e307Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kz0xKXI9ZShyLGlbdF0pO3JldHVybntjKCl7bD1oKCJ0ZXh0YXJlYSIpLGsobCxyKX0sbSh0LGUpe2QodCxsLGUpLHoobCxuWzFdKSxzfHwobz1bdihsLCJibHVyIixuWzEyNl0pLHYobCwiZm9jdXMiLG5bMTI3XSksdihsLCJrZXlkb3duIixuWzEyOF0pLHYobCwia2V5cHJlc3MiLG5bMTI5XSksdihsLCJrZXl1cCIsblsxMzBdKSx2KGwsImNoYW5nZSIsblsxMzFdKSx2KGwsImlucHV0IixuWzEzMl0pLHYobCwiaW5wdXQiLG5bMTUxXSldLHM9ITApfSxwKHQsZSl7ayhsLHI9VyhpLFs0MDk2JmVbMF0mJnRbMTJdLDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119LDE2JmVbMF0mJntyZWFkT25seTp0WzRdfV0pKSwyJmVbMF0mJnoobCx0WzFdKX0saTp0LG86dCxkKHQpe3QmJnAobCkscz0hMSxjKG8pfX19ZnVuY3Rpb24gR3QoZSl7bGV0IG47ZnVuY3Rpb24gbCh0LGUpe3JldHVybiJ0ZXh0Ij09PXRbM10/WnQ6InBhc3N3b3JkIj09PXRbM10/WXQ6ImVtYWlsIj09PXRbM10/WHQ6ImZpbGUiPT09dFszXT9XdDoiY2hlY2tib3giPT09dFszXT9WdDoicmFkaW8iPT09dFszXT9RdDoidXJsIj09PXRbM10/S3Q6Im51bWJlciI9PT10WzNdP0h0OiJkYXRlIj09PXRbM10/RnQ6InRpbWUiPT09dFszXT9NdDoiZGF0ZXRpbWUiPT09dFszXT9KdDoiY29sb3IiPT09dFszXT9JdDoicmFuZ2UiPT09dFszXT9xdDoic2VhcmNoIj09PXRbM10/UHQ6RHR9bGV0IGM9bChlKSxzPWMoZSk7cmV0dXJue2MoKXtzLmMoKSxuPWIoKX0sbSh0LGUpe3MubSh0LGUpLGQodCxuLGUpfSxwKHQsZSl7Yz09PShjPWwodCkpJiZzP3MucCh0LGUpOihzLmQoMSkscz1jKHQpLHMmJihzLmMoKSxzLm0obi5wYXJlbnROb2RlLG4pKSl9LGk6dCxvOnQsZCh0KXtzLmQodCksdCYmcChuKX19fWZ1bmN0aW9uIER0KHQpe2xldCBuLGwscyxvPVt0WzEyXSx7dHlwZTp0WzNdfSx7cmVhZE9ubHk6dFs0XX0se2NsYXNzOnRbOV19LHtuYW1lOnRbNl19LHtkaXNhYmxlZDp0WzhdfSx7cGxhY2Vob2xkZXI6dFs3XX0se3ZhbHVlOnRbMV19XSxpPXt9O2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCs9MSlpPWUoaSxvW3RdKTtyZXR1cm57Yygpe249aCgiaW5wdXQiKSxrKG4saSl9LG0oZSxjKXtkKGUsbixjKSxuLnZhbHVlPWkudmFsdWUsbHx8KHM9W3YobiwiYmx1ciIsdFsxMjFdKSx2KG4sImZvY3VzIix0WzEyMl0pLHYobiwia2V5ZG93biIsdFsxMjNdKSx2KG4sImtleXByZXNzIix0WzEyNF0pLHYobiwia2V5dXAiLHRbMTI1XSksdihuLCJpbnB1dCIsdFsxMV0pLHYobiwiY2hhbmdlIix0WzExXSldLGw9ITApfSxwKHQsZSl7ayhuLGk9VyhvLFs0MDk2JmVbMF0mJnRbMTJdLDgmZVswXSYme3R5cGU6dFszXX0sMTYmZVswXSYme3JlYWRPbmx5OnRbNF19LDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119LDImZVswXSYmbi52YWx1ZSE9PXRbMV0mJnt2YWx1ZTp0WzFdfV0pKSwidmFsdWUiaW4gaSYmKG4udmFsdWU9aS52YWx1ZSl9LGQodCl7dCYmcChuKSxsPSExLGMocyl9fX1mdW5jdGlvbiBQdCh0KXtsZXQgbixsLHMsbz1bdFsxMl0se3R5cGU6InNlYXJjaCJ9LHtyZWFkT25seTp0WzRdfSx7Y2xhc3M6dFs5XX0se25hbWU6dFs2XX0se2Rpc2FibGVkOnRbOF19LHtwbGFjZWhvbGRlcjp0WzddfV0saT17fTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTEpaT1lKGksb1t0XSk7cmV0dXJue2MoKXtuPWgoImlucHV0IiksayhuLGkpfSxtKGUsYyl7ZChlLG4sYykseihuLHRbMV0pLGx8fChzPVt2KG4sImJsdXIiLHRbMTE0XSksdihuLCJmb2N1cyIsdFsxMTVdKSx2KG4sImtleWRvd24iLHRbMTE2XSksdihuLCJrZXlwcmVzcyIsdFsxMTddKSx2KG4sImtleXVwIix0WzExOF0pLHYobiwiY2hhbmdlIix0WzExOV0pLHYobiwiaW5wdXQiLHRbMTIwXSksdihuLCJpbnB1dCIsdFsxNTBdKV0sbD0hMCl9LHAodCxlKXtrKG4saT1XKG8sWzQwOTYmZVswXSYmdFsxMl0se3R5cGU6InNlYXJjaCJ9LDE2JmVbMF0mJntyZWFkT25seTp0WzRdfSw1MTImZVswXSYme2NsYXNzOnRbOV19LDY0JmVbMF0mJntuYW1lOnRbNl19LDI1NiZlWzBdJiZ7ZGlzYWJsZWQ6dFs4XX0sMTI4JmVbMF0mJntwbGFjZWhvbGRlcjp0WzddfV0pKSwyJmVbMF0mJnoobix0WzFdKX0sZCh0KXt0JiZwKG4pLGw9ITEsYyhzKX19fWZ1bmN0aW9uIHF0KHQpe2xldCBuLGwscyxvPVt0WzEyXSx7dHlwZToicmFuZ2UifSx7cmVhZE9ubHk6dFs0XX0se2NsYXNzOnRbOV19LHtuYW1lOnRbNl19LHtkaXNhYmxlZDp0WzhdfSx7cGxhY2Vob2xkZXI6dFs3XX1dLGk9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKWk9ZShpLG9bdF0pO3JldHVybntjKCl7bj1oKCJpbnB1dCIpLGsobixpKX0sbShlLGMpe2QoZSxuLGMpLHoobix0WzFdKSxsfHwocz1bdihuLCJibHVyIix0WzEwN10pLHYobiwiZm9jdXMiLHRbMTA4XSksdihuLCJrZXlkb3duIix0WzEwOV0pLHYobiwia2V5cHJlc3MiLHRbMTEwXSksdihuLCJrZXl1cCIsdFsxMTFdKSx2KG4sImNoYW5nZSIsdFsxMTJdKSx2KG4sImlucHV0Iix0WzExM10pLHYobiwiY2hhbmdlIix0WzE0OV0pLHYobiwiaW5wdXQiLHRbMTQ5XSldLGw9ITApfSxwKHQsZSl7ayhuLGk9VyhvLFs0MDk2JmVbMF0mJnRbMTJdLHt0eXBlOiJyYW5nZSJ9LDE2JmVbMF0mJntyZWFkT25seTp0WzRdfSw1MTImZVswXSYme2NsYXNzOnRbOV19LDY0JmVbMF0mJntuYW1lOnRbNl19LDI1NiZlWzBdJiZ7ZGlzYWJsZWQ6dFs4XX0sMTI4JmVbMF0mJntwbGFjZWhvbGRlcjp0WzddfV0pKSwyJmVbMF0mJnoobix0WzFdKX0sZCh0KXt0JiZwKG4pLGw9ITEsYyhzKX19fWZ1bmN0aW9uIEl0KHQpe2xldCBuLGwscyxvPVt0WzEyXSx7dHlwZToiY29sb3IifSx7cmVhZE9ubHk6dFs0XX0se2NsYXNzOnRbOV19LHtuYW1lOnRbNl19LHtkaXNhYmxlZDp0WzhdfSx7cGxhY2Vob2xkZXI6dFs3XX1dLGk9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKWk9ZShpLG9bdF0pO3JldHVybntjKCl7bj1oKCJpbnB1dCIpLGsobixpKX0sbShlLGMpe2QoZSxuLGMpLHoobix0WzFdKSxsfHwocz1bdihuLCJibHVyIix0WzEwMF0pLHYobiwiZm9jdXMiLHRbMTAxXSksdihuLCJrZXlkb3duIix0WzEwMl0pLHYobiwia2V5cHJlc3MiLHRbMTAzXSksdihuLCJrZXl1cCIsdFsxMDRdKSx2KG4sImNoYW5nZSIsdFsxMDVdKSx2KG4sImlucHV0Iix0WzEwNl0pLHYobiwiaW5wdXQiLHRbMTQ4XSldLGw9ITApfSxwKHQsZSl7ayhuLGk9VyhvLFs0MDk2JmVbMF0mJnRbMTJdLHt0eXBlOiJjb2xvciJ9LDE2JmVbMF0mJntyZWFkT25seTp0WzRdfSw1MTImZVswXSYme2NsYXNzOnRbOV19LDY0JmVbMF0mJntuYW1lOnRbNl19LDI1NiZlWzBdJiZ7ZGlzYWJsZWQ6dFs4XX0sMTI4JmVbMF0mJntwbGFjZWhvbGRlcjp0WzddfV0pKSwyJmVbMF0mJnoobix0WzFdKX0sZCh0KXt0JiZwKG4pLGw9ITEsYyhzKX19fWZ1bmN0aW9uIEp0KHQpe2xldCBuLGwscyxvPVt0WzEyXSx7dHlwZToiZGF0ZXRpbWUifSx7cmVhZE9ubHk6dFs0XX0se2NsYXNzOnRbOV19LHtuYW1lOnRbNl19LHtkaXNhYmxlZDp0WzhdfSx7cGxhY2Vob2xkZXI6dFs3XX1dLGk9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKWk9ZShpLG9bdF0pO3JldHVybntjKCl7bj1oKCJpbnB1dCIpLGsobixpKX0sbShlLGMpe2QoZSxuLGMpLHoobix0WzFdKSxsfHwocz1bdihuLCJibHVyIix0WzkzXSksdihuLCJmb2N1cyIsdFs5NF0pLHYobiwia2V5ZG93biIsdFs5NV0pLHYobiwia2V5cHJlc3MiLHRbOTZdKSx2KG4sImtleXVwIix0Wzk3XSksdihuLCJjaGFuZ2UiLHRbOThdKSx2KG4sImlucHV0Iix0Wzk5XSksdihuLCJpbnB1dCIsdFsxNDddKV0sbD0hMCl9LHAodCxlKXtrKG4saT1XKG8sWzQwOTYmZVswXSYmdFsxMl0se3R5cGU6ImRhdGV0aW1lIn0sMTYmZVswXSYme3JlYWRPbmx5OnRbNF19LDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119XSkpLDImZVswXSYmeihuLHRbMV0pfSxkKHQpe3QmJnAobiksbD0hMSxjKHMpfX19ZnVuY3Rpb24gTXQodCl7bGV0IG4sbCxzLG89W3RbMTJdLHt0eXBlOiJ0aW1lIn0se3JlYWRPbmx5OnRbNF19LHtjbGFzczp0WzldfSx7bmFtZTp0WzZdfSx7ZGlzYWJsZWQ6dFs4XX0se3BsYWNlaG9sZGVyOnRbN119XSxpPXt9O2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCs9MSlpPWUoaSxvW3RdKTtyZXR1cm57Yygpe249aCgiaW5wdXQiKSxrKG4saSl9LG0oZSxjKXtkKGUsbixjKSx6KG4sdFsxXSksbHx8KHM9W3YobiwiYmx1ciIsdFs4Nl0pLHYobiwiZm9jdXMiLHRbODddKSx2KG4sImtleWRvd24iLHRbODhdKSx2KG4sImtleXByZXNzIix0Wzg5XSksdihuLCJrZXl1cCIsdFs5MF0pLHYobiwiY2hhbmdlIix0WzkxXSksdihuLCJpbnB1dCIsdFs5Ml0pLHYobiwiaW5wdXQiLHRbMTQ2XSldLGw9ITApfSxwKHQsZSl7ayhuLGk9VyhvLFs0MDk2JmVbMF0mJnRbMTJdLHt0eXBlOiJ0aW1lIn0sMTYmZVswXSYme3JlYWRPbmx5OnRbNF19LDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119XSkpLDImZVswXSYmeihuLHRbMV0pfSxkKHQpe3QmJnAobiksbD0hMSxjKHMpfX19ZnVuY3Rpb24gRnQodCl7bGV0IG4sbCxzLG89W3RbMTJdLHt0eXBlOiJkYXRlIn0se3JlYWRPbmx5OnRbNF19LHtjbGFzczp0WzldfSx7bmFtZTp0WzZdfSx7ZGlzYWJsZWQ6dFs4XX0se3BsYWNlaG9sZGVyOnRbN119XSxpPXt9O2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCs9MSlpPWUoaSxvW3RdKTtyZXR1cm57Yygpe249aCgiaW5wdXQiKSxrKG4saSl9LG0oZSxjKXtkKGUsbixjKSx6KG4sdFsxXSksbHx8KHM9W3YobiwiYmx1ciIsdFs3OV0pLHYobiwiZm9jdXMiLHRbODBdKSx2KG4sImtleWRvd24iLHRbODFdKSx2KG4sImtleXByZXNzIix0WzgyXSksdihuLCJrZXl1cCIsdFs4M10pLHYobiwiY2hhbmdlIix0Wzg0XSksdihuLCJpbnB1dCIsdFs4NV0pLHYobiwiaW5wdXQiLHRbMTQ1XSldLGw9ITApfSxwKHQsZSl7ayhuLGk9VyhvLFs0MDk2JmVbMF0mJnRbMTJdLHt0eXBlOiJkYXRlIn0sMTYmZVswXSYme3JlYWRPbmx5OnRbNF19LDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119XSkpLDImZVswXSYmeihuLHRbMV0pfSxkKHQpe3QmJnAobiksbD0hMSxjKHMpfX19ZnVuY3Rpb24gSHQodCl7bGV0IG4sbCxzLG89W3RbMTJdLHt0eXBlOiJudW1iZXIifSx7cmVhZE9ubHk6dFs0XX0se2NsYXNzOnRbOV19LHtuYW1lOnRbNl19LHtkaXNhYmxlZDp0WzhdfSx7cGxhY2Vob2xkZXI6dFs3XX1dLGk9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKWk9ZShpLG9bdF0pO3JldHVybntjKCl7bj1oKCJpbnB1dCIpLGsobixpKX0sbShlLGMpe2QoZSxuLGMpLHoobix0WzFdKSxsfHwocz1bdihuLCJibHVyIix0WzcyXSksdihuLCJmb2N1cyIsdFs3M10pLHYobiwia2V5ZG93biIsdFs3NF0pLHYobiwia2V5cHJlc3MiLHRbNzVdKSx2KG4sImtleXVwIix0Wzc2XSksdihuLCJjaGFuZ2UiLHRbNzddKSx2KG4sImlucHV0Iix0Wzc4XSksdihuLCJpbnB1dCIsdFsxNDRdKV0sbD0hMCl9LHAodCxlKXtrKG4saT1XKG8sWzQwOTYmZVswXSYmdFsxMl0se3R5cGU6Im51bWJlciJ9LDE2JmVbMF0mJntyZWFkT25seTp0WzRdfSw1MTImZVswXSYme2NsYXNzOnRbOV19LDY0JmVbMF0mJntuYW1lOnRbNl19LDI1NiZlWzBdJiZ7ZGlzYWJsZWQ6dFs4XX0sMTI4JmVbMF0mJntwbGFjZWhvbGRlcjp0WzddfV0pKSwyJmVbMF0mJncobi52YWx1ZSkhPT10WzFdJiZ6KG4sdFsxXSl9LGQodCl7dCYmcChuKSxsPSExLGMocyl9fX1mdW5jdGlvbiBLdCh0KXtsZXQgbixsLHMsbz1bdFsxMl0se3R5cGU6InVybCJ9LHtyZWFkT25seTp0WzRdfSx7Y2xhc3M6dFs5XX0se25hbWU6dFs2XX0se2Rpc2FibGVkOnRbOF19LHtwbGFjZWhvbGRlcjp0WzddfV0saT17fTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTEpaT1lKGksb1t0XSk7cmV0dXJue2MoKXtuPWgoImlucHV0IiksayhuLGkpfSxtKGUsYyl7ZChlLG4sYykseihuLHRbMV0pLGx8fChzPVt2KG4sImJsdXIiLHRbNjVdKSx2KG4sImZvY3VzIix0WzY2XSksdihuLCJrZXlkb3duIix0WzY3XSksdihuLCJrZXlwcmVzcyIsdFs2OF0pLHYobiwia2V5dXAiLHRbNjldKSx2KG4sImNoYW5nZSIsdFs3MF0pLHYobiwiaW5wdXQiLHRbNzFdKSx2KG4sImlucHV0Iix0WzE0M10pXSxsPSEwKX0scCh0LGUpe2sobixpPVcobyxbNDA5NiZlWzBdJiZ0WzEyXSx7dHlwZToidXJsIn0sMTYmZVswXSYme3JlYWRPbmx5OnRbNF19LDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119XSkpLDImZVswXSYmeihuLHRbMV0pfSxkKHQpe3QmJnAobiksbD0hMSxjKHMpfX19ZnVuY3Rpb24gUXQodCl7bGV0IG4sbCxzLG89W3RbMTJdLHt0eXBlOiJyYWRpbyJ9LHtyZWFkT25seTp0WzRdfSx7Y2xhc3M6dFs5XX0se25hbWU6dFs2XX0se2Rpc2FibGVkOnRbOF19LHtwbGFjZWhvbGRlcjp0WzddfV0saT17fTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTEpaT1lKGksb1t0XSk7cmV0dXJue2MoKXtuPWgoImlucHV0IiksayhuLGkpfSxtKGUsYyl7ZChlLG4sYykseihuLHRbMV0pLGx8fChzPVt2KG4sImJsdXIiLHRbNThdKSx2KG4sImZvY3VzIix0WzU5XSksdihuLCJrZXlkb3duIix0WzYwXSksdihuLCJrZXlwcmVzcyIsdFs2MV0pLHYobiwia2V5dXAiLHRbNjJdKSx2KG4sImNoYW5nZSIsdFs2M10pLHYobiwiaW5wdXQiLHRbNjRdKSx2KG4sImNoYW5nZSIsdFsxNDJdKV0sbD0hMCl9LHAodCxlKXtrKG4saT1XKG8sWzQwOTYmZVswXSYmdFsxMl0se3R5cGU6InJhZGlvIn0sMTYmZVswXSYme3JlYWRPbmx5OnRbNF19LDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119XSkpLDImZVswXSYmeihuLHRbMV0pfSxkKHQpe3QmJnAobiksbD0hMSxjKHMpfX19ZnVuY3Rpb24gVnQodCl7bGV0IG4sbCxzLG89W3RbMTJdLHt0eXBlOiJjaGVja2JveCJ9LHtyZWFkT25seTp0WzRdfSx7Y2xhc3M6dFs5XX0se25hbWU6dFs2XX0se2Rpc2FibGVkOnRbOF19LHtwbGFjZWhvbGRlcjp0WzddfV0saT17fTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTEpaT1lKGksb1t0XSk7cmV0dXJue2MoKXtuPWgoImlucHV0IiksayhuLGkpfSxtKGUsYyl7ZChlLG4sYyksbi5jaGVja2VkPXRbMF0seihuLHRbMV0pLGx8fChzPVt2KG4sImJsdXIiLHRbNTFdKSx2KG4sImZvY3VzIix0WzUyXSksdihuLCJrZXlkb3duIix0WzUzXSksdihuLCJrZXlwcmVzcyIsdFs1NF0pLHYobiwia2V5dXAiLHRbNTVdKSx2KG4sImNoYW5nZSIsdFs1Nl0pLHYobiwiaW5wdXQiLHRbNTddKSx2KG4sImNoYW5nZSIsdFsxNDFdKV0sbD0hMCl9LHAodCxlKXtrKG4saT1XKG8sWzQwOTYmZVswXSYmdFsxMl0se3R5cGU6ImNoZWNrYm94In0sMTYmZVswXSYme3JlYWRPbmx5OnRbNF19LDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119XSkpLDEmZVswXSYmKG4uY2hlY2tlZD10WzBdKSwyJmVbMF0mJnoobix0WzFdKX0sZCh0KXt0JiZwKG4pLGw9ITEsYyhzKX19fWZ1bmN0aW9uIFd0KHQpe2xldCBuLGwscyxvPVt0WzEyXSx7dHlwZToiZmlsZSJ9LHtyZWFkT25seTp0WzRdfSx7Y2xhc3M6dFs5XX0se25hbWU6dFs2XX0se2Rpc2FibGVkOnRbOF19LHtwbGFjZWhvbGRlcjp0WzddfV0saT17fTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTEpaT1lKGksb1t0XSk7cmV0dXJue2MoKXtuPWgoImlucHV0IiksayhuLGkpfSxtKGUsYyl7ZChlLG4sYyksbHx8KHM9W3YobiwiYmx1ciIsdFs0NF0pLHYobiwiZm9jdXMiLHRbNDVdKSx2KG4sImtleWRvd24iLHRbNDZdKSx2KG4sImtleXByZXNzIix0WzQ3XSksdihuLCJrZXl1cCIsdFs0OF0pLHYobiwiY2hhbmdlIix0WzQ5XSksdihuLCJpbnB1dCIsdFs1MF0pLHYobiwiY2hhbmdlIix0WzE0MF0pXSxsPSEwKX0scCh0LGUpe2sobixpPVcobyxbNDA5NiZlWzBdJiZ0WzEyXSx7dHlwZToiZmlsZSJ9LDE2JmVbMF0mJntyZWFkT25seTp0WzRdfSw1MTImZVswXSYme2NsYXNzOnRbOV19LDY0JmVbMF0mJntuYW1lOnRbNl19LDI1NiZlWzBdJiZ7ZGlzYWJsZWQ6dFs4XX0sMTI4JmVbMF0mJntwbGFjZWhvbGRlcjp0WzddfV0pKX0sZCh0KXt0JiZwKG4pLGw9ITEsYyhzKX19fWZ1bmN0aW9uIFh0KHQpe2xldCBuLGwscyxvPVt0WzEyXSx7dHlwZToiZW1haWwifSx7cmVhZE9ubHk6dFs0XX0se2NsYXNzOnRbOV19LHtuYW1lOnRbNl19LHtkaXNhYmxlZDp0WzhdfSx7cGxhY2Vob2xkZXI6dFs3XX1dLGk9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKWk9ZShpLG9bdF0pO3JldHVybntjKCl7bj1oKCJpbnB1dCIpLGsobixpKX0sbShlLGMpe2QoZSxuLGMpLHoobix0WzFdKSxsfHwocz1bdihuLCJibHVyIix0WzM3XSksdihuLCJmb2N1cyIsdFszOF0pLHYobiwia2V5ZG93biIsdFszOV0pLHYobiwia2V5cHJlc3MiLHRbNDBdKSx2KG4sImtleXVwIix0WzQxXSksdihuLCJjaGFuZ2UiLHRbNDJdKSx2KG4sImlucHV0Iix0WzQzXSksdihuLCJpbnB1dCIsdFsxMzldKV0sbD0hMCl9LHAodCxlKXtrKG4saT1XKG8sWzQwOTYmZVswXSYmdFsxMl0se3R5cGU6ImVtYWlsIn0sMTYmZVswXSYme3JlYWRPbmx5OnRbNF19LDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119XSkpLDImZVswXSYmbi52YWx1ZSE9PXRbMV0mJnoobix0WzFdKX0sZCh0KXt0JiZwKG4pLGw9ITEsYyhzKX19fWZ1bmN0aW9uIFl0KHQpe2xldCBuLGwscyxvPVt0WzEyXSx7dHlwZToicGFzc3dvcmQifSx7cmVhZE9ubHk6dFs0XX0se2NsYXNzOnRbOV19LHtuYW1lOnRbNl19LHtkaXNhYmxlZDp0WzhdfSx7cGxhY2Vob2xkZXI6dFs3XX1dLGk9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKWk9ZShpLG9bdF0pO3JldHVybntjKCl7bj1oKCJpbnB1dCIpLGsobixpKX0sbShlLGMpe2QoZSxuLGMpLHoobix0WzFdKSxsfHwocz1bdihuLCJibHVyIix0WzMwXSksdihuLCJmb2N1cyIsdFszMV0pLHYobiwia2V5ZG93biIsdFszMl0pLHYobiwia2V5cHJlc3MiLHRbMzNdKSx2KG4sImtleXVwIix0WzM0XSksdihuLCJjaGFuZ2UiLHRbMzVdKSx2KG4sImlucHV0Iix0WzM2XSksdihuLCJpbnB1dCIsdFsxMzhdKV0sbD0hMCl9LHAodCxlKXtrKG4saT1XKG8sWzQwOTYmZVswXSYmdFsxMl0se3R5cGU6InBhc3N3b3JkIn0sMTYmZVswXSYme3JlYWRPbmx5OnRbNF19LDUxMiZlWzBdJiZ7Y2xhc3M6dFs5XX0sNjQmZVswXSYme25hbWU6dFs2XX0sMjU2JmVbMF0mJntkaXNhYmxlZDp0WzhdfSwxMjgmZVswXSYme3BsYWNlaG9sZGVyOnRbN119XSkpLDImZVswXSYmbi52YWx1ZSE9PXRbMV0mJnoobix0WzFdKX0sZCh0KXt0JiZwKG4pLGw9ITEsYyhzKX19fWZ1bmN0aW9uIFp0KHQpe2xldCBuLGwscyxvPVt0WzEyXSx7dHlwZToidGV4dCJ9LHtyZWFkT25seTp0WzRdfSx7Y2xhc3M6dFs5XX0se25hbWU6dFs2XX0se2Rpc2FibGVkOnRbOF19LHtwbGFjZWhvbGRlcjp0WzddfV0saT17fTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTEpaT1lKGksb1t0XSk7cmV0dXJue2MoKXtuPWgoImlucHV0IiksayhuLGkpfSxtKGUsYyl7ZChlLG4sYykseihuLHRbMV0pLGx8fChzPVt2KG4sImJsdXIiLHRbMjNdKSx2KG4sImZvY3VzIix0WzI0XSksdihuLCJrZXlkb3duIix0WzI1XSksdihuLCJrZXlwcmVzcyIsdFsyNl0pLHYobiwia2V5dXAiLHRbMjddKSx2KG4sImNoYW5nZSIsdFsyOF0pLHYobiwiaW5wdXQiLHRbMjldKSx2KG4sImlucHV0Iix0WzEzN10pXSxsPSEwKX0scCh0LGUpe2sobixpPVcobyxbNDA5NiZlWzBdJiZ0WzEyXSx7dHlwZToidGV4dCJ9LDE2JmVbMF0mJntyZWFkT25seTp0WzRdfSw1MTImZVswXSYme2NsYXNzOnRbOV19LDY0JmVbMF0mJntuYW1lOnRbNl19LDI1NiZlWzBdJiZ7ZGlzYWJsZWQ6dFs4XX0sMTI4JmVbMF0mJntwbGFjZWhvbGRlcjp0WzddfV0pKSwyJmVbMF0mJm4udmFsdWUhPT10WzFdJiZ6KG4sdFsxXSl9LGQodCl7dCYmcChuKSxsPSExLGMocyl9fX1mdW5jdGlvbiB0ZSh0KXtsZXQgZSxuLGwsYztjb25zdCBzPVtHdCxDdCxCdF0sbz1bXTtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuImlucHV0Ij09PXRbMTBdPzA6InRleHRhcmVhIj09PXRbMTBdPzE6InNlbGVjdCIhPT10WzEwXXx8dFs1XT8tMToyfXJldHVybn4oZT1pKHQpKSYmKG49b1tlXT1zW2VdKHQpKSx7Yygpe24mJm4uYygpLGw9YigpfSxtKHQsbil7fmUmJm9bZV0ubSh0LG4pLGQodCxsLG4pLGM9ITB9LHAodCxjKXtsZXQgcj1lO2U9aSh0KSxlPT09cj9+ZSYmb1tlXS5wKHQsYyk6KG4mJihIKCksVihvW3JdLDEsMSwoKCk9PntvW3JdPW51bGx9KSksSygpKSx+ZT8obj1vW2VdLG4/bi5wKHQsYyk6KG49b1tlXT1zW2VdKHQpLG4uYygpKSxRKG4sMSksbi5tKGwucGFyZW50Tm9kZSxsKSk6bj1udWxsKX0saSh0KXtjfHwoUShuKSxjPSEwKX0sbyh0KXtWKG4pLGM9ITF9LGQodCl7fmUmJm9bZV0uZCh0KSx0JiZwKGwpfX19ZnVuY3Rpb24gZWUodCxuLGwpe2NvbnN0IGM9WyJjbGFzcyIsInR5cGUiLCJzaXplIiwiYnNTaXplIiwiY29sb3IiLCJjaGVja2VkIiwidmFsaWQiLCJpbnZhbGlkIiwicGxhaW50ZXh0IiwiYWRkb24iLCJ2YWx1ZSIsImZpbGVzIiwicmVhZG9ubHkiLCJtdWx0aXBsZSIsIm5hbWUiLCJwbGFjZWhvbGRlciIsImRpc2FibGVkIl07bGV0IHMsbyxpPWYobixjKSx7JCRzbG90czpyPXt9LCQkc2NvcGU6YX09bix7Y2xhc3M6JD0iIn09bix7dHlwZTpkPSJ0ZXh0In09bix7c2l6ZTpwfT1uLHtic1NpemU6bX09bix7Y29sb3I6aH09bix7Y2hlY2tlZDpnPSExfT1uLHt2YWxpZDp5PSExfT1uLHtpbnZhbGlkOmI9ITF9PW4se3BsYWludGV4dDp2PSExfT1uLHthZGRvbjp4PSExfT1uLHt2YWx1ZTprPSIifT1uLHtmaWxlczpPPSIifT1uLHtyZWFkb25seTp6fT1uLHttdWx0aXBsZTpffT1uLHtuYW1lOmo9IiJ9PW4se3BsYWNlaG9sZGVyOk49IiJ9PW4se2Rpc2FibGVkOlN9PW47cmV0dXJuIHQuJCRzZXQ9dD0+e249ZShlKHt9LG4pLHUodCkpLGwoMTIsaT1mKG4sYykpLCJjbGFzcyJpbiB0JiZsKDE1LCQ9dC5jbGFzcyksInR5cGUiaW4gdCYmbCgzLGQ9dC50eXBlKSwic2l6ZSJpbiB0JiZsKDEzLHA9dC5zaXplKSwiYnNTaXplImluIHQmJmwoMTQsbT10LmJzU2l6ZSksImNvbG9yImluIHQmJmwoMTYsaD10LmNvbG9yKSwiY2hlY2tlZCJpbiB0JiZsKDAsZz10LmNoZWNrZWQpLCJ2YWxpZCJpbiB0JiZsKDE3LHk9dC52YWxpZCksImludmFsaWQiaW4gdCYmbCgxOCxiPXQuaW52YWxpZCksInBsYWludGV4dCJpbiB0JiZsKDE5LHY9dC5wbGFpbnRleHQpLCJhZGRvbiJpbiB0JiZsKDIwLHg9dC5hZGRvbiksInZhbHVlImluIHQmJmwoMSxrPXQudmFsdWUpLCJmaWxlcyJpbiB0JiZsKDIsTz10LmZpbGVzKSwicmVhZG9ubHkiaW4gdCYmbCg0LHo9dC5yZWFkb25seSksIm11bHRpcGxlImluIHQmJmwoNSxfPXQubXVsdGlwbGUpLCJuYW1lImluIHQmJmwoNixqPXQubmFtZSksInBsYWNlaG9sZGVyImluIHQmJmwoNyxOPXQucGxhY2Vob2xkZXIpLCJkaXNhYmxlZCJpbiB0JiZsKDgsUz10LmRpc2FibGVkKSwiJCRzY29wZSJpbiB0JiZsKDIxLGE9dC4kJHNjb3BlKX0sdC4kJC51cGRhdGU9KCk9PntpZigyMDg4OTY4JnQuJCQuZGlydHlbMF0pe2NvbnN0IHQ9WyJyYWRpbyIsImNoZWNrYm94Il0uaW5kZXhPZihkKT4tMSxlPW5ldyBSZWdFeHAoIlxcRCIsImciKSxuPSJmaWxlIj09PWQsYz0idGV4dGFyZWEiPT09ZCxpPSJyYW5nZSI9PT1kLHI9ImJ1dHRvbiI9PT1kfHwicmVzZXQiPT09ZHx8InN1Ym1pdCI9PT1kLGE9ImhpZGRlbiI9PT1kfHwiaW1hZ2UiPT09ZDtsKDEwLG89InNlbGVjdCI9PT1kfHxjP2Q6ImlucHV0Iik7bGV0IHU9ImZvcm0tY29udHJvbCI7dj8odT1gJHt1fS1wbGFpbnRleHRgLGwoMTAsbz0iaW5wdXQiKSk6bj91PWAke3V9LWZpbGVgOnQ/dT14P251bGw6ImZvcm0tY2hlY2staW5wdXQiOnI/dT1gYnRuIGJ0bi0ke2h8fCJzZWNvbmRhcnkifWA6aT91PSJmb3JtLWNvbnRyb2wtcmFuZ2UiOmEmJih1PSIiKSxwJiZlLnRlc3QocCkmJihjb25zb2xlLndhcm4oJ1BsZWFzZSB1c2UgdGhlIHByb3AgImJzU2l6ZSIgaW5zdGVhZCBvZiB0aGUgInNpemUiIHRvIGJvb3RzdHJhcFwncyBpbnB1dCBzaXppbmcuJyksbCgxNCxtPXApLGwoMTMscD12b2lkIDApKSxsKDkscz1pdCgkLGImJiJpcy1pbnZhbGlkIix5JiYiaXMtdmFsaWQiLCEhbSYmYGZvcm0tY29udHJvbC0ke219YCx1KSl9fSxbZyxrLE8sZCx6LF8saixOLFMscyxvLHQ9PntsKDEsaz10LnRhcmdldC52YWx1ZSl9LGkscCxtLCQsaCx5LGIsdix4LGEscixmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbihlKXtUKHQsZSl9LGZ1bmN0aW9uKGUpe1QodCxlKX0sZnVuY3Rpb24oZSl7VCh0LGUpfSxmdW5jdGlvbigpe2s9dGhpcy52YWx1ZSxsKDEsayl9LGZ1bmN0aW9uKCl7az10aGlzLnZhbHVlLGwoMSxrKX0sZnVuY3Rpb24oKXtrPXRoaXMudmFsdWUsbCgxLGspfSxmdW5jdGlvbigpe089dGhpcy5maWxlcyxsKDIsTyl9LGZ1bmN0aW9uKCl7Zz10aGlzLmNoZWNrZWQsaz10aGlzLnZhbHVlLGwoMCxnKSxsKDEsayl9LGZ1bmN0aW9uKCl7az10aGlzLnZhbHVlLGwoMSxrKX0sZnVuY3Rpb24oKXtrPXRoaXMudmFsdWUsbCgxLGspfSxmdW5jdGlvbigpe2s9dyh0aGlzLnZhbHVlKSxsKDEsayl9LGZ1bmN0aW9uKCl7az10aGlzLnZhbHVlLGwoMSxrKX0sZnVuY3Rpb24oKXtrPXRoaXMudmFsdWUsbCgxLGspfSxmdW5jdGlvbigpe2s9dGhpcy52YWx1ZSxsKDEsayl9LGZ1bmN0aW9uKCl7az10aGlzLnZhbHVlLGwoMSxrKX0sZnVuY3Rpb24oKXtrPXcodGhpcy52YWx1ZSksbCgxLGspfSxmdW5jdGlvbigpe2s9dGhpcy52YWx1ZSxsKDEsayl9LGZ1bmN0aW9uKCl7az10aGlzLnZhbHVlLGwoMSxrKX0sZnVuY3Rpb24oKXtrPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5xdWVyeVNlbGVjdG9yKCI6Y2hlY2tlZCIpfHx0Lm9wdGlvbnNbMF07cmV0dXJuIGUmJmUuX192YWx1ZX0odGhpcyksbCgxLGspfV19Y2xhc3MgbmUgZXh0ZW5kcyBsdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLG50KHRoaXMsdCxlZSx0ZSxvLHtjbGFzczoxNSx0eXBlOjMsc2l6ZToxMyxic1NpemU6MTQsY29sb3I6MTYsY2hlY2tlZDowLHZhbGlkOjE3LGludmFsaWQ6MTgscGxhaW50ZXh0OjE5LGFkZG9uOjIwLHZhbHVlOjEsZmlsZXM6MixyZWFkb25seTo0LG11bHRpcGxlOjUsbmFtZTo2LHBsYWNlaG9sZGVyOjcsZGlzYWJsZWQ6OH0sWy0xLC0xLC0xLC0xLC0xXSl9fWZ1bmN0aW9uIGxlKHQpe2xldCBuLGw7Y29uc3QgYz10WzE0XS5kZWZhdWx0LHM9aShjLHQsdFsxM10sbnVsbCk7bGV0IG89W3RbMl0se2NsYXNzOnRbMV19LHtmb3I6dFswXX1dLHI9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKXI9ZShyLG9bdF0pO3JldHVybntjKCl7bj1oKCJsYWJlbCIpLHMmJnMuYygpLGsobixyKX0sbSh0LGUpe2QodCxuLGUpLHMmJnMubShuLG51bGwpLGw9ITB9LHAodCxbZV0pe3MmJnMucCYmODE5MiZlJiZhKHMsYyx0LHRbMTNdLGUsbnVsbCxudWxsKSxrKG4scj1XKG8sWzQmZSYmdFsyXSwoIWx8fDImZSkmJntjbGFzczp0WzFdfSwoIWx8fDEmZSkmJntmb3I6dFswXX1dKSl9LGkodCl7bHx8KFEocyx0KSxsPSEwKX0sbyh0KXtWKHMsdCksbD0hMX0sZCh0KXt0JiZwKG4pLHMmJnMuZCh0KX19fWZ1bmN0aW9uIGNlKHQsbixsKXtsZXQgYztjb25zdCBzPVsiY2xhc3MiLCJoaWRkZW4iLCJjaGVjayIsInNpemUiLCJmb3IiLCJ4cyIsInNtIiwibWQiLCJsZyIsInhsIiwid2lkdGhzIl07bGV0IG89ZihuLHMpLHskJHNsb3RzOmk9e30sJCRzY29wZTpyfT1uLHtjbGFzczphPSIifT1uLHtoaWRkZW46JD0hMX09bix7Y2hlY2s6ZD0hMX09bix7c2l6ZTpwPSIifT1uLHtmb3I6bT1udWxsfT1uLHt4czpoPSIifT1uLHtzbTpnPSIifT1uLHttZDp5PSIifT1uLHtsZzpiPSIifT1uLHt4bDp2PSIifT1uO2NvbnN0IHg9e3hzOmgsc206ZyxtZDp5LGxnOmIseGw6dn07bGV0e3dpZHRoczprPU9iamVjdC5rZXlzKHgpfT1uO2NvbnN0IHc9W107cmV0dXJuIGsuZm9yRWFjaCgodD0+e2xldCBlPW5bdF07aWYoIWUmJiIiIT09ZSlyZXR1cm47Y29uc3QgbD0ieHMiPT09dDtsZXQgYztpZihjdChlKSl7Y29uc3Qgbj1sPyItIjpgLSR7dH0tYDtjPXN0KGwsdCxlLnNpemUpLHcucHVzaChpdCh7W2NdOmUuc2l6ZXx8IiI9PT1lLnNpemUsW2BvcmRlciR7bn0ke2Uub3JkZXJ9YF06ZS5vcmRlcnx8MD09PWUub3JkZXIsW2BvZmZzZXQke259JHtlLm9mZnNldH1gXTplLm9mZnNldHx8MD09PWUub2Zmc2V0fSkpfWVsc2UgYz1zdChsLHQsZSksdy5wdXNoKGMpfSkpLHQuJCRzZXQ9dD0+e2woMTcsbj1lKGUoe30sbiksdSh0KSkpLGwoMixvPWYobixzKSksImNsYXNzImluIHQmJmwoMyxhPXQuY2xhc3MpLCJoaWRkZW4iaW4gdCYmbCg0LCQ9dC5oaWRkZW4pLCJjaGVjayJpbiB0JiZsKDUsZD10LmNoZWNrKSwic2l6ZSJpbiB0JiZsKDYscD10LnNpemUpLCJmb3IiaW4gdCYmbCgwLG09dC5mb3IpLCJ4cyJpbiB0JiZsKDcsaD10LnhzKSwic20iaW4gdCYmbCg4LGc9dC5zbSksIm1kImluIHQmJmwoOSx5PXQubWQpLCJsZyJpbiB0JiZsKDEwLGI9dC5sZyksInhsImluIHQmJmwoMTEsdj10LnhsKSwid2lkdGhzImluIHQmJmwoMTIsaz10LndpZHRocyksIiQkc2NvcGUiaW4gdCYmbCgxMyxyPXQuJCRzY29wZSl9LHQuJCQudXBkYXRlPSgpPT57MTIwJnQuJCQuZGlydHkmJmwoMSxjPWl0KGEsISEkJiYic3Itb25seSIsISFkJiYiZm9ybS1jaGVjay1sYWJlbCIsISFwJiZgY29sLWZvcm0tbGFiZWwtJHtwfWAsdywhIXcubGVuZ3RoJiYiY29sLWZvcm0tbGFiZWwiKSl9LG49dShuKSxbbSxjLG8sYSwkLGQscCxoLGcseSxiLHYsayxyLGldfWNsYXNzIHNlIGV4dGVuZHMgbHR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSxudCh0aGlzLHQsY2UsbGUsbyx7Y2xhc3M6MyxoaWRkZW46NCxjaGVjazo1LHNpemU6Nixmb3I6MCx4czo3LHNtOjgsbWQ6OSxsZzoxMCx4bDoxMSx3aWR0aHM6MTJ9KX19ZnVuY3Rpb24gb2UodCl7bGV0IG4sbDtjb25zdCBjPXRbNV0uZGVmYXVsdCxzPWkoYyx0LHRbNF0sbnVsbCk7bGV0IG89W3RbMV0se2NsYXNzOnRbMF19XSxyPXt9O2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCs9MSlyPWUocixvW3RdKTtyZXR1cm57Yygpe249aCgidWwiKSxzJiZzLmMoKSxrKG4scil9LG0odCxlKXtkKHQsbixlKSxzJiZzLm0obixudWxsKSxsPSEwfSxwKHQsW2VdKXtzJiZzLnAmJjE2JmUmJmEocyxjLHQsdFs0XSxlLG51bGwsbnVsbCksayhuLHI9VyhvLFsyJmUmJnRbMV0sKCFsfHwxJmUpJiZ7Y2xhc3M6dFswXX1dKSl9LGkodCl7bHx8KFEocyx0KSxsPSEwKX0sbyh0KXtWKHMsdCksbD0hMX0sZCh0KXt0JiZwKG4pLHMmJnMuZCh0KX19fWZ1bmN0aW9uIGllKHQsbixsKXtsZXQgYztjb25zdCBzPVsiY2xhc3MiLCJmbHVzaCJdO2xldCBvPWYobixzKSx7JCRzbG90czppPXt9LCQkc2NvcGU6cn09bix7Y2xhc3M6YT0iIn09bix7Zmx1c2g6JD0hMX09bjtyZXR1cm4gdC4kJHNldD10PT57bj1lKGUoe30sbiksdSh0KSksbCgxLG89ZihuLHMpKSwiY2xhc3MiaW4gdCYmbCgyLGE9dC5jbGFzcyksImZsdXNoImluIHQmJmwoMywkPXQuZmx1c2gpLCIkJHNjb3BlImluIHQmJmwoNCxyPXQuJCRzY29wZSl9LHQuJCQudXBkYXRlPSgpPT57MTImdC4kJC5kaXJ0eSYmbCgwLGM9aXQoYSwibGlzdC1ncm91cCIsISEkJiYibGlzdC1ncm91cC1mbHVzaCIpKX0sW2MsbyxhLCQscixpXX1jbGFzcyByZSBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksbnQodGhpcyx0LGllLG9lLG8se2NsYXNzOjIsZmx1c2g6M30pfX1mdW5jdGlvbiBhZSh0KXtsZXQgbixsO2NvbnN0IGM9dFsxMF0uZGVmYXVsdCxzPWkoYyx0LHRbOV0sbnVsbCk7bGV0IG89W3RbNV0se2NsYXNzOnRbNF19LHtkaXNhYmxlZDp0WzFdfSx7YWN0aXZlOnRbMF19XSxyPXt9O2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCs9MSlyPWUocixvW3RdKTtyZXR1cm57Yygpe249aCgibGkiKSxzJiZzLmMoKSxrKG4scil9LG0odCxlKXtkKHQsbixlKSxzJiZzLm0obixudWxsKSxsPSEwfSxwKHQsZSl7cyYmcy5wJiY1MTImZSYmYShzLGMsdCx0WzldLGUsbnVsbCxudWxsKSxrKG4scj1XKG8sWzMyJmUmJnRbNV0sKCFsfHwxNiZlKSYme2NsYXNzOnRbNF19LCghbHx8MiZlKSYme2Rpc2FibGVkOnRbMV19LCghbHx8MSZlKSYme2FjdGl2ZTp0WzBdfV0pKX0saSh0KXtsfHwoUShzLHQpLGw9ITApfSxvKHQpe1Yocyx0KSxsPSExfSxkKHQpe3QmJnAobikscyYmcy5kKHQpfX19ZnVuY3Rpb24gdWUodCl7bGV0IG4sbCxjLHM7Y29uc3Qgbz10WzEwXS5kZWZhdWx0LHI9aShvLHQsdFs5XSxudWxsKTtsZXQgdT1bdFs1XSx7Y2xhc3M6dFs0XX0se3R5cGU6ImJ1dHRvbiJ9LHtkaXNhYmxlZDp0WzFdfSx7YWN0aXZlOnRbMF19XSxmPXt9O2ZvcihsZXQgdD0wO3Q8dS5sZW5ndGg7dCs9MSlmPWUoZix1W3RdKTtyZXR1cm57Yygpe249aCgiYnV0dG9uIiksciYmci5jKCksayhuLGYpfSxtKGUsbyl7ZChlLG4sbyksciYmci5tKG4sbnVsbCksbD0hMCxjfHwocz12KG4sImNsaWNrIix0WzExXSksYz0hMCl9LHAodCxlKXtyJiZyLnAmJjUxMiZlJiZhKHIsbyx0LHRbOV0sZSxudWxsLG51bGwpLGsobixmPVcodSxbMzImZSYmdFs1XSwoIWx8fDE2JmUpJiZ7Y2xhc3M6dFs0XX0se3R5cGU6ImJ1dHRvbiJ9LCghbHx8MiZlKSYme2Rpc2FibGVkOnRbMV19LCghbHx8MSZlKSYme2FjdGl2ZTp0WzBdfV0pKX0saSh0KXtsfHwoUShyLHQpLGw9ITApfSxvKHQpe1Yocix0KSxsPSExfSxkKHQpe3QmJnAobiksciYmci5kKHQpLGM9ITEscygpfX19ZnVuY3Rpb24gZmUodCl7bGV0IG4sbDtjb25zdCBjPXRbMTBdLmRlZmF1bHQscz1pKGMsdCx0WzldLG51bGwpO2xldCBvPVt0WzVdLHtjbGFzczp0WzRdfSx7aHJlZjp0WzJdfSx7ZGlzYWJsZWQ6dFsxXX0se2FjdGl2ZTp0WzBdfV0scj17fTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTEpcj1lKHIsb1t0XSk7cmV0dXJue2MoKXtuPWgoImEiKSxzJiZzLmMoKSxrKG4scil9LG0odCxlKXtkKHQsbixlKSxzJiZzLm0obixudWxsKSxsPSEwfSxwKHQsZSl7cyYmcy5wJiY1MTImZSYmYShzLGMsdCx0WzldLGUsbnVsbCxudWxsKSxrKG4scj1XKG8sWzMyJmUmJnRbNV0sKCFsfHwxNiZlKSYme2NsYXNzOnRbNF19LCghbHx8NCZlKSYme2hyZWY6dFsyXX0sKCFsfHwyJmUpJiZ7ZGlzYWJsZWQ6dFsxXX0sKCFsfHwxJmUpJiZ7YWN0aXZlOnRbMF19XSkpfSxpKHQpe2x8fChRKHMsdCksbD0hMCl9LG8odCl7VihzLHQpLGw9ITF9LGQodCl7dCYmcChuKSxzJiZzLmQodCl9fX1mdW5jdGlvbiAkZSh0KXtsZXQgZSxuLGwsYztjb25zdCBzPVtmZSx1ZSxhZV0sbz1bXTtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHRbMl0/MDoiYnV0dG9uIj09PXRbM10/MToyfXJldHVybiBlPWkodCksbj1vW2VdPXNbZV0odCkse2MoKXtuLmMoKSxsPWIoKX0sbSh0LG4pe29bZV0ubSh0LG4pLGQodCxsLG4pLGM9ITB9LHAodCxbY10pe2xldCByPWU7ZT1pKHQpLGU9PT1yP29bZV0ucCh0LGMpOihIKCksVihvW3JdLDEsMSwoKCk9PntvW3JdPW51bGx9KSksSygpLG49b1tlXSxuP24ucCh0LGMpOihuPW9bZV09c1tlXSh0KSxuLmMoKSksUShuLDEpLG4ubShsLnBhcmVudE5vZGUsbCkpfSxpKHQpe2N8fChRKG4pLGM9ITApfSxvKHQpe1YobiksYz0hMX0sZCh0KXtvW2VdLmQodCksdCYmcChsKX19fWZ1bmN0aW9uIGRlKHQsbixsKXtsZXQgYztjb25zdCBzPVsiY2xhc3MiLCJhY3RpdmUiLCJkaXNhYmxlZCIsImNvbG9yIiwiYWN0aW9uIiwiaHJlZiIsInRhZyJdO2xldCBvPWYobixzKSx7JCRzbG90czppPXt9LCQkc2NvcGU6cn09bix7Y2xhc3M6YT0iIn09bix7YWN0aXZlOiQ9ITF9PW4se2Rpc2FibGVkOmQ9ITF9PW4se2NvbG9yOnA9IiJ9PW4se2FjdGlvbjptPSExfT1uLHtocmVmOmg9bnVsbH09bix7dGFnOmc9bnVsbH09bjtyZXR1cm4gdC4kJHNldD10PT57bj1lKGUoe30sbiksdSh0KSksbCg1LG89ZihuLHMpKSwiY2xhc3MiaW4gdCYmbCg2LGE9dC5jbGFzcyksImFjdGl2ZSJpbiB0JiZsKDAsJD10LmFjdGl2ZSksImRpc2FibGVkImluIHQmJmwoMSxkPXQuZGlzYWJsZWQpLCJjb2xvciJpbiB0JiZsKDcscD10LmNvbG9yKSwiYWN0aW9uImluIHQmJmwoOCxtPXQuYWN0aW9uKSwiaHJlZiJpbiB0JiZsKDIsaD10LmhyZWYpLCJ0YWciaW4gdCYmbCgzLGc9dC50YWcpLCIkJHNjb3BlImluIHQmJmwoOSxyPXQuJCRzY29wZSl9LHQuJCQudXBkYXRlPSgpPT57NDUxJnQuJCQuZGlydHkmJmwoNCxjPWl0KGEsISEkJiYiYWN0aXZlIiwhIWQmJiJkaXNhYmxlZCIsISFtJiYibGlzdC1ncm91cC1pdGVtLWFjdGlvbiIsISFwJiZgbGlzdC1ncm91cC1pdGVtLSR7cH1gLCJsaXN0LWdyb3VwLWl0ZW0iKSl9LFskLGQsaCxnLGMsbyxhLHAsbSxyLGksZnVuY3Rpb24oZSl7VCh0LGUpfV19Y2xhc3MgcGUgZXh0ZW5kcyBsdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLG50KHRoaXMsdCxkZSwkZSxvLHtjbGFzczo2LGFjdGl2ZTowLGRpc2FibGVkOjEsY29sb3I6NyxhY3Rpb246OCxocmVmOjIsdGFnOjN9KX19ZnVuY3Rpb24gbWUodCl7bGV0IG4sbDtjb25zdCBjPXRbMTJdLmRlZmF1bHQscz1pKGMsdCx0WzExXSxudWxsKTtsZXQgbz1bdFsxXSx7Y2xhc3M6dFswXX1dLHI9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKXI9ZShyLG9bdF0pO3JldHVybntjKCl7bj1oKCJ1bCIpLHMmJnMuYygpLGsobixyKX0sbSh0LGUpe2QodCxuLGUpLHMmJnMubShuLG51bGwpLGw9ITB9LHAodCxbZV0pe3MmJnMucCYmMjA0OCZlJiZhKHMsYyx0LHRbMTFdLGUsbnVsbCxudWxsKSxrKG4scj1XKG8sWzImZSYmdFsxXSwoIWx8fDEmZSkmJntjbGFzczp0WzBdfV0pKX0saSh0KXtsfHwoUShzLHQpLGw9ITApfSxvKHQpe1Yocyx0KSxsPSExfSxkKHQpe3QmJnAobikscyYmcy5kKHQpfX19ZnVuY3Rpb24gaGUodCxuLGwpe2xldCBjO2NvbnN0IHM9WyJjbGFzcyIsInRhYnMiLCJwaWxscyIsInZlcnRpY2FsIiwiaG9yaXpvbnRhbCIsImp1c3RpZmllZCIsImZpbGwiLCJuYXZiYXIiLCJjYXJkIl07bGV0IG89ZihuLHMpLHskJHNsb3RzOmk9e30sJCRzY29wZTpyfT1uLHtjbGFzczphPSIifT1uLHt0YWJzOiQ9ITF9PW4se3BpbGxzOmQ9ITF9PW4se3ZlcnRpY2FsOnA9ITF9PW4se2hvcml6b250YWw6bT0iIn09bix7anVzdGlmaWVkOmg9ITF9PW4se2ZpbGw6Zz0hMX09bix7bmF2YmFyOnk9ITF9PW4se2NhcmQ6Yj0hMX09bjtyZXR1cm4gdC4kJHNldD10PT57bj1lKGUoe30sbiksdSh0KSksbCgxLG89ZihuLHMpKSwiY2xhc3MiaW4gdCYmbCgyLGE9dC5jbGFzcyksInRhYnMiaW4gdCYmbCgzLCQ9dC50YWJzKSwicGlsbHMiaW4gdCYmbCg0LGQ9dC5waWxscyksInZlcnRpY2FsImluIHQmJmwoNSxwPXQudmVydGljYWwpLCJob3Jpem9udGFsImluIHQmJmwoNixtPXQuaG9yaXpvbnRhbCksImp1c3RpZmllZCJpbiB0JiZsKDcsaD10Lmp1c3RpZmllZCksImZpbGwiaW4gdCYmbCg4LGc9dC5maWxsKSwibmF2YmFyImluIHQmJmwoOSx5PXQubmF2YmFyKSwiY2FyZCJpbiB0JiZsKDEwLGI9dC5jYXJkKSwiJCRzY29wZSJpbiB0JiZsKDExLHI9dC4kJHNjb3BlKX0sdC4kJC51cGRhdGU9KCk9PnsyMDQ0JnQuJCQuZGlydHkmJmwoMCxjPWl0KGEseT8ibmF2YmFyLW5hdiI6Im5hdiIsISFtJiZganVzdGlmeS1jb250ZW50LSR7bX1gLGZ1bmN0aW9uKHQpe3JldHVybiExIT09dCYmKCEwPT09dHx8InhzIj09PXQ/ImZsZXgtY29sdW1uIjpgZmxleC0ke3R9LWNvbHVtbmApfShwKSx7Im5hdi10YWJzIjokLCJjYXJkLWhlYWRlci10YWJzIjpiJiYkLCJuYXYtcGlsbHMiOmQsImNhcmQtaGVhZGVyLXBpbGxzIjpiJiZkLCJuYXYtanVzdGlmaWVkIjpoLCJuYXYtZmlsbCI6Z30pKX0sW2MsbyxhLCQsZCxwLG0saCxnLHksYixyLGldfWNsYXNzIGdlIGV4dGVuZHMgbHR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSxudCh0aGlzLHQsaGUsbWUsbyx7Y2xhc3M6Mix0YWJzOjMscGlsbHM6NCx2ZXJ0aWNhbDo1LGhvcml6b250YWw6NixqdXN0aWZpZWQ6NyxmaWxsOjgsbmF2YmFyOjksY2FyZDoxMH0pfX1mdW5jdGlvbiB5ZSh0KXtsZXQgbixsO2NvbnN0IGM9dFs1XS5kZWZhdWx0LHM9aShjLHQsdFs0XSxudWxsKTtsZXQgbz1bdFsxXSx7Y2xhc3M6dFswXX1dLHI9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKXI9ZShyLG9bdF0pO3JldHVybntjKCl7bj1oKCJsaSIpLHMmJnMuYygpLGsobixyKX0sbSh0LGUpe2QodCxuLGUpLHMmJnMubShuLG51bGwpLGw9ITB9LHAodCxbZV0pe3MmJnMucCYmMTYmZSYmYShzLGMsdCx0WzRdLGUsbnVsbCxudWxsKSxrKG4scj1XKG8sWzImZSYmdFsxXSwoIWx8fDEmZSkmJntjbGFzczp0WzBdfV0pKX0saSh0KXtsfHwoUShzLHQpLGw9ITApfSxvKHQpe1Yocyx0KSxsPSExfSxkKHQpe3QmJnAobikscyYmcy5kKHQpfX19ZnVuY3Rpb24gYmUodCxuLGwpe2xldCBjO2NvbnN0IHM9WyJjbGFzcyIsImFjdGl2ZSJdO2xldCBvPWYobixzKSx7JCRzbG90czppPXt9LCQkc2NvcGU6cn09bix7Y2xhc3M6YT0iIn09bix7YWN0aXZlOiQ9ITF9PW47cmV0dXJuIHQuJCRzZXQ9dD0+e249ZShlKHt9LG4pLHUodCkpLGwoMSxvPWYobixzKSksImNsYXNzImluIHQmJmwoMixhPXQuY2xhc3MpLCJhY3RpdmUiaW4gdCYmbCgzLCQ9dC5hY3RpdmUpLCIkJHNjb3BlImluIHQmJmwoNCxyPXQuJCRzY29wZSl9LHQuJCQudXBkYXRlPSgpPT57MTImdC4kJC5kaXJ0eSYmbCgwLGM9aXQoYSwibmF2LWl0ZW0iLCEhJCYmImFjdGl2ZSIpKX0sW2MsbyxhLCQscixpXX1jbGFzcyB2ZSBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksbnQodGhpcyx0LGJlLHllLG8se2NsYXNzOjIsYWN0aXZlOjN9KX19ZnVuY3Rpb24geGUodCl7bGV0IG4sbCxzLG87Y29uc3Qgcj10WzhdLmRlZmF1bHQsdT1pKHIsdCx0WzddLG51bGwpO2xldCBmPVt0WzNdLHtocmVmOnRbMF19LHtjbGFzczp0WzFdfV0sJD17fTtmb3IobGV0IHQ9MDt0PGYubGVuZ3RoO3QrPTEpJD1lKCQsZlt0XSk7cmV0dXJue2MoKXtuPWgoImEiKSx1JiZ1LmMoKSxrKG4sJCl9LG0oZSxjKXtkKGUsbixjKSx1JiZ1Lm0obixudWxsKSxsPSEwLHN8fChvPVt2KG4sImNsaWNrIix0WzldKSx2KG4sImNsaWNrIix0WzJdKV0scz0hMCl9LHAodCxbZV0pe3UmJnUucCYmMTI4JmUmJmEodSxyLHQsdFs3XSxlLG51bGwsbnVsbCksayhuLCQ9VyhmLFs4JmUmJnRbM10sKCFsfHwxJmUpJiZ7aHJlZjp0WzBdfSwoIWx8fDImZSkmJntjbGFzczp0WzFdfV0pKX0saSh0KXtsfHwoUSh1LHQpLGw9ITApfSxvKHQpe1YodSx0KSxsPSExfSxkKHQpe3QmJnAobiksdSYmdS5kKHQpLHM9ITEsYyhvKX19fWZ1bmN0aW9uIGtlKHQsbixsKXtsZXQgYztjb25zdCBzPVsiY2xhc3MiLCJkaXNhYmxlZCIsImFjdGl2ZSIsImhyZWYiXTtsZXQgbz1mKG4scykseyQkc2xvdHM6aT17fSwkJHNjb3BlOnJ9PW4se2NsYXNzOmE9IiJ9PW4se2Rpc2FibGVkOiQ9ITF9PW4se2FjdGl2ZTpkPSExfT1uLHtocmVmOnA9IiMifT1uO3JldHVybiB0LiQkc2V0PXQ9PntuPWUoZSh7fSxuKSx1KHQpKSxsKDMsbz1mKG4scykpLCJjbGFzcyJpbiB0JiZsKDQsYT10LmNsYXNzKSwiZGlzYWJsZWQiaW4gdCYmbCg1LCQ9dC5kaXNhYmxlZCksImFjdGl2ZSJpbiB0JiZsKDYsZD10LmFjdGl2ZSksImhyZWYiaW4gdCYmbCgwLHA9dC5ocmVmKSwiJCRzY29wZSJpbiB0JiZsKDcscj10LiQkc2NvcGUpfSx0LiQkLnVwZGF0ZT0oKT0+ezExMiZ0LiQkLmRpcnR5JiZsKDEsYz1pdChhLCJuYXYtbGluayIse2Rpc2FibGVkOiQsYWN0aXZlOmR9KSl9LFtwLGMsZnVuY3Rpb24odCl7aWYoJClyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHZvaWQgdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsiIyI9PT1wJiZ0LnByZXZlbnREZWZhdWx0KCl9LG8sYSwkLGQscixpLGZ1bmN0aW9uKGUpe1QodCxlKX1dfWNsYXNzIHdlIGV4dGVuZHMgbHR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSxudCh0aGlzLHQsa2UseGUsbyx7Y2xhc3M6NCxkaXNhYmxlZDo1LGFjdGl2ZTo2LGhyZWY6MH0pfX1mdW5jdGlvbiBPZSh0KXtsZXQgbixsO2NvbnN0IGM9dFs2XS5kZWZhdWx0LHM9aShjLHQsdFs1XSxudWxsKTtsZXQgbz1bdFsxXSx7Y2xhc3M6dFswXX1dLHI9e307Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kz0xKXI9ZShyLG9bdF0pO3JldHVybntjKCl7bj1oKCJkaXYiKSxzJiZzLmMoKSxrKG4scil9LG0odCxlKXtkKHQsbixlKSxzJiZzLm0obixudWxsKSxsPSEwfSxwKHQsW2VdKXtzJiZzLnAmJjMyJmUmJmEocyxjLHQsdFs1XSxlLG51bGwsbnVsbCksayhuLHI9VyhvLFsyJmUmJnRbMV0sKCFsfHwxJmUpJiZ7Y2xhc3M6dFswXX1dKSl9LGkodCl7bHx8KFEocyx0KSxsPSEwKX0sbyh0KXtWKHMsdCksbD0hMX0sZCh0KXt0JiZwKG4pLHMmJnMuZCh0KX19fWZ1bmN0aW9uIHplKHQsbixsKXtsZXQgYztjb25zdCBzPVsiY2xhc3MiLCJub0d1dHRlcnMiLCJmb3JtIl07bGV0IG89ZihuLHMpLHskJHNsb3RzOmk9e30sJCRzY29wZTpyfT1uLHtjbGFzczphPSIifT1uLHtub0d1dHRlcnM6JD0hMX09bix7Zm9ybTpkPSExfT1uO3JldHVybiB0LiQkc2V0PXQ9PntuPWUoZSh7fSxuKSx1KHQpKSxsKDEsbz1mKG4scykpLCJjbGFzcyJpbiB0JiZsKDIsYT10LmNsYXNzKSwibm9HdXR0ZXJzImluIHQmJmwoMywkPXQubm9HdXR0ZXJzKSwiZm9ybSJpbiB0JiZsKDQsZD10LmZvcm0pLCIkJHNjb3BlImluIHQmJmwoNSxyPXQuJCRzY29wZSl9LHQuJCQudXBkYXRlPSgpPT57MjgmdC4kJC5kaXJ0eSYmbCgwLGM9aXQoYSwkPyJuby1ndXR0ZXJzIjpudWxsLGQ/ImZvcm0tcm93Ijoicm93IikpfSxbYyxvLGEsJCxkLHIsaV19Y2xhc3MgX2UgZXh0ZW5kcyBsdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLG50KHRoaXMsdCx6ZSxPZSxvLHtjbGFzczoyLG5vR3V0dGVyczozLGZvcm06NH0pfX1mdW5jdGlvbiBqZSh0KXtsZXQgbixsLGM7Y29uc3Qgcz10WzddLmRlZmF1bHQsbz1pKHMsdCx0WzZdLG51bGwpLHI9b3x8ZnVuY3Rpb24odCl7bGV0IGU7cmV0dXJue2MoKXtlPWcoIkxvYWRpbmcuLi4iKX0sbSh0LG4pe2QodCxlLG4pfSxkKHQpe3QmJnAoZSl9fX0oKTtsZXQgdT1bdFsxXSx7cm9sZToic3RhdHVzIn0se2NsYXNzOnRbMF19XSxmPXt9O2ZvcihsZXQgdD0wO3Q8dS5sZW5ndGg7dCs9MSlmPWUoZix1W3RdKTtyZXR1cm57Yygpe249aCgiZGl2IiksbD1oKCJzcGFuIiksciYmci5jKCkseChsLCJjbGFzcyIsInNyLW9ubHkiKSxrKG4sZil9LG0odCxlKXtkKHQsbixlKSwkKG4sbCksciYmci5tKGwsbnVsbCksYz0hMH0scCh0LFtlXSl7byYmby5wJiY2NCZlJiZhKG8scyx0LHRbNl0sZSxudWxsLG51bGwpLGsobixmPVcodSxbMiZlJiZ0WzFdLHtyb2xlOiJzdGF0dXMifSwoIWN8fDEmZSkmJntjbGFzczp0WzBdfV0pKX0saSh0KXtjfHwoUShyLHQpLGM9ITApfSxvKHQpe1Yocix0KSxjPSExfSxkKHQpe3QmJnAobiksciYmci5kKHQpfX19ZnVuY3Rpb24gTmUodCxuLGwpe2xldCBjO2NvbnN0IHM9WyJjbGFzcyIsInR5cGUiLCJzaXplIiwiY29sb3IiXTtsZXQgbz1mKG4scykseyQkc2xvdHM6aT17fSwkJHNjb3BlOnJ9PW4se2NsYXNzOmE9IiJ9PW4se3R5cGU6JD0iYm9yZGVyIn09bix7c2l6ZTpkPSIifT1uLHtjb2xvcjpwPSIifT1uO3JldHVybiB0LiQkc2V0PXQ9PntuPWUoZSh7fSxuKSx1KHQpKSxsKDEsbz1mKG4scykpLCJjbGFzcyJpbiB0JiZsKDIsYT10LmNsYXNzKSwidHlwZSJpbiB0JiZsKDMsJD10LnR5cGUpLCJzaXplImluIHQmJmwoNCxkPXQuc2l6ZSksImNvbG9yImluIHQmJmwoNSxwPXQuY29sb3IpLCIkJHNjb3BlImluIHQmJmwoNixyPXQuJCRzY29wZSl9LHQuJCQudXBkYXRlPSgpPT57NjAmdC4kJC5kaXJ0eSYmbCgwLGM9aXQoYSwhIWQmJmBzcGlubmVyLSR7JH0tJHtkfWAsYHNwaW5uZXItJHskfWAsISFwJiZgdGV4dC0ke3B9YCkpfSxbYyxvLGEsJCxkLHAscixpXX1jbGFzcyBTZSBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksbnQodGhpcyx0LE5lLGplLG8se2NsYXNzOjIsdHlwZTozLHNpemU6NCxjb2xvcjo1fSl9fWNvbnN0IEVlPWZ1bmN0aW9uKGUsbj10KXtsZXQgbDtjb25zdCBjPVtdO2Z1bmN0aW9uIHModCl7aWYobyhlLHQpJiYoZT10LGwpKXtjb25zdCB0PSF5dC5sZW5ndGg7Zm9yKGxldCB0PTA7dDxjLmxlbmd0aDt0Kz0xKXtjb25zdCBuPWNbdF07blsxXSgpLHl0LnB1c2gobixlKX1pZih0KXtmb3IobGV0IHQ9MDt0PHl0Lmxlbmd0aDt0Kz0yKXl0W3RdWzBdKHl0W3QrMV0pO3l0Lmxlbmd0aD0wfX19cmV0dXJue3NldDpzLHVwZGF0ZTpmdW5jdGlvbih0KXtzKHQoZSkpfSxzdWJzY3JpYmU6ZnVuY3Rpb24obyxpPXQpe2NvbnN0IHI9W28saV07cmV0dXJuIGMucHVzaChyKSwxPT09Yy5sZW5ndGgmJihsPW4ocyl8fHQpLG8oZSksKCk9Pntjb25zdCB0PWMuaW5kZXhPZihyKTstMSE9PXQmJmMuc3BsaWNlKHQsMSksMD09PWMubGVuZ3RoJiYobCgpLGw9bnVsbCl9fX19KCIiKTtmdW5jdGlvbiBUZSh0LGUsbil7Y29uc3QgbD10LnNsaWNlKCk7cmV0dXJuIGxbM109ZVtuXSxsfWZ1bmN0aW9uIExlKGUpe2xldCBuLGw7cmV0dXJuIG49bmV3IFNlKHt9KSx7Yygpe1kobi4kJC5mcmFnbWVudCl9LG0odCxlKXtaKG4sdCxlKSxsPSEwfSxwOnQsaSh0KXtsfHwoUShuLiQkLmZyYWdtZW50LHQpLGw9ITApfSxvKHQpe1Yobi4kJC5mcmFnbWVudCx0KSxsPSExfSxkKHQpe3R0KG4sdCl9fX1mdW5jdGlvbiBSZSh0KXtsZXQgZSxuO3JldHVybiBlPW5ldyByZSh7cHJvcHM6eyQkc2xvdHM6e2RlZmF1bHQ6W0JlXX0sJCRzY29wZTp7Y3R4OnR9fX0pLHtjKCl7WShlLiQkLmZyYWdtZW50KX0sbSh0LGwpe1ooZSx0LGwpLG49ITB9LHAodCxuKXtjb25zdCBsPXt9OzY3Jm4mJihsLiQkc2NvcGU9e2RpcnR5Om4sY3R4OnR9KSxlLiRzZXQobCl9LGkodCl7bnx8KFEoZS4kJC5mcmFnbWVudCx0KSxuPSEwKX0sbyh0KXtWKGUuJCQuZnJhZ21lbnQsdCksbj0hMX0sZCh0KXt0dChlLHQpfX19ZnVuY3Rpb24gQWUodCl7bGV0IGUsbj10WzNdLm5hbWUrIiI7cmV0dXJue2MoKXtlPWcobil9LG0odCxuKXtkKHQsZSxuKX0scCh0LGwpezEmbCYmbiE9PShuPXRbM10ubmFtZSsiIikmJk8oZSxuKX0sZCh0KXt0JiZwKGUpfX19ZnVuY3Rpb24gVWUodCl7bGV0IGUsbjtyZXR1cm4gZT1uZXcgcGUoe3Byb3BzOnthY3RpdmU6dFszXS5uYW1lPT10WzFdLGFjdGlvbjohMCx0YWc6ImJ1dHRvbiIsJCRzbG90czp7ZGVmYXVsdDpbQWVdfSwkJHNjb3BlOntjdHg6dH19fSksZS4kb24oImNsaWNrIiwoZnVuY3Rpb24oKXtzKHRbMl0odFszXS5uYW1lKSkmJnRbMl0odFszXS5uYW1lKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpfSxtKHQsbCl7WihlLHQsbCksbj0hMH0scChuLGwpe3Q9bjtjb25zdCBjPXt9OzMmbCYmKGMuYWN0aXZlPXRbM10ubmFtZT09dFsxXSksNjUmbCYmKGMuJCRzY29wZT17ZGlydHk6bCxjdHg6dH0pLGUuJHNldChjKX0saSh0KXtufHwoUShlLiQkLmZyYWdtZW50LHQpLG49ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxuPSExfSxkKHQpe3R0KGUsdCl9fX1mdW5jdGlvbiBCZSh0KXtsZXQgZSxuLGw9dFswXSxjPVtdO2ZvcihsZXQgZT0wO2U8bC5sZW5ndGg7ZSs9MSljW2VdPVVlKFRlKHQsbCxlKSk7Y29uc3Qgcz10PT5WKGNbdF0sMSwxLCgoKT0+e2NbdF09bnVsbH0pKTtyZXR1cm57Yygpe2ZvcihsZXQgdD0wO3Q8Yy5sZW5ndGg7dCs9MSljW3RdLmMoKTtlPWIoKX0sbSh0LGwpe2ZvcihsZXQgZT0wO2U8Yy5sZW5ndGg7ZSs9MSljW2VdLm0odCxsKTtkKHQsZSxsKSxuPSEwfSxwKHQsbil7aWYoNyZuKXtsZXQgbztmb3IobD10WzBdLG89MDtvPGwubGVuZ3RoO28rPTEpe2NvbnN0IHM9VGUodCxsLG8pO2Nbb10/KGNbb10ucChzLG4pLFEoY1tvXSwxKSk6KGNbb109VWUocyksY1tvXS5jKCksUShjW29dLDEpLGNbb10ubShlLnBhcmVudE5vZGUsZSkpfWZvcihIKCksbz1sLmxlbmd0aDtvPGMubGVuZ3RoO28rPTEpcyhvKTtLKCl9fSxpKHQpe2lmKCFuKXtmb3IobGV0IHQ9MDt0PGwubGVuZ3RoO3QrPTEpUShjW3RdKTtuPSEwfX0sbyh0KXtjPWMuZmlsdGVyKEJvb2xlYW4pO2ZvcihsZXQgdD0wO3Q8Yy5sZW5ndGg7dCs9MSlWKGNbdF0pO249ITF9LGQodCl7bShjLHQpLHQmJnAoZSl9fX1mdW5jdGlvbiBDZSh0KXtsZXQgZSxuLGwsYztjb25zdCBzPVtSZSxMZV0sbz1bXTtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHRbMF0/MDoxfXJldHVybiBlPWkodCksbj1vW2VdPXNbZV0odCkse2MoKXtuLmMoKSxsPWIoKX0sbSh0LG4pe29bZV0ubSh0LG4pLGQodCxsLG4pLGM9ITB9LHAodCxbY10pe2xldCByPWU7ZT1pKHQpLGU9PT1yP29bZV0ucCh0LGMpOihIKCksVihvW3JdLDEsMSwoKCk9PntvW3JdPW51bGx9KSksSygpLG49b1tlXSxuP24ucCh0LGMpOihuPW9bZV09c1tlXSh0KSxuLmMoKSksUShuLDEpLG4ubShsLnBhcmVudE5vZGUsbCkpfSxpKHQpe2N8fChRKG4pLGM9ITApfSxvKHQpe1YobiksYz0hMX0sZCh0KXtvW2VdLmQodCksdCYmcChsKX19fWZ1bmN0aW9uIEdlKHQsZSxuKXtsZXQgbDtmdW5jdGlvbiBjKHQpe0VlLnNldCh0KSxuKDEscz10KX1FKChhc3luYygpPT57YXdhaXQgZmV0Y2goIi9hcGkvZGV2aWNlcyIpLnRoZW4oKHQ9PnQuanNvbigpKSkudGhlbigodD0+e24oMCxsPXQpLGwubGVuZ3RoPjAmJmMobFswXS5uYW1lKX0pKX0pKTtsZXQgcz0iIjtyZXR1cm5bbCxzLGNdfWNsYXNzIERlIGV4dGVuZHMgbHR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSxudCh0aGlzLHQsR2UsQ2Usbyx7fSl9fWZ1bmN0aW9uIFBlKHQpe2xldCBlO3JldHVybntjKCl7ZT1nKCJTY2FuIil9LG0odCxuKXtkKHQsZSxuKX0sZCh0KXt0JiZwKGUpfX19ZnVuY3Rpb24gcWUodCl7bGV0IGU7cmV0dXJue2MoKXtlPWcoIkRvd25sb2FkIil9LG0odCxuKXtkKHQsZSxuKX0sZCh0KXt0JiZwKGUpfX19ZnVuY3Rpb24gSWUodCl7bGV0IGU7cmV0dXJue2MoKXtlPWcoIkNsZWFyIil9LG0odCxuKXtkKHQsZSxuKX0sZCh0KXt0JiZwKGUpfX19ZnVuY3Rpb24gSmUodCl7bGV0IGUsbixsLGMscyxvO3JldHVybiBlPW5ldyBndCh7cHJvcHM6e291dGxpbmU6ITAscHJpbWFyeTohMCwkJHNsb3RzOntkZWZhdWx0OltQZV19LCQkc2NvcGU6e2N0eDp0fX19KSxlLiRvbigiY2xpY2siLHRbN10pLGw9bmV3IGd0KHtwcm9wczp7b3V0bGluZTohMCxzdWNjZXNzOiEwLGRpc2FibGVkOiF0WzBdLCQkc2xvdHM6e2RlZmF1bHQ6W3FlXX0sJCRzY29wZTp7Y3R4OnR9fX0pLGwuJG9uKCJjbGljayIsdFs4XSkscz1uZXcgZ3Qoe3Byb3BzOntvdXRsaW5lOiEwLCQkc2xvdHM6e2RlZmF1bHQ6W0llXX0sJCRzY29wZTp7Y3R4OnR9fX0pLHMuJG9uKCJjbGljayIsdFs2XSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpLG49eSgpLFkobC4kJC5mcmFnbWVudCksYz15KCksWShzLiQkLmZyYWdtZW50KX0sbSh0LGkpe1ooZSx0LGkpLGQodCxuLGkpLFoobCx0LGkpLGQodCxjLGkpLFoocyx0LGkpLG89ITB9LHAodCxuKXtjb25zdCBjPXt9OzgxOTImbiYmKGMuJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLGUuJHNldChjKTtjb25zdCBvPXt9OzEmbiYmKG8uZGlzYWJsZWQ9IXRbMF0pLDgxOTImbiYmKG8uJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLGwuJHNldChvKTtjb25zdCBpPXt9OzgxOTImbiYmKGkuJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLHMuJHNldChpKX0saSh0KXtvfHwoUShlLiQkLmZyYWdtZW50LHQpLFEobC4kJC5mcmFnbWVudCx0KSxRKHMuJCQuZnJhZ21lbnQsdCksbz0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLFYobC4kJC5mcmFnbWVudCx0KSxWKHMuJCQuZnJhZ21lbnQsdCksbz0hMX0sZCh0KXt0dChlLHQpLHQmJnAobiksdHQobCx0KSx0JiZwKGMpLHR0KHMsdCl9fX1mdW5jdGlvbiBNZSh0KXtsZXQgZSxuO3JldHVybiBlPW5ldyB4dCh7cHJvcHM6eyQkc2xvdHM6e2RlZmF1bHQ6W0plXX0sJCRzY29wZTp7Y3R4OnR9fX0pLHtjKCl7WShlLiQkLmZyYWdtZW50KX0sbSh0LGwpe1ooZSx0LGwpLG49ITB9LHAodCxuKXtjb25zdCBsPXt9OzgxOTMmbiYmKGwuJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLGUuJHNldChsKX0saSh0KXtufHwoUShlLiQkLmZyYWdtZW50LHQpLG49ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxuPSExfSxkKHQpe3R0KGUsdCl9fX1mdW5jdGlvbiBGZSh0KXtsZXQgZSxuO3JldHVybiBlPW5ldyBPdCh7cHJvcHM6eyQkc2xvdHM6e2RlZmF1bHQ6W01lXX0sJCRzY29wZTp7Y3R4OnR9fX0pLHtjKCl7WShlLiQkLmZyYWdtZW50KX0sbSh0LGwpe1ooZSx0LGwpLG49ITB9LHAodCxuKXtjb25zdCBsPXt9OzgxOTMmbiYmKGwuJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLGUuJHNldChsKX0saSh0KXtufHwoUShlLiQkLmZyYWdtZW50LHQpLG49ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxuPSExfSxkKHQpe3R0KGUsdCl9fX1mdW5jdGlvbiBIZSh0KXtsZXQgZSxuLGwsYyxzLG8saSxyLGEsdTtyZXR1cm4gYT1uZXcgU2Uoe3Byb3BzOntjbGFzczp0WzVdfX0pLHtjKCl7ZT1oKCJoNSIpLG49ZygiSW1hZ2UgZnJvbSAiKSxsPWcodFsyXSksYz15KCkscz1oKCJpbWciKSxyPXkoKSxZKGEuJCQuZnJhZ21lbnQpLHgoZSwib2JqZWN0IiwiIikseChlLCJjbGFzcyIsdFs0XSkseChzLCJjbGFzcyIsbz0iaW1nLWZsdWlkICIrdFs0XSkscy5zcmMhPT0oaT10WzFdKSYmeChzLCJzcmMiLGkpfSxtKHQsbyl7ZCh0LGUsbyksJChlLG4pLCQoZSxsKSxkKHQsYyxvKSxkKHQscyxvKSxkKHQscixvKSxaKGEsdCxvKSx1PSEwfSxwKHQsbil7KCF1fHw0Jm4pJiZPKGwsdFsyXSksKCF1fHwxNiZuKSYmeChlLCJjbGFzcyIsdFs0XSksKCF1fHwxNiZuJiZvIT09KG89ImltZy1mbHVpZCAiK3RbNF0pKSYmeChzLCJjbGFzcyIsbyksKCF1fHwyJm4mJnMuc3JjIT09KGk9dFsxXSkpJiZ4KHMsInNyYyIsaSk7Y29uc3QgYz17fTszMiZuJiYoYy5jbGFzcz10WzVdKSxhLiRzZXQoYyl9LGkodCl7dXx8KFEoYS4kJC5mcmFnbWVudCx0KSx1PSEwKX0sbyh0KXtWKGEuJCQuZnJhZ21lbnQsdCksdT0hMX0sZCh0KXt0JiZwKGUpLHQmJnAoYyksdCYmcChzKSx0JiZwKHIpLHR0KGEsdCl9fX1mdW5jdGlvbiBLZSh0KXtsZXQgZSxuO3JldHVybiBlPW5ldyBPdCh7cHJvcHM6eyQkc2xvdHM6e2RlZmF1bHQ6W0hlXX0sJCRzY29wZTp7Y3R4OnR9fX0pLHtjKCl7WShlLiQkLmZyYWdtZW50KX0sbSh0LGwpe1ooZSx0LGwpLG49ITB9LHAodCxuKXtjb25zdCBsPXt9OzgyNDYmbiYmKGwuJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLGUuJHNldChsKX0saSh0KXtufHwoUShlLiQkLmZyYWdtZW50LHQpLG49ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxuPSExfSxkKHQpe3R0KGUsdCl9fX1mdW5jdGlvbiBRZSh0KXtsZXQgZSxuLGwsYztyZXR1cm4gZT1uZXcgX2Uoe3Byb3BzOnskJHNsb3RzOntkZWZhdWx0OltGZV19LCQkc2NvcGU6e2N0eDp0fX19KSxsPW5ldyBfZSh7cHJvcHM6eyQkc2xvdHM6e2RlZmF1bHQ6W0tlXX0sJCRzY29wZTp7Y3R4OnR9fX0pLHtjKCl7WShlLiQkLmZyYWdtZW50KSxuPXkoKSxZKGwuJCQuZnJhZ21lbnQpfSxtKHQscyl7WihlLHQscyksZCh0LG4scyksWihsLHQscyksYz0hMH0scCh0LG4pe2NvbnN0IGM9e307ODE5MyZuJiYoYy4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGMpO2NvbnN0IHM9e307ODI0NiZuJiYocy4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksbC4kc2V0KHMpfSxpKHQpe2N8fChRKGUuJCQuZnJhZ21lbnQsdCksUShsLiQkLmZyYWdtZW50LHQpLGM9ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxWKGwuJCQuZnJhZ21lbnQsdCksYz0hMX0sZCh0KXt0dChlLHQpLHQmJnAobiksdHQobCx0KX19fWZ1bmN0aW9uIFZlKHQpe2xldCBlLG47cmV0dXJuIGU9bmV3IE90KHtwcm9wczp7JCRzbG90czp7ZGVmYXVsdDpbUWVdfSwkJHNjb3BlOntjdHg6dH19fSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpfSxtKHQsbCl7WihlLHQsbCksbj0hMH0scCh0LG4pe2NvbnN0IGw9e307ODI0NyZuJiYobC4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGwpfSxpKHQpe258fChRKGUuJCQuZnJhZ21lbnQsdCksbj0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLG49ITF9LGQodCl7dHQoZSx0KX19fWZ1bmN0aW9uIFdlKHQpe2xldCBlLG47cmV0dXJuIGU9bmV3IF9lKHtwcm9wczp7Y2xhc3M6dFszXSwkJHNsb3RzOntkZWZhdWx0OltWZV19LCQkc2NvcGU6e2N0eDp0fX19KSx7Yygpe1koZS4kJC5mcmFnbWVudCl9LG0odCxsKXtaKGUsdCxsKSxuPSEwfSxwKHQsW25dKXtjb25zdCBsPXt9OzgmbiYmKGwuY2xhc3M9dFszXSksODI0NyZuJiYobC4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGwpfSxpKHQpe258fChRKGUuJCQuZnJhZ21lbnQsdCksbj0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLG49ITF9LGQodCl7dHQoZSx0KX19fWZ1bmN0aW9uIFhlKHQsZSxuKXtsZXQgbCxjLHMse3NldHRpbmdzOm89e319PWUse2FjdGl2ZTppfT1lLHI9IiIsYT0hMSx1PSExO2NvbnN0IGY9KCk9PntuKDEscj0iIiksbigwLGE9ITEpfTtsZXQgJDtFZS5zdWJzY3JpYmUoKHQ9PntuKDIsJD10KSxmKCl9KSk7cmV0dXJuIHQuJCRzZXQ9dD0+eyJzZXR0aW5ncyJpbiB0JiZuKDksbz10LnNldHRpbmdzKSwiYWN0aXZlImluIHQmJm4oMTAsaT10LmFjdGl2ZSl9LHQuJCQudXBkYXRlPSgpPT57MTAyNCZ0LiQkLmRpcnR5JiZuKDMsbD1pPyIiOiJkLW5vbmUiKSwxJnQuJCQuZGlydHkmJm4oNCxjPWE/IiI6ImludmlzaWJsZSIpLDIwNDgmdC4kJC5kaXJ0eSYmbig1LHM9dT8iIjoiaW52aXNpYmxlIil9LFthLHIsJCxsLGMscyxmLGFzeW5jKCk9PntuKDExLHU9ITApLGF3YWl0IGZldGNoKCIvYXBpL2RldmljZXMvIiskKyIvc2NhbiIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KG8pfSkudGhlbigodD0+dC5ibG9iKCkpKS50aGVuKCh0PT57bigxMSx1PSExKSxuKDEscj0od2luZG93LlVSTHx8d2luZG93LndlYmtpdFVSTCkuY3JlYXRlT2JqZWN0VVJMKHQpKSxuKDAsYT0hMCl9KSl9LCgpPT57dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO3dpbmRvdy5VUkwmJndpbmRvdy5CbG9iJiYiZG93bmxvYWQiaW4gdCYmd2luZG93LmF0b2ImJih0LmhyZWY9cix0LmRvd25sb2FkPSJzY2FubmVkLnBuZyIsdC5jbGljaygpLHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHIpKX0sbyxpLHVdfWNsYXNzIFllIGV4dGVuZHMgbHR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSxudCh0aGlzLHQsWGUsV2Usbyx7c2V0dGluZ3M6OSxhY3RpdmU6MTB9KX19ZnVuY3Rpb24gWmUodCxlLG4pe2NvbnN0IGw9dC5zbGljZSgpO3JldHVybiBsWzE0XT1lW25dLGxbMTVdPWUsbFsxNl09bixsfWZ1bmN0aW9uIHRuKHQsZSxuKXtjb25zdCBsPXQuc2xpY2UoKTtyZXR1cm4gbFsxN109ZVtuXSxsfWZ1bmN0aW9uIGVuKGUpe2xldCBuO3JldHVybntjKCl7bj1nKCJVbmRlZmluZWQgb3B0aW9uIil9LG0odCxlKXtkKHQsbixlKX0scDp0LGk6dCxvOnQsZCh0KXt0JiZwKG4pfX19ZnVuY3Rpb24gbm4odCl7bGV0IGUsbixsLGMscztmdW5jdGlvbiBvKGUpe3RbOV0uY2FsbChudWxsLGUsdFsxNF0pfWU9bmV3IHNlKHtwcm9wczp7Zm9yOnRbMTRdLm5hbWUsJCRzbG90czp7ZGVmYXVsdDpbb25dfSwkJHNjb3BlOntjdHg6dH19fSk7bGV0IGk9e3R5cGU6InNlbGVjdCIsbmFtZTp0WzE0XS5uYW1lLGlkOnRbMTRdLm5hbWUsJCRzbG90czp7ZGVmYXVsdDpbYW5dfSwkJHNjb3BlOntjdHg6dH19O3JldHVybiB2b2lkIDAhPT10WzBdW3RbMTRdLm5hbWVdJiYoaS52YWx1ZT10WzBdW3RbMTRdLm5hbWVdKSxsPW5ldyBuZSh7cHJvcHM6aX0pLFIucHVzaCgoKCk9PlgobCwidmFsdWUiLG8pKSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpLG49eSgpLFkobC4kJC5mcmFnbWVudCl9LG0odCxjKXtaKGUsdCxjKSxkKHQsbixjKSxaKGwsdCxjKSxzPSEwfSxwKG4scyl7dD1uO2NvbnN0IG89e307MiZzJiYoby5mb3I9dFsxNF0ubmFtZSksMTA0ODU3OCZzJiYoby4kJHNjb3BlPXtkaXJ0eTpzLGN0eDp0fSksZS4kc2V0KG8pO2NvbnN0IGk9e307MiZzJiYoaS5uYW1lPXRbMTRdLm5hbWUpLDImcyYmKGkuaWQ9dFsxNF0ubmFtZSksMTA0ODU3OCZzJiYoaS4kJHNjb3BlPXtkaXJ0eTpzLGN0eDp0fSksIWMmJjMmcyYmKGM9ITAsaS52YWx1ZT10WzBdW3RbMTRdLm5hbWVdLEQoKCgpPT5jPSExKSkpLGwuJHNldChpKX0saSh0KXtzfHwoUShlLiQkLmZyYWdtZW50LHQpLFEobC4kJC5mcmFnbWVudCx0KSxzPSEwKX0sbyh0KXtWKGUuJCQuZnJhZ21lbnQsdCksVihsLiQkLmZyYWdtZW50LHQpLHM9ITF9LGQodCl7dHQoZSx0KSx0JiZwKG4pLHR0KGwsdCl9fX1mdW5jdGlvbiBsbih0KXtsZXQgZSxuLGwsYyxzO2Z1bmN0aW9uIG8oZSl7dFs4XS5jYWxsKG51bGwsZSx0WzE0XSl9ZT1uZXcgc2Uoe3Byb3BzOntmb3I6dFsxNF0ubmFtZSwkJHNsb3RzOntkZWZhdWx0Olt1bl19LCQkc2NvcGU6e2N0eDp0fX19KTtsZXQgaT17bmFtZTp0WzE0XS5uYW1lLGlkOnRbMTRdLm5hbWV9O3JldHVybiB2b2lkIDAhPT10WzBdW3RbMTRdLm5hbWVdJiYoaS52YWx1ZT10WzBdW3RbMTRdLm5hbWVdKSxsPW5ldyBuZSh7cHJvcHM6aX0pLFIucHVzaCgoKCk9PlgobCwidmFsdWUiLG8pKSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpLG49eSgpLFkobC4kJC5mcmFnbWVudCl9LG0odCxjKXtaKGUsdCxjKSxkKHQsbixjKSxaKGwsdCxjKSxzPSEwfSxwKG4scyl7dD1uO2NvbnN0IG89e307MiZzJiYoby5mb3I9dFsxNF0ubmFtZSksMTA0ODU3OCZzJiYoby4kJHNjb3BlPXtkaXJ0eTpzLGN0eDp0fSksZS4kc2V0KG8pO2NvbnN0IGk9e307MiZzJiYoaS5uYW1lPXRbMTRdLm5hbWUpLDImcyYmKGkuaWQ9dFsxNF0ubmFtZSksIWMmJjMmcyYmKGM9ITAsaS52YWx1ZT10WzBdW3RbMTRdLm5hbWVdLEQoKCgpPT5jPSExKSkpLGwuJHNldChpKX0saSh0KXtzfHwoUShlLiQkLmZyYWdtZW50LHQpLFEobC4kJC5mcmFnbWVudCx0KSxzPSEwKX0sbyh0KXtWKGUuJCQuZnJhZ21lbnQsdCksVihsLiQkLmZyYWdtZW50LHQpLHM9ITF9LGQodCl7dHQoZSx0KSx0JiZwKG4pLHR0KGwsdCl9fX1mdW5jdGlvbiBjbih0KXtsZXQgZSxuLGwsYyxzO2Z1bmN0aW9uIG8oZSl7dFs3XS5jYWxsKG51bGwsZSx0WzE0XSl9ZT1uZXcgc2Uoe3Byb3BzOntmb3I6dFsxNF0ubmFtZSwkJHNsb3RzOntkZWZhdWx0Olskbl19LCQkc2NvcGU6e2N0eDp0fX19KTtsZXQgaT17dHlwZToibnVtYmVyIixuYW1lOnRbMTRdLm5hbWUsaWQ6dFsxNF0ubmFtZX07cmV0dXJuIHZvaWQgMCE9PXRbMF1bdFsxNF0ubmFtZV0mJihpLnZhbHVlPXRbMF1bdFsxNF0ubmFtZV0pLGw9bmV3IG5lKHtwcm9wczppfSksUi5wdXNoKCgoKT0+WChsLCJ2YWx1ZSIsbykpKSx7Yygpe1koZS4kJC5mcmFnbWVudCksbj15KCksWShsLiQkLmZyYWdtZW50KX0sbSh0LGMpe1ooZSx0LGMpLGQodCxuLGMpLFoobCx0LGMpLHM9ITB9LHAobixzKXt0PW47Y29uc3Qgbz17fTsyJnMmJihvLmZvcj10WzE0XS5uYW1lKSwxMDQ4NTc4JnMmJihvLiQkc2NvcGU9e2RpcnR5OnMsY3R4OnR9KSxlLiRzZXQobyk7Y29uc3QgaT17fTsyJnMmJihpLm5hbWU9dFsxNF0ubmFtZSksMiZzJiYoaS5pZD10WzE0XS5uYW1lKSwhYyYmMyZzJiYoYz0hMCxpLnZhbHVlPXRbMF1bdFsxNF0ubmFtZV0sRCgoKCk9PmM9ITEpKSksbC4kc2V0KGkpfSxpKHQpe3N8fChRKGUuJCQuZnJhZ21lbnQsdCksUShsLiQkLmZyYWdtZW50LHQpLHM9ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxWKGwuJCQuZnJhZ21lbnQsdCkscz0hMX0sZCh0KXt0dChlLHQpLHQmJnAobiksdHQobCx0KX19fWZ1bmN0aW9uIHNuKHQpe2xldCBlLG47cmV0dXJuIGU9bmV3IHNlKHtwcm9wczp7Zm9yOnRbMTRdLm5hbWUsY2hlY2s6ITAsJCRzbG90czp7ZGVmYXVsdDpbZG5dfSwkJHNjb3BlOntjdHg6dH19fSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpfSxtKHQsbCl7WihlLHQsbCksbj0hMH0scCh0LG4pe2NvbnN0IGw9e307MiZuJiYobC5mb3I9dFsxNF0ubmFtZSksMTA0ODU3OSZuJiYobC4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGwpfSxpKHQpe258fChRKGUuJCQuZnJhZ21lbnQsdCksbj0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLG49ITF9LGQodCl7dHQoZSx0KX19fWZ1bmN0aW9uIG9uKHQpe2xldCBlLG49dFsxNF0udGl0bGUrIiI7cmV0dXJue2MoKXtlPWcobil9LG0odCxuKXtkKHQsZSxuKX0scCh0LGwpezImbCYmbiE9PShuPXRbMTRdLnRpdGxlKyIiKSYmTyhlLG4pfSxkKHQpe3QmJnAoZSl9fX1mdW5jdGlvbiBybih0KXtsZXQgZSxuLGwsYz10WzE3XSsiIjtyZXR1cm57Yygpe2U9aCgib3B0aW9uIiksbj1nKGMpLGUuX192YWx1ZT1sPXRbMTddLGUudmFsdWU9ZS5fX3ZhbHVlfSxtKHQsbCl7ZCh0LGUsbCksJChlLG4pfSxwKHQscyl7MiZzJiZjIT09KGM9dFsxN10rIiIpJiZPKG4sYyksMiZzJiZsIT09KGw9dFsxN10pJiYoZS5fX3ZhbHVlPWwsZS52YWx1ZT1lLl9fdmFsdWUpfSxkKHQpe3QmJnAoZSl9fX1mdW5jdGlvbiBhbih0KXtsZXQgZSxuPXRbMTRdLnNldCxsPVtdO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSs9MSlsW2VdPXJuKHRuKHQsbixlKSk7cmV0dXJue2MoKXtmb3IobGV0IHQ9MDt0PGwubGVuZ3RoO3QrPTEpbFt0XS5jKCk7ZT1iKCl9LG0odCxuKXtmb3IobGV0IGU9MDtlPGwubGVuZ3RoO2UrPTEpbFtlXS5tKHQsbik7ZCh0LGUsbil9LHAodCxjKXtpZigyJmMpe2xldCBzO2ZvcihuPXRbMTRdLnNldCxzPTA7czxuLmxlbmd0aDtzKz0xKXtjb25zdCBvPXRuKHQsbixzKTtsW3NdP2xbc10ucChvLGMpOihsW3NdPXJuKG8pLGxbc10uYygpLGxbc10ubShlLnBhcmVudE5vZGUsZSkpfWZvcig7czxsLmxlbmd0aDtzKz0xKWxbc10uZCgxKTtsLmxlbmd0aD1uLmxlbmd0aH19LGQodCl7bShsLHQpLHQmJnAoZSl9fX1mdW5jdGlvbiB1bih0KXtsZXQgZSxuPXRbMTRdLnRpdGxlKyIiO3JldHVybntjKCl7ZT1nKG4pfSxtKHQsbil7ZCh0LGUsbil9LHAodCxsKXsyJmwmJm4hPT0obj10WzE0XS50aXRsZSsiIikmJk8oZSxuKX0sZCh0KXt0JiZwKGUpfX19ZnVuY3Rpb24gZm4odCl7bGV0IGUsbixsLGMscyxvLGkscj10WzE0XS5yYW5nZS5taW4rIiIsYT10WzE0XS5yYW5nZS5tYXgrIiIsdT10WzE0XS5yYW5nZS5xdWFudCsiIjtyZXR1cm57Yygpe2U9ZygiKFJhbmdlOiAiKSxuPWcociksbD1nKCItIiksYz1nKGEpLHM9ZygiLCBzdGVwOiAiKSxvPWcodSksaT1nKCIpIil9LG0odCxyKXtkKHQsZSxyKSxkKHQsbixyKSxkKHQsbCxyKSxkKHQsYyxyKSxkKHQscyxyKSxkKHQsbyxyKSxkKHQsaSxyKX0scCh0LGUpezImZSYmciE9PShyPXRbMTRdLnJhbmdlLm1pbisiIikmJk8obixyKSwyJmUmJmEhPT0oYT10WzE0XS5yYW5nZS5tYXgrIiIpJiZPKGMsYSksMiZlJiZ1IT09KHU9dFsxNF0ucmFuZ2UucXVhbnQrIiIpJiZPKG8sdSl9LGQodCl7dCYmcChlKSx0JiZwKG4pLHQmJnAobCksdCYmcChjKSx0JiZwKHMpLHQmJnAobyksdCYmcChpKX19fWZ1bmN0aW9uICRuKHQpe2xldCBlLG4sbCxjPXRbMTRdLnRpdGxlKyIiLHM9bnVsbCE9PXRbMTRdLnJhbmdlJiZmbih0KTtyZXR1cm57Yygpe2U9ZyhjKSxuPXkoKSxzJiZzLmMoKSxsPWIoKX0sbSh0LGMpe2QodCxlLGMpLGQodCxuLGMpLHMmJnMubSh0LGMpLGQodCxsLGMpfSxwKHQsbil7MiZuJiZjIT09KGM9dFsxNF0udGl0bGUrIiIpJiZPKGUsYyksbnVsbCE9PXRbMTRdLnJhbmdlP3M/cy5wKHQsbik6KHM9Zm4odCkscy5jKCkscy5tKGwucGFyZW50Tm9kZSxsKSk6cyYmKHMuZCgxKSxzPW51bGwpfSxkKHQpe3QmJnAoZSksdCYmcChuKSxzJiZzLmQodCksdCYmcChsKX19fWZ1bmN0aW9uIGRuKHQpe2xldCBlLG4sbCxjLHMsbz10WzE0XS50aXRsZSsiIjtmdW5jdGlvbiBpKGUpe3RbNl0uY2FsbChudWxsLGUsdFsxNF0pfWxldCByPXtpZDp0WzE0XS5uYW1lLHBsYWNlaG9sZGVyOnRbMTRdLmRlc2NyaXB0aW9uLHR5cGU6ImNoZWNrYm94In07cmV0dXJuIHZvaWQgMCE9PXRbMF1bdFsxNF0ubmFtZV0mJihyLmNoZWNrZWQ9dFswXVt0WzE0XS5uYW1lXSksZT1uZXcgbmUoe3Byb3BzOnJ9KSxSLnB1c2goKCgpPT5YKGUsImNoZWNrZWQiLGkpKSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpLGw9eSgpLGM9ZyhvKX0sbSh0LG4pe1ooZSx0LG4pLGQodCxsLG4pLGQodCxjLG4pLHM9ITB9LHAobCxpKXt0PWw7Y29uc3Qgcj17fTsyJmkmJihyLmlkPXRbMTRdLm5hbWUpLDImaSYmKHIucGxhY2Vob2xkZXI9dFsxNF0uZGVzY3JpcHRpb24pLCFuJiYzJmkmJihuPSEwLHIuY2hlY2tlZD10WzBdW3RbMTRdLm5hbWVdLEQoKCgpPT5uPSExKSkpLGUuJHNldChyKSwoIXN8fDImaSkmJm8hPT0obz10WzE0XS50aXRsZSsiIikmJk8oYyxvKX0saSh0KXtzfHwoUShlLiQkLmZyYWdtZW50LHQpLHM9ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxzPSExfSxkKHQpe3R0KGUsdCksdCYmcChsKSx0JiZwKGMpfX19ZnVuY3Rpb24gcG4odCl7bGV0IGUsbixsLGM7Y29uc3Qgcz1bc24sY24sbG4sbm4sZW5dLG89W107ZnVuY3Rpb24gaSh0LGUpe3JldHVybiAwPT09dFsxNF0udHlwZT8wOjEhPT10WzE0XS50eXBlJiYyIT09dFsxNF0udHlwZXx8bnVsbCE9PXRbMTRdLnNldD8zPT09dFsxNF0udHlwZSYmbnVsbD09PXRbMTRdLnNldD8yOm51bGwhPT10WzE0XS5zZXQ/Mzo0OjF9cmV0dXJuIGU9aSh0KSxuPW9bZV09c1tlXSh0KSx7Yygpe24uYygpLGw9eSgpfSxtKHQsbil7b1tlXS5tKHQsbiksZCh0LGwsbiksYz0hMH0scCh0LGMpe2xldCByPWU7ZT1pKHQpLGU9PT1yP29bZV0ucCh0LGMpOihIKCksVihvW3JdLDEsMSwoKCk9PntvW3JdPW51bGx9KSksSygpLG49b1tlXSxuP24ucCh0LGMpOihuPW9bZV09c1tlXSh0KSxuLmMoKSksUShuLDEpLG4ubShsLnBhcmVudE5vZGUsbCkpfSxpKHQpe2N8fChRKG4pLGM9ITApfSxvKHQpe1YobiksYz0hMX0sZCh0KXtvW2VdLmQodCksdCYmcChsKX19fWZ1bmN0aW9uIG1uKHQpe2xldCBlLG47cmV0dXJuIGU9bmV3IFV0KHtwcm9wczp7JCRzbG90czp7ZGVmYXVsdDpbcG5dfSwkJHNjb3BlOntjdHg6dH19fSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpfSxtKHQsbCl7WihlLHQsbCksbj0hMH0scCh0LG4pe2NvbnN0IGw9e307MTA0ODU3OSZuJiYobC4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGwpfSxpKHQpe258fChRKGUuJCQuZnJhZ21lbnQsdCksbj0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLG49ITF9LGQodCl7dHQoZSx0KX19fWZ1bmN0aW9uIGhuKHQpe2xldCBlLG4sbD10WzFdLGM9W107Zm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKz0xKWNbZV09bW4oWmUodCxsLGUpKTtjb25zdCBzPXQ9PlYoY1t0XSwxLDEsKCgpPT57Y1t0XT1udWxsfSkpO3JldHVybntjKCl7Zm9yKGxldCB0PTA7dDxjLmxlbmd0aDt0Kz0xKWNbdF0uYygpO2U9YigpfSxtKHQsbCl7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDtlKz0xKWNbZV0ubSh0LGwpO2QodCxlLGwpLG49ITB9LHAodCxuKXtpZigzJm4pe2xldCBvO2ZvcihsPXRbMV0sbz0wO288bC5sZW5ndGg7bys9MSl7Y29uc3Qgcz1aZSh0LGwsbyk7Y1tvXT8oY1tvXS5wKHMsbiksUShjW29dLDEpKTooY1tvXT1tbihzKSxjW29dLmMoKSxRKGNbb10sMSksY1tvXS5tKGUucGFyZW50Tm9kZSxlKSl9Zm9yKEgoKSxvPWwubGVuZ3RoO288Yy5sZW5ndGg7bys9MSlzKG8pO0soKX19LGkodCl7aWYoIW4pe2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGg7dCs9MSlRKGNbdF0pO249ITB9fSxvKHQpe2M9Yy5maWx0ZXIoQm9vbGVhbik7Zm9yKGxldCB0PTA7dDxjLmxlbmd0aDt0Kz0xKVYoY1t0XSk7bj0hMX0sZCh0KXttKGMsdCksdCYmcChlKX19fWZ1bmN0aW9uIGduKHQpe2xldCBlLG4sbCxjO3JldHVybiBlPW5ldyBTZSh7cHJvcHM6e2NsYXNzOnRbM119fSksbD1uZXcgRXQoe3Byb3BzOnskJHNsb3RzOntkZWZhdWx0Oltobl19LCQkc2NvcGU6e2N0eDp0fX19KSx7Yygpe1koZS4kJC5mcmFnbWVudCksbj15KCksWShsLiQkLmZyYWdtZW50KX0sbSh0LHMpe1ooZSx0LHMpLGQodCxuLHMpLFoobCx0LHMpLGM9ITB9LHAodCxuKXtjb25zdCBjPXt9OzgmbiYmKGMuY2xhc3M9dFszXSksZS4kc2V0KGMpO2NvbnN0IHM9e307MTA0ODU3OSZuJiYocy4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksbC4kc2V0KHMpfSxpKHQpe2N8fChRKGUuJCQuZnJhZ21lbnQsdCksUShsLiQkLmZyYWdtZW50LHQpLGM9ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxWKGwuJCQuZnJhZ21lbnQsdCksYz0hMX0sZCh0KXt0dChlLHQpLHQmJnAobiksdHQobCx0KX19fWZ1bmN0aW9uIHluKHQpe2xldCBlLG47cmV0dXJuIGU9bmV3IE90KHtwcm9wczp7JCRzbG90czp7ZGVmYXVsdDpbZ25dfSwkJHNjb3BlOntjdHg6dH19fSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpfSxtKHQsbCl7WihlLHQsbCksbj0hMH0scCh0LG4pe2NvbnN0IGw9e307MTA0ODU4NyZuJiYobC4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGwpfSxpKHQpe258fChRKGUuJCQuZnJhZ21lbnQsdCksbj0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLG49ITF9LGQodCl7dHQoZSx0KX19fWZ1bmN0aW9uIGJuKHQpe2xldCBlLG47cmV0dXJuIGU9bmV3IF9lKHtwcm9wczp7Y2xhc3M6dFsyXSwkJHNsb3RzOntkZWZhdWx0Olt5bl19LCQkc2NvcGU6e2N0eDp0fX19KSx7Yygpe1koZS4kJC5mcmFnbWVudCl9LG0odCxsKXtaKGUsdCxsKSxuPSEwfSxwKHQsW25dKXtjb25zdCBsPXt9OzQmbiYmKGwuY2xhc3M9dFsyXSksMTA0ODU4NyZuJiYobC4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGwpfSxpKHQpe258fChRKGUuJCQuZnJhZ21lbnQsdCksbj0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLG49ITF9LGQodCl7dHQoZSx0KX19fWZ1bmN0aW9uIHZuKHQsZSxuKXtsZXQgbCxjLHthY3RpdmU6c309ZSxvPSExLGk9W10se3NldHRpbmdzOnI9e319PWU7Y29uc3QgYT1hc3luYyB0PT57bigxLGk9W10pLG4oNSxvPSEwKSxhd2FpdCBmZXRjaCgiL2FwaS9kZXZpY2VzLyIrdSsiL29wdGlvbnMiLHttZXRob2Q6IkdFVCIsYm9keTpKU09OLnN0cmluZ2lmeSh0KX0pLnRoZW4oKHQ9PnQuanNvbigpKSkudGhlbigodD0+e24oNSxvPSExKSxuKDEsaT10KSxjb25zb2xlLmxvZyhpKSxpLmZvckVhY2goKGZ1bmN0aW9uKHQpe24oMCxyW3QubmFtZV09dC5kZWZhdWx0LHIpfSkpfSkpfTtsZXQgdTtFZS5zdWJzY3JpYmUoKHQ9Pnt1PXQsIiIhPT11JiZhKCl9KSk7cmV0dXJuIEUoKGFzeW5jKCk9PnsiIiE9PXUmJmF3YWl0IGEoKX0pKSx0LiQkc2V0PXQ9PnsiYWN0aXZlImluIHQmJm4oNCxzPXQuYWN0aXZlKSwic2V0dGluZ3MiaW4gdCYmbigwLHI9dC5zZXR0aW5ncyl9LHQuJCQudXBkYXRlPSgpPT57MTYmdC4kJC5kaXJ0eSYmbigyLGw9cz8iIjoiZC1ub25lIiksMzImdC4kJC5kaXJ0eSYmbigzLGM9bz8iIjoiZC1ub25lIil9LFtyLGksbCxjLHMsbyxmdW5jdGlvbih0LGUpe3JbZS5uYW1lXT10LG4oMCxyKX0sZnVuY3Rpb24odCxlKXtyW2UubmFtZV09dCxuKDAscil9LGZ1bmN0aW9uKHQsZSl7cltlLm5hbWVdPXQsbigwLHIpfSxmdW5jdGlvbih0LGUpe3JbZS5uYW1lXT10LG4oMCxyKX1dfWNsYXNzIHhuIGV4dGVuZHMgbHR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSxudCh0aGlzLHQsdm4sYm4sbyx7YWN0aXZlOjQsc2V0dGluZ3M6MH0pfX1mdW5jdGlvbiBrbih0KXtsZXQgZSxuO3JldHVybiBlPW5ldyBEZSh7fSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpfSxtKHQsbCl7WihlLHQsbCksbj0hMH0saSh0KXtufHwoUShlLiQkLmZyYWdtZW50LHQpLG49ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxuPSExfSxkKHQpe3R0KGUsdCl9fX1mdW5jdGlvbiB3bih0KXtsZXQgZTtyZXR1cm57Yygpe2U9ZygiU2NhbiIpfSxtKHQsbil7ZCh0LGUsbil9LGQodCl7dCYmcChlKX19fWZ1bmN0aW9uIE9uKHQpe2xldCBlLG47cmV0dXJuIGU9bmV3IHdlKHtwcm9wczp7YWN0aXZlOiJzY2FuIj09PXRbMF0sJCRzbG90czp7ZGVmYXVsdDpbd25dfSwkJHNjb3BlOntjdHg6dH19fSksZS4kb24oImNsaWNrIix0WzJdKCJzY2FuIikpLHtjKCl7WShlLiQkLmZyYWdtZW50KX0sbSh0LGwpe1ooZSx0LGwpLG49ITB9LHAodCxuKXtjb25zdCBsPXt9OzEmbiYmKGwuYWN0aXZlPSJzY2FuIj09PXRbMF0pLDY0Jm4mJihsLiQkc2NvcGU9e2RpcnR5Om4sY3R4OnR9KSxlLiRzZXQobCl9LGkodCl7bnx8KFEoZS4kJC5mcmFnbWVudCx0KSxuPSEwKX0sbyh0KXtWKGUuJCQuZnJhZ21lbnQsdCksbj0hMX0sZCh0KXt0dChlLHQpfX19ZnVuY3Rpb24gem4odCl7bGV0IGU7cmV0dXJue2MoKXtlPWcoIlNldHRpbmdzIil9LG0odCxuKXtkKHQsZSxuKX0sZCh0KXt0JiZwKGUpfX19ZnVuY3Rpb24gX24odCl7bGV0IGUsbjtyZXR1cm4gZT1uZXcgd2Uoe3Byb3BzOnthY3RpdmU6InNldHRpbmdzIj09PXRbMF0sJCRzbG90czp7ZGVmYXVsdDpbem5dfSwkJHNjb3BlOntjdHg6dH19fSksZS4kb24oImNsaWNrIix0WzJdKCJzZXR0aW5ncyIpKSx7Yygpe1koZS4kJC5mcmFnbWVudCl9LG0odCxsKXtaKGUsdCxsKSxuPSEwfSxwKHQsbil7Y29uc3QgbD17fTsxJm4mJihsLmFjdGl2ZT0ic2V0dGluZ3MiPT09dFswXSksNjQmbiYmKGwuJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLGUuJHNldChsKX0saSh0KXtufHwoUShlLiQkLmZyYWdtZW50LHQpLG49ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxuPSExfSxkKHQpe3R0KGUsdCl9fX1mdW5jdGlvbiBqbih0KXtsZXQgZSxuLGwsYztyZXR1cm4gZT1uZXcgdmUoe3Byb3BzOnskJHNsb3RzOntkZWZhdWx0OltPbl19LCQkc2NvcGU6e2N0eDp0fX19KSxsPW5ldyB2ZSh7cHJvcHM6eyQkc2xvdHM6e2RlZmF1bHQ6W19uXX0sJCRzY29wZTp7Y3R4OnR9fX0pLHtjKCl7WShlLiQkLmZyYWdtZW50KSxuPXkoKSxZKGwuJCQuZnJhZ21lbnQpfSxtKHQscyl7WihlLHQscyksZCh0LG4scyksWihsLHQscyksYz0hMH0scCh0LG4pe2NvbnN0IGM9e307NjUmbiYmKGMuJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLGUuJHNldChjKTtjb25zdCBzPXt9OzY1Jm4mJihzLiQkc2NvcGU9e2RpcnR5Om4sY3R4OnR9KSxsLiRzZXQocyl9LGkodCl7Y3x8KFEoZS4kJC5mcmFnbWVudCx0KSxRKGwuJCQuZnJhZ21lbnQsdCksYz0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLFYobC4kJC5mcmFnbWVudCx0KSxjPSExfSxkKHQpe3R0KGUsdCksdCYmcChuKSx0dChsLHQpfX19ZnVuY3Rpb24gTm4odCl7bGV0IGUsbjtyZXR1cm4gZT1uZXcgZ2Uoe3Byb3BzOnt0YWJzOiEwLCQkc2xvdHM6e2RlZmF1bHQ6W2puXX0sJCRzY29wZTp7Y3R4OnR9fX0pLHtjKCl7WShlLiQkLmZyYWdtZW50KX0sbSh0LGwpe1ooZSx0LGwpLG49ITB9LHAodCxuKXtjb25zdCBsPXt9OzY1Jm4mJihsLiQkc2NvcGU9e2RpcnR5Om4sY3R4OnR9KSxlLiRzZXQobCl9LGkodCl7bnx8KFEoZS4kJC5mcmFnbWVudCx0KSxuPSEwKX0sbyh0KXtWKGUuJCQuZnJhZ21lbnQsdCksbj0hMX0sZCh0KXt0dChlLHQpfX19ZnVuY3Rpb24gU24odCl7bGV0IGUsbjtyZXR1cm4gZT1uZXcgT3Qoe3Byb3BzOnskJHNsb3RzOntkZWZhdWx0OltObl19LCQkc2NvcGU6e2N0eDp0fX19KSx7Yygpe1koZS4kJC5mcmFnbWVudCl9LG0odCxsKXtaKGUsdCxsKSxuPSEwfSxwKHQsbil7Y29uc3QgbD17fTs2NSZuJiYobC4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGwpfSxpKHQpe258fChRKGUuJCQuZnJhZ21lbnQsdCksbj0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLG49ITF9LGQodCl7dHQoZSx0KX19fWZ1bmN0aW9uIEVuKHQpe2xldCBlLG4sbCxjLHMsbyxpO2Z1bmN0aW9uIHIoZSl7dFszXS5jYWxsKG51bGwsZSl9ZT1uZXcgX2Uoe3Byb3BzOnskJHNsb3RzOntkZWZhdWx0OltTbl19LCQkc2NvcGU6e2N0eDp0fX19KSxsPW5ldyBZZSh7cHJvcHM6e2FjdGl2ZToic2NhbiI9PT10WzBdLHNldHRpbmdzOnRbMV19fSk7bGV0IGE9e2FjdGl2ZToic2V0dGluZ3MiPT09dFswXX07cmV0dXJuIHZvaWQgMCE9PXRbMV0mJihhLnNldHRpbmdzPXRbMV0pLHM9bmV3IHhuKHtwcm9wczphfSksUi5wdXNoKCgoKT0+WChzLCJzZXR0aW5ncyIscikpKSx7Yygpe1koZS4kJC5mcmFnbWVudCksbj15KCksWShsLiQkLmZyYWdtZW50KSxjPXkoKSxZKHMuJCQuZnJhZ21lbnQpfSxtKHQsbyl7WihlLHQsbyksZCh0LG4sbyksWihsLHQsbyksZCh0LGMsbyksWihzLHQsbyksaT0hMH0scCh0LG4pe2NvbnN0IGM9e307NjUmbiYmKGMuJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLGUuJHNldChjKTtjb25zdCBpPXt9OzEmbiYmKGkuYWN0aXZlPSJzY2FuIj09PXRbMF0pLDImbiYmKGkuc2V0dGluZ3M9dFsxXSksbC4kc2V0KGkpO2NvbnN0IHI9e307MSZuJiYoci5hY3RpdmU9InNldHRpbmdzIj09PXRbMF0pLCFvJiYyJm4mJihvPSEwLHIuc2V0dGluZ3M9dFsxXSxEKCgoKT0+bz0hMSkpKSxzLiRzZXQocil9LGkodCl7aXx8KFEoZS4kJC5mcmFnbWVudCx0KSxRKGwuJCQuZnJhZ21lbnQsdCksUShzLiQkLmZyYWdtZW50LHQpLGk9ITApfSxvKHQpe1YoZS4kJC5mcmFnbWVudCx0KSxWKGwuJCQuZnJhZ21lbnQsdCksVihzLiQkLmZyYWdtZW50LHQpLGk9ITF9LGQodCl7dHQoZSx0KSx0JiZwKG4pLHR0KGwsdCksdCYmcChjKSx0dChzLHQpfX19ZnVuY3Rpb24gVG4odCl7bGV0IGUsbixsLGM7cmV0dXJuIGU9bmV3IE90KHtwcm9wczp7c206IjYiLG1kOiIyIiwkJHNsb3RzOntkZWZhdWx0Oltrbl19LCQkc2NvcGU6e2N0eDp0fX19KSxsPW5ldyBPdCh7cHJvcHM6e3NtOiI2IixtZDoiMTAiLCQkc2xvdHM6e2RlZmF1bHQ6W0VuXX0sJCRzY29wZTp7Y3R4OnR9fX0pLHtjKCl7WShlLiQkLmZyYWdtZW50KSxuPXkoKSxZKGwuJCQuZnJhZ21lbnQpfSxtKHQscyl7WihlLHQscyksZCh0LG4scyksWihsLHQscyksYz0hMH0scCh0LG4pe2NvbnN0IGM9e307NjQmbiYmKGMuJCRzY29wZT17ZGlydHk6bixjdHg6dH0pLGUuJHNldChjKTtjb25zdCBzPXt9OzY3Jm4mJihzLiQkc2NvcGU9e2RpcnR5Om4sY3R4OnR9KSxsLiRzZXQocyl9LGkodCl7Y3x8KFEoZS4kJC5mcmFnbWVudCx0KSxRKGwuJCQuZnJhZ21lbnQsdCksYz0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLFYobC4kJC5mcmFnbWVudCx0KSxjPSExfSxkKHQpe3R0KGUsdCksdCYmcChuKSx0dChsLHQpfX19ZnVuY3Rpb24gTG4odCl7bGV0IGUsbjtyZXR1cm4gZT1uZXcgX2Uoe3Byb3BzOnskJHNsb3RzOntkZWZhdWx0OltUbl19LCQkc2NvcGU6e2N0eDp0fX19KSx7Yygpe1koZS4kJC5mcmFnbWVudCl9LG0odCxsKXtaKGUsdCxsKSxuPSEwfSxwKHQsbil7Y29uc3QgbD17fTs2NyZuJiYobC4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGwpfSxpKHQpe258fChRKGUuJCQuZnJhZ21lbnQsdCksbj0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLG49ITF9LGQodCl7dHQoZSx0KX19fWZ1bmN0aW9uIFJuKHQpe2xldCBlLG47cmV0dXJuIGU9bmV3IGp0KHtwcm9wczp7JCRzbG90czp7ZGVmYXVsdDpbTG5dfSwkJHNjb3BlOntjdHg6dH19fSkse2MoKXtZKGUuJCQuZnJhZ21lbnQpfSxtKHQsbCl7WihlLHQsbCksbj0hMH0scCh0LFtuXSl7Y29uc3QgbD17fTs2NyZuJiYobC4kJHNjb3BlPXtkaXJ0eTpuLGN0eDp0fSksZS4kc2V0KGwpfSxpKHQpe258fChRKGUuJCQuZnJhZ21lbnQsdCksbj0hMCl9LG8odCl7VihlLiQkLmZyYWdtZW50LHQpLG49ITF9LGQodCl7dHQoZSx0KX19fWZ1bmN0aW9uIEFuKHQsZSxuKXtsZXQgbD17fTtFZS5zdWJzY3JpYmUoKHQ9Pnt9KSk7bGV0e2FjdGl2ZVRhYjpjPSJzY2FuIn09ZTtyZXR1cm4gdC4kJHNldD10PT57ImFjdGl2ZVRhYiJpbiB0JiZuKDAsYz10LmFjdGl2ZVRhYil9LFtjLGwsdD0+KCk9Pm4oMCxjPXQpLGZ1bmN0aW9uKHQpe2w9dCxuKDEsbCl9XX1jbGFzcyBVbiBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksbnQodGhpcyx0LEFuLFJuLG8se2FjdGl2ZVRhYjowfSl9fWZ1bmN0aW9uIEJuKGUpe2xldCBuLGwsYztyZXR1cm4gbD1uZXcgVW4oe30pLHtjKCl7bj1oKCJtYWluIiksWShsLiQkLmZyYWdtZW50KX0sbSh0LGUpe2QodCxuLGUpLFoobCxuLG51bGwpLGM9ITB9LHA6dCxpKHQpe2N8fChRKGwuJCQuZnJhZ21lbnQsdCksYz0hMCl9LG8odCl7VihsLiQkLmZyYWdtZW50LHQpLGM9ITF9LGQodCl7dCYmcChuKSx0dChsKX19fXJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBsdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLG50KHRoaXMsdCxudWxsLEJuLG8se30pfX0oe3RhcmdldDpkb2N1bWVudC5ib2R5LHByb3BzOntuYW1lOiJ3b3JsZCJ9fSl9KCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1bmRsZS5qcy5tYXAK\"") + packr.PackJSONBytes("../../web/public", "build/bundle.js.map", "\"eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlL2ludGVybmFsL2luZGV4Lm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvdXRpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL0J1dHRvbi5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlL3N0b3JlL2luZGV4Lm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvQnV0dG9uR3JvdXAuc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Db2wuc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Db250YWluZXIuc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9Gb3JtLnN2ZWx0ZSIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvRm9ybUdyb3VwLnN2ZWx0ZSIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvSW5wdXQuc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9MYWJlbC5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL0xpc3RHcm91cC5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL0xpc3RHcm91cEl0ZW0uc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9OYXYuc3ZlbHRlIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N2ZWx0ZXN0cmFwL3NyYy9OYXZJdGVtLnN2ZWx0ZSIsIi4uLy4uL25vZGVfbW9kdWxlcy9zdmVsdGVzdHJhcC9zcmMvTmF2TGluay5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL1Jvdy5zdmVsdGUiLCIuLi8uLi9ub2RlX21vZHVsZXMvc3ZlbHRlc3RyYXAvc3JjL1NwaW5uZXIuc3ZlbHRlIiwiLi4vLi4vc3JjL3N0b3Jlcy5qcyIsIi4uLy4uL3NyYy9TY2FubmVycy5zdmVsdGUiLCIuLi8uLi9zcmMvU2NhblBhZ2Uuc3ZlbHRlIiwiLi4vLi4vc3JjL1NldHRpbmdzUGFnZS5zdmVsdGUiLCIuLi8uLi9zcmMvU2Nhbm5lci5zdmVsdGUiLCIuLi8uLi9zcmMvbWFpbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBub29wKCkgeyB9XG5jb25zdCBpZGVudGl0eSA9IHggPT4geDtcbmZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKVxuICAgICAgICB0YXJba10gPSBzcmNba107XG4gICAgcmV0dXJuIHRhcjtcbn1cbmZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHtcbiAgICBlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7XG4gICAgICAgIGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfVxuICAgIH07XG59XG5mdW5jdGlvbiBydW4oZm4pIHtcbiAgICByZXR1cm4gZm4oKTtcbn1cbmZ1bmN0aW9uIGJsYW5rX29iamVjdCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cbmZ1bmN0aW9uIHJ1bl9hbGwoZm5zKSB7XG4gICAgZm5zLmZvckVhY2gocnVuKTtcbn1cbmZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYiB8fCAoKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5mdW5jdGlvbiBub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiO1xufVxuZnVuY3Rpb24gaXNfZW1wdHkob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVfc3RvcmUoc3RvcmUsIG5hbWUpIHtcbiAgICBpZiAoc3RvcmUgIT0gbnVsbCAmJiB0eXBlb2Ygc3RvcmUuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmFtZX0nIGlzIG5vdCBhIHN0b3JlIHdpdGggYSAnc3Vic2NyaWJlJyBtZXRob2RgKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzdWJzY3JpYmUoc3RvcmUsIC4uLmNhbGxiYWNrcykge1xuICAgIGlmIChzdG9yZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBub29wO1xuICAgIH1cbiAgICBjb25zdCB1bnN1YiA9IHN0b3JlLnN1YnNjcmliZSguLi5jYWxsYmFja3MpO1xuICAgIHJldHVybiB1bnN1Yi51bnN1YnNjcmliZSA/ICgpID0+IHVuc3ViLnVuc3Vic2NyaWJlKCkgOiB1bnN1Yjtcbn1cbmZ1bmN0aW9uIGdldF9zdG9yZV92YWx1ZShzdG9yZSkge1xuICAgIGxldCB2YWx1ZTtcbiAgICBzdWJzY3JpYmUoc3RvcmUsIF8gPT4gdmFsdWUgPSBfKSgpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNvbXBvbmVudF9zdWJzY3JpYmUoY29tcG9uZW50LCBzdG9yZSwgY2FsbGJhY2spIHtcbiAgICBjb21wb25lbnQuJCQub25fZGVzdHJveS5wdXNoKHN1YnNjcmliZShzdG9yZSwgY2FsbGJhY2spKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9zbG90KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pIHtcbiAgICBpZiAoZGVmaW5pdGlvbikge1xuICAgICAgICBjb25zdCBzbG90X2N0eCA9IGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbik7XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uWzBdKHNsb3RfY3R4KTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRfc2xvdF9jb250ZXh0KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pIHtcbiAgICByZXR1cm4gZGVmaW5pdGlvblsxXSAmJiBmblxuICAgICAgICA/IGFzc2lnbigkJHNjb3BlLmN0eC5zbGljZSgpLCBkZWZpbml0aW9uWzFdKGZuKGN0eCkpKVxuICAgICAgICA6ICQkc2NvcGUuY3R4O1xufVxuZnVuY3Rpb24gZ2V0X3Nsb3RfY2hhbmdlcyhkZWZpbml0aW9uLCAkJHNjb3BlLCBkaXJ0eSwgZm4pIHtcbiAgICBpZiAoZGVmaW5pdGlvblsyXSAmJiBmbikge1xuICAgICAgICBjb25zdCBsZXRzID0gZGVmaW5pdGlvblsyXShmbihkaXJ0eSkpO1xuICAgICAgICBpZiAoJCRzY29wZS5kaXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGV0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxldHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWF4KCQkc2NvcGUuZGlydHkubGVuZ3RoLCBsZXRzLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgbWVyZ2VkW2ldID0gJCRzY29wZS5kaXJ0eVtpXSB8IGxldHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkJHNjb3BlLmRpcnR5IHwgbGV0cztcbiAgICB9XG4gICAgcmV0dXJuICQkc2NvcGUuZGlydHk7XG59XG5mdW5jdGlvbiB1cGRhdGVfc2xvdChzbG90LCBzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4sIGdldF9zbG90X2NvbnRleHRfZm4pIHtcbiAgICBjb25zdCBzbG90X2NoYW5nZXMgPSBnZXRfc2xvdF9jaGFuZ2VzKHNsb3RfZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4pO1xuICAgIGlmIChzbG90X2NoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jb250ZXh0ID0gZ2V0X3Nsb3RfY29udGV4dChzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG4gICAgICAgIHNsb3QucChzbG90X2NvbnRleHQsIHNsb3RfY2hhbmdlcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3Rfc3ByZWFkKHNsb3QsIHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBkaXJ0eSwgZ2V0X3Nsb3RfY2hhbmdlc19mbiwgZ2V0X3Nsb3Rfc3ByZWFkX2NoYW5nZXNfZm4sIGdldF9zbG90X2NvbnRleHRfZm4pIHtcbiAgICBjb25zdCBzbG90X2NoYW5nZXMgPSBnZXRfc2xvdF9zcHJlYWRfY2hhbmdlc19mbihkaXJ0eSkgfCBnZXRfc2xvdF9jaGFuZ2VzKHNsb3RfZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4pO1xuICAgIGlmIChzbG90X2NoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jb250ZXh0ID0gZ2V0X3Nsb3RfY29udGV4dChzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG4gICAgICAgIHNsb3QucChzbG90X2NvbnRleHQsIHNsb3RfY2hhbmdlcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZXhjbHVkZV9pbnRlcm5hbF9wcm9wcyhwcm9wcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBpbiBwcm9wcylcbiAgICAgICAgaWYgKGtbMF0gIT09ICckJylcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHByb3BzW2tdO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb21wdXRlX3Jlc3RfcHJvcHMocHJvcHMsIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0ge307XG4gICAga2V5cyA9IG5ldyBTZXQoa2V5cyk7XG4gICAgZm9yIChjb25zdCBrIGluIHByb3BzKVxuICAgICAgICBpZiAoIWtleXMuaGFzKGspICYmIGtbMF0gIT09ICckJylcbiAgICAgICAgICAgIHJlc3Rba10gPSBwcm9wc1trXTtcbiAgICByZXR1cm4gcmVzdDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVfc2xvdHMoc2xvdHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzbG90cykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBvbmNlKGZuKSB7XG4gICAgbGV0IHJhbiA9IGZhbHNlO1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBpZiAocmFuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICByYW4gPSB0cnVlO1xuICAgICAgICBmbi5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgIH07XG59XG5mdW5jdGlvbiBudWxsX3RvX2VtcHR5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xufVxuZnVuY3Rpb24gc2V0X3N0b3JlX3ZhbHVlKHN0b3JlLCByZXQsIHZhbHVlID0gcmV0KSB7XG4gICAgc3RvcmUuc2V0KHZhbHVlKTtcbiAgICByZXR1cm4gcmV0O1xufVxuY29uc3QgaGFzX3Byb3AgPSAob2JqLCBwcm9wKSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbmZ1bmN0aW9uIGFjdGlvbl9kZXN0cm95ZXIoYWN0aW9uX3Jlc3VsdCkge1xuICAgIHJldHVybiBhY3Rpb25fcmVzdWx0ICYmIGlzX2Z1bmN0aW9uKGFjdGlvbl9yZXN1bHQuZGVzdHJveSkgPyBhY3Rpb25fcmVzdWx0LmRlc3Ryb3kgOiBub29wO1xufVxuXG5jb25zdCBpc19jbGllbnQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbmxldCBub3cgPSBpc19jbGllbnRcbiAgICA/ICgpID0+IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKVxuICAgIDogKCkgPT4gRGF0ZS5ub3coKTtcbmxldCByYWYgPSBpc19jbGllbnQgPyBjYiA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpIDogbm9vcDtcbi8vIHVzZWQgaW50ZXJuYWxseSBmb3IgdGVzdGluZ1xuZnVuY3Rpb24gc2V0X25vdyhmbikge1xuICAgIG5vdyA9IGZuO1xufVxuZnVuY3Rpb24gc2V0X3JhZihmbikge1xuICAgIHJhZiA9IGZuO1xufVxuXG5jb25zdCB0YXNrcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIHJ1bl90YXNrcyhub3cpIHtcbiAgICB0YXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICBpZiAoIXRhc2suYyhub3cpKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgICAgICB0YXNrLmYoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0YXNrcy5zaXplICE9PSAwKVxuICAgICAgICByYWYocnVuX3Rhc2tzKTtcbn1cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSFcbiAqL1xuZnVuY3Rpb24gY2xlYXJfbG9vcHMoKSB7XG4gICAgdGFza3MuY2xlYXIoKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0YXNrIHRoYXQgcnVucyBvbiBlYWNoIHJhZiBmcmFtZVxuICogdW50aWwgaXQgcmV0dXJucyBhIGZhbHN5IHZhbHVlIG9yIGlzIGFib3J0ZWRcbiAqL1xuZnVuY3Rpb24gbG9vcChjYWxsYmFjaykge1xuICAgIGxldCB0YXNrO1xuICAgIGlmICh0YXNrcy5zaXplID09PSAwKVxuICAgICAgICByYWYocnVuX3Rhc2tzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdWxmaWxsID0+IHtcbiAgICAgICAgICAgIHRhc2tzLmFkZCh0YXNrID0geyBjOiBjYWxsYmFjaywgZjogZnVsZmlsbCB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIGFib3J0KCkge1xuICAgICAgICAgICAgdGFza3MuZGVsZXRlKHRhc2spO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkge1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xufVxuZnVuY3Rpb24gZGV0YWNoKG5vZGUpIHtcbiAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBkZXN0cm95X2VhY2goaXRlcmF0aW9ucywgZGV0YWNoaW5nKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChpdGVyYXRpb25zW2ldKVxuICAgICAgICAgICAgaXRlcmF0aW9uc1tpXS5kKGRldGFjaGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZWxlbWVudChuYW1lKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7XG59XG5mdW5jdGlvbiBlbGVtZW50X2lzKG5hbWUsIGlzKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSwgeyBpcyB9KTtcbn1cbmZ1bmN0aW9uIG9iamVjdF93aXRob3V0X3Byb3BlcnRpZXMob2JqLCBleGNsdWRlKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIG9iaikge1xuICAgICAgICBpZiAoaGFzX3Byb3Aob2JqLCBrKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgJiYgZXhjbHVkZS5pbmRleE9mKGspID09PSAtMSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGFyZ2V0W2tdID0gb2JqW2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBzdmdfZWxlbWVudChuYW1lKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIHRleHQoZGF0YSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKTtcbn1cbmZ1bmN0aW9uIHNwYWNlKCkge1xuICAgIHJldHVybiB0ZXh0KCcgJyk7XG59XG5mdW5jdGlvbiBlbXB0eSgpIHtcbiAgICByZXR1cm4gdGV4dCgnJyk7XG59XG5mdW5jdGlvbiBsaXN0ZW4obm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiAoKSA9PiBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcHJldmVudF9kZWZhdWx0KGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc3RvcF9wcm9wYWdhdGlvbihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzZWxmKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMpXG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSAhPT0gdmFsdWUpXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gc2V0X2F0dHJpYnV0ZXMobm9kZSwgYXR0cmlidXRlcykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG5vZGUuX19wcm90b19fKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICAgIG5vZGUuc3R5bGUuY3NzVGV4dCA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdfX3ZhbHVlJykge1xuICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZXNjcmlwdG9yc1trZXldICYmIGRlc2NyaXB0b3JzW2tleV0uc2V0KSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdmdfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YShub2RlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGlmIChwcm9wIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZVtwcm9wXSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cihub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geGxpbmtfYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUoZ3JvdXAsIF9fdmFsdWUsIGNoZWNrZWQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChncm91cFtpXS5jaGVja2VkKVxuICAgICAgICAgICAgdmFsdWUuYWRkKGdyb3VwW2ldLl9fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgICAgdmFsdWUuZGVsZXRlKF9fdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnID8gbnVsbCA6ICt2YWx1ZTtcbn1cbmZ1bmN0aW9uIHRpbWVfcmFuZ2VzX3RvX2FycmF5KHJhbmdlcykge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyYXkucHVzaCh7IHN0YXJ0OiByYW5nZXMuc3RhcnQoaSksIGVuZDogcmFuZ2VzLmVuZChpKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gY2hpbGRyZW4oZWxlbWVudCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGROb2Rlcyk7XG59XG5mdW5jdGlvbiBjbGFpbV9lbGVtZW50KG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBzdmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZSA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gbm9kZS5hdHRyaWJ1dGVzW2orK107XG4gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmUucHVzaChhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByZW1vdmUubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShyZW1vdmVba10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzLnNwbGljZShpLCAxKVswXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3ZnID8gc3ZnX2VsZW1lbnQobmFtZSkgOiBlbGVtZW50KG5hbWUpO1xufVxuZnVuY3Rpb24gY2xhaW1fdGV4dChub2RlcywgZGF0YSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gJycgKyBkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVzLnNwbGljZShpLCAxKVswXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dChkYXRhKTtcbn1cbmZ1bmN0aW9uIGNsYWltX3NwYWNlKG5vZGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX3RleHQobm9kZXMsICcgJyk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YSh0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC53aG9sZVRleHQgIT09IGRhdGEpXG4gICAgICAgIHRleHQuZGF0YSA9IGRhdGE7XG59XG5mdW5jdGlvbiBzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIHZhbHVlKSB7XG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF90eXBlKGlucHV0LCB0eXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaW5wdXQudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfc3R5bGUobm9kZSwga2V5LCB2YWx1ZSwgaW1wb3J0YW50KSB7XG4gICAgbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlLCBpbXBvcnRhbnQgPyAnaW1wb3J0YW50JyA6ICcnKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdF9vcHRpb24oc2VsZWN0LCB2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gc2VsZWN0Lm9wdGlvbnNbaV07XG4gICAgICAgIGlmIChvcHRpb24uX192YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbi8vIHVuZm9ydHVuYXRlbHkgdGhpcyBjYW4ndCBiZSBhIGNvbnN0YW50IGFzIHRoYXQgd291bGRuJ3QgYmUgdHJlZS1zaGFrZWFibGVcbi8vIHNvIHdlIGNhY2hlIHRoZSByZXN1bHQgaW5zdGVhZFxubGV0IGNyb3Nzb3JpZ2luO1xuZnVuY3Rpb24gaXNfY3Jvc3NvcmlnaW4oKSB7XG4gICAgaWYgKGNyb3Nzb3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3Jvc3NvcmlnaW4gPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdm9pZCB3aW5kb3cucGFyZW50LmRvY3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY3Jvc3NvcmlnaW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcm9zc29yaWdpbjtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIobm9kZSwgZm4pIHtcbiAgICBjb25zdCBjb21wdXRlZF9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKGNvbXB1dGVkX3N0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgY29uc3QgaWZyYW1lID0gZWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyAnICtcbiAgICAgICAgJ292ZXJmbG93OiBoaWRkZW47IGJvcmRlcjogMDsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZnJhbWUudGFiSW5kZXggPSAtMTtcbiAgICBjb25zdCBjcm9zc29yaWdpbiA9IGlzX2Nyb3Nzb3JpZ2luKCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlO1xuICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICBpZnJhbWUuc3JjID0gXCJkYXRhOnRleHQvaHRtbCw8c2NyaXB0Pm9ucmVzaXplPWZ1bmN0aW9uKCl7cGFyZW50LnBvc3RNZXNzYWdlKDAsJyonKX08L3NjcmlwdD5cIjtcbiAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4od2luZG93LCAnbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpXG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZnJhbWUuc3JjID0gJ2Fib3V0OmJsYW5rJztcbiAgICAgICAgaWZyYW1lLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gbGlzdGVuKGlmcmFtZS5jb250ZW50V2luZG93LCAncmVzaXplJywgZm4pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmQobm9kZSwgaWZyYW1lKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoY3Jvc3NvcmlnaW4pIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5zdWJzY3JpYmUgJiYgaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGV0YWNoKGlmcmFtZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZV9jbGFzcyhlbGVtZW50LCBuYW1lLCB0b2dnbGUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cbmZ1bmN0aW9uIGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwpIHtcbiAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCBkZXRhaWwpO1xuICAgIHJldHVybiBlO1xufVxuZnVuY3Rpb24gcXVlcnlfc2VsZWN0b3JfYWxsKHNlbGVjdG9yLCBwYXJlbnQgPSBkb2N1bWVudC5ib2R5KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbn1cbmNsYXNzIEh0bWxUYWcge1xuICAgIGNvbnN0cnVjdG9yKGFuY2hvciA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5hID0gYW5jaG9yO1xuICAgICAgICB0aGlzLmUgPSB0aGlzLm4gPSBudWxsO1xuICAgIH1cbiAgICBtKGh0bWwsIHRhcmdldCwgYW5jaG9yID0gbnVsbCkge1xuICAgICAgICBpZiAoIXRoaXMuZSkge1xuICAgICAgICAgICAgdGhpcy5lID0gZWxlbWVudCh0YXJnZXQubm9kZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy50ID0gdGFyZ2V0O1xuICAgICAgICAgICAgdGhpcy5oKGh0bWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaShhbmNob3IpO1xuICAgIH1cbiAgICBoKGh0bWwpIHtcbiAgICAgICAgdGhpcy5lLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHRoaXMubiA9IEFycmF5LmZyb20odGhpcy5lLmNoaWxkTm9kZXMpO1xuICAgIH1cbiAgICBpKGFuY2hvcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaW5zZXJ0KHRoaXMudCwgdGhpcy5uW2ldLCBhbmNob3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHAoaHRtbCkge1xuICAgICAgICB0aGlzLmQoKTtcbiAgICAgICAgdGhpcy5oKGh0bWwpO1xuICAgICAgICB0aGlzLmkodGhpcy5hKTtcbiAgICB9XG4gICAgZCgpIHtcbiAgICAgICAgdGhpcy5uLmZvckVhY2goZGV0YWNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyaWJ1dGVfdG9fb2JqZWN0KGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJlc3VsdFthdHRyaWJ1dGUubmFtZV0gPSBhdHRyaWJ1dGUudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzKGVsZW1lbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBlbGVtZW50LmNoaWxkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICByZXN1bHRbbm9kZS5zbG90IHx8ICdkZWZhdWx0J10gPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IGFjdGl2ZV9kb2NzID0gbmV3IFNldCgpO1xubGV0IGFjdGl2ZSA9IDA7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gaGFzaChzdHIpIHtcbiAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgbGV0IGkgPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSBeIHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBoYXNoID4+PiAwO1xufVxuZnVuY3Rpb24gY3JlYXRlX3J1bGUobm9kZSwgYSwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNlLCBmbiwgdWlkID0gMCkge1xuICAgIGNvbnN0IHN0ZXAgPSAxNi42NjYgLyBkdXJhdGlvbjtcbiAgICBsZXQga2V5ZnJhbWVzID0gJ3tcXG4nO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDw9IDE7IHAgKz0gc3RlcCkge1xuICAgICAgICBjb25zdCB0ID0gYSArIChiIC0gYSkgKiBlYXNlKHApO1xuICAgICAgICBrZXlmcmFtZXMgKz0gcCAqIDEwMCArIGAleyR7Zm4odCwgMSAtIHQpfX1cXG5gO1xuICAgIH1cbiAgICBjb25zdCBydWxlID0ga2V5ZnJhbWVzICsgYDEwMCUgeyR7Zm4oYiwgMSAtIGIpfX1cXG59YDtcbiAgICBjb25zdCBuYW1lID0gYF9fc3ZlbHRlXyR7aGFzaChydWxlKX1fJHt1aWR9YDtcbiAgICBjb25zdCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgYWN0aXZlX2RvY3MuYWRkKGRvYyk7XG4gICAgY29uc3Qgc3R5bGVzaGVldCA9IGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0IHx8IChkb2MuX19zdmVsdGVfc3R5bGVzaGVldCA9IGRvYy5oZWFkLmFwcGVuZENoaWxkKGVsZW1lbnQoJ3N0eWxlJykpLnNoZWV0KTtcbiAgICBjb25zdCBjdXJyZW50X3J1bGVzID0gZG9jLl9fc3ZlbHRlX3J1bGVzIHx8IChkb2MuX19zdmVsdGVfcnVsZXMgPSB7fSk7XG4gICAgaWYgKCFjdXJyZW50X3J1bGVzW25hbWVdKSB7XG4gICAgICAgIGN1cnJlbnRfcnVsZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUoYEBrZXlmcmFtZXMgJHtuYW1lfSAke3J1bGV9YCwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCBhbmltYXRpb24gPSBub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJztcbiAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IGAke2FuaW1hdGlvbiA/IGAke2FuaW1hdGlvbn0sIGAgOiAnJ30ke25hbWV9ICR7ZHVyYXRpb259bXMgbGluZWFyICR7ZGVsYXl9bXMgMSBib3RoYDtcbiAgICBhY3RpdmUgKz0gMTtcbiAgICByZXR1cm4gbmFtZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IChub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJykuc3BsaXQoJywgJyk7XG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLmZpbHRlcihuYW1lXG4gICAgICAgID8gYW5pbSA9PiBhbmltLmluZGV4T2YobmFtZSkgPCAwIC8vIHJlbW92ZSBzcGVjaWZpYyBhbmltYXRpb25cbiAgICAgICAgOiBhbmltID0+IGFuaW0uaW5kZXhPZignX19zdmVsdGUnKSA9PT0gLTEgLy8gcmVtb3ZlIGFsbCBTdmVsdGUgYW5pbWF0aW9uc1xuICAgICk7XG4gICAgY29uc3QgZGVsZXRlZCA9IHByZXZpb3VzLmxlbmd0aCAtIG5leHQubGVuZ3RoO1xuICAgIGlmIChkZWxldGVkKSB7XG4gICAgICAgIG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gbmV4dC5qb2luKCcsICcpO1xuICAgICAgICBhY3RpdmUgLT0gZGVsZXRlZDtcbiAgICAgICAgaWYgKCFhY3RpdmUpXG4gICAgICAgICAgICBjbGVhcl9ydWxlcygpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsZWFyX3J1bGVzKCkge1xuICAgIHJhZigoKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGFjdGl2ZV9kb2NzLmZvckVhY2goZG9jID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2MuX19zdmVsdGVfc3R5bGVzaGVldDtcbiAgICAgICAgICAgIGxldCBpID0gc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoaS0tKVxuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShpKTtcbiAgICAgICAgICAgIGRvYy5fX3N2ZWx0ZV9ydWxlcyA9IHt9O1xuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZlX2RvY3MuY2xlYXIoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2FuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFmcm9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB0byA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG4gICAgc3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86XG4gICAgZW5kID0gc3RhcnRfdGltZSArIGR1cmF0aW9uLCB0aWNrID0gbm9vcCwgY3NzIH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IG5hbWU7XG4gICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIG5hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5KSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgbmFtZSk7XG4gICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgbG9vcChub3cgPT4ge1xuICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkICYmIG5vdyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuICAgICAgICAgICAgY29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBzdGFydCgpO1xuICAgIHRpY2soMCwgMSk7XG4gICAgcmV0dXJuIHN0b3A7XG59XG5mdW5jdGlvbiBmaXhfcG9zaXRpb24obm9kZSkge1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgYSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuICAgIGNvbnN0IGIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChhLmxlZnQgIT09IGIubGVmdCB8fCBhLnRvcCAhPT0gYi50b3ApIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuICAgICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcbiAgICB9XG59XG5cbmxldCBjdXJyZW50X2NvbXBvbmVudDtcbmZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHtcbiAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbicpO1xuICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGJlZm9yZVVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmJlZm9yZV91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbk1vdW50KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fbW91bnQucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmFmdGVyX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uRGVzdHJveShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX2Rlc3Ryb3kucHVzaChmbik7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudERpc3BhdGNoZXIoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgcmV0dXJuICh0eXBlLCBkZXRhaWwpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1t0eXBlXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgLy8gVE9ETyBhcmUgdGhlcmUgc2l0dWF0aW9ucyB3aGVyZSBldmVudHMgY291bGQgYmUgZGlzcGF0Y2hlZFxuICAgICAgICAgICAgLy8gaW4gYSBzZXJ2ZXIgKG5vbi1ET00pIGVudmlyb25tZW50P1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBjdXN0b21fZXZlbnQodHlwZSwgZGV0YWlsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29tcG9uZW50LCBldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBzZXRDb250ZXh0KGtleSwgY29udGV4dCkge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuc2V0KGtleSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmdldChrZXkpO1xufVxuZnVuY3Rpb24gaGFzQ29udGV4dChrZXkpIHtcbiAgICByZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5oYXMoa2V5KTtcbn1cbi8vIFRPRE8gZmlndXJlIG91dCBpZiB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnRcbi8vIHNob3J0aGFuZCBldmVudHMsIG9yIGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50XG4vLyBhIHJlYWwgYnViYmxpbmcgbWVjaGFuaXNtXG5mdW5jdGlvbiBidWJibGUoY29tcG9uZW50LCBldmVudCkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbZXZlbnQudHlwZV07XG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICBjYWxsYmFja3Muc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKGV2ZW50KSk7XG4gICAgfVxufVxuXG5jb25zdCBkaXJ0eV9jb21wb25lbnRzID0gW107XG5jb25zdCBpbnRyb3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07XG5jb25zdCBiaW5kaW5nX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVuZGVyX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5jb25zdCByZXNvbHZlZF9wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCkge1xuICAgIGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuICAgICAgICB1cGRhdGVfc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZWRfcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0aWNrKCkge1xuICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgIHJldHVybiByZXNvbHZlZF9wcm9taXNlO1xufVxuZnVuY3Rpb24gYWRkX3JlbmRlcl9jYWxsYmFjayhmbikge1xuICAgIHJlbmRlcl9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZGRfZmx1c2hfY2FsbGJhY2soZm4pIHtcbiAgICBmbHVzaF9jYWxsYmFja3MucHVzaChmbik7XG59XG5sZXQgZmx1c2hpbmcgPSBmYWxzZTtcbmNvbnN0IHNlZW5fY2FsbGJhY2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgaWYgKGZsdXNoaW5nKVxuICAgICAgICByZXR1cm47XG4gICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgIGRvIHtcbiAgICAgICAgLy8gZmlyc3QsIGNhbGwgYmVmb3JlVXBkYXRlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBhbmQgdXBkYXRlIGNvbXBvbmVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJ0eV9jb21wb25lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBkaXJ0eV9jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoY29tcG9uZW50LiQkKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgd2hpbGUgKGJpbmRpbmdfY2FsbGJhY2tzLmxlbmd0aClcbiAgICAgICAgICAgIGJpbmRpbmdfY2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgICAgIC8vIHRoZW4sIG9uY2UgY29tcG9uZW50cyBhcmUgdXBkYXRlZCwgY2FsbFxuICAgICAgICAvLyBhZnRlclVwZGF0ZSBmdW5jdGlvbnMuIFRoaXMgbWF5IGNhdXNlXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgdXBkYXRlcy4uLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVuZGVyX2NhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGlmICghc2Vlbl9jYWxsYmFja3MuaGFzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLnNvIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgICAgICBzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgIH0gd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKTtcbiAgICB3aGlsZSAoZmx1c2hfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBmbHVzaF9jYWxsYmFja3MucG9wKCkoKTtcbiAgICB9XG4gICAgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgc2Vlbl9jYWxsYmFja3MuY2xlYXIoKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZSgkJCkge1xuICAgIGlmICgkJC5mcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAkJC51cGRhdGUoKTtcbiAgICAgICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAgICAgY29uc3QgZGlydHkgPSAkJC5kaXJ0eTtcbiAgICAgICAgJCQuZGlydHkgPSBbLTFdO1xuICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5wKCQkLmN0eCwgZGlydHkpO1xuICAgICAgICAkJC5hZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbiAgICB9XG59XG5cbmxldCBwcm9taXNlO1xuZnVuY3Rpb24gd2FpdCgpIHtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoKG5vZGUsIGRpcmVjdGlvbiwga2luZCkge1xuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQoYCR7ZGlyZWN0aW9uID8gJ2ludHJvJyA6ICdvdXRybyd9JHtraW5kfWApKTtcbn1cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xubGV0IG91dHJvcztcbmZ1bmN0aW9uIGdyb3VwX291dHJvcygpIHtcbiAgICBvdXRyb3MgPSB7XG4gICAgICAgIHI6IDAsXG4gICAgICAgIGM6IFtdLFxuICAgICAgICBwOiBvdXRyb3MgLy8gcGFyZW50IGdyb3VwXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrX291dHJvcygpIHtcbiAgICBpZiAoIW91dHJvcy5yKSB7XG4gICAgICAgIHJ1bl9hbGwob3V0cm9zLmMpO1xuICAgIH1cbiAgICBvdXRyb3MgPSBvdXRyb3MucDtcbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLmkpIHtcbiAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgYmxvY2suaShsb2NhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9vdXQoYmxvY2ssIGxvY2FsLCBkZXRhY2gsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLm8pIHtcbiAgICAgICAgaWYgKG91dHJvaW5nLmhhcyhibG9jaykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG91dHJvaW5nLmFkZChibG9jayk7XG4gICAgICAgIG91dHJvcy5jLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmQoMSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrLm8obG9jYWwpO1xuICAgIH1cbn1cbmNvbnN0IG51bGxfdHJhbnNpdGlvbiA9IHsgZHVyYXRpb246IDAgfTtcbmZ1bmN0aW9uIGNyZWF0ZV9pbl90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBsZXQgdGFzaztcbiAgICBsZXQgdWlkID0gMDtcbiAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKCkge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzLCB1aWQrKyk7XG4gICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgaWYgKHRhc2spXG4gICAgICAgICAgICB0YXNrLmFib3J0KCk7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIHRydWUsICdzdGFydCcpKTtcbiAgICAgICAgdGFzayA9IGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCB0cnVlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlKTtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oZ28pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5kKCkge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBjb25zdCBncm91cCA9IG91dHJvcztcbiAgICBncm91cC5yICs9IDE7XG4gICAgZnVuY3Rpb24gZ28oKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDEsIDAsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICBjb25zdCBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheTtcbiAgICAgICAgY29uc3QgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgZHVyYXRpb247XG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdzdGFydCcpKTtcbiAgICAgICAgbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93ID49IGVuZF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIGZhbHNlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghLS1ncm91cC5yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIGBlbmQoKWAgYmVpbmcgY2FsbGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjbGVhbiB1cCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5fYWxsKGdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEgLSB0LCB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgIHdhaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnbygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlbmQocmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChyZXNldCAmJiBjb25maWcudGljaykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy50aWNrKDEsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zLCBpbnRybykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCB0ID0gaW50cm8gPyAwIDogMTtcbiAgICBsZXQgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgYW5pbWF0aW9uX25hbWUgPSBudWxsO1xuICAgIGZ1bmN0aW9uIGNsZWFyX2FuaW1hdGlvbigpIHtcbiAgICAgICAgaWYgKGFuaW1hdGlvbl9uYW1lKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0KHByb2dyYW0sIGR1cmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGQgPSBwcm9ncmFtLmIgLSB0O1xuICAgICAgICBkdXJhdGlvbiAqPSBNYXRoLmFicyhkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGE6IHQsXG4gICAgICAgICAgICBiOiBwcm9ncmFtLmIsXG4gICAgICAgICAgICBkLFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBzdGFydDogcHJvZ3JhbS5zdGFydCxcbiAgICAgICAgICAgIGVuZDogcHJvZ3JhbS5zdGFydCArIGR1cmF0aW9uLFxuICAgICAgICAgICAgZ3JvdXA6IHByb2dyYW0uZ3JvdXBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ28oYikge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0ge1xuICAgICAgICAgICAgc3RhcnQ6IG5vdygpICsgZGVsYXksXG4gICAgICAgICAgICBiXG4gICAgICAgIH07XG4gICAgICAgIGlmICghYikge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIHByb2dyYW0uZ3JvdXAgPSBvdXRyb3M7XG4gICAgICAgICAgICBvdXRyb3MuciArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0gfHwgcGVuZGluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICBwZW5kaW5nX3Byb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBpbnRybywgYW5kIHRoZXJlJ3MgYSBkZWxheSwgd2UgbmVlZCB0byBkb1xuICAgICAgICAgICAgLy8gYW4gaW5pdGlhbCB0aWNrIGFuZC9vciBhcHBseSBDU1MgYW5pbWF0aW9uIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCB0LCBiLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiKVxuICAgICAgICAgICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBpbml0KHByb2dyYW0sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgYiwgJ3N0YXJ0JykpO1xuICAgICAgICAgICAgbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nX3Byb2dyYW0gJiYgbm93ID4gcGVuZGluZ19wcm9ncmFtLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IGluaXQocGVuZGluZ19wcm9ncmFtLCBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHJ1bm5pbmdfcHJvZ3JhbS5iLCAnc3RhcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIHQsIHJ1bm5pbmdfcHJvZ3JhbS5iLCBydW5uaW5nX3Byb2dyYW0uZHVyYXRpb24sIDAsIGVhc2luZywgY29uZmlnLmNzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm93ID49IHJ1bm5pbmdfcHJvZ3JhbS5lbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2sodCA9IHJ1bm5pbmdfcHJvZ3JhbS5iLCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCBydW5uaW5nX3Byb2dyYW0uYiwgJ2VuZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBkb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbS5iKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJvIOKAlCB3ZSBjYW4gdGlkeSB1cCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHJvIOKAlCBuZWVkcyB0byBiZSBjb29yZGluYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIS0tcnVubmluZ19wcm9ncmFtLmdyb3VwLnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fYWxsKHJ1bm5pbmdfcHJvZ3JhbS5ncm91cC5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vdyA+PSBydW5uaW5nX3Byb2dyYW0uc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBydW5uaW5nX3Byb2dyYW0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gcnVubmluZ19wcm9ncmFtLmEgKyBydW5uaW5nX3Byb2dyYW0uZCAqIGVhc2luZyhwIC8gcnVubmluZ19wcm9ncmFtLmR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2sodCwgMSAtIHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhIShydW5uaW5nX3Byb2dyYW0gfHwgcGVuZGluZ19wcm9ncmFtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJ1bihiKSB7XG4gICAgICAgICAgICBpZiAoaXNfZnVuY3Rpb24oY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHdhaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgICAgICAgICAgZ28oYik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbyhiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW5kKCkge1xuICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlX3Byb21pc2UocHJvbWlzZSwgaW5mbykge1xuICAgIGNvbnN0IHRva2VuID0gaW5mby50b2tlbiA9IHt9O1xuICAgIGZ1bmN0aW9uIHVwZGF0ZSh0eXBlLCBpbmRleCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoaW5mby50b2tlbiAhPT0gdG9rZW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGluZm8ucmVzb2x2ZWQgPSB2YWx1ZTtcbiAgICAgICAgbGV0IGNoaWxkX2N0eCA9IGluZm8uY3R4O1xuICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNoaWxkX2N0eCA9IGNoaWxkX2N0eC5zbGljZSgpO1xuICAgICAgICAgICAgY2hpbGRfY3R4W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibG9jayA9IHR5cGUgJiYgKGluZm8uY3VycmVudCA9IHR5cGUpKGNoaWxkX2N0eCk7XG4gICAgICAgIGxldCBuZWVkc19mbHVzaCA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5mby5ibG9jaykge1xuICAgICAgICAgICAgaWYgKGluZm8uYmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgaW5mby5ibG9ja3MuZm9yRWFjaCgoYmxvY2ssIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGluZGV4ICYmIGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cF9vdXRyb3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25fb3V0KGJsb2NrLCAxLCAxLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uYmxvY2tzW2ldID09PSBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrc1tpXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja19vdXRyb3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5mby5ibG9jay5kKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgICAgICBibG9jay5tKGluZm8ubW91bnQoKSwgaW5mby5hbmNob3IpO1xuICAgICAgICAgICAgbmVlZHNfZmx1c2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8uYmxvY2sgPSBibG9jaztcbiAgICAgICAgaWYgKGluZm8uYmxvY2tzKVxuICAgICAgICAgICAgaW5mby5ibG9ja3NbaW5kZXhdID0gYmxvY2s7XG4gICAgICAgIGlmIChuZWVkc19mbHVzaCkge1xuICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNfcHJvbWlzZShwcm9taXNlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50X2NvbXBvbmVudCA9IGdldF9jdXJyZW50X2NvbXBvbmVudCgpO1xuICAgICAgICBwcm9taXNlLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGN1cnJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGN1cnJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLmNhdGNoLCAyLCBpbmZvLmVycm9yLCBlcnJvcik7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgICAgICBpZiAoIWluZm8uaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIHdlIHByZXZpb3VzbHkgaGFkIGEgdGhlbi9jYXRjaCBibG9jaywgZGVzdHJveSBpdFxuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnBlbmRpbmcsIDApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8udGhlbikge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLnJlc29sdmVkID0gcHJvbWlzZTtcbiAgICB9XG59XG5cbmNvbnN0IGdsb2JhbHMgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IHdpbmRvd1xuICAgIDogdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gZ2xvYmFsVGhpc1xuICAgICAgICA6IGdsb2JhbCk7XG5cbmZ1bmN0aW9uIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmQoMSk7XG4gICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xufVxuZnVuY3Rpb24gb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIHRyYW5zaXRpb25fb3V0KGJsb2NrLCAxLCAxLCAoKSA9PiB7XG4gICAgICAgIGxvb2t1cC5kZWxldGUoYmxvY2sua2V5KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZigpO1xuICAgIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiB1cGRhdGVfa2V5ZWRfZWFjaChvbGRfYmxvY2tzLCBkaXJ0eSwgZ2V0X2tleSwgZHluYW1pYywgY3R4LCBsaXN0LCBsb29rdXAsIG5vZGUsIGRlc3Ryb3ksIGNyZWF0ZV9lYWNoX2Jsb2NrLCBuZXh0LCBnZXRfY29udGV4dCkge1xuICAgIGxldCBvID0gb2xkX2Jsb2Nrcy5sZW5ndGg7XG4gICAgbGV0IG4gPSBsaXN0Lmxlbmd0aDtcbiAgICBsZXQgaSA9IG87XG4gICAgY29uc3Qgb2xkX2luZGV4ZXMgPSB7fTtcbiAgICB3aGlsZSAoaS0tKVxuICAgICAgICBvbGRfaW5kZXhlc1tvbGRfYmxvY2tzW2ldLmtleV0gPSBpO1xuICAgIGNvbnN0IG5ld19ibG9ja3MgPSBbXTtcbiAgICBjb25zdCBuZXdfbG9va3VwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRlbHRhcyA9IG5ldyBNYXAoKTtcbiAgICBpID0gbjtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkX2N0eCA9IGdldF9jb250ZXh0KGN0eCwgbGlzdCwgaSk7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoY2hpbGRfY3R4KTtcbiAgICAgICAgbGV0IGJsb2NrID0gbG9va3VwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgICAgICBibG9jayA9IGNyZWF0ZV9lYWNoX2Jsb2NrKGtleSwgY2hpbGRfY3R4KTtcbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkeW5hbWljKSB7XG4gICAgICAgICAgICBibG9jay5wKGNoaWxkX2N0eCwgZGlydHkpO1xuICAgICAgICB9XG4gICAgICAgIG5ld19sb29rdXAuc2V0KGtleSwgbmV3X2Jsb2Nrc1tpXSA9IGJsb2NrKTtcbiAgICAgICAgaWYgKGtleSBpbiBvbGRfaW5kZXhlcylcbiAgICAgICAgICAgIGRlbHRhcy5zZXQoa2V5LCBNYXRoLmFicyhpIC0gb2xkX2luZGV4ZXNba2V5XSkpO1xuICAgIH1cbiAgICBjb25zdCB3aWxsX21vdmUgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgZGlkX21vdmUgPSBuZXcgU2V0KCk7XG4gICAgZnVuY3Rpb24gaW5zZXJ0KGJsb2NrKSB7XG4gICAgICAgIHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuICAgICAgICBibG9jay5tKG5vZGUsIG5leHQpO1xuICAgICAgICBsb29rdXAuc2V0KGJsb2NrLmtleSwgYmxvY2spO1xuICAgICAgICBuZXh0ID0gYmxvY2suZmlyc3Q7XG4gICAgICAgIG4tLTtcbiAgICB9XG4gICAgd2hpbGUgKG8gJiYgbikge1xuICAgICAgICBjb25zdCBuZXdfYmxvY2sgPSBuZXdfYmxvY2tzW24gLSAxXTtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvIC0gMV07XG4gICAgICAgIGNvbnN0IG5ld19rZXkgPSBuZXdfYmxvY2sua2V5O1xuICAgICAgICBjb25zdCBvbGRfa2V5ID0gb2xkX2Jsb2NrLmtleTtcbiAgICAgICAgaWYgKG5ld19ibG9jayA9PT0gb2xkX2Jsb2NrKSB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICBuZXh0ID0gbmV3X2Jsb2NrLmZpcnN0O1xuICAgICAgICAgICAgby0tO1xuICAgICAgICAgICAgbi0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfa2V5KSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCBibG9ja1xuICAgICAgICAgICAgZGVzdHJveShvbGRfYmxvY2ssIGxvb2t1cCk7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWxvb2t1cC5oYXMobmV3X2tleSkgfHwgd2lsbF9tb3ZlLmhhcyhuZXdfa2V5KSkge1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlkX21vdmUuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGVsdGFzLmdldChuZXdfa2V5KSA+IGRlbHRhcy5nZXQob2xkX2tleSkpIHtcbiAgICAgICAgICAgIGRpZF9tb3ZlLmFkZChuZXdfa2V5KTtcbiAgICAgICAgICAgIGluc2VydChuZXdfYmxvY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2lsbF9tb3ZlLmFkZChvbGRfa2V5KTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoby0tKSB7XG4gICAgICAgIGNvbnN0IG9sZF9ibG9jayA9IG9sZF9ibG9ja3Nbb107XG4gICAgICAgIGlmICghbmV3X2xvb2t1cC5oYXMob2xkX2Jsb2NrLmtleSkpXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICB9XG4gICAgd2hpbGUgKG4pXG4gICAgICAgIGluc2VydChuZXdfYmxvY2tzW24gLSAxXSk7XG4gICAgcmV0dXJuIG5ld19ibG9ja3M7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2tleXMoY3R4LCBsaXN0LCBnZXRfY29udGV4dCwgZ2V0X2tleSkge1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKSk7XG4gICAgICAgIGlmIChrZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYXZlIGR1cGxpY2F0ZSBrZXlzIGluIGEga2V5ZWQgZWFjaCcpO1xuICAgICAgICB9XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRfc3ByZWFkX3VwZGF0ZShsZXZlbHMsIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcbiAgICBjb25zdCB0b19udWxsX291dCA9IHt9O1xuICAgIGNvbnN0IGFjY291bnRlZF9mb3IgPSB7ICQkc2NvcGU6IDEgfTtcbiAgICBsZXQgaSA9IGxldmVscy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBjb25zdCBvID0gbGV2ZWxzW2ldO1xuICAgICAgICBjb25zdCBuID0gdXBkYXRlc1tpXTtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gbikpXG4gICAgICAgICAgICAgICAgICAgIHRvX251bGxfb3V0W2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbikge1xuICAgICAgICAgICAgICAgIGlmICghYWNjb3VudGVkX2ZvcltrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gbltrZXldO1xuICAgICAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldmVsc1tpXSA9IG47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvKSB7XG4gICAgICAgICAgICAgICAgYWNjb3VudGVkX2ZvcltrZXldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b19udWxsX291dCkge1xuICAgICAgICBpZiAoIShrZXkgaW4gdXBkYXRlKSlcbiAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZ2V0X3NwcmVhZF9vYmplY3Qoc3ByZWFkX3Byb3BzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzcHJlYWRfcHJvcHMgPT09ICdvYmplY3QnICYmIHNwcmVhZF9wcm9wcyAhPT0gbnVsbCA/IHNwcmVhZF9wcm9wcyA6IHt9O1xufVxuXG4vLyBzb3VyY2U6IGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZGljZXMuaHRtbFxuY29uc3QgYm9vbGVhbl9hdHRyaWJ1dGVzID0gbmV3IFNldChbXG4gICAgJ2FsbG93ZnVsbHNjcmVlbicsXG4gICAgJ2FsbG93cGF5bWVudHJlcXVlc3QnLFxuICAgICdhc3luYycsXG4gICAgJ2F1dG9mb2N1cycsXG4gICAgJ2F1dG9wbGF5JyxcbiAgICAnY2hlY2tlZCcsXG4gICAgJ2NvbnRyb2xzJyxcbiAgICAnZGVmYXVsdCcsXG4gICAgJ2RlZmVyJyxcbiAgICAnZGlzYWJsZWQnLFxuICAgICdmb3Jtbm92YWxpZGF0ZScsXG4gICAgJ2hpZGRlbicsXG4gICAgJ2lzbWFwJyxcbiAgICAnbG9vcCcsXG4gICAgJ211bHRpcGxlJyxcbiAgICAnbXV0ZWQnLFxuICAgICdub21vZHVsZScsXG4gICAgJ25vdmFsaWRhdGUnLFxuICAgICdvcGVuJyxcbiAgICAncGxheXNpbmxpbmUnLFxuICAgICdyZWFkb25seScsXG4gICAgJ3JlcXVpcmVkJyxcbiAgICAncmV2ZXJzZWQnLFxuICAgICdzZWxlY3RlZCdcbl0pO1xuXG5jb25zdCBpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3RlciA9IC9bXFxzJ1wiPi89XFx1e0ZERDB9LVxcdXtGREVGfVxcdXtGRkZFfVxcdXtGRkZGfVxcdXsxRkZGRX1cXHV7MUZGRkZ9XFx1ezJGRkZFfVxcdXsyRkZGRn1cXHV7M0ZGRkV9XFx1ezNGRkZGfVxcdXs0RkZGRX1cXHV7NEZGRkZ9XFx1ezVGRkZFfVxcdXs1RkZGRn1cXHV7NkZGRkV9XFx1ezZGRkZGfVxcdXs3RkZGRX1cXHV7N0ZGRkZ9XFx1ezhGRkZFfVxcdXs4RkZGRn1cXHV7OUZGRkV9XFx1ezlGRkZGfVxcdXtBRkZGRX1cXHV7QUZGRkZ9XFx1e0JGRkZFfVxcdXtCRkZGRn1cXHV7Q0ZGRkV9XFx1e0NGRkZGfVxcdXtERkZGRX1cXHV7REZGRkZ9XFx1e0VGRkZFfVxcdXtFRkZGRn1cXHV7RkZGRkV9XFx1e0ZGRkZGfVxcdXsxMEZGRkV9XFx1ezEwRkZGRn1dL3U7XG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNub25jaGFyYWN0ZXJcbmZ1bmN0aW9uIHNwcmVhZChhcmdzLCBjbGFzc2VzX3RvX2FkZCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKTtcbiAgICBpZiAoY2xhc3Nlc190b19hZGQpIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY2xhc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgYXR0cmlidXRlcy5jbGFzcyA9IGNsYXNzZXNfdG9fYWRkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXR0cmlidXRlcy5jbGFzcyArPSAnICcgKyBjbGFzc2VzX3RvX2FkZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgc3RyID0gJyc7XG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgaWYgKGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyLnRlc3QobmFtZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc1tuYW1lXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKVxuICAgICAgICAgICAgc3RyICs9ICcgJyArIG5hbWU7XG4gICAgICAgIGVsc2UgaWYgKGJvb2xlYW5fYXR0cmlidXRlcy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgICAgIHN0ciArPSAnICcgKyBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHN0ciArPSBgICR7bmFtZX09XCIke1N0cmluZyh2YWx1ZSkucmVwbGFjZSgvXCIvZywgJyYjMzQ7JykucmVwbGFjZSgvJy9nLCAnJiMzOTsnKX1cImA7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xufVxuY29uc3QgZXNjYXBlZCA9IHtcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7JyxcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0Oydcbn07XG5mdW5jdGlvbiBlc2NhcGUoaHRtbCkge1xuICAgIHJldHVybiBTdHJpbmcoaHRtbCkucmVwbGFjZSgvW1wiJyY8Pl0vZywgbWF0Y2ggPT4gZXNjYXBlZFttYXRjaF0pO1xufVxuZnVuY3Rpb24gZWFjaChpdGVtcywgZm4pIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzdHIgKz0gZm4oaXRlbXNbaV0sIGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuY29uc3QgbWlzc2luZ19jb21wb25lbnQgPSB7XG4gICAgJCRyZW5kZXI6ICgpID0+ICcnXG59O1xuZnVuY3Rpb24gdmFsaWRhdGVfY29tcG9uZW50KGNvbXBvbmVudCwgbmFtZSkge1xuICAgIGlmICghY29tcG9uZW50IHx8ICFjb21wb25lbnQuJCRyZW5kZXIpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdzdmVsdGU6Y29tcG9uZW50JylcbiAgICAgICAgICAgIG5hbWUgKz0gJyB0aGlzPXsuLi59JztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGA8JHtuYW1lfT4gaXMgbm90IGEgdmFsaWQgU1NSIGNvbXBvbmVudC4gWW91IG1heSBuZWVkIHRvIHJldmlldyB5b3VyIGJ1aWxkIGNvbmZpZyB0byBlbnN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGNvbXBpbGVkLCByYXRoZXIgdGhhbiBpbXBvcnRlZCBhcyBwcmUtY29tcGlsZWQgbW9kdWxlc2ApO1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuZnVuY3Rpb24gZGVidWcoZmlsZSwgbGluZSwgY29sdW1uLCB2YWx1ZXMpIHtcbiAgICBjb25zb2xlLmxvZyhge0BkZWJ1Z30gJHtmaWxlID8gZmlsZSArICcgJyA6ICcnfSgke2xpbmV9OiR7Y29sdW1ufSlgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2codmFsdWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgcmV0dXJuICcnO1xufVxubGV0IG9uX2Rlc3Ryb3k7XG5mdW5jdGlvbiBjcmVhdGVfc3NyX2NvbXBvbmVudChmbikge1xuICAgIGZ1bmN0aW9uICQkcmVuZGVyKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cykge1xuICAgICAgICBjb25zdCBwYXJlbnRfY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG4gICAgICAgIGNvbnN0ICQkID0ge1xuICAgICAgICAgICAgb25fZGVzdHJveSxcbiAgICAgICAgICAgIGNvbnRleHQ6IG5ldyBNYXAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSxcbiAgICAgICAgICAgIC8vIHRoZXNlIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGlzY2FyZGVkXG4gICAgICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpXG4gICAgICAgIH07XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudCh7ICQkIH0pO1xuICAgICAgICBjb25zdCBodG1sID0gZm4ocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzKTtcbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVuZGVyOiAocHJvcHMgPSB7fSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgICAgICBvbl9kZXN0cm95ID0gW107XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHRpdGxlOiAnJywgaGVhZDogJycsIGNzczogbmV3IFNldCgpIH07XG4gICAgICAgICAgICBjb25zdCBodG1sID0gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywge30sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcnVuX2FsbChvbl9kZXN0cm95KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogQXJyYXkuZnJvbShyZXN1bHQuY3NzKS5tYXAoY3NzID0+IGNzcy5jb2RlKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBudWxsIC8vIFRPRE9cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWQ6IHJlc3VsdC50aXRsZSArIHJlc3VsdC5oZWFkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAkJHJlbmRlclxuICAgIH07XG59XG5mdW5jdGlvbiBhZGRfYXR0cmlidXRlKG5hbWUsIHZhbHVlLCBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgKGJvb2xlYW4gJiYgIXZhbHVlKSlcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIHJldHVybiBgICR7bmFtZX0ke3ZhbHVlID09PSB0cnVlID8gJycgOiBgPSR7dHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEpTT04uc3RyaW5naWZ5KGVzY2FwZSh2YWx1ZSkpIDogYFwiJHt2YWx1ZX1cImB9YH1gO1xufVxuZnVuY3Rpb24gYWRkX2NsYXNzZXMoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzID8gYCBjbGFzcz1cIiR7Y2xhc3Nlc31cImAgOiAnJztcbn1cblxuZnVuY3Rpb24gYmluZChjb21wb25lbnQsIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaW5kZXggPSBjb21wb25lbnQuJCQucHJvcHNbbmFtZV07XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29tcG9uZW50LiQkLmJvdW5kW2luZGV4XSA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayhjb21wb25lbnQuJCQuY3R4W2luZGV4XSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlX2NvbXBvbmVudChibG9jaykge1xuICAgIGJsb2NrICYmIGJsb2NrLmMoKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2NvbXBvbmVudChibG9jaywgcGFyZW50X25vZGVzKSB7XG4gICAgYmxvY2sgJiYgYmxvY2subChwYXJlbnRfbm9kZXMpO1xufVxuZnVuY3Rpb24gbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgdGFyZ2V0LCBhbmNob3IpIHtcbiAgICBjb25zdCB7IGZyYWdtZW50LCBvbl9tb3VudCwgb25fZGVzdHJveSwgYWZ0ZXJfdXBkYXRlIH0gPSBjb21wb25lbnQuJCQ7XG4gICAgZnJhZ21lbnQgJiYgZnJhZ21lbnQubSh0YXJnZXQsIGFuY2hvcik7XG4gICAgLy8gb25Nb3VudCBoYXBwZW5zIGJlZm9yZSB0aGUgaW5pdGlhbCBhZnRlclVwZGF0ZVxuICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdfb25fZGVzdHJveSA9IG9uX21vdW50Lm1hcChydW4pLmZpbHRlcihpc19mdW5jdGlvbik7XG4gICAgICAgIGlmIChvbl9kZXN0cm95KSB7XG4gICAgICAgICAgICBvbl9kZXN0cm95LnB1c2goLi4ubmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRWRnZSBjYXNlIC0gY29tcG9uZW50IHdhcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHksXG4gICAgICAgICAgICAvLyBtb3N0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBhIGJpbmRpbmcgaW5pdGlhbGlzaW5nXG4gICAgICAgICAgICBydW5fYWxsKG5ld19vbl9kZXN0cm95KTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnQuJCQub25fbW91bnQgPSBbXTtcbiAgICB9KTtcbiAgICBhZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfY29tcG9uZW50KGNvbXBvbmVudCwgZGV0YWNoaW5nKSB7XG4gICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQ7XG4gICAgaWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHJ1bl9hbGwoJCQub25fZGVzdHJveSk7XG4gICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmQoZGV0YWNoaW5nKTtcbiAgICAgICAgLy8gVE9ETyBudWxsIG91dCBvdGhlciByZWZzLCBpbmNsdWRpbmcgY29tcG9uZW50LiQkIChidXQgbmVlZCB0b1xuICAgICAgICAvLyBwcmVzZXJ2ZSBmaW5hbCBzdGF0ZT8pXG4gICAgICAgICQkLm9uX2Rlc3Ryb3kgPSAkJC5mcmFnbWVudCA9IG51bGw7XG4gICAgICAgICQkLmN0eCA9IFtdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKSB7XG4gICAgaWYgKGNvbXBvbmVudC4kJC5kaXJ0eVswXSA9PT0gLTEpIHtcbiAgICAgICAgZGlydHlfY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgICAgICBjb21wb25lbnQuJCQuZGlydHkuZmlsbCgwKTtcbiAgICB9XG4gICAgY29tcG9uZW50LiQkLmRpcnR5WyhpIC8gMzEpIHwgMF0gfD0gKDEgPDwgKGkgJSAzMSkpO1xufVxuZnVuY3Rpb24gaW5pdChjb21wb25lbnQsIG9wdGlvbnMsIGluc3RhbmNlLCBjcmVhdGVfZnJhZ21lbnQsIG5vdF9lcXVhbCwgcHJvcHMsIGRpcnR5ID0gWy0xXSkge1xuICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBjb25zdCBwcm9wX3ZhbHVlcyA9IG9wdGlvbnMucHJvcHMgfHwge307XG4gICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQgPSB7XG4gICAgICAgIGZyYWdtZW50OiBudWxsLFxuICAgICAgICBjdHg6IG51bGwsXG4gICAgICAgIC8vIHN0YXRlXG4gICAgICAgIHByb3BzLFxuICAgICAgICB1cGRhdGU6IG5vb3AsXG4gICAgICAgIG5vdF9lcXVhbCxcbiAgICAgICAgYm91bmQ6IGJsYW5rX29iamVjdCgpLFxuICAgICAgICAvLyBsaWZlY3ljbGVcbiAgICAgICAgb25fbW91bnQ6IFtdLFxuICAgICAgICBvbl9kZXN0cm95OiBbXSxcbiAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sXG4gICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgIGNvbnRleHQ6IG5ldyBNYXAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSxcbiAgICAgICAgLy8gZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIGNhbGxiYWNrczogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIGRpcnR5LFxuICAgICAgICBza2lwX2JvdW5kOiBmYWxzZVxuICAgIH07XG4gICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgJCQuY3R4ID0gaW5zdGFuY2VcbiAgICAgICAgPyBpbnN0YW5jZShjb21wb25lbnQsIHByb3BfdmFsdWVzLCAoaSwgcmV0LCAuLi5yZXN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3QubGVuZ3RoID8gcmVzdFswXSA6IHJldDtcbiAgICAgICAgICAgIGlmICgkJC5jdHggJiYgbm90X2VxdWFsKCQkLmN0eFtpXSwgJCQuY3R4W2ldID0gdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEkJC5za2lwX2JvdW5kICYmICQkLmJvdW5kW2ldKVxuICAgICAgICAgICAgICAgICAgICAkJC5ib3VuZFtpXSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWR5KVxuICAgICAgICAgICAgICAgICAgICBtYWtlX2RpcnR5KGNvbXBvbmVudCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9KVxuICAgICAgICA6IFtdO1xuICAgICQkLnVwZGF0ZSgpO1xuICAgIHJlYWR5ID0gdHJ1ZTtcbiAgICBydW5fYWxsKCQkLmJlZm9yZV91cGRhdGUpO1xuICAgIC8vIGBmYWxzZWAgYXMgYSBzcGVjaWFsIGNhc2Ugb2Ygbm8gRE9NIGNvbXBvbmVudFxuICAgICQkLmZyYWdtZW50ID0gY3JlYXRlX2ZyYWdtZW50ID8gY3JlYXRlX2ZyYWdtZW50KCQkLmN0eCkgOiBmYWxzZTtcbiAgICBpZiAob3B0aW9ucy50YXJnZXQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZHJlbihvcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQubChub2Rlcyk7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGRldGFjaCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuYygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmludHJvKVxuICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihjb21wb25lbnQuJCQuZnJhZ21lbnQpO1xuICAgICAgICBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5hbmNob3IpO1xuICAgICAgICBmbHVzaCgpO1xuICAgIH1cbiAgICBzZXRfY3VycmVudF9jb21wb25lbnQocGFyZW50X2NvbXBvbmVudCk7XG59XG5sZXQgU3ZlbHRlRWxlbWVudDtcbmlmICh0eXBlb2YgSFRNTEVsZW1lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBTdmVsdGVFbGVtZW50ID0gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuJCQuc2xvdHRlZCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLiQkLnNsb3R0ZWRba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsIF9vbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXNbYXR0cl0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB0aGlzIGRlbGVnYXRlIHRvIGFkZEV2ZW50TGlzdGVuZXI/XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuJCRzZXQgJiYgIWlzX2VtcHR5KCQkcHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgU3ZlbHRlIGNvbXBvbmVudHMuIFVzZWQgd2hlbiBkZXY9ZmFsc2UuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gbm9vcDtcbiAgICB9XG4gICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSB8fCAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gPSBbXSkpO1xuICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICBpZiAodGhpcy4kJHNldCAmJiAhaXNfZW1wdHkoJCRwcm9wcykpIHtcbiAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoX2Rldih0eXBlLCBkZXRhaWwpIHtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudCh0eXBlLCBPYmplY3QuYXNzaWduKHsgdmVyc2lvbjogJzMuMzEuMicgfSwgZGV0YWlsKSkpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2Rldih0YXJnZXQsIG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZCh0YXJnZXQsIG5vZGUpO1xufVxuZnVuY3Rpb24gaW5zZXJ0X2Rldih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUsIGFuY2hvciB9KTtcbiAgICBpbnNlcnQodGFyZ2V0LCBub2RlLCBhbmNob3IpO1xufVxuZnVuY3Rpb24gZGV0YWNoX2Rldihub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmUnLCB7IG5vZGUgfSk7XG4gICAgZGV0YWNoKG5vZGUpO1xufVxuZnVuY3Rpb24gZGV0YWNoX2JldHdlZW5fZGV2KGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nICYmIGJlZm9yZS5uZXh0U2libGluZyAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgZGV0YWNoX2RldihiZWZvcmUubmV4dFNpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9iZWZvcmVfZGV2KGFmdGVyKSB7XG4gICAgd2hpbGUgKGFmdGVyLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGFmdGVyLnByZXZpb3VzU2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZGV0YWNoX2FmdGVyX2RldihiZWZvcmUpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5fZGV2KG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zLCBoYXNfcHJldmVudF9kZWZhdWx0LCBoYXNfc3RvcF9wcm9wYWdhdGlvbikge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IG9wdGlvbnMgPT09IHRydWUgPyBbJ2NhcHR1cmUnXSA6IG9wdGlvbnMgPyBBcnJheS5mcm9tKE9iamVjdC5rZXlzKG9wdGlvbnMpKSA6IFtdO1xuICAgIGlmIChoYXNfcHJldmVudF9kZWZhdWx0KVxuICAgICAgICBtb2RpZmllcnMucHVzaCgncHJldmVudERlZmF1bHQnKTtcbiAgICBpZiAoaGFzX3N0b3BfcHJvcGFnYXRpb24pXG4gICAgICAgIG1vZGlmaWVycy5wdXNoKCdzdG9wUHJvcGFnYXRpb24nKTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUFkZEV2ZW50TGlzdGVuZXInLCB7IG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBtb2RpZmllcnMgfSk7XG4gICAgY29uc3QgZGlzcG9zZSA9IGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgICAgICBkaXNwb3NlKCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGF0dHJfZGV2KG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVJlbW92ZUF0dHJpYnV0ZScsIHsgbm9kZSwgYXR0cmlidXRlIH0pO1xuICAgIGVsc2VcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXRBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBwcm9wX2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0UHJvcGVydHknLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIGRhdGFzZXRfZGV2KG5vZGUsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIG5vZGUuZGF0YXNldFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldERhdGFzZXQnLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhX2Rldih0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC53aG9sZVRleHQgPT09IGRhdGEpXG4gICAgICAgIHJldHVybjtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldERhdGEnLCB7IG5vZGU6IHRleHQsIGRhdGEgfSk7XG4gICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2VhY2hfYXJndW1lbnQoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnICYmICEoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIGFyZykpIHtcbiAgICAgICAgbGV0IG1zZyA9ICd7I2VhY2h9IG9ubHkgaXRlcmF0ZXMgb3ZlciBhcnJheS1saWtlIG9iamVjdHMuJztcbiAgICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgYXJnICYmIFN5bWJvbC5pdGVyYXRvciBpbiBhcmcpIHtcbiAgICAgICAgICAgIG1zZyArPSAnIFlvdSBjYW4gdXNlIGEgc3ByZWFkIHRvIGNvbnZlcnQgdGhpcyBpdGVyYWJsZSBpbnRvIGFuIGFycmF5Lic7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVfc2xvdHMobmFtZSwgc2xvdCwga2V5cykge1xuICAgIGZvciAoY29uc3Qgc2xvdF9rZXkgb2YgT2JqZWN0LmtleXMoc2xvdCkpIHtcbiAgICAgICAgaWYgKCF+a2V5cy5pbmRleE9mKHNsb3Rfa2V5KSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGA8JHtuYW1lfT4gcmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBzbG90IFwiJHtzbG90X2tleX1cIi5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgU3ZlbHRlIGNvbXBvbmVudHMgd2l0aCBzb21lIG1pbm9yIGRldi1lbmhhbmNlbWVudHMuIFVzZWQgd2hlbiBkZXY9dHJ1ZS5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50RGV2IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCAoIW9wdGlvbnMudGFyZ2V0ICYmICFvcHRpb25zLiQkaW5saW5lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3RhcmdldCcgaXMgYSByZXF1aXJlZCBvcHRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLiRkZXN0cm95KCk7XG4gICAgICAgIHRoaXMuJGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbXBvbmVudCB3YXMgYWxyZWFkeSBkZXN0cm95ZWQnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIH07XG4gICAgfVxuICAgICRjYXB0dXJlX3N0YXRlKCkgeyB9XG4gICAgJGluamVjdF9zdGF0ZSgpIHsgfVxufVxuLyoqXG4gKiBCYXNlIGNsYXNzIHRvIGNyZWF0ZSBzdHJvbmdseSB0eXBlZCBTdmVsdGUgY29tcG9uZW50cy5cbiAqIFRoaXMgb25seSBleGlzdHMgZm9yIHR5cGluZyBwdXJwb3NlcyBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gYC5kLnRzYCBmaWxlcy5cbiAqXG4gKiAjIyMgRXhhbXBsZTpcbiAqXG4gKiBZb3UgaGF2ZSBjb21wb25lbnQgbGlicmFyeSBvbiBucG0gY2FsbGVkIGBjb21wb25lbnQtbGlicmFyeWAsIGZyb20gd2hpY2hcbiAqIHlvdSBleHBvcnQgYSBjb21wb25lbnQgY2FsbGVkIGBNeUNvbXBvbmVudGAuIEZvciBTdmVsdGUrVHlwZVNjcmlwdCB1c2VycyxcbiAqIHlvdSB3YW50IHRvIHByb3ZpZGUgdHlwaW5ncy4gVGhlcmVmb3JlIHlvdSBjcmVhdGUgYSBgaW5kZXguZC50c2A6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgU3ZlbHRlQ29tcG9uZW50VHlwZWQgfSBmcm9tIFwic3ZlbHRlXCI7XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnRUeXBlZDx7Zm9vOiBzdHJpbmd9PiB7fVxuICogYGBgXG4gKiBUeXBpbmcgdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgSURFcyBsaWtlIFZTIENvZGUgd2l0aCB0aGUgU3ZlbHRlIGV4dGVuc2lvblxuICogdG8gcHJvdmlkZSBpbnRlbGxpc2Vuc2UgYW5kIHRvIHVzZSB0aGUgY29tcG9uZW50IGxpa2UgdGhpcyBpbiBhIFN2ZWx0ZSBmaWxlXG4gKiB3aXRoIFR5cGVTY3JpcHQ6XG4gKiBgYGBzdmVsdGVcbiAqIDxzY3JpcHQgbGFuZz1cInRzXCI+XG4gKiBcdGltcG9ydCB7IE15Q29tcG9uZW50IH0gZnJvbSBcImNvbXBvbmVudC1saWJyYXJ5XCI7XG4gKiA8L3NjcmlwdD5cbiAqIDxNeUNvbXBvbmVudCBmb289eydiYXInfSAvPlxuICogYGBgXG4gKlxuICogIyMjIyBXaHkgbm90IG1ha2UgdGhpcyBwYXJ0IG9mIGBTdmVsdGVDb21wb25lbnQoRGV2KWA/XG4gKiBCZWNhdXNlXG4gKiBgYGB0c1xuICogY2xhc3MgQVN1YmNsYXNzT2ZTdmVsdGVDb21wb25lbnQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnQ8e2Zvbzogc3RyaW5nfT4ge31cbiAqIGNvbnN0IGNvbXBvbmVudDogdHlwZW9mIFN2ZWx0ZUNvbXBvbmVudCA9IEFTdWJjbGFzc09mU3ZlbHRlQ29tcG9uZW50O1xuICogYGBgXG4gKiB3aWxsIHRocm93IGEgdHlwZSBlcnJvciwgc28gd2UgbmVlZCB0byBzZXBlcmF0ZSB0aGUgbW9yZSBzdHJpY3RseSB0eXBlZCBjbGFzcy5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50VHlwZWQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbG9vcF9ndWFyZCh0aW1lb3V0KSB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiB0aW1lb3V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luZmluaXRlIGxvb3AgZGV0ZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCB7IEh0bWxUYWcsIFN2ZWx0ZUNvbXBvbmVudCwgU3ZlbHRlQ29tcG9uZW50RGV2LCBTdmVsdGVDb21wb25lbnRUeXBlZCwgU3ZlbHRlRWxlbWVudCwgYWN0aW9uX2Rlc3Ryb3llciwgYWRkX2F0dHJpYnV0ZSwgYWRkX2NsYXNzZXMsIGFkZF9mbHVzaF9jYWxsYmFjaywgYWRkX2xvY2F0aW9uLCBhZGRfcmVuZGVyX2NhbGxiYWNrLCBhZGRfcmVzaXplX2xpc3RlbmVyLCBhZGRfdHJhbnNmb3JtLCBhZnRlclVwZGF0ZSwgYXBwZW5kLCBhcHBlbmRfZGV2LCBhc3NpZ24sIGF0dHIsIGF0dHJfZGV2LCBhdHRyaWJ1dGVfdG9fb2JqZWN0LCBiZWZvcmVVcGRhdGUsIGJpbmQsIGJpbmRpbmdfY2FsbGJhY2tzLCBibGFua19vYmplY3QsIGJ1YmJsZSwgY2hlY2tfb3V0cm9zLCBjaGlsZHJlbiwgY2xhaW1fY29tcG9uZW50LCBjbGFpbV9lbGVtZW50LCBjbGFpbV9zcGFjZSwgY2xhaW1fdGV4dCwgY2xlYXJfbG9vcHMsIGNvbXBvbmVudF9zdWJzY3JpYmUsIGNvbXB1dGVfcmVzdF9wcm9wcywgY29tcHV0ZV9zbG90cywgY3JlYXRlRXZlbnREaXNwYXRjaGVyLCBjcmVhdGVfYW5pbWF0aW9uLCBjcmVhdGVfYmlkaXJlY3Rpb25hbF90cmFuc2l0aW9uLCBjcmVhdGVfY29tcG9uZW50LCBjcmVhdGVfaW5fdHJhbnNpdGlvbiwgY3JlYXRlX291dF90cmFuc2l0aW9uLCBjcmVhdGVfc2xvdCwgY3JlYXRlX3Nzcl9jb21wb25lbnQsIGN1cnJlbnRfY29tcG9uZW50LCBjdXN0b21fZXZlbnQsIGRhdGFzZXRfZGV2LCBkZWJ1ZywgZGVzdHJveV9ibG9jaywgZGVzdHJveV9jb21wb25lbnQsIGRlc3Ryb3lfZWFjaCwgZGV0YWNoLCBkZXRhY2hfYWZ0ZXJfZGV2LCBkZXRhY2hfYmVmb3JlX2RldiwgZGV0YWNoX2JldHdlZW5fZGV2LCBkZXRhY2hfZGV2LCBkaXJ0eV9jb21wb25lbnRzLCBkaXNwYXRjaF9kZXYsIGVhY2gsIGVsZW1lbnQsIGVsZW1lbnRfaXMsIGVtcHR5LCBlc2NhcGUsIGVzY2FwZWQsIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMsIGZpeF9hbmRfZGVzdHJveV9ibG9jaywgZml4X2FuZF9vdXRyb19hbmRfZGVzdHJveV9ibG9jaywgZml4X3Bvc2l0aW9uLCBmbHVzaCwgZ2V0Q29udGV4dCwgZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUsIGdldF9jdXJyZW50X2NvbXBvbmVudCwgZ2V0X2N1c3RvbV9lbGVtZW50c19zbG90cywgZ2V0X3Nsb3RfY2hhbmdlcywgZ2V0X3Nsb3RfY29udGV4dCwgZ2V0X3NwcmVhZF9vYmplY3QsIGdldF9zcHJlYWRfdXBkYXRlLCBnZXRfc3RvcmVfdmFsdWUsIGdsb2JhbHMsIGdyb3VwX291dHJvcywgaGFuZGxlX3Byb21pc2UsIGhhc0NvbnRleHQsIGhhc19wcm9wLCBpZGVudGl0eSwgaW5pdCwgaW5zZXJ0LCBpbnNlcnRfZGV2LCBpbnRyb3MsIGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyLCBpc19jbGllbnQsIGlzX2Nyb3Nzb3JpZ2luLCBpc19lbXB0eSwgaXNfZnVuY3Rpb24sIGlzX3Byb21pc2UsIGxpc3RlbiwgbGlzdGVuX2RldiwgbG9vcCwgbG9vcF9ndWFyZCwgbWlzc2luZ19jb21wb25lbnQsIG1vdW50X2NvbXBvbmVudCwgbm9vcCwgbm90X2VxdWFsLCBub3csIG51bGxfdG9fZW1wdHksIG9iamVjdF93aXRob3V0X3Byb3BlcnRpZXMsIG9uRGVzdHJveSwgb25Nb3VudCwgb25jZSwgb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIHByZXZlbnRfZGVmYXVsdCwgcHJvcF9kZXYsIHF1ZXJ5X3NlbGVjdG9yX2FsbCwgcmFmLCBydW4sIHJ1bl9hbGwsIHNhZmVfbm90X2VxdWFsLCBzY2hlZHVsZV91cGRhdGUsIHNlbGVjdF9tdWx0aXBsZV92YWx1ZSwgc2VsZWN0X29wdGlvbiwgc2VsZWN0X29wdGlvbnMsIHNlbGVjdF92YWx1ZSwgc2VsZiwgc2V0Q29udGV4dCwgc2V0X2F0dHJpYnV0ZXMsIHNldF9jdXJyZW50X2NvbXBvbmVudCwgc2V0X2N1c3RvbV9lbGVtZW50X2RhdGEsIHNldF9kYXRhLCBzZXRfZGF0YV9kZXYsIHNldF9pbnB1dF90eXBlLCBzZXRfaW5wdXRfdmFsdWUsIHNldF9ub3csIHNldF9yYWYsIHNldF9zdG9yZV92YWx1ZSwgc2V0X3N0eWxlLCBzZXRfc3ZnX2F0dHJpYnV0ZXMsIHNwYWNlLCBzcHJlYWQsIHN0b3BfcHJvcGFnYXRpb24sIHN1YnNjcmliZSwgc3ZnX2VsZW1lbnQsIHRleHQsIHRpY2ssIHRpbWVfcmFuZ2VzX3RvX2FycmF5LCB0b19udW1iZXIsIHRvZ2dsZV9jbGFzcywgdHJhbnNpdGlvbl9pbiwgdHJhbnNpdGlvbl9vdXQsIHVwZGF0ZV9rZXllZF9lYWNoLCB1cGRhdGVfc2xvdCwgdXBkYXRlX3Nsb3Rfc3ByZWFkLCB2YWxpZGF0ZV9jb21wb25lbnQsIHZhbGlkYXRlX2VhY2hfYXJndW1lbnQsIHZhbGlkYXRlX2VhY2hfa2V5cywgdmFsaWRhdGVfc2xvdHMsIHZhbGlkYXRlX3N0b3JlLCB4bGlua19hdHRyIH07XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0T3JpZ2luYWxCb2R5UGFkZGluZygpIHtcbiAgY29uc3Qgc3R5bGUgPSB3aW5kb3cgPyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5LCBudWxsKSA6IHt9O1xuXG4gIHJldHVybiBwYXJzZUludCgoc3R5bGUgJiYgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1yaWdodCcpKSB8fCAwLCAxMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxiYXJXaWR0aCgpIHtcbiAgbGV0IHNjcm9sbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAvLyAubW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUgc3R5bGVzIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL3Y0LjAuMC1hbHBoYS40L3Njc3MvX21vZGFsLnNjc3MjTDEwNi1MMTEzXG4gIHNjcm9sbERpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIHNjcm9sbERpdi5zdHlsZS50b3AgPSAnLTk5OTlweCc7XG4gIHNjcm9sbERpdi5zdHlsZS53aWR0aCA9ICc1MHB4JztcbiAgc2Nyb2xsRGl2LnN0eWxlLmhlaWdodCA9ICc1MHB4JztcbiAgc2Nyb2xsRGl2LnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYub2Zmc2V0V2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgcmV0dXJuIHNjcm9sbGJhcldpZHRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U2Nyb2xsYmFyV2lkdGgocGFkZGluZykge1xuICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHBhZGRpbmcgPiAwID8gYCR7cGFkZGluZ31weGAgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCb2R5T3ZlcmZsb3dpbmcoKSB7XG4gIHJldHVybiB3aW5kb3cgPyBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgd2luZG93LmlubmVyV2lkdGggOiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbGx5VXBkYXRlU2Nyb2xsYmFyKCkge1xuICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IGdldFNjcm9sbGJhcldpZHRoKCk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL3Y0LjAuMC1hbHBoYS42L2pzL3NyYy9tb2RhbC5qcyNMNDMzXG4gIGNvbnN0IGZpeGVkQ29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnXG4gIClbMF07XG4gIGNvbnN0IGJvZHlQYWRkaW5nID0gZml4ZWRDb250ZW50XG4gICAgPyBwYXJzZUludChmaXhlZENvbnRlbnQuc3R5bGUucGFkZGluZ1JpZ2h0IHx8IDAsIDEwKVxuICAgIDogMDtcblxuICBpZiAoaXNCb2R5T3ZlcmZsb3dpbmcoKSkge1xuICAgIHNldFNjcm9sbGJhcldpZHRoKGJvZHlQYWRkaW5nICsgc2Nyb2xsYmFyV2lkdGgpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5TaXplQ2xhc3MoaXNYcywgY29sV2lkdGgsIGNvbFNpemUpIHtcbiAgaWYgKGNvbFNpemUgPT09IHRydWUgfHwgY29sU2l6ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gaXNYcyA/ICdjb2wnIDogYGNvbC0ke2NvbFdpZHRofWA7XG4gIH0gZWxzZSBpZiAoY29sU2l6ZSA9PT0gJ2F1dG8nKSB7XG4gICAgcmV0dXJuIGlzWHMgPyAnY29sLWF1dG8nIDogYGNvbC0ke2NvbFdpZHRofS1hdXRvYDtcbiAgfVxuXG4gIHJldHVybiBpc1hzID8gYGNvbC0ke2NvbFNpemV9YCA6IGBjb2wtJHtjb2xXaWR0aH0tJHtjb2xTaXplfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbigkJHByb3BzKSB7XG4gIC8vIFRPRE8gc3VwcG9ydCBrZXlzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBjb25zdCB7IGNoaWxkcmVuLCAkJHNjb3BlLCAkJHNsb3RzIH0gPSAkJHByb3BzO1xuICBjb25zdCByZXN0ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKCQkcHJvcHMpKSB7XG4gICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICckJHNjb3BlJyAmJiBrZXkgIT09ICckJHNsb3RzJykge1xuICAgICAgcmVzdFtrZXldID0gJCRwcm9wc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyb3dzZXJFdmVudCh0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoLi4uYXJncyk7XG5cbiAgcmV0dXJuICgpID0+IHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKC4uLmFyZ3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV3Q2Fyb3VzZWxBY3RpdmVJbmRleChkaXJlY3Rpb24sIGl0ZW1zLCBhY3RpdmVJbmRleCkge1xuICBpZiAoZGlyZWN0aW9uID09PSAncHJldicpIHtcbiAgICByZXR1cm4gYWN0aXZlSW5kZXggPT09IDAgPyBpdGVtcy5sZW5ndGggLSAxIDogYWN0aXZlSW5kZXggLSAxO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ25leHQnKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUluZGV4ID09PSBpdGVtcy5sZW5ndGggLSAxID8gMCA6IGFjdGl2ZUluZGV4ICsgMTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0NsYXNzTmFtZSh2YWx1ZSkge1xuICBsZXQgcmVzdWx0ID0gJyc7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdCArPSB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZS5tYXAodG9DbGFzc05hbWUpLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWVba2V5XSkge1xuICAgICAgICAgIHJlc3VsdCAmJiAocmVzdWx0ICs9ICcgJyk7XG4gICAgICAgICAgcmVzdWx0ICs9IGtleTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsYXNzbmFtZXMoLi4uYXJncykge1xuICByZXR1cm4gYXJncy5tYXAodG9DbGFzc05hbWUpLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG59XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGJsb2NrID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgY2hpbGRyZW4gPSB1bmRlZmluZWQ7XG4gIGV4cG9ydCBsZXQgY2xvc2UgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBjb2xvciA9ICdzZWNvbmRhcnknO1xuICBleHBvcnQgbGV0IGRpc2FibGVkID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgaHJlZiA9ICcnO1xuICBleHBvcnQgbGV0IG91dGxpbmUgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBzaXplID0gbnVsbDtcbiAgZXhwb3J0IGxldCBzdHlsZSA9ICcnO1xuICBleHBvcnQgbGV0IHZhbHVlID0gJyc7XG5cbiAgJDogYXJpYUxhYmVsID0gJCRwcm9wc1snYXJpYS1sYWJlbCddO1xuXG4gICQ6IGNsYXNzZXMgPSBjbGFzc25hbWVzKFxuICAgIGNsYXNzTmFtZSxcbiAgICB7IGNsb3NlIH0sXG4gICAgY2xvc2UgfHwgJ2J0bicsXG4gICAgY2xvc2UgfHwgYGJ0biR7b3V0bGluZSA/ICctb3V0bGluZScgOiAnJ30tJHtjb2xvcn1gLFxuICAgIHNpemUgPyBgYnRuLSR7c2l6ZX1gIDogZmFsc2UsXG4gICAgYmxvY2sgPyAnYnRuLWJsb2NrJyA6IGZhbHNlLFxuICAgIHsgYWN0aXZlIH1cbiAgKTtcblxuICAkOiBkZWZhdWx0QXJpYUxhYmVsID0gY2xvc2UgPyAnQ2xvc2UnIDogbnVsbDtcbjwvc2NyaXB0PlxuXG57I2lmIGhyZWZ9XG4gIDxhXG4gICAgey4uLiQkcmVzdFByb3BzfVxuICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgIHtkaXNhYmxlZH1cbiAgICBvbjpjbGlja1xuICAgIHtocmVmfVxuICAgIGFyaWEtbGFiZWw9e2FyaWFMYWJlbCB8fCBkZWZhdWx0QXJpYUxhYmVsfVxuICAgIHtzdHlsZX0+XG4gICAgeyNpZiBjaGlsZHJlbn1cbiAgICAgIHtjaGlsZHJlbn1cbiAgICB7OmVsc2V9XG4gICAgICA8c2xvdCAvPlxuICAgIHsvaWZ9XG4gIDwvYT5cbns6ZWxzZX1cbiAgPGJ1dHRvblxuICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICB7ZGlzYWJsZWR9XG4gICAgb246Y2xpY2tcbiAgICB7dmFsdWV9XG4gICAgYXJpYS1sYWJlbD17YXJpYUxhYmVsIHx8IGRlZmF1bHRBcmlhTGFiZWx9XG4gICAge3N0eWxlfT5cbiAgICA8c2xvdD5cbiAgICAgIHsjaWYgY2xvc2V9XG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPsOXPC9zcGFuPlxuICAgICAgezplbHNlIGlmIGNoaWxkcmVufVxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICB7OmVsc2V9XG4gICAgICAgIDxzbG90IC8+XG4gICAgICB7L2lmfVxuICAgIDwvc2xvdD5cbiAgPC9idXR0b24+XG57L2lmfVxuIiwiaW1wb3J0IHsgbm9vcCwgc2FmZV9ub3RfZXF1YWwsIHN1YnNjcmliZSwgcnVuX2FsbCwgaXNfZnVuY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbmRleC5tanMnO1xuZXhwb3J0IHsgZ2V0X3N0b3JlX3ZhbHVlIGFzIGdldCB9IGZyb20gJy4uL2ludGVybmFsL2luZGV4Lm1qcyc7XG5cbmNvbnN0IHN1YnNjcmliZXJfcXVldWUgPSBbXTtcbi8qKlxuICogQ3JlYXRlcyBhIGBSZWFkYWJsZWAgc3RvcmUgdGhhdCBhbGxvd3MgcmVhZGluZyBieSBzdWJzY3JpcHRpb24uXG4gKiBAcGFyYW0gdmFsdWUgaW5pdGlhbCB2YWx1ZVxuICogQHBhcmFtIHtTdGFydFN0b3BOb3RpZmllcn1zdGFydCBzdGFydCBhbmQgc3RvcCBub3RpZmljYXRpb25zIGZvciBzdWJzY3JpcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHJlYWRhYmxlKHZhbHVlLCBzdGFydCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN1YnNjcmliZTogd3JpdGFibGUodmFsdWUsIHN0YXJ0KS5zdWJzY3JpYmVcbiAgICB9O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBgV3JpdGFibGVgIHN0b3JlIHRoYXQgYWxsb3dzIGJvdGggdXBkYXRpbmcgYW5kIHJlYWRpbmcgYnkgc3Vic2NyaXB0aW9uLlxuICogQHBhcmFtIHsqPX12YWx1ZSBpbml0aWFsIHZhbHVlXG4gKiBAcGFyYW0ge1N0YXJ0U3RvcE5vdGlmaWVyPX1zdGFydCBzdGFydCBhbmQgc3RvcCBub3RpZmljYXRpb25zIGZvciBzdWJzY3JpcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHdyaXRhYmxlKHZhbHVlLCBzdGFydCA9IG5vb3ApIHtcbiAgICBsZXQgc3RvcDtcbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IFtdO1xuICAgIGZ1bmN0aW9uIHNldChuZXdfdmFsdWUpIHtcbiAgICAgICAgaWYgKHNhZmVfbm90X2VxdWFsKHZhbHVlLCBuZXdfdmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ld192YWx1ZTtcbiAgICAgICAgICAgIGlmIChzdG9wKSB7IC8vIHN0b3JlIGlzIHJlYWR5XG4gICAgICAgICAgICAgICAgY29uc3QgcnVuX3F1ZXVlID0gIXN1YnNjcmliZXJfcXVldWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHN1YnNjcmliZXJzW2ldO1xuICAgICAgICAgICAgICAgICAgICBzWzFdKCk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfcXVldWUucHVzaChzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydW5fcXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJzY3JpYmVyX3F1ZXVlLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX3F1ZXVlW2ldWzBdKHN1YnNjcmliZXJfcXVldWVbaSArIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX3F1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZShmbikge1xuICAgICAgICBzZXQoZm4odmFsdWUpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3Vic2NyaWJlKHJ1biwgaW52YWxpZGF0ZSA9IG5vb3ApIHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IFtydW4sIGludmFsaWRhdGVdO1xuICAgICAgICBzdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuICAgICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBzdG9wID0gc3RhcnQoc2V0KSB8fCBub29wO1xuICAgICAgICB9XG4gICAgICAgIHJ1bih2YWx1ZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgICAgICAgICAgc3RvcCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IHNldCwgdXBkYXRlLCBzdWJzY3JpYmUgfTtcbn1cbmZ1bmN0aW9uIGRlcml2ZWQoc3RvcmVzLCBmbiwgaW5pdGlhbF92YWx1ZSkge1xuICAgIGNvbnN0IHNpbmdsZSA9ICFBcnJheS5pc0FycmF5KHN0b3Jlcyk7XG4gICAgY29uc3Qgc3RvcmVzX2FycmF5ID0gc2luZ2xlXG4gICAgICAgID8gW3N0b3Jlc11cbiAgICAgICAgOiBzdG9yZXM7XG4gICAgY29uc3QgYXV0byA9IGZuLmxlbmd0aCA8IDI7XG4gICAgcmV0dXJuIHJlYWRhYmxlKGluaXRpYWxfdmFsdWUsIChzZXQpID0+IHtcbiAgICAgICAgbGV0IGluaXRlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHBlbmRpbmcgPSAwO1xuICAgICAgICBsZXQgY2xlYW51cCA9IG5vb3A7XG4gICAgICAgIGNvbnN0IHN5bmMgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZuKHNpbmdsZSA/IHZhbHVlc1swXSA6IHZhbHVlcywgc2V0KTtcbiAgICAgICAgICAgIGlmIChhdXRvKSB7XG4gICAgICAgICAgICAgICAgc2V0KHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwID0gaXNfZnVuY3Rpb24ocmVzdWx0KSA/IHJlc3VsdCA6IG5vb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlcnMgPSBzdG9yZXNfYXJyYXkubWFwKChzdG9yZSwgaSkgPT4gc3Vic2NyaWJlKHN0b3JlLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlO1xuICAgICAgICAgICAgcGVuZGluZyAmPSB+KDEgPDwgaSk7XG4gICAgICAgICAgICBpZiAoaW5pdGVkKSB7XG4gICAgICAgICAgICAgICAgc3luYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nIHw9ICgxIDw8IGkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIGluaXRlZCA9IHRydWU7XG4gICAgICAgIHN5bmMoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICAgICAgICBydW5fYWxsKHVuc3Vic2NyaWJlcnMpO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5leHBvcnQgeyBkZXJpdmVkLCByZWFkYWJsZSwgd3JpdGFibGUgfTtcbiIsIjxzY3JpcHQ+XG4gIGltcG9ydCBjbGFzc25hbWVzIGZyb20gJy4vdXRpbHMnO1xuXG4gIGxldCBjbGFzc05hbWUgPSAnJztcbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG4gIGV4cG9ydCBsZXQgc2l6ZSA9ICcnO1xuICBleHBvcnQgbGV0IHZlcnRpY2FsID0gZmFsc2U7XG5cbiAgJDogY2xhc3NlcyA9IGNsYXNzbmFtZXMoXG4gICAgY2xhc3NOYW1lLFxuICAgIHNpemUgPyBgYnRuLWdyb3VwLSR7c2l6ZX1gIDogZmFsc2UsXG4gICAgdmVydGljYWwgPyAnYnRuLWdyb3VwLXZlcnRpY2FsJyA6ICdidG4tZ3JvdXAnXG4gICk7XG48L3NjcmlwdD5cblxuPGRpdiB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfT5cbiAgPHNsb3QgLz5cbjwvZGl2PlxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IHsgZ2V0Q29sdW1uU2l6ZUNsYXNzLCBpc09iamVjdCB9IGZyb20gJy4vdXRpbHMnO1xuXG4gIGxldCBjbGFzc05hbWUgPSAnJztcbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG4gIGV4cG9ydCBsZXQgeHMgPSB1bmRlZmluZWQ7XG4gIGV4cG9ydCBsZXQgc20gPSB1bmRlZmluZWQ7XG4gIGV4cG9ydCBsZXQgbWQgPSB1bmRlZmluZWQ7XG4gIGV4cG9ydCBsZXQgbGcgPSB1bmRlZmluZWQ7XG4gIGV4cG9ydCBsZXQgeGwgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29sQ2xhc3NlcyA9IFtdO1xuICBjb25zdCBsb29rdXAgPSB7XG4gICAgeHMsXG4gICAgc20sXG4gICAgbWQsXG4gICAgbGcsXG4gICAgeGxcbiAgfTtcblxuICBPYmplY3Qua2V5cyhsb29rdXApLmZvckVhY2goKGNvbFdpZHRoKSA9PiB7XG4gICAgY29uc3QgY29sdW1uUHJvcCA9IGxvb2t1cFtjb2xXaWR0aF07XG4gICAgaWYgKCFjb2x1bW5Qcm9wICYmIGNvbHVtblByb3AgIT09ICcnKSB7XG4gICAgICByZXR1cm47IC8vbm8gdmFsdWUgZm9yIHRoaXMgd2lkdGhcbiAgICB9XG5cbiAgICBjb25zdCBpc1hzID0gY29sV2lkdGggPT09ICd4cyc7XG5cbiAgICBpZiAoaXNPYmplY3QoY29sdW1uUHJvcCkpIHtcbiAgICAgIGNvbnN0IGNvbFNpemVJbnRlcmZpeCA9IGlzWHMgPyAnLScgOiBgLSR7Y29sV2lkdGh9LWA7XG4gICAgICBjb25zdCBjb2xDbGFzcyA9IGdldENvbHVtblNpemVDbGFzcyhpc1hzLCBjb2xXaWR0aCwgY29sdW1uUHJvcC5zaXplKTtcblxuICAgICAgaWYgKGNvbHVtblByb3Auc2l6ZSB8fCBjb2x1bW5Qcm9wLnNpemUgPT09ICcnKSB7XG4gICAgICAgIGNvbENsYXNzZXMucHVzaChjb2xDbGFzcyk7XG4gICAgICB9XG4gICAgICBpZiAoY29sdW1uUHJvcC5wdXNoKSB7XG4gICAgICAgIGNvbENsYXNzZXMucHVzaChgcHVzaCR7Y29sU2l6ZUludGVyZml4fSR7Y29sdW1uUHJvcC5wdXNofWApO1xuICAgICAgfVxuICAgICAgaWYgKGNvbHVtblByb3AucHVsbCkge1xuICAgICAgICBjb2xDbGFzc2VzLnB1c2goYHB1bGwke2NvbFNpemVJbnRlcmZpeH0ke2NvbHVtblByb3AucHVsbH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2x1bW5Qcm9wLm9mZnNldCkge1xuICAgICAgICBjb2xDbGFzc2VzLnB1c2goYG9mZnNldCR7Y29sU2l6ZUludGVyZml4fSR7Y29sdW1uUHJvcC5vZmZzZXR9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbENsYXNzZXMucHVzaChnZXRDb2x1bW5TaXplQ2xhc3MoaXNYcywgY29sV2lkdGgsIGNvbHVtblByb3ApKTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICghY29sQ2xhc3Nlcy5sZW5ndGgpIHtcbiAgICBjb2xDbGFzc2VzLnB1c2goJ2NvbCcpO1xuICB9XG5cbiAgaWYgKGNsYXNzTmFtZSkge1xuICAgIGNvbENsYXNzZXMucHVzaChjbGFzc05hbWUpO1xuICB9XG48L3NjcmlwdD5cblxuPGRpdiB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjb2xDbGFzc2VzLmpvaW4oJyAnKX0+XG4gIDxzbG90IC8+XG48L2Rpdj5cbiIsIjxzY3JpcHQ+XG4gIGltcG9ydCBjbGFzc25hbWVzIGZyb20gJy4vdXRpbHMnO1xuXG4gIGxldCBjbGFzc05hbWUgPSAnJztcbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG4gIGV4cG9ydCBsZXQgZmx1aWQgPSBmYWxzZTtcblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsIGZsdWlkID8gJ2NvbnRhaW5lci1mbHVpZCcgOiAnY29udGFpbmVyJyk7XG48L3NjcmlwdD5cblxuPGRpdiB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfT5cbiAgPHNsb3QgLz5cbjwvZGl2PlxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCBpbmxpbmUgPSBmYWxzZTtcblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsIGlubGluZSA/ICdmb3JtLWlubGluZScgOiBmYWxzZSk7XG48L3NjcmlwdD5cblxuPGZvcm0gey4uLiQkcmVzdFByb3BzfSBjbGFzcz17Y2xhc3Nlc30gb246c3VibWl0PlxuICA8c2xvdCAvPlxuPC9mb3JtPlxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgZXhwb3J0IGxldCBjbGFzc05hbWUgPSAnJztcbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG4gIGV4cG9ydCBsZXQgcm93ID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgY2hlY2sgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBpbmxpbmUgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBkaXNhYmxlZCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IHRhZyA9IG51bGw7XG5cbiAgJDogY2xhc3NlcyA9IGNsYXNzbmFtZXMoXG4gICAgY2xhc3NOYW1lLFxuICAgIHJvdyA/ICdyb3cnIDogZmFsc2UsXG4gICAgY2hlY2sgPyAnZm9ybS1jaGVjaycgOiAnZm9ybS1ncm91cCcsXG4gICAgY2hlY2sgJiYgaW5saW5lID8gJ2Zvcm0tY2hlY2staW5saW5lJyA6IGZhbHNlLFxuICAgIGNoZWNrICYmIGRpc2FibGVkID8gJ2Rpc2FibGVkJyA6IGZhbHNlXG4gICk7XG48L3NjcmlwdD5cblxueyNpZiB0YWcgPT09ICdmaWVsZHNldCd9XG4gIDxmaWVsZHNldCB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfT5cbiAgICA8c2xvdCAvPlxuICA8L2ZpZWxkc2V0PlxuezplbHNlfVxuICA8ZGl2IHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NsYXNzZXN9PlxuICAgIDxzbG90IC8+XG4gIDwvZGl2Plxuey9pZn1cbiIsIjxzY3JpcHQ+XG4gIGltcG9ydCBjbGFzc25hbWVzIGZyb20gJy4vdXRpbHMnO1xuXG4gIGxldCBjbGFzc05hbWUgPSAnJztcbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG5cbiAgZXhwb3J0IGxldCB0eXBlID0gJ3RleHQnO1xuICBleHBvcnQgbGV0IHNpemUgPSB1bmRlZmluZWQ7XG4gIGV4cG9ydCBsZXQgYnNTaXplID0gdW5kZWZpbmVkO1xuICBleHBvcnQgbGV0IGNvbG9yID0gdW5kZWZpbmVkO1xuICBleHBvcnQgbGV0IGNoZWNrZWQgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCB2YWxpZCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGludmFsaWQgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBwbGFpbnRleHQgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBhZGRvbiA9IGZhbHNlO1xuICBleHBvcnQgbGV0IHZhbHVlID0gJyc7XG4gIGV4cG9ydCBsZXQgZmlsZXMgPSAnJztcbiAgZXhwb3J0IGxldCByZWFkb25seSA9IHVuZGVmaW5lZDtcbiAgZXhwb3J0IGxldCBtdWx0aXBsZSA9IHVuZGVmaW5lZDtcbiAgZXhwb3J0IGxldCBuYW1lID0gJyc7XG4gIGV4cG9ydCBsZXQgcGxhY2Vob2xkZXIgPSAnJztcbiAgZXhwb3J0IGxldCBkaXNhYmxlZCA9IHVuZGVmaW5lZDtcblxuICBsZXQgY2xhc3NlcztcbiAgbGV0IHRhZztcbiAgJDoge1xuICAgIGNvbnN0IGNoZWNrSW5wdXQgPSBbJ3JhZGlvJywgJ2NoZWNrYm94J10uaW5kZXhPZih0eXBlKSA+IC0xO1xuICAgIGNvbnN0IGlzTm90YU51bWJlciA9IG5ldyBSZWdFeHAoJ1xcXFxEJywgJ2cnKTtcblxuICAgIGNvbnN0IGZpbGVJbnB1dCA9IHR5cGUgPT09ICdmaWxlJztcbiAgICBjb25zdCB0ZXh0YXJlYUlucHV0ID0gdHlwZSA9PT0gJ3RleHRhcmVhJztcbiAgICBjb25zdCByYW5nZUlucHV0ID0gdHlwZSA9PT0gJ3JhbmdlJztcbiAgICBjb25zdCBzZWxlY3RJbnB1dCA9IHR5cGUgPT09ICdzZWxlY3QnO1xuICAgIGNvbnN0IGJ1dHRvbklucHV0ID1cbiAgICAgIHR5cGUgPT09ICdidXR0b24nIHx8IHR5cGUgPT09ICdyZXNldCcgfHwgdHlwZSA9PT0gJ3N1Ym1pdCc7XG4gICAgY29uc3QgdW5zdXBwb3J0ZWRJbnB1dCA9IHR5cGUgPT09ICdoaWRkZW4nIHx8IHR5cGUgPT09ICdpbWFnZSc7XG4gICAgdGFnID0gc2VsZWN0SW5wdXQgfHwgdGV4dGFyZWFJbnB1dCA/IHR5cGUgOiAnaW5wdXQnO1xuXG4gICAgbGV0IGZvcm1Db250cm9sQ2xhc3MgPSAnZm9ybS1jb250cm9sJztcblxuICAgIGlmIChwbGFpbnRleHQpIHtcbiAgICAgIGZvcm1Db250cm9sQ2xhc3MgPSBgJHtmb3JtQ29udHJvbENsYXNzfS1wbGFpbnRleHRgO1xuICAgICAgdGFnID0gJ2lucHV0JztcbiAgICB9IGVsc2UgaWYgKGZpbGVJbnB1dCkge1xuICAgICAgZm9ybUNvbnRyb2xDbGFzcyA9IGAke2Zvcm1Db250cm9sQ2xhc3N9LWZpbGVgO1xuICAgIH0gZWxzZSBpZiAoY2hlY2tJbnB1dCkge1xuICAgICAgaWYgKGFkZG9uKSB7XG4gICAgICAgIGZvcm1Db250cm9sQ2xhc3MgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybUNvbnRyb2xDbGFzcyA9ICdmb3JtLWNoZWNrLWlucHV0JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJ1dHRvbklucHV0KSB7XG4gICAgICBmb3JtQ29udHJvbENsYXNzID0gYGJ0biBidG4tJHtjb2xvciB8fCAnc2Vjb25kYXJ5J31gO1xuICAgIH0gZWxzZSBpZiAocmFuZ2VJbnB1dCkge1xuICAgICAgZm9ybUNvbnRyb2xDbGFzcyA9ICdmb3JtLWNvbnRyb2wtcmFuZ2UnO1xuICAgIH0gZWxzZSBpZiAodW5zdXBwb3J0ZWRJbnB1dCkge1xuICAgICAgZm9ybUNvbnRyb2xDbGFzcyA9ICcnO1xuICAgIH1cblxuICAgIGlmIChzaXplICYmIGlzTm90YU51bWJlci50ZXN0KHNpemUpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdQbGVhc2UgdXNlIHRoZSBwcm9wIFwiYnNTaXplXCIgaW5zdGVhZCBvZiB0aGUgXCJzaXplXCIgdG8gYm9vdHN0cmFwXFwncyBpbnB1dCBzaXppbmcuJ1xuICAgICAgKTtcbiAgICAgIGJzU2l6ZSA9IHNpemU7XG4gICAgICBzaXplID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNsYXNzZXMgPSBjbGFzc25hbWVzKFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgaW52YWxpZCAmJiAnaXMtaW52YWxpZCcsXG4gICAgICB2YWxpZCAmJiAnaXMtdmFsaWQnLFxuICAgICAgYnNTaXplID8gYGZvcm0tY29udHJvbC0ke2JzU2l6ZX1gIDogZmFsc2UsXG4gICAgICBmb3JtQ29udHJvbENsYXNzXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUlucHV0ID0gKGV2ZW50KSA9PiB7XG4gICAgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH07XG48L3NjcmlwdD5cblxueyNpZiB0YWcgPT09ICdpbnB1dCd9XG4gIHsjaWYgdHlwZSA9PT0gJ3RleHQnfVxuICAgIDxpbnB1dFxuICAgICAgey4uLiQkcmVzdFByb3BzfVxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdwYXNzd29yZCd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdlbWFpbCd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdmaWxlJ31cbiAgICA8aW5wdXRcbiAgICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgIG9uOmJsdXJcbiAgICAgIG9uOmZvY3VzXG4gICAgICBvbjprZXlkb3duXG4gICAgICBvbjprZXlwcmVzc1xuICAgICAgb246a2V5dXBcbiAgICAgIG9uOmNoYW5nZVxuICAgICAgb246aW5wdXRcbiAgICAgIGJpbmQ6ZmlsZXNcbiAgICAgIHtyZWFkb25seX1cbiAgICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgICAge25hbWV9XG4gICAgICB7ZGlzYWJsZWR9XG4gICAgICB7cGxhY2Vob2xkZXJ9IC8+XG4gIHs6ZWxzZSBpZiB0eXBlID09PSAnY2hlY2tib3gnfVxuICAgIDxpbnB1dFxuICAgICAgey4uLiQkcmVzdFByb3BzfVxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgIG9uOmJsdXJcbiAgICAgIG9uOmZvY3VzXG4gICAgICBvbjprZXlkb3duXG4gICAgICBvbjprZXlwcmVzc1xuICAgICAgb246a2V5dXBcbiAgICAgIG9uOmNoYW5nZVxuICAgICAgb246aW5wdXRcbiAgICAgIGJpbmQ6Y2hlY2tlZFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdyYWRpbyd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICd1cmwnfVxuICAgIDxpbnB1dFxuICAgICAgey4uLiQkcmVzdFByb3BzfVxuICAgICAgdHlwZT1cInVybFwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ251bWJlcid9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgIG9uOmJsdXJcbiAgICAgIG9uOmZvY3VzXG4gICAgICBvbjprZXlkb3duXG4gICAgICBvbjprZXlwcmVzc1xuICAgICAgb246a2V5dXBcbiAgICAgIG9uOmNoYW5nZVxuICAgICAgb246aW5wdXRcbiAgICAgIGJpbmQ6dmFsdWVcbiAgICAgIHtyZWFkb25seX1cbiAgICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgICAge25hbWV9XG4gICAgICB7ZGlzYWJsZWR9XG4gICAgICB7cGxhY2Vob2xkZXJ9IC8+XG4gIHs6ZWxzZSBpZiB0eXBlID09PSAnZGF0ZSd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwiZGF0ZVwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2UgaWYgdHlwZSA9PT0gJ3RpbWUnfVxuICAgIDxpbnB1dFxuICAgICAgey4uLiQkcmVzdFByb3BzfVxuICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdkYXRldGltZSd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwiZGF0ZXRpbWVcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdjb2xvcid9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwiY29sb3JcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdyYW5nZSd9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgb246Ymx1clxuICAgICAgb246Zm9jdXNcbiAgICAgIG9uOmtleWRvd25cbiAgICAgIG9uOmtleXByZXNzXG4gICAgICBvbjprZXl1cFxuICAgICAgb246Y2hhbmdlXG4gICAgICBvbjppbnB1dFxuICAgICAgYmluZDp2YWx1ZVxuICAgICAge3JlYWRvbmx5fVxuICAgICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgICB7bmFtZX1cbiAgICAgIHtkaXNhYmxlZH1cbiAgICAgIHtwbGFjZWhvbGRlcn0gLz5cbiAgezplbHNlIGlmIHR5cGUgPT09ICdzZWFyY2gnfVxuICAgIDxpbnB1dFxuICAgICAgey4uLiQkcmVzdFByb3BzfVxuICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICBvbjpibHVyXG4gICAgICBvbjpmb2N1c1xuICAgICAgb246a2V5ZG93blxuICAgICAgb246a2V5cHJlc3NcbiAgICAgIG9uOmtleXVwXG4gICAgICBvbjpjaGFuZ2VcbiAgICAgIG9uOmlucHV0XG4gICAgICBiaW5kOnZhbHVlXG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfSAvPlxuICB7OmVsc2V9XG4gICAgPGlucHV0XG4gICAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgICB7dHlwZX1cbiAgICAgIG9uOmJsdXJcbiAgICAgIG9uOmZvY3VzXG4gICAgICBvbjprZXlkb3duXG4gICAgICBvbjprZXlwcmVzc1xuICAgICAgb246a2V5dXBcbiAgICAgIG9uOmlucHV0PXtoYW5kbGVJbnB1dH1cbiAgICAgIG9uOmNoYW5nZT17aGFuZGxlSW5wdXR9XG4gICAgICB7cmVhZG9ubHl9XG4gICAgICBjbGFzcz17Y2xhc3Nlc31cbiAgICAgIHtuYW1lfVxuICAgICAge2Rpc2FibGVkfVxuICAgICAge3BsYWNlaG9sZGVyfVxuICAgICAge3ZhbHVlfSAvPlxuICB7L2lmfVxuezplbHNlIGlmIHRhZyA9PT0gJ3RleHRhcmVhJ31cbiAgPHRleHRhcmVhXG4gICAgey4uLiQkcmVzdFByb3BzfVxuICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgIG9uOmJsdXJcbiAgICBvbjpmb2N1c1xuICAgIG9uOmtleWRvd25cbiAgICBvbjprZXlwcmVzc1xuICAgIG9uOmtleXVwXG4gICAgb246Y2hhbmdlXG4gICAgb246aW5wdXRcbiAgICBiaW5kOnZhbHVlXG4gICAge25hbWV9XG4gICAge2Rpc2FibGVkfVxuICAgIHtwbGFjZWhvbGRlcn1cbiAgICB7cmVhZG9ubHl9IC8+XG57OmVsc2UgaWYgdGFnID09PSAnc2VsZWN0JyAmJiAhbXVsdGlwbGV9XG4gIDxzZWxlY3RcbiAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgb246Ymx1clxuICAgIG9uOmZvY3VzXG4gICAgb246Y2hhbmdlXG4gICAgb246aW5wdXRcbiAgICBiaW5kOnZhbHVlXG4gICAge25hbWV9XG4gICAge2Rpc2FibGVkfVxuICAgIHtyZWFkb25seX0+XG4gICAgPHNsb3QgLz5cbiAgPC9zZWxlY3Q+XG5cbiAgPCEtLSB7OmVsc2UgaWYgdGFnID09PSAnc2VsZWN0JyAmJiBtdWx0aXBsZX1cbiAgPHNlbGVjdFxuICAgIHsuLi4kJHJlc3RQcm9wc31cbiAgICBtdWx0aXBsZVxuICAgIGNsYXNzPXtjbGFzc2VzfVxuICAgIG9uOmJsdXJcbiAgICBvbjpmb2N1c1xuICAgIG9uOmNoYW5nZVxuICAgIG9uOmlucHV0XG4gICAgYmluZDp2YWx1ZVxuICAgIHtuYW1lfVxuICAgIHtkaXNhYmxlZH0+XG4gICAgPHNsb3QgLz5cbiAgPC9zZWxlY3Q+IC0tPlxuey9pZn1cbiIsIjxzY3JpcHQ+XG4gIGltcG9ydCBjbGFzc25hbWVzIGZyb20gJy4vdXRpbHMnO1xuXG4gIGltcG9ydCB7IGdldENvbHVtblNpemVDbGFzcywgaXNPYmplY3QgfSBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG5cbiAgZXhwb3J0IHsgY2xhc3NOYW1lIGFzIGNsYXNzIH07XG4gIGV4cG9ydCBsZXQgaGlkZGVuID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgY2hlY2sgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBzaXplID0gJyc7XG4gIGV4cG9ydCBsZXQgZm9yZSA9IG51bGw7XG4gIGV4cG9ydCB7IGZvcmUgYXMgZm9yIH07XG4gIGV4cG9ydCBsZXQgeHMgPSAnJztcbiAgZXhwb3J0IGxldCBzbSA9ICcnO1xuICBleHBvcnQgbGV0IG1kID0gJyc7XG4gIGV4cG9ydCBsZXQgbGcgPSAnJztcbiAgZXhwb3J0IGxldCB4bCA9ICcnO1xuXG4gIGNvbnN0IGNvbFdpZHRocyA9IHtcbiAgICB4cyxcbiAgICBzbSxcbiAgICBtZCxcbiAgICBsZyxcbiAgICB4bFxuICB9O1xuICBleHBvcnQgbGV0IHdpZHRocyA9IE9iamVjdC5rZXlzKGNvbFdpZHRocyk7XG5cbiAgY29uc3QgY29sQ2xhc3NlcyA9IFtdO1xuXG4gIHdpZHRocy5mb3JFYWNoKChjb2xXaWR0aCkgPT4ge1xuICAgIGxldCBjb2x1bW5Qcm9wID0gJCRwcm9wc1tjb2xXaWR0aF07XG5cbiAgICBpZiAoIWNvbHVtblByb3AgJiYgY29sdW1uUHJvcCAhPT0gJycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1hzID0gY29sV2lkdGggPT09ICd4cyc7XG4gICAgbGV0IGNvbENsYXNzO1xuXG4gICAgaWYgKGlzT2JqZWN0KGNvbHVtblByb3ApKSB7XG4gICAgICBjb25zdCBjb2xTaXplSW50ZXJmaXggPSBpc1hzID8gJy0nIDogYC0ke2NvbFdpZHRofS1gO1xuICAgICAgY29sQ2xhc3MgPSBnZXRDb2x1bW5TaXplQ2xhc3MoaXNYcywgY29sV2lkdGgsIGNvbHVtblByb3Auc2l6ZSk7XG5cbiAgICAgIGNvbENsYXNzZXMucHVzaChcbiAgICAgICAgY2xhc3NuYW1lcyh7XG4gICAgICAgICAgW2NvbENsYXNzXTogY29sdW1uUHJvcC5zaXplIHx8IGNvbHVtblByb3Auc2l6ZSA9PT0gJycsXG4gICAgICAgICAgW2BvcmRlciR7Y29sU2l6ZUludGVyZml4fSR7Y29sdW1uUHJvcC5vcmRlcn1gXTpcbiAgICAgICAgICAgIGNvbHVtblByb3Aub3JkZXIgfHwgY29sdW1uUHJvcC5vcmRlciA9PT0gMCxcbiAgICAgICAgICBbYG9mZnNldCR7Y29sU2l6ZUludGVyZml4fSR7Y29sdW1uUHJvcC5vZmZzZXR9YF06XG4gICAgICAgICAgICBjb2x1bW5Qcm9wLm9mZnNldCB8fCBjb2x1bW5Qcm9wLm9mZnNldCA9PT0gMFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29sQ2xhc3MgPSBnZXRDb2x1bW5TaXplQ2xhc3MoaXNYcywgY29sV2lkdGgsIGNvbHVtblByb3ApO1xuICAgICAgY29sQ2xhc3Nlcy5wdXNoKGNvbENsYXNzKTtcbiAgICB9XG4gIH0pO1xuXG4gICQ6IGNsYXNzZXMgPSBjbGFzc25hbWVzKFxuICAgIGNsYXNzTmFtZSxcbiAgICBoaWRkZW4gPyAnc3Itb25seScgOiBmYWxzZSxcbiAgICBjaGVjayA/ICdmb3JtLWNoZWNrLWxhYmVsJyA6IGZhbHNlLFxuICAgIHNpemUgPyBgY29sLWZvcm0tbGFiZWwtJHtzaXplfWAgOiBmYWxzZSxcbiAgICBjb2xDbGFzc2VzLFxuICAgIGNvbENsYXNzZXMubGVuZ3RoID8gJ2NvbC1mb3JtLWxhYmVsJyA6IGZhbHNlXG4gICk7XG48L3NjcmlwdD5cblxuPGxhYmVsIHsuLi4kJHJlc3RQcm9wc30gY2xhc3M9e2NsYXNzZXN9IGZvcj17Zm9yZX0+XG4gIDxzbG90IC8+XG48L2xhYmVsPlxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCBmbHVzaCA9IGZhbHNlO1xuXG4gICQ6IGNsYXNzZXMgPSBjbGFzc25hbWVzKFxuICAgIGNsYXNzTmFtZSxcbiAgICAnbGlzdC1ncm91cCcsXG4gICAgZmx1c2ggPyAnbGlzdC1ncm91cC1mbHVzaCcgOiBmYWxzZVxuICApO1xuPC9zY3JpcHQ+XG5cbjx1bCB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfT5cbiAgPHNsb3QgLz5cbjwvdWw+XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGRpc2FibGVkID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgY29sb3IgPSAnJztcbiAgZXhwb3J0IGxldCBhY3Rpb24gPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBocmVmID0gbnVsbDtcbiAgZXhwb3J0IGxldCB0YWcgPSBudWxsO1xuXG4gICQ6IGNsYXNzZXMgPSBjbGFzc25hbWVzKFxuICAgIGNsYXNzTmFtZSxcbiAgICBhY3RpdmUgPyAnYWN0aXZlJyA6IGZhbHNlLFxuICAgIGRpc2FibGVkID8gJ2Rpc2FibGVkJyA6IGZhbHNlLFxuICAgIGFjdGlvbiA/ICdsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uJyA6IGZhbHNlLFxuICAgIGNvbG9yID8gYGxpc3QtZ3JvdXAtaXRlbS0ke2NvbG9yfWAgOiBmYWxzZSxcbiAgICAnbGlzdC1ncm91cC1pdGVtJ1xuICApO1xuPC9zY3JpcHQ+XG5cbnsjaWYgaHJlZn1cbiAgPGEgey4uLiQkcmVzdFByb3BzfSBjbGFzcz17Y2xhc3Nlc30ge2hyZWZ9IHtkaXNhYmxlZH0ge2FjdGl2ZX0+XG4gICAgPHNsb3QgLz5cbiAgPC9hPlxuezplbHNlIGlmIHRhZyA9PT0gJ2J1dHRvbid9XG4gIDxidXR0b25cbiAgICB7Li4uJCRyZXN0UHJvcHN9XG4gICAgY2xhc3M9e2NsYXNzZXN9XG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgb246Y2xpY2tcbiAgICB7ZGlzYWJsZWR9XG4gICAge2FjdGl2ZX0+XG4gICAgPHNsb3QgLz5cbiAgPC9idXR0b24+XG57OmVsc2V9XG4gIDxsaSB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfSB7ZGlzYWJsZWR9IHthY3RpdmV9PlxuICAgIDxzbG90IC8+XG4gIDwvbGk+XG57L2lmfVxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCB0YWJzID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgcGlsbHMgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCB2ZXJ0aWNhbCA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGhvcml6b250YWwgPSAnJztcbiAgZXhwb3J0IGxldCBqdXN0aWZpZWQgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBmaWxsID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgbmF2YmFyID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgY2FyZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGdldFZlcnRpY2FsQ2xhc3ModmVydGljYWwpIHtcbiAgICBpZiAodmVydGljYWwgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh2ZXJ0aWNhbCA9PT0gdHJ1ZSB8fCB2ZXJ0aWNhbCA9PT0gJ3hzJykge1xuICAgICAgcmV0dXJuICdmbGV4LWNvbHVtbic7XG4gICAgfVxuICAgIHJldHVybiBgZmxleC0ke3ZlcnRpY2FsfS1jb2x1bW5gO1xuICB9XG5cbiAgJDogY2xhc3NlcyA9IGNsYXNzbmFtZXMoXG4gICAgY2xhc3NOYW1lLFxuICAgIG5hdmJhciA/ICduYXZiYXItbmF2JyA6ICduYXYnLFxuICAgIGhvcml6b250YWwgPyBganVzdGlmeS1jb250ZW50LSR7aG9yaXpvbnRhbH1gIDogZmFsc2UsXG4gICAgZ2V0VmVydGljYWxDbGFzcyh2ZXJ0aWNhbCksXG4gICAge1xuICAgICAgJ25hdi10YWJzJzogdGFicyxcbiAgICAgICdjYXJkLWhlYWRlci10YWJzJzogY2FyZCAmJiB0YWJzLFxuICAgICAgJ25hdi1waWxscyc6IHBpbGxzLFxuICAgICAgJ2NhcmQtaGVhZGVyLXBpbGxzJzogY2FyZCAmJiBwaWxscyxcbiAgICAgICduYXYtanVzdGlmaWVkJzoganVzdGlmaWVkLFxuICAgICAgJ25hdi1maWxsJzogZmlsbFxuICAgIH1cbiAgKTtcbjwvc2NyaXB0PlxuXG48dWwgey4uLiQkcmVzdFByb3BzfSBjbGFzcz17Y2xhc3Nlc30+XG4gIDxzbG90IC8+XG48L3VsPlxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCBhY3RpdmUgPSBmYWxzZTtcblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsICduYXYtaXRlbScsIGFjdGl2ZSA/ICdhY3RpdmUnIDogZmFsc2UpO1xuPC9zY3JpcHQ+XG5cbjxsaSB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfT5cbiAgPHNsb3QgLz5cbjwvbGk+XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IGRpc2FibGVkID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgYWN0aXZlID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgaHJlZiA9ICcjJztcblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhjbGFzc05hbWUsICduYXYtbGluaycsIHtcbiAgICBkaXNhYmxlZCxcbiAgICBhY3RpdmVcbiAgfSk7XG5cbiAgZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaHJlZiA9PT0gJyMnKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG48L3NjcmlwdD5cblxuPGEgey4uLiQkcmVzdFByb3BzfSB7aHJlZn0gb246Y2xpY2sgb246Y2xpY2s9e2hhbmRsZUNsaWNrfSBjbGFzcz17Y2xhc3Nlc30+XG4gIDxzbG90IC8+XG48L2E+XG4iLCI8c2NyaXB0PlxuICBpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICcuL3V0aWxzJztcblxuICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gIGV4cG9ydCB7IGNsYXNzTmFtZSBhcyBjbGFzcyB9O1xuICBleHBvcnQgbGV0IG5vR3V0dGVycyA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGZvcm0gPSBmYWxzZTtcblxuICAkOiBjbGFzc2VzID0gY2xhc3NuYW1lcyhcbiAgICBjbGFzc05hbWUsXG4gICAgbm9HdXR0ZXJzID8gJ25vLWd1dHRlcnMnIDogbnVsbCxcbiAgICBmb3JtID8gJ2Zvcm0tcm93JyA6ICdyb3cnXG4gICk7XG48L3NjcmlwdD5cblxuPGRpdiB7Li4uJCRyZXN0UHJvcHN9IGNsYXNzPXtjbGFzc2VzfT5cbiAgPHNsb3QgLz5cbjwvZGl2PlxuIiwiPHNjcmlwdD5cbiAgaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnLi91dGlscyc7XG5cbiAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICBleHBvcnQgeyBjbGFzc05hbWUgYXMgY2xhc3MgfTtcbiAgZXhwb3J0IGxldCB0eXBlID0gJ2JvcmRlcic7XG4gIGV4cG9ydCBsZXQgc2l6ZSA9ICcnO1xuICBleHBvcnQgbGV0IGNvbG9yID0gJyc7XG5cbiAgJDogY2xhc3NlcyA9IGNsYXNzbmFtZXMoXG4gICAgY2xhc3NOYW1lLFxuICAgIHNpemUgPyBgc3Bpbm5lci0ke3R5cGV9LSR7c2l6ZX1gIDogZmFsc2UsXG4gICAgYHNwaW5uZXItJHt0eXBlfWAsXG4gICAgY29sb3IgPyBgdGV4dC0ke2NvbG9yfWAgOiBmYWxzZVxuICApO1xuPC9zY3JpcHQ+XG5cbjxkaXYgey4uLiQkcmVzdFByb3BzfSByb2xlPVwic3RhdHVzXCIgY2xhc3M9e2NsYXNzZXN9PlxuICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICA8c2xvdD5Mb2FkaW5nLi4uPC9zbG90PlxuICA8L3NwYW4+XG48L2Rpdj5cbiIsImltcG9ydCB7d3JpdGFibGV9IGZyb20gXCJzdmVsdGUvc3RvcmVcIjtcblxuZXhwb3J0IGNvbnN0IHNjYW5uZXIgPSB3cml0YWJsZShcIlwiKTsiLCI8c2NyaXB0PlxuICAgIGltcG9ydCB7IExpc3RHcm91cCwgTGlzdEdyb3VwSXRlbSwgU3Bpbm5lciB9IGZyb20gJ3N2ZWx0ZXN0cmFwJztcblxuICAgIGltcG9ydCB7IG9uTW91bnQgfSBmcm9tIFwic3ZlbHRlXCI7XG5cbiAgICBsZXQgc2Nhbm5lcnM7XG5cbiAgICBvbk1vdW50KGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZmV0Y2goYC9hcGkvZGV2aWNlc2ApXG4gICAgICAgICAgICAudGhlbihyID0+IHIuanNvbigpKVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgc2Nhbm5lcnMgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGlmIChzY2FubmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdChzY2FubmVyc1swXS5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGltcG9ydCB7IHNjYW5uZXIgfSBmcm9tICcuL3N0b3Jlcy5qcyc7XG5cbiAgICBmdW5jdGlvbiBzZWxlY3QobmFtZSkge1xuICAgICAgICBzY2FubmVyLnNldChuYW1lKVxuICAgICAgICB2YWx1ZSA9IG5hbWVcbiAgICB9XG5cbiAgICBsZXQgdmFsdWUgPSAnJztcblxuPC9zY3JpcHQ+XG5cbnsjaWYgc2Nhbm5lcnN9XG4gICAgPExpc3RHcm91cD5cbiAgICB7I2VhY2ggc2Nhbm5lcnMgYXMgc2Nhbm5lciB9XG4gICAgICAgIDxMaXN0R3JvdXBJdGVtIGFjdGl2ZT17c2Nhbm5lci5uYW1lID09IHZhbHVlfSBhY3Rpb24gdGFnPVwiYnV0dG9uXCIgb246Y2xpY2s9e3NlbGVjdChzY2FubmVyLm5hbWUpfT57c2Nhbm5lci5uYW1lfTwvTGlzdEdyb3VwSXRlbT5cbiAgICB7L2VhY2h9XG4gICAgPC9MaXN0R3JvdXA+XG57OmVsc2V9XG4gICAgPFNwaW5uZXIvPlxuey9pZn0iLCI8c2NyaXB0PlxuICAgIGltcG9ydCB7XG4gICAgICAgIENvbCxcbiAgICAgICAgUm93LFxuICAgICAgICBCdXR0b24sXG4gICAgICAgIE1lZGlhLFxuICAgICAgICBCdXR0b25Hcm91cCxcbiAgICAgICAgU3Bpbm5lcixcbiAgICB9IGZyb20gJ3N2ZWx0ZXN0cmFwJztcblxuICAgIGV4cG9ydCBsZXQgc2V0dGluZ3MgPSB7fTtcblxuICAgIGV4cG9ydCBsZXQgYWN0aXZlO1xuICAgICQ6IG1haW5Sb3dDbGFzcyA9IGFjdGl2ZSA/ICcnIDogJ2Qtbm9uZSc7XG5cbiAgICBsZXQgaW1hZ2VTb3VyY2UgPSAnJztcbiAgICBsZXQgaW1hZ2VTaG93biA9IGZhbHNlO1xuICAgICQ6IGltYWdlQ2xhc3MgPSBpbWFnZVNob3duID8gJycgOiAnaW52aXNpYmxlJztcblxuICAgIGxldCBzcGlubmVyU2hvd24gPSBmYWxzZTtcbiAgICAkOiBzcGlubmVyQ2xhc3MgPSBzcGlubmVyU2hvd24gPyAnJyA6ICdpbnZpc2libGUnO1xuXG4gICAgY29uc3QgY2xlYXIgPSAoKSA9PiB7XG4gICAgICAgIGltYWdlU291cmNlID0gXCJcIjtcbiAgICAgICAgaW1hZ2VTaG93biA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBpbXBvcnQgeyBzY2FubmVyIH0gZnJvbSAnLi9zdG9yZXMuanMnO1xuICAgIGxldCBzY2FubmVyTmFtZTtcbiAgICBjb25zdCB1bnN1YnNjcmliZSA9IHNjYW5uZXIuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgc2Nhbm5lck5hbWUgPSB2YWx1ZTtcbiAgICAgICAgY2xlYXIoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNjYW4gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNwaW5uZXJTaG93biA9IHRydWU7XG4gICAgICAgIGF3YWl0IGZldGNoKGAvYXBpL2RldmljZXMvYCsgc2Nhbm5lck5hbWUgK2Avc2NhbmAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShzZXR0aW5ncylcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKHIgPT4gci5ibG9iKCkpXG4gICAgICAgICAgICAudGhlbihibG9iID0+IHtcbiAgICAgICAgICAgICAgICBzcGlubmVyU2hvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpbWFnZVNvdXJjZSA9ICh3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkwpLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgICAgICAgICBpbWFnZVNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBkb3dubG9hZCA9ICgpID0+IHtcbiAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGlmICh3aW5kb3cuVVJMICYmIHdpbmRvdy5CbG9iICYmICgnZG93bmxvYWQnIGluIGEpICYmIHdpbmRvdy5hdG9iKSB7XG4gICAgICAgICAgICBhLmhyZWYgPSBpbWFnZVNvdXJjZTtcbiAgICAgICAgICAgIGEuZG93bmxvYWQgPSBcInNjYW5uZWQucG5nXCI7XG4gICAgICAgICAgICBhLmNsaWNrKCk7XG4gICAgICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTChpbWFnZVNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG48L3NjcmlwdD5cblxuPFJvdyBjbGFzcz17bWFpblJvd0NsYXNzfT5cbiAgICA8Q29sPlxuICAgICAgICA8Um93PlxuICAgICAgICAgICAgPENvbD5cbiAgICAgICAgICAgICAgICA8QnV0dG9uR3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gb3V0bGluZSBwcmltYXJ5IG9uOmNsaWNrPXtzY2FufT5TY2FuPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gb3V0bGluZSBzdWNjZXNzIGRpc2FibGVkPXshaW1hZ2VTaG93bn0gb246Y2xpY2s9e2Rvd25sb2FkfT5Eb3dubG9hZDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIG91dGxpbmUgb246Y2xpY2s9e2NsZWFyfT5DbGVhcjwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvQnV0dG9uR3JvdXA+XG4gICAgICAgICAgICA8L0NvbD5cbiAgICAgICAgPC9Sb3c+XG4gICAgICAgIDxSb3c+XG4gICAgICAgICAgICA8Q29sPlxuICAgICAgICAgICAgICAgIDxoNSBvYmplY3QgY2xhc3M9e2ltYWdlQ2xhc3N9PkltYWdlIGZyb20ge3NjYW5uZXJOYW1lfTwvaDU+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1mbHVpZCB7aW1hZ2VDbGFzc31cIiBzcmM9e2ltYWdlU291cmNlfS8+XG4gICAgICAgICAgICAgICAgPFNwaW5uZXIgY2xhc3M9e3NwaW5uZXJDbGFzc30vPlxuICAgICAgICAgICAgPC9Db2w+XG4gICAgICAgIDwvUm93PlxuICAgIDwvQ29sPlxuPC9Sb3c+IiwiPHNjcmlwdD5cbiAgICBpbXBvcnQge1xuICAgICAgICBDb2wsXG4gICAgICAgIFJvdyxcbiAgICAgICAgU3Bpbm5lcixcbiAgICAgICAgRm9ybSxcbiAgICAgICAgRm9ybUdyb3VwLFxuICAgICAgICBJbnB1dCxcbiAgICAgICAgTGFiZWwsXG4gICAgfSBmcm9tICdzdmVsdGVzdHJhcCc7XG5cbiAgICBpbXBvcnQge29uTW91bnR9IGZyb20gXCJzdmVsdGVcIjtcblxuICAgIGltcG9ydCB7IHNjYW5uZXIgfSBmcm9tICcuL3N0b3Jlcy5qcyc7XG5cbiAgICBleHBvcnQgbGV0IGFjdGl2ZTtcbiAgICAkOiBtYWluUm93Q2xhc3MgPSBhY3RpdmUgPyAnJyA6ICdkLW5vbmUnO1xuXG4gICAgbGV0IHNwaW5uZXJTaG93biA9IGZhbHNlO1xuICAgICQ6IHNwaW5uZXJDbGFzcyA9IHNwaW5uZXJTaG93biA/ICcnIDogJ2Qtbm9uZSc7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFtdO1xuICAgIGV4cG9ydCBsZXQgc2V0dGluZ3MgPSB7fTtcblxuICAgIGNvbnN0IGNsZWFyID0gKCkgPT4ge1xuICAgICAgICBvcHRpb25zID0gW107XG4gICAgfTtcblxuICAgIGNvbnN0IGxvYWQgPSBhc3luYyAoZGF0YSkgPT4ge1xuICAgICAgICBjbGVhcigpO1xuICAgICAgICBzcGlubmVyU2hvd24gPSB0cnVlO1xuICAgICAgICBhd2FpdCBmZXRjaChgL2FwaS9kZXZpY2VzL2ArIHNjYW5uZXJOYW1lICtgL29wdGlvbnNgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKHIgPT4gci5qc29uKCkpXG4gICAgICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBzcGlubmVyU2hvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gZGF0YTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbihvcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Nbb3B0aW9uLm5hbWVdID0gb3B0aW9uLmRlZmF1bHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBsZXQgc2Nhbm5lck5hbWU7XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzY2FubmVyLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgIHNjYW5uZXJOYW1lID0gdmFsdWU7XG4gICAgICAgIGlmIChzY2FubmVyTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgbG9hZCgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBvbk1vdW50KGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHNjYW5uZXJOYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBhd2FpdCBsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuPC9zY3JpcHQ+XG5cbjxSb3cgY2xhc3M9e21haW5Sb3dDbGFzc30+XG4gICAgPENvbD5cbiAgICAgICAgPFNwaW5uZXIgY2xhc3M9e3NwaW5uZXJDbGFzc30vPlxuICAgICAgICA8Rm9ybT5cbiAgICAgICAgICAgIHsjZWFjaCBvcHRpb25zIGFzIG9wdGlvbn1cbiAgICAgICAgICAgICAgICA8Rm9ybUdyb3VwPlxuICAgICAgICAgICAgICAgICAgICB7I2lmIG9wdGlvbi50eXBlID09PSAwfVxuICAgICAgICAgICAgICAgICAgICAgICAgPExhYmVsIGZvcj17b3B0aW9uLm5hbWV9IGNoZWNrPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dCBpZD17b3B0aW9uLm5hbWV9IHBsYWNlaG9sZGVyPXtvcHRpb24uZGVzY3JpcHRpb259IHR5cGU9XCJjaGVja2JveFwiIGJpbmQ6Y2hlY2tlZD17c2V0dGluZ3Nbb3B0aW9uLm5hbWVdfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvcHRpb24udGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0xhYmVsPlxuICAgICAgICAgICAgICAgICAgICB7OmVsc2UgaWYgKG9wdGlvbi50eXBlID09PSAxIHx8IG9wdGlvbi50eXBlID09PSAyKSAmJiBvcHRpb24uc2V0ID09PSBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgPExhYmVsIGZvcj17b3B0aW9uLm5hbWV9PntvcHRpb24udGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNpZiBvcHRpb24ucmFuZ2UgIT09IG51bGx9IChSYW5nZToge29wdGlvbi5yYW5nZS5taW59LXtvcHRpb24ucmFuZ2UubWF4fSwgc3RlcDoge29wdGlvbi5yYW5nZS5xdWFudH0pIHsvaWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0IHR5cGU9XCJudW1iZXJcIiBuYW1lPXtvcHRpb24ubmFtZX0gaWQ9e29wdGlvbi5uYW1lfSBiaW5kOnZhbHVlPXtzZXR0aW5nc1tvcHRpb24ubmFtZV19Lz5cbiAgICAgICAgICAgICAgICAgICAgezplbHNlIGlmIG9wdGlvbi50eXBlID09PSAzICYmIG9wdGlvbi5zZXQgPT09IG51bGx9XG4gICAgICAgICAgICAgICAgICAgICAgICA8TGFiZWwgZm9yPXtvcHRpb24ubmFtZX0+e29wdGlvbi50aXRsZX08L0xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0IG5hbWU9e29wdGlvbi5uYW1lfSBpZD17b3B0aW9uLm5hbWV9IGJpbmQ6dmFsdWU9e3NldHRpbmdzW29wdGlvbi5uYW1lXX0vPlxuICAgICAgICAgICAgICAgICAgICB7OmVsc2UgaWYgb3B0aW9uLnNldCAhPT0gbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxMYWJlbCBmb3I9e29wdGlvbi5uYW1lfT57b3B0aW9uLnRpdGxlfTwvTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXQgdHlwZT1cInNlbGVjdFwiIG5hbWU9e29wdGlvbi5uYW1lfSBpZD17b3B0aW9uLm5hbWV9IGJpbmQ6dmFsdWU9e3NldHRpbmdzW29wdGlvbi5uYW1lXX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNlYWNoIG9wdGlvbi5zZXQgYXMgaXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17aXRlbX0+e2l0ZW19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgey9lYWNofVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9JbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgezplbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgVW5kZWZpbmVkIG9wdGlvblxuICAgICAgICAgICAgICAgICAgICB7L2lmfVxuICAgICAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgICAgICAgey9lYWNofVxuICAgICAgICA8L0Zvcm0+XG4gICAgPC9Db2w+XG48L1Jvdz4iLCI8c2NyaXB0PlxuICAgIGltcG9ydCB7XG4gICAgICAgIENvbCxcbiAgICAgICAgQ29udGFpbmVyLFxuICAgICAgICBSb3csXG4gICAgICAgIE5hdixcbiAgICAgICAgTmF2SXRlbSxcbiAgICAgICAgTmF2TGlua1xuICAgIH0gZnJvbSAnc3ZlbHRlc3RyYXAnO1xuICAgIGltcG9ydCBTY2FubmVycyBmcm9tICcuL1NjYW5uZXJzLnN2ZWx0ZSc7XG4gICAgaW1wb3J0IFNjYW5QYWdlIGZyb20gJy4vU2NhblBhZ2Uuc3ZlbHRlJ1xuICAgIGltcG9ydCBTZXR0aW5nc1BhZ2UgZnJvbSAnLi9TZXR0aW5nc1BhZ2Uuc3ZlbHRlJ1xuXG4gICAgbGV0IHNjYW5uZXJOYW1lO1xuXG4gICAgbGV0IHNldHRpbmdzID0ge307XG5cbiAgICBpbXBvcnQgeyBzY2FubmVyIH0gZnJvbSAnLi9zdG9yZXMuanMnO1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc2Nhbm5lci5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICBzY2FubmVyTmFtZSA9IHZhbHVlO1xuICAgIH0pO1xuXG4gICAgZXhwb3J0IGxldCBhY3RpdmVUYWIgPSAnc2Nhbic7XG5cbiAgICBjb25zdCBzZWxlY3RUYWIgPSBuYW1lID0+ICgpID0+IGFjdGl2ZVRhYiA9IG5hbWU7XG48L3NjcmlwdD5cblxuPENvbnRhaW5lcj5cbiAgICA8Um93PlxuICAgICAgICA8Q29sIHNtPVwiNlwiIG1kPVwiMlwiPlxuICAgICAgICAgICAgPFNjYW5uZXJzLz5cbiAgICAgICAgPC9Db2w+XG4gICAgICAgIDxDb2wgc209XCI2XCIgbWQ9XCIxMFwiPlxuICAgICAgICAgICAgPFJvdz5cbiAgICAgICAgICAgICAgICA8Q29sPlxuICAgICAgICAgICAgICAgICAgICA8TmF2IHRhYnM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TmF2SXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TmF2TGluayBhY3RpdmU9e1wic2NhblwiID09PSBhY3RpdmVUYWJ9IG9uOmNsaWNrPXtzZWxlY3RUYWIoXCJzY2FuXCIpfT5TY2FuPC9OYXZMaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9OYXZJdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPE5hdkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPE5hdkxpbmsgYWN0aXZlPXtcInNldHRpbmdzXCIgPT09IGFjdGl2ZVRhYn0gb246Y2xpY2s9e3NlbGVjdFRhYihcInNldHRpbmdzXCIpfT5TZXR0aW5nczwvTmF2TGluaz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvTmF2SXRlbT5cbiAgICAgICAgICAgICAgICAgICAgPC9OYXY+XG4gICAgICAgICAgICAgICAgPC9Db2w+XG4gICAgICAgICAgICA8L1Jvdz5cbiAgICAgICAgICAgIDxTY2FuUGFnZSBhY3RpdmU9e1wic2NhblwiID09PSBhY3RpdmVUYWJ9IHNldHRpbmdzPXtzZXR0aW5nc30vPlxuICAgICAgICAgICAgPFNldHRpbmdzUGFnZSBhY3RpdmU9e1wic2V0dGluZ3NcIiA9PT0gYWN0aXZlVGFifSBiaW5kOnNldHRpbmdzPXtzZXR0aW5nc30vPlxuICAgICAgICA8L0NvbD5cbiAgICA8L1Jvdz5cbjwvQ29udGFpbmVyPiIsImltcG9ydCBBcHAgZnJvbSAnLi9BcHAuc3ZlbHRlJztcblxuaW1wb3J0ICdib290c3RyYXAvZGlzdC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MnO1xuXG5jb25zdCBhcHAgPSBuZXcgQXBwKHtcblx0dGFyZ2V0OiBkb2N1bWVudC5ib2R5LFxuXHRwcm9wczoge1xuXHRcdG5hbWU6ICd3b3JsZCdcblx0fVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFwcDsiXSwibmFtZXMiOlsibm9vcCIsImFzc2lnbiIsInRhciIsInNyYyIsImsiLCJydW4iLCJmbiIsImJsYW5rX29iamVjdCIsIk9iamVjdCIsImNyZWF0ZSIsInJ1bl9hbGwiLCJmbnMiLCJmb3JFYWNoIiwiaXNfZnVuY3Rpb24iLCJ0aGluZyIsInNhZmVfbm90X2VxdWFsIiwiYSIsImIiLCJjcmVhdGVfc2xvdCIsImRlZmluaXRpb24iLCJjdHgiLCIkJHNjb3BlIiwic2xvdF9jdHgiLCJnZXRfc2xvdF9jb250ZXh0Iiwic2xpY2UiLCJ1cGRhdGVfc2xvdCIsInNsb3QiLCJzbG90X2RlZmluaXRpb24iLCJkaXJ0eSIsImdldF9zbG90X2NoYW5nZXNfZm4iLCJnZXRfc2xvdF9jb250ZXh0X2ZuIiwic2xvdF9jaGFuZ2VzIiwibGV0cyIsInVuZGVmaW5lZCIsIm1lcmdlZCIsImxlbiIsIk1hdGgiLCJtYXgiLCJsZW5ndGgiLCJpIiwiZ2V0X3Nsb3RfY2hhbmdlcyIsInNsb3RfY29udGV4dCIsInAiLCJleGNsdWRlX2ludGVybmFsX3Byb3BzIiwicHJvcHMiLCJyZXN1bHQiLCJjb21wdXRlX3Jlc3RfcHJvcHMiLCJrZXlzIiwicmVzdCIsIlNldCIsImhhcyIsImFwcGVuZCIsInRhcmdldCIsIm5vZGUiLCJhcHBlbmRDaGlsZCIsImluc2VydCIsImFuY2hvciIsImluc2VydEJlZm9yZSIsImRldGFjaCIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsImRlc3Ryb3lfZWFjaCIsIml0ZXJhdGlvbnMiLCJkZXRhY2hpbmciLCJkIiwiZWxlbWVudCIsIm5hbWUiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ0ZXh0IiwiZGF0YSIsImNyZWF0ZVRleHROb2RlIiwic3BhY2UiLCJlbXB0eSIsImxpc3RlbiIsImV2ZW50IiwiaGFuZGxlciIsIm9wdGlvbnMiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImF0dHIiLCJhdHRyaWJ1dGUiLCJ2YWx1ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInNldF9hdHRyaWJ1dGVzIiwiYXR0cmlidXRlcyIsImRlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsIl9fcHJvdG9fXyIsImtleSIsInN0eWxlIiwiY3NzVGV4dCIsInNldCIsInRvX251bWJlciIsInNldF9kYXRhIiwid2hvbGVUZXh0Iiwic2V0X2lucHV0X3ZhbHVlIiwiaW5wdXQiLCJzZWxlY3Rfb3B0aW9uIiwic2VsZWN0Iiwib3B0aW9uIiwiX192YWx1ZSIsInNlbGVjdGVkIiwic2VsZWN0X29wdGlvbnMiLCJpbmRleE9mIiwiY3VycmVudF9jb21wb25lbnQiLCJzZXRfY3VycmVudF9jb21wb25lbnQiLCJjb21wb25lbnQiLCJvbk1vdW50IiwiRXJyb3IiLCJnZXRfY3VycmVudF9jb21wb25lbnQiLCIkJCIsIm9uX21vdW50IiwicHVzaCIsImJ1YmJsZSIsImNhbGxiYWNrcyIsInR5cGUiLCJkaXJ0eV9jb21wb25lbnRzIiwiYmluZGluZ19jYWxsYmFja3MiLCJyZW5kZXJfY2FsbGJhY2tzIiwiZmx1c2hfY2FsbGJhY2tzIiwicmVzb2x2ZWRfcHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwidXBkYXRlX3NjaGVkdWxlZCIsImFkZF9yZW5kZXJfY2FsbGJhY2siLCJhZGRfZmx1c2hfY2FsbGJhY2siLCJmbHVzaGluZyIsInNlZW5fY2FsbGJhY2tzIiwiZmx1c2giLCJ1cGRhdGUiLCJwb3AiLCJjYWxsYmFjayIsImFkZCIsImNsZWFyIiwiZnJhZ21lbnQiLCJiZWZvcmVfdXBkYXRlIiwiYWZ0ZXJfdXBkYXRlIiwib3V0cm9pbmciLCJvdXRyb3MiLCJncm91cF9vdXRyb3MiLCJyIiwiYyIsImNoZWNrX291dHJvcyIsInRyYW5zaXRpb25faW4iLCJibG9jayIsImxvY2FsIiwiZGVsZXRlIiwidHJhbnNpdGlvbl9vdXQiLCJvIiwiZ2V0X3NwcmVhZF91cGRhdGUiLCJsZXZlbHMiLCJ1cGRhdGVzIiwidG9fbnVsbF9vdXQiLCJhY2NvdW50ZWRfZm9yIiwibiIsImJpbmQiLCJpbmRleCIsImJvdW5kIiwiY3JlYXRlX2NvbXBvbmVudCIsIm1vdW50X2NvbXBvbmVudCIsIm9uX2Rlc3Ryb3kiLCJtIiwibmV3X29uX2Rlc3Ryb3kiLCJtYXAiLCJmaWx0ZXIiLCJkZXN0cm95X2NvbXBvbmVudCIsIm1ha2VfZGlydHkiLCJ0aGVuIiwiZmlsbCIsImluaXQiLCJpbnN0YW5jZSIsImNyZWF0ZV9mcmFnbWVudCIsIm5vdF9lcXVhbCIsInBhcmVudF9jb21wb25lbnQiLCJwcm9wX3ZhbHVlcyIsImNvbnRleHQiLCJNYXAiLCJza2lwX2JvdW5kIiwicmVhZHkiLCJyZXQiLCJoeWRyYXRlIiwibm9kZXMiLCJBcnJheSIsImZyb20iLCJjaGlsZE5vZGVzIiwiY2hpbGRyZW4iLCJsIiwiaW50cm8iLCJTdmVsdGVDb21wb25lbnQiLCJbb2JqZWN0IE9iamVjdF0iLCJ0aGlzIiwiJGRlc3Ryb3kiLCJzcGxpY2UiLCIkJHByb3BzIiwib2JqIiwiJCRzZXQiLCJpc09iamVjdCIsImdldENvbHVtblNpemVDbGFzcyIsImlzWHMiLCJjb2xXaWR0aCIsImNvbFNpemUiLCJ0b0NsYXNzTmFtZSIsImlzQXJyYXkiLCJCb29sZWFuIiwiam9pbiIsImNsYXNzbmFtZXMiLCJhcmdzIiwiY2xhc3NOYW1lIiwiYWN0aXZlIiwiY2xvc2UiLCJjb2xvciIsImRpc2FibGVkIiwiaHJlZiIsIm91dGxpbmUiLCJzaXplIiwiYXJpYUxhYmVsIiwiY2xhc3NlcyIsImRlZmF1bHRBcmlhTGFiZWwiLCJzdWJzY3JpYmVyX3F1ZXVlIiwidmVydGljYWwiLCJ4cyIsInNtIiwibWQiLCJsZyIsInhsIiwiY29sQ2xhc3NlcyIsImxvb2t1cCIsImNvbHVtblByb3AiLCJjb2xTaXplSW50ZXJmaXgiLCJjb2xDbGFzcyIsInB1bGwiLCJvZmZzZXQiLCJmbHVpZCIsImlubGluZSIsInJvdyIsImNoZWNrIiwidGFnIiwiYnNTaXplIiwiY2hlY2tlZCIsInZhbGlkIiwiaW52YWxpZCIsInBsYWludGV4dCIsImFkZG9uIiwiZmlsZXMiLCJyZWFkb25seSIsIm11bHRpcGxlIiwicGxhY2Vob2xkZXIiLCJjaGVja0lucHV0IiwiaXNOb3RhTnVtYmVyIiwiUmVnRXhwIiwiZmlsZUlucHV0IiwidGV4dGFyZWFJbnB1dCIsInJhbmdlSW5wdXQiLCJidXR0b25JbnB1dCIsInVuc3VwcG9ydGVkSW5wdXQiLCJmb3JtQ29udHJvbENsYXNzIiwidGVzdCIsImNvbnNvbGUiLCJ3YXJuIiwic2VsZWN0ZWRfb3B0aW9uIiwicXVlcnlTZWxlY3RvciIsImhpZGRlbiIsImZvcmUiLCJjb2xXaWR0aHMiLCJ3aWR0aHMiLCJvcmRlciIsImFjdGlvbiIsInRhYnMiLCJwaWxscyIsImhvcml6b250YWwiLCJqdXN0aWZpZWQiLCJuYXZiYXIiLCJjYXJkIiwiZ2V0VmVydGljYWxDbGFzcyIsIm5hdi10YWJzIiwiY2FyZC1oZWFkZXItdGFicyIsIm5hdi1waWxscyIsImNhcmQtaGVhZGVyLXBpbGxzIiwibmF2LWp1c3RpZmllZCIsIm5hdi1maWxsIiwiZSIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwibm9HdXR0ZXJzIiwiZm9ybSIsInNjYW5uZXIiLCJzdGFydCIsInN0b3AiLCJzdWJzY3JpYmVycyIsIm5ld192YWx1ZSIsInJ1bl9xdWV1ZSIsInMiLCJzdWJzY3JpYmUiLCJpbnZhbGlkYXRlIiwic3Vic2NyaWJlciIsIndyaXRhYmxlIiwic2Nhbm5lcnMiLCJmZXRjaCIsImpzb24iLCJzZXR0aW5ncyIsImltYWdlU291cmNlIiwiaW1hZ2VTaG93biIsInNwaW5uZXJTaG93biIsInNjYW5uZXJOYW1lIiwibWFpblJvd0NsYXNzIiwiaW1hZ2VDbGFzcyIsInNwaW5uZXJDbGFzcyIsIm1ldGhvZCIsImhlYWRlcnMiLCJDb250ZW50LVR5cGUiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsImJsb2IiLCJ3aW5kb3ciLCJVUkwiLCJ3ZWJraXRVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJCbG9iIiwiYXRvYiIsImRvd25sb2FkIiwiY2xpY2siLCJyZXZva2VPYmplY3RVUkwiLCJ0aXRsZSIsInJhbmdlIiwibWluIiwicXVhbnQiLCJkZXNjcmlwdGlvbiIsImxvYWQiLCJsb2ciLCJkZWZhdWx0IiwiYWN0aXZlVGFiIl0sIm1hcHBpbmdzIjoiZ0NBQUEsU0FBU0EsS0FFVCxTQUFTQyxFQUFPQyxFQUFLQyxHQUVqQixJQUFLLE1BQU1DLEtBQUtELEVBQ1pELEVBQUlFLEdBQUtELEVBQUlDLEdBQ2pCLE9BQU9GLEVBVVgsU0FBU0csRUFBSUMsR0FDVCxPQUFPQSxJQUVYLFNBQVNDLElBQ0wsT0FBT0MsT0FBT0MsT0FBTyxNQUV6QixTQUFTQyxFQUFRQyxHQUNiQSxFQUFJQyxRQUFRUCxHQUVoQixTQUFTUSxFQUFZQyxHQUNqQixNQUF3QixtQkFBVkEsRUFFbEIsU0FBU0MsRUFBZUMsRUFBR0MsR0FDdkIsT0FBT0QsR0FBS0EsRUFBSUMsR0FBS0EsRUFBSUQsSUFBTUMsR0FBT0QsR0FBa0IsaUJBQU5BLEdBQWdDLG1CQUFOQSxFQTRCaEYsU0FBU0UsRUFBWUMsRUFBWUMsRUFBS0MsRUFBU2YsR0FDM0MsR0FBSWEsRUFBWSxDQUNaLE1BQU1HLEVBQVdDLEVBQWlCSixFQUFZQyxFQUFLQyxFQUFTZixHQUM1RCxPQUFPYSxFQUFXLEdBQUdHLElBRzdCLFNBQVNDLEVBQWlCSixFQUFZQyxFQUFLQyxFQUFTZixHQUNoRCxPQUFPYSxFQUFXLElBQU1iLEVBQ2xCTCxFQUFPb0IsRUFBUUQsSUFBSUksUUFBU0wsRUFBVyxHQUFHYixFQUFHYyxLQUM3Q0MsRUFBUUQsSUFvQmxCLFNBQVNLLEVBQVlDLEVB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\"") packr.PackJSONBytes("../../web/public", "favicon.png", "\"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsSAAALEgHS3X78AAAL6UlEQVR4nO1dCY4TRxStwMCwD4hNIEQmdQEmJ8jkBMwNmJwg5AQMNxhOEDhBhhswJwhcoGIQYkcwYt+jZ+oHx9hj99+q2vaTWiyS2+2uV3//v3748uVLmGF6sWO29tONGQGmHDMCTDlmBJhyzE37CxiGlNJiCGEpX4fzn8NwM4TwPP95M8bYqe4HDcHMC8jIC74SQljO14LgdlshhBv52qiZEFNPgJTSaggB1y+GX3MrhLCeyfDc8HsaYyoJkFKCSL+YL8lObwpIho0QwlotUmHqCJBSwqKvOS/8IFyrgQhTQ4CU0nIWw+cqeBwCJMJ6jHGt1ANMPAGyuMcL/r2CxxkG2AirMcab3l880XGAlNJKds1qXvyQpdLfWT25YiIlQN71V0MI5yt4nKaAbXDRy1uYOAJUZORJAJWw7EGCiSFADuRcNfbnPeFCgomwAVJK2PH/TNDih2wX3MjqzAytlgCVunbaMJUErUwGebt2O3bsCPPz82Fubq579eLz58/h/fv34d27d92/G+BcVm0rFjdvnQTIrh12/Y+W34OFXlhYCHv37g27d+8e6zMfP34Mb968Ca9fvw6vXr3SfqTLFgGj1hDAy7XDgh85ciTs2bNHdB+QYWtrK7x48UJTMvwaY7yhdbPQFgJ4uHbY8SdOnBAvfD9AhGfPnnWJoIDbqEvQtAeqJoCXawdRj10PXW+Ft2/fhgcPHmhIgysxRrWIYbUEyK7dJcvvgG7Hrh9Xx0uBxb93717XaBRCTRVURwAP1w47nXa9N5RIsBljXNZ49GoI4OXawcg7fvz4d+6cJ5RIoCIFqogEemTtsOux8KdOnSq6+PQsp0+flqoeFZewqATwcu3279/fXXxLI48DSABIAoFh+JO0oqjYG8muXcdy8bHTT5482b1qW/yQjVChHSL2BtwlgNeu93DttHD37l2uPbAVYxQli1zfTkppKdfKmy0+dhX069GjR1ux+MCxY8e4H13I75QNN2uoZ/HNonnY8SVcOykQfQRxmVKADGgWXAhgvfg1uHZSQGU9fvyYcxdRPMD8jVkuPkQ8djxengcQ10dMHxf+ju8H+Q4cOND1NCTA55kEEIXJTY3AbPB1LBYfLwx63mvXI6GDa7vnkbqa9+/f76aTGfiZW1Ju/fbUdz4FdKQ7blxALz969Gikfkb+H/48Ak1cwBZgEmCRaweYESAnc1Tj+Z6uHRYTOx45/XGBxYN6OHjwIOs7BZHBpdxz2BgmBMh6Xy2TZ5WrHwakbrHroeebAoThEmDnzp3mv60fVhLgqtaNPF077PqnT5+KijckCR6BPcMOBqkTIPfbi0W/d64eOhxWuFFh51gQEIAdDLKQAOIsFUQoDD0PQMxj1xsUcbYCqgTIu19UrQvXzsuvh76Goae96zudTtdL2bdvXyNvRaFSqDG0JYAoO+UV1MGuh7hnulwjAUJRwAhiHRINv2uU9yIgIrswRI0A2fJn6368JA9jb1RARxtUFYyLfuMwXf/hwwe35yJoSoBV9kPMzXVFvyXGDehYAhIBtgakwSCJgIYSb2gSgN26BGvfKrjDCehYgp4HZOiPbQhUUlkVkMU/y/hDMsUqwCMJ6FgDz4RyMIpu4t8CG4BdFqYlAdgpSQu9jxcJI68Nrh0kE3a+IAq4JakL1CIAKxCBII/27q8hoNMUQrtENFhKiwCLnA9xY+aDYO3aVQxWEoigRQBWUQL0vwasAjotgag5pGgNlTTO77Xr4abu2rXru///9OlTUbcS3cLS2YJiAuRevsaQ7n6FpoqhwIIjhIsLJB3louJZQEJ4Hc6G57r0BsUkgNTvV2q1/h9AykOHDjWuNgJJcMGlo7pBqCUHlSROuxcjgET8U1Gm5rOgNl/DI4H0oJwGSGBIhGsagyJaWUetqXetCk6oYhmejpGdotIcOrUE8OolwP1RKIqaA8Vw9GWtMfPFCCAR4YLqWfdeAgKSXVA1zNr/XmxpGH8EDQKw3BAJAWCkcVK63r0E/aDAl5AEqsfOiFNw3IfBYEUusJOaWOrY9dQmXrp9DCQQpr4v5OFZKtDKwd5q+gFYxhIpAP09jicBUX/27Fm3RpJxgGcSPo/awEgtArAMEollTGNWhulyGHk1t4kL28hWtIZIa8lDVs8/KmAkCSG8QCwwjDpE4HobNr3KybmgFreHDx9y7rCQC3DEgSCtrcFKSNCiSYGXSfV2kAi1Lz4BakAQElcZHq1CgJyQYDm5tZRqlYIgCHVeQw1oKkdWXlo7rNs2IKYh8EzEwyKLE4D68WoHlXejhx8XfHmlAdASj0A0HyhoD4hIKXW4xaHw0Wty1Qijqoo1ehgR2sakMAbEI2O1/SO2VYodVZsqgJF6586dbe0UqkuQPLuAPOKAkDYB1rnGIHaaRY6fAywm3DNc4zwPVSFLwPQGxKemqBIgh4XZRYqWVT7jArsd4rhpZQ+CWiVmA0jDwqoEyA9zQXIPDZHK/V4sPAxSLgEl5WACT6AeAmhNBqHFQI2dNcjIE4xrbTU0u4OXNY92oZn6loOhtFvH2jKatheauVGTM/Dp5K1hHbUcWE0FqdGNHQXN5lCzg516fXG8ZE68H/fAghud6dd9JkmtQSkXWEsCuJx73zt5ozfrh2tQcyUGLkCvU92+FajSSAIBAUS1gVoEMDnWdDvQji7ZAaxZX8itkJIWh2p0Bq20/Kx+FjTrCyGhmK6nOJWqIQFUji9rCyxmFQuSSqK+wDAjQDNYuaQCNVYFAViTwZD9I3esdljOKhbWQ4jPDRQRQHJeDYlQWPKlp3dtB+tZxcKRdWUJwI1D92a+4MKdOXPmPz+/liEPHrOK8ZsFu/9WDc2hLAkwSJRSI6XiUesseLWOQeIJd79K3qVIm8yw3Dd0LSxsLEAJIng1jFLtgxCi2UAE6S9VaU7oBxEBfjZF/ixtBM9jaCjJJQz9Xq+lO5g9Hm4c0DHvNHkD7pK210C9el7H0CicGh5q6w5uDM7LhlTQmioWjF27QUDqWankbVPj2HiClAAdyyxgP7Q8hNoPnxoB1bS7BgEaA7uBs/Oku3UCjqG5prn7QxtHxMBQaxo6JVvC8/Apg1nFWxZp9yISAKlP7m6mTuBx4X2usOHU0lXNySCEIgSQWMEQ31jQUXX41DquOY94OxhPLb0SY1Tx+/shJQArGyV9SVhULDBcwkH+tKdrF+yPoYHPb1ZxJe4N5PYDIv6vYYxBHZBEwYLDRvAS9zBmnzx5YhmkwuidZQvRT9B4Uzc4zSDQlRpnA9JMX084HUNjvvhBqTGEPR2kjePdsevRRDIJix+UVADyASwF6HkusBSOx9DA12efwNYUWnMCr3M+K8yHuwHJKLSJGy8+RMpvnosfFHsD2S6KQlrUDCAnTQMxVlebSKzFGNVOXR8XahNCUkrPueXhNaoCpwqlbnSvxMITNB1ldoqydBVQL6gz2eEMIqjNxZKLH5QlwOEcGWTXUsEt9Irc9QOLTWFcY9zOYV3VpA4XahIgG4OiQgXNyVtNQK6dw+Jfybq+isUPBlPCDufwsGh2jZdNQCPqHEh3K+96cSOHNlQJEL71Cv4lvY91Fs/phNHu4Q4xRpPZCRpQJ0D4SoINzvDoQdCu3oG4h6h3OGF0M+96leJNK1gRQEUV9ALGoWQQNMT8y5cvPRa+uGvXBCYECN/axv7Wvi8Vh4II8/PzAw92RAAHFwpPsOOx6E55h+tWhRtWMCNA+EoChDX/LP0jHVCVa9cEphUTWQz+YfkdFaA6164JTCUAIaV0VTpAskJU69o1gQsBwlcSwBW65PJltqjetWsCNwKEybAJWuHaNYErAcK3iaIbLRss1SrXrgncCRC+xQk2PNvKBGida9cERQhASCldzL1uNUqD1rp2TVB0unGMcT23mF8r+RwD0GrXrgmKSoBeZNtgrbBaABHXJsnIG4VqCEDIh06s5fGzXqph6haeUB0BCNlQXMmXSmaxDwjkrGsfx942VEuAfuQ6g6U8mXSJIR02c4by5rQvei9aQ4B+ZAlBM4oWB8wsJAOuM42ifVy0lgAz6KB9h9zMoIoZAaYcMwJMM0II/wJv+riuzREqgwAAAABJRU5ErkJggg==\"") packr.PackJSONBytes("../../web/public", "global.css", "\"Ym9keSB7Cgljb2xvcjogIzMzMzsKCW1hcmdpbjogMDsKCXBhZGRpbmc6IDhweDsKCWJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5yb3cgewoJcGFkZGluZy1ib3R0b206IDNweDsKfQ==\"") packr.PackJSONBytes("../../web/public", "index.html", "\"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+Cgk8bWV0YSBjaGFyc2V0PSd1dGYtOCc+Cgk8bWV0YSBuYW1lPSd2aWV3cG9ydCcgY29udGVudD0nd2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSc+CgoJPHRpdGxlPnNjYW48L3RpdGxlPgoKCTxsaW5rIHJlbD0nc3R5bGVzaGVldCcgaHJlZj0nL2dsb2JhbC5jc3MnPgoJPGxpbmsgcmVsPSdzdHlsZXNoZWV0JyBocmVmPScvYnVpbGQvYnVuZGxlLmNzcyc+CgoJPHNjcmlwdCBkZWZlciBzcmM9Jy9idWlsZC9idW5kbGUuanMnPjwvc2NyaXB0Pgo8L2hlYWQ+Cgo8Ym9keT4KPC9ib2R5Pgo8L2h0bWw+Cg==\"") diff --git a/go.mod b/go.mod index b2a4be7..ccf6c51 100644 --- a/go.mod +++ b/go.mod @@ -4,24 +4,17 @@ go 1.14 require ( github.com/caarlos0/env/v6 v6.4.0 - github.com/gobuffalo/envy v1.9.0 // indirect - github.com/gobuffalo/packd v1.0.0 // indirect + github.com/gobuffalo/envy v1.10.1 // indirect + github.com/gobuffalo/packd v1.0.1 // indirect github.com/gobuffalo/packr v1.30.1 - github.com/gobuffalo/packr/v2 v2.8.1 // indirect - github.com/karrick/godirwalk v1.16.1 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect github.com/labstack/echo/v4 v4.1.17 - github.com/labstack/gommon v0.3.0 - github.com/rogpeppe/go-internal v1.6.2 // indirect - github.com/sirupsen/logrus v1.7.0 // indirect - github.com/spf13/cobra v1.1.1 // indirect github.com/tjgq/sane v0.0.0-20180903025858-a697b47bd07c go.uber.org/dig v1.10.0 - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.16.0 - golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect - golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect - golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect - golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 // indirect - golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect + go.uber.org/zap v1.17.0 + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect + golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42 // indirect + golang.org/x/text v0.3.5 // indirect + golang.org/x/tools v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index ac5f47b..420a4f9 100644 --- a/go.sum +++ b/go.sum @@ -1,442 +1,162 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/caarlos0/env v3.5.0+incompatible h1:Yy0UN8o9Wtr/jGHZDpCBLpNrzcFLLM2yixi/rBrKyJs= github.com/caarlos0/env/v6 v6.4.0 h1:fUo2hQNR3O7Yb7E2sYy8cxY42BRvFxWa0G4XBMLJAQM= github.com/caarlos0/env/v6 v6.4.0/go.mod h1:MX/8qQ2zCofGGkb7FxjmDLOOjUylO2b7dbsIpN30bnY= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.9.0 h1:eZR0DuEgVLfeIb1zIKt3bT4YovIMf9O9LXQeCZLXpqE= -github.com/gobuffalo/envy v1.9.0/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/logger v1.0.0 h1:xw9Ko9EcC5iAFprrjJ6oZco9UpzS5MQ4jAwghsLHdy4= +github.com/gobuffalo/envy v1.10.1 h1:ppDLoXv2feQ5nus4IcgtyMdHQkKng2lhJCIm33cblM0= +github.com/gobuffalo/envy v1.10.1/go.mod h1:AWx4++KnNOW3JOeEvhSaq+mvgAvnMYOY1XSIin4Mago= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= -github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM= -github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= +github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0= +github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY= github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg= github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk= -github.com/gobuffalo/packr/v2 v2.5.1 h1:TFOeY2VoGamPjQLiNDT3mn//ytzk236VMO2j7iHxJR4= github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= -github.com/gobuffalo/packr/v2 v2.8.1 h1:tkQpju6i3EtMXJ9uoF5GT6kB+LMTimDWD8Xvbz6zDVA= -github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karrick/godirwalk v1.10.12 h1:BqUm+LuJcXjGv1d2mj3gBiQyrQ57a0rYoAmhvJQ7RDU= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= -github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/labstack/echo v1.4.4 h1:1bEiBNeGSUKxcPDGfZ/7IgdhJJZx8wV/pICJh4W2NJI= -github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= github.com/labstack/echo/v4 v4.1.17 h1:PQIBaRplyRy3OjwILGkPg89JRtH2x5bssi59G2EL3fo= github.com/labstack/echo/v4 v4.1.17/go.mod h1:Tn2yRQL/UclUalpb5rPdXDevbkJ+lp/2svdyFBg6CHQ= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= -github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= -github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY= -github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tjgq/sane v0.0.0-20180903025858-a697b47bd07c h1:eAvZ7ifJN0D7EuTpG0W96JrMThJI+e6OnsHF7tqP0IE= github.com/tjgq/sane v0.0.0-20180903025858-a697b47bd07c/go.mod h1:VAAJOvnXA7ItE82SmBr2bHO4fwAZM5zhvNAow+6/JxE= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6 h1:nfeHNc1nAqecKCy2FCy4HY+soOOe5sDLJ/gZLbx6GYI= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6 h1:DvY3Zkh7KabQE/kfzMvYvKirSiguP9Q/veMtkYyf0o8= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 h1:/dSxr6gT0FNI1MO5WLJo8mTmItROeOKTkDn+7OwWBos= -golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42 h1:G2DDmludOQZoWbpCr7OKDxnl478ZBGMcOhrv+ooX/Q4= +golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b h1:NVD8gBK33xpdqCaZVVtd6OFJp+3dxkXuz7+U7KaVN6s= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/scan/scan.go b/internal/scan/scan.go index 296e8d6..f1cb4dd 100644 --- a/internal/scan/scan.go +++ b/internal/scan/scan.go @@ -271,8 +271,27 @@ func (s *Scan) Scan(name string, arguments []Argument) ([]byte, error) { if err != nil { return nil, fmt.Errorf("%s is not valid int: %w", typedV, ErrInvalidArgument) } + case []interface{}: + vs := make([]int, 0, len(typedV)) + for _, item := range typedV { + switch typedItem := item.(type) { + case float64: + vs = append(vs, int(typedItem)) + case float32: + vs = append(vs, int(typedItem)) + case int: + vs = append(vs, int(typedItem)) + case int64: + vs = append(vs, int(typedItem)) + case int32: + vs = append(vs, int(typedItem)) + default: + fmt.Printf("%s %T err \n", item, item) + } + } + v = vs default: - return nil, fmt.Errorf("%s is %T not an int: %w", typedV, arg.Name, ErrInvalidArgument) // not an int + return nil, fmt.Errorf("%#v is %T not an int: %w", typedV, arg.Name, ErrInvalidArgument) // not an int } case sane.TypeFloat: if v, ok = arg.Value.(float64); !ok { diff --git a/screenshot.jpeg b/screenshot.jpeg deleted file mode 100644 index 5464948..0000000 Binary files a/screenshot.jpeg and /dev/null differ diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..aa285c5 Binary files /dev/null and b/screenshot.png differ diff --git a/web/package-lock.json b/web/package-lock.json index e101383..a777d1b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,8 +1,1094 @@ { "name": "svelte-app", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "svelte-app", + "version": "1.0.0", + "dependencies": { + "bootstrap": "^4.5.3", + "sirv-cli": "^1.0.0", + "sveltestrap": "^3.11.0" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^16.0.0", + "@rollup/plugin-node-resolve": "^10.0.0", + "rollup": "^2.3.4", + "rollup-plugin-css-only": "^3.1.0", + "rollup-plugin-livereload": "^2.0.0", + "rollup-plugin-svelte": "^7.0.0", + "rollup-plugin-terser": "^7.0.0", + "svelte": "^3.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.11", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz", + "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==" + }, + "node_modules/@popperjs/core": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.6.0.tgz", + "integrity": "sha512-cPqjjzuFWNK3BSKLm0abspP0sp/IGOli4p5I5fKFAzdS8fvjdOwDCfZqAaIiXd9lPkOWi3SUUfZof3hEb7J/uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz", + "integrity": "sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^2.30.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-10.0.0.tgz", + "integrity": "sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.14.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", + "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bootstrap": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.3.tgz", + "integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", + "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/console-clear": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", + "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/livereload": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz", + "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==", + "dev": true, + "dependencies": { + "chokidar": "^3.3.0", + "livereload-js": "^3.1.0", + "opts": ">= 1.2.0", + "ws": "^6.2.1" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/livereload-js": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.1.tgz", + "integrity": "sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==", + "dev": true + }, + "node_modules/local-access": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", + "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=" + }, + "node_modules/lodash.tonumber": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz", + "integrity": "sha1-C5azGzVnJ5Prf1pj7nkfG56QJdk=" + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mri": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", + "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.36.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.36.1.tgz", + "integrity": "sha512-eAfqho8dyzuVvrGqpR0ITgEdq0zG2QJeWYh+HeuTbpcaXk8vNFc48B7bJa1xYosTCKx0CuW+447oQOW8HgBIZQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/rollup-plugin-css-only": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-css-only/-/rollup-plugin-css-only-3.1.0.tgz", + "integrity": "sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "4" + }, + "engines": { + "node": ">=10.12.0" + }, + "peerDependencies": { + "rollup": "1 || 2" + } + }, + "node_modules/rollup-plugin-css-only/node_modules/@rollup/pluginutils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", + "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/rollup-plugin-livereload": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz", + "integrity": "sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A==", + "dev": true, + "dependencies": { + "livereload": "^0.9.1" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/rollup-plugin-svelte": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-7.0.0.tgz", + "integrity": "sha512-cw4yv/5v1NQV3nPbpOJtikgkB+9mfSJaqKUdq7x5fVQJnwLtcdc2JOszBs5pBY+SemTs5pmJbdEMseEavbUtjQ==", + "dev": true, + "dependencies": { + "require-relative": "^0.8.7", + "rollup-pluginutils": "^2.8.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "rollup": ">=2.0.0", + "svelte": ">=3.5.0" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/sade": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", + "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semiver": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", + "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/sirv": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.10.tgz", + "integrity": "sha512-H5EZCoZaggEUQy8ocKsF7WAToGuZhjJlLvM3XOef46CbdIgbNeQ1p32N1PCuCjkVYwrAVOSMacN6CXXgIzuspg==", + "dependencies": { + "@polka/url": "^1.0.0-next.9", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv-cli": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-1.0.10.tgz", + "integrity": "sha512-8mLTRkvzpZXMyUZJ1whf84YHN/mm2r2+j5sU1ZYr5n2jA8VkFItNPk53oysOo+0QxBVp9aUjggkAsQp1d7L3OQ==", + "dependencies": { + "console-clear": "^1.1.0", + "get-port": "^3.2.0", + "kleur": "^3.0.0", + "local-access": "^1.0.1", + "sade": "^1.6.0", + "semiver": "^1.0.0", + "sirv": "^1.0.10", + "tinydate": "^1.0.0" + }, + "bin": { + "sirv": "bin.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svelte": { + "version": "3.31.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.31.2.tgz", + "integrity": "sha512-TxZGrXzX2ggFH3BIKY5fmbeMdJuZrMIMDYPMX6R9255bueuYIuVaBQSLUeY2oD7W4IdeqRZiAVGCjDw2POKBRA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/sveltestrap": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/sveltestrap/-/sveltestrap-3.11.0.tgz", + "integrity": "sha512-MdjbdEGYQXvwlZm+QwNjIGmGRRxGAErn7OzDWHfmbA4o7+Sd50ow7uVGatXE7LZz4DMh/vC/feCFWySs5FBX+A==", + "dependencies": { + "@popperjs/core": "^2.6.0", + "lodash.isobject": "^3.0.2", + "lodash.tonumber": "^4.0.3" + }, + "peerDependencies": { + "svelte": "^3.4.4" + } + }, + "node_modules/terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tinydate": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", + "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.12.11", @@ -149,7 +1235,8 @@ "bootstrap": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.3.tgz", - "integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==" + "integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==", + "requires": {} }, "brace-expansion": { "version": "1.1.11", @@ -767,8 +1854,7 @@ "svelte": { "version": "3.31.2", "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.31.2.tgz", - "integrity": "sha512-TxZGrXzX2ggFH3BIKY5fmbeMdJuZrMIMDYPMX6R9255bueuYIuVaBQSLUeY2oD7W4IdeqRZiAVGCjDw2POKBRA==", - "dev": true + "integrity": "sha512-TxZGrXzX2ggFH3BIKY5fmbeMdJuZrMIMDYPMX6R9255bueuYIuVaBQSLUeY2oD7W4IdeqRZiAVGCjDw2POKBRA==" }, "sveltestrap": { "version": "3.11.0",