Sort:  

removed

removed

removed

{ "id": "ssc-testnet-hive", "json": { "contractName":"contract", "contractAction":"update", "contractPayload":{ "name":"comments", "params":"", "code":"LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IFsiZXJyb3IiLCB7ICJhbGxvdyI6IFsiX2lkIl0gfV0gKi8KLyogZ2xvYmFsIGFjdGlvbnMsIGFwaSAqLwoKY29uc3QgU01UX1BSRUNJU0lPTiA9IDEwOwpjb25zdCBNQVhfVk9USU5HX1BPV0VSID0gMTAwMDA7CmNvbnN0IE1BWF9XRUlHSFQgPSAxMDAwMDsKCmFjdGlvbnMuY3JlYXRlU1NDID0gYXN5bmMgKCkgPT4gewogIGNvbnN0IHRhYmxlRXhpc3RzID0gYXdhaXQgYXBpLmRiLnRhYmxlRXhpc3RzKCdyZXdhcmRQb29scycpOwogIGlmICh0YWJsZUV4aXN0cyA9PT0gZmFsc2UpIHsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgncGFyYW1zJyk7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3Jld2FyZFBvb2xzJywgWydjb25maWcudGFncycsICdsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcCddKTsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgncG9zdHMnLCBbCiAgICAgICdhdXRob3JwZXJtJywKICAgICAgeyBuYW1lOiAnYnlDYXNob3V0VGltZScsIGluZGV4OiB7IHJld2FyZFBvb2xJZDogMSwgY2FzaG91dFRpbWU6IDEgfSB9LAogICAgXSwgeyBwcmltYXJ5S2V5OiBbJ2F1dGhvcnBlcm0nLCAncmV3YXJkUG9vbElkJ10gfSk7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3ZvdGVzJywgW3sgbmFtZTogJ2J5VGltZXN0YW1wJywgaW5kZXg6IHsgcmV3YXJkUG9vbElkOiAxLCBhdXRob3JwZXJtOiAxLCB0aW1lc3RhbXA6IDEgfSB9XSwgeyBwcmltYXJ5S2V5OiBbJ3Jld2FyZFBvb2xJZCcsICdhdXRob3JwZXJtJywgJ3ZvdGVyJ10gfSk7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3ZvdGluZ1Bvd2VyJywgW10sIHsgcHJpbWFyeUtleTogWydyZXdhcmRQb29sSWQnLCAnYWNjb3VudCddIH0pOwoKICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgc2V0dXBGZWU6ICcxMDAwJywKICAgICAgdXBkYXRlRmVlOiAnMjAnLAogICAgICBtYXhQb29sc1BlclBvc3Q6IDIwLAogICAgICBtYXhUYWdzUGVyUG9vbDogNSwKICAgICAgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jazogMiwKICAgICAgbGFzdE1haW50ZW5hbmNlQmxvY2s6IGFwaS5ibG9ja051bWJlciwKICAgICAgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZDogMjAsCiAgICAgIHZvdGVRdWVyeUxpbWl0OiAxMDAsCiAgICAgIG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQ6IDEwMCwKICAgICAgbGFzdFByb2Nlc3NlZFBvb2xJZDogMCwKICAgIH07CiAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdwYXJhbXMnLCBwYXJhbXMpOwogIH0gZWxzZSB7CiAgICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwogICAgcGFyYW1zLm1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQgPSAxMDA7CiAgICBwYXJhbXMudm90ZVF1ZXJ5TGltaXQgPSAxMDA7CiAgICBwYXJhbXMubGFzdFByb2Nlc3NlZFBvb2xJZCA9IDA7CiAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwYXJhbXMnLCBwYXJhbXMpOwogIH0KfTsKCmFjdGlvbnMudXBkYXRlUGFyYW1zID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBpZiAoYXBpLnNlbmRlciAhPT0gYXBpLm93bmVyKSByZXR1cm47CgogIGNvbnN0IHsKICAgIHNldHVwRmVlLAogICAgdXBkYXRlRmVlLAogICAgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jaywKICAgIG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQsCiAgICBtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kLAogICAgdm90ZVF1ZXJ5TGltaXQsCiAgfSA9IHBheWxvYWQ7CgogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CgogIGlmIChzZXR1cEZlZSkgewogICAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiBzZXR1cEZlZSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIoc2V0dXBGZWUpLmlzTmFOKCkgJiYgYXBpLkJpZ051bWJlcihzZXR1cEZlZSkuZ3RlKDApLCAnaW52YWxpZCBzZXR1cEZlZScpKSByZXR1cm47CiAgICBwYXJhbXMuc2V0dXBGZWUgPSBzZXR1cEZlZTsKICB9CiAgaWYgKHVwZGF0ZUZlZSkgewogICAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiB1cGRhdGVGZWUgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKHVwZGF0ZUZlZSkuaXNOYU4oKSAmJiBhcGkuQmlnTnVtYmVyKHVwZGF0ZUZlZSkuZ3RlKDApLCAnaW52YWxpZCB1cGRhdGVGZWUnKSkgcmV0dXJuOwogICAgcGFyYW1zLnVwZGF0ZUZlZSA9IHVwZGF0ZUZlZTsKICB9CiAgaWYgKG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2spIHsKICAgIGlmICghYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2spICYmIG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2sgPj0gMSwgJ2ludmFsaWQgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jaycpKSByZXR1cm47CiAgICBwYXJhbXMubWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jayA9IG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2s7CiAgfQogIGlmIChtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kKSAmJiBtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kID49IDEsICdpbnZhbGlkIG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQnKSkgcmV0dXJuOwogICAgcGFyYW1zLm1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQgPSBtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kOwogIH0KICBpZiAobWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZCkgewogICAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZCkgJiYgbWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZCA+PSAxLCAnaW52YWxpZCBtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kJykpIHJldHVybjsKICAgIHBhcmFtcy5tYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kID0gbWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZDsKICB9CiAgaWYgKHZvdGVRdWVyeUxpbWl0KSB7CiAgICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcih2b3RlUXVlcnlMaW1pdCkgJiYgdm90ZVF1ZXJ5TGltaXQgPj0gMSwgJ2ludmFsaWQgdm90ZVF1ZXJ5TGltaXQnKSkgcmV0dXJuOwogICAgcGFyYW1zLnZvdGVRdWVyeUxpbWl0ID0gdm90ZVF1ZXJ5TGltaXQ7CiAgfQoKICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwYXJhbXMnLCBwYXJhbXMpOwp9OwoKZnVuY3Rpb24gY2FsY3VsYXRlV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLCB2b3RlUnNoYXJlU3VtKSB7CiAgaWYgKGFwaS5CaWdOdW1iZXIodm90ZVJzaGFyZVN1bSkubHRlKDApKSByZXR1cm4gYXBpLkJpZ051bWJlcigwKTsKICBpZiAocmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlID09PSAncG93ZXInKSB7CiAgICBjb25zdCBwb3N0UmV3YXJkRXhwb25lbnQgPSBhcGkuQmlnTnVtYmVyKHJld2FyZFBvb2wuY29uZmlnLnBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcik7CiAgICBpZiAocG9zdFJld2FyZEV4cG9uZW50LmVxKCcxJykgfHwgcG9zdFJld2FyZEV4cG9uZW50LmVxKCcyJykpIHsKICAgICAgcmV0dXJuIGFwaS5CaWdOdW1iZXIodm90ZVJzaGFyZVN1bSkucG93KHJld2FyZFBvb2wuY29uZmlnLnBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcikKICAgICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogICAgfQogICAgcmV0dXJuIGFwaS5CaWdOdW1iZXIocGFyc2VGbG9hdCh2b3RlUnNoYXJlU3VtKQogICAgICAgICoqIHBhcnNlRmxvYXQocmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyKSkKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICB9CiAgcmV0dXJuIGFwaS5CaWdOdW1iZXIodm90ZVJzaGFyZVN1bSk7Cn0KCmZ1bmN0aW9uIGNhbGN1bGF0ZUN1cmF0aW9uV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLCB2b3RlUnNoYXJlU3VtKSB7CiAgaWYgKGFwaS5CaWdOdW1iZXIodm90ZVJzaGFyZVN1bSkubHRlKDApKSByZXR1cm4gYXBpLkJpZ051bWJlcigwKTsKICBpZiAocmV3YXJkUG9vbC5jb25maWcuY3VyYXRpb25SZXdhcmRDdXJ2ZSA9PT0gJ3Bvd2VyJykgewogICAgY29uc3QgY3VyYXRpb25SZXdhcmRFeHBvbmVudCA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5jb25maWcuY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcik7CiAgICBpZiAoY3VyYXRpb25SZXdhcmRFeHBvbmVudC5lcSgnMC41JykpIHsKICAgICAgcmV0dXJuIGFwaS5CaWdOdW1iZXIodm90ZVJzaGFyZVN1bSkuc3FydCgpCiAgICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIH0gaWYgKGN1cmF0aW9uUmV3YXJkRXhwb25lbnQuZXEoJzEnKSkgewogICAgICByZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS50b0ZpeGVkKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICB9CiAgICByZXR1cm4gYXBpLkJpZ051bWJlcihwYXJzZUZsb2F0KHZvdGVSc2hhcmVTdW0pCiAgICAgICAgKiogcGFyc2VGbG9hdChyZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyKSkKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICB9CiAgcmV0dXJuIGFwaS5CaWdOdW1iZXIodm90ZVJzaGFyZVN1bSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIHBheVVzZXIoc3ltYm9sLCBxdWFudGl0eSwgdXNlciwgc3Rha2VkUmV3YXJkUGVyY2VudGFnZSkgewogIGNvbnN0IHF1YW50aXR5QmlnbnVtID0gYXBpLkJpZ051bWJlcihxdWFudGl0eSk7CiAgY29uc3Qgc3Rha2VkUXVhbnRpdHkgPSBxdWFudGl0eUJpZ251bS5tdWx0aXBsaWVkQnkoc3Rha2VkUmV3YXJkUGVyY2VudGFnZSkuZGl2aWRlZEJ5KDEwMCkKICAgIC50b0ZpeGVkKHF1YW50aXR5QmlnbnVtLmRwKCksIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgY29uc3QgbGlxdWlkUXVhbnRpdHkgPSBxdWFudGl0eUJpZ251bS5taW51cyhzdGFrZWRRdWFudGl0eSkKICAgIC50b0ZpeGVkKHF1YW50aXR5QmlnbnVtLmRwKCksIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgbGV0IHJlczsKICBpZiAoYXBpLkJpZ051bWJlcihsaXF1aWRRdWFudGl0eSkuZ3QoMCkpIHsKICAgIHJlcyA9IGF3YWl0IGFwaS50cmFuc2ZlclRva2Vucyh1c2VyLCBzeW1ib2wsIGxpcXVpZFF1YW50aXR5LCAndXNlcicpOwogICAgaWYgKHJlcy5lcnJvcnMpIHsKICAgICAgYXBpLmRlYnVnKGBFcnJvciBwYXlpbmcgb3V0IGxpcXVpZCAke2xpcXVpZFF1YW50aXR5fSAke3N5bWJvbH0gdG8KJHt1c2VyfSAoVFhJRCAke2FwaS50cmFuc2FjdGlvbklkfSk6IFxuJHtyZXMuZXJyb3JzfWApOwogICAgfQogIH0KICBpZiAoYXBpLkJpZ051bWJlcihzdGFrZWRRdWFudGl0eSkuZ3QoMCkpIHsKICAgIHJlcyA9IGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgJ3N0YWtlRnJvbUNvbnRyYWN0JywgeyB0bzogdXNlciwgc3ltYm9sLCBxdWFudGl0eTogc3Rha2VkUXVhbnRpdHkgfSk7CiAgICBpZiAocmVzLmVycm9ycykgewogICAgICBhcGkuZGVidWcoYEVycm9yIHBheWluZyBvdXQgc3Rha2VkICR7c3Rha2VkUXVhbnRpdHl9ICR7c3ltYm9sfSB0bwoke3VzZXJ9IChUWElEICR7YXBpLnRyYW5zYWN0aW9uSWR9KTogXG4ke3Jlcy5lcnJvcnN9YCk7CiAgICB9CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBwYXlPdXRCZW5lZmljaWFyaWVzKHJld2FyZFBvb2wsIHRva2VuLCBwb3N0LCBhdXRob3JCZW5lUG9ydGlvbikgewogIGNvbnN0IHsKICAgIGF1dGhvcnBlcm0sCiAgICBzeW1ib2wsCiAgICByZXdhcmRQb29sSWQsCiAgICBiZW5lZmljaWFyaWVzLAogIH0gPSBwb3N0OwogIGlmICghYmVuZWZpY2lhcmllcyB8fCBiZW5lZmljaWFyaWVzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIGFwaS5CaWdOdW1iZXIoMCk7CiAgfQogIGxldCB0b3RhbEJlbmVQYXkgPSBhcGkuQmlnTnVtYmVyKDApOwogIGZvciAobGV0IGkgPSAwOyBpIDwgYmVuZWZpY2lhcmllcy5sZW5ndGg7IGkgKz0gMSkgewogICAgY29uc3QgYmVuZWZpY2lhcnkgPSBiZW5lZmljaWFyaWVzW2ldOwogICAgY29uc3QgYmVuZVBheSA9IGFwaS5CaWdOdW1iZXIoYXV0aG9yQmVuZVBvcnRpb24pLm11bHRpcGxpZWRCeShiZW5lZmljaWFyeS53ZWlnaHQpCiAgICAgIC5kaXZpZGVkQnkoMTAwMDApCiAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIGFwaS5lbWl0KCdiZW5lZmljaWFyeVJld2FyZCcsIHsKICAgICAgcmV3YXJkUG9vbElkLCBhdXRob3JwZXJtLCBzeW1ib2wsIGFjY291bnQ6IGJlbmVmaWNpYXJ5LmFjY291bnQsIHF1YW50aXR5OiBiZW5lUGF5LAogICAgfSk7CiAgICBhd2FpdCBwYXlVc2VyKHN5bWJvbCwgYmVuZVBheSwgYmVuZWZpY2lhcnkuYWNjb3VudCwgcmV3YXJkUG9vbC5jb25maWcuc3Rha2VkUmV3YXJkUGVyY2VudGFnZSk7CiAgICB0b3RhbEJlbmVQYXkgPSBhcGkuQmlnTnVtYmVyKHRvdGFsQmVuZVBheSkucGx1cyhiZW5lUGF5KTsKICB9CiAgcmV0dXJuIHRvdGFsQmVuZVBheTsKfQoKYXN5bmMgZnVuY3Rpb24gcGF5T3V0Q3VyYXRvcnMocmV3YXJkUG9vbCwgdG9rZW4sIHBvc3QsIGN1cmF0b3JQb3J0aW9uLCBwYXJhbXMpIHsKICBjb25zdCB7CiAgICBhdXRob3JwZXJtLAogICAgc3ltYm9sLAogICAgcmV3YXJkUG9vbElkLAogIH0gPSBwb3N0OwogIGNvbnN0IHsKICAgIHZvdGVRdWVyeUxpbWl0LAogIH0gPSBwYXJhbXM7CiAgY29uc3QgcmVzcG9uc2UgPSB7CiAgICBkb25lOiBmYWxzZSwKICAgIHZvdGVzUHJvY2Vzc2VkOiAwLAogIH07CiAgY29uc3Qgdm90ZXNUb1BheW91dCA9IGF3YWl0IGFwaS5kYi5maW5kKCd2b3RlcycsIHsgcmV3YXJkUG9vbElkLCBhdXRob3JwZXJtIH0sIHZvdGVRdWVyeUxpbWl0LCAwLCBbeyBpbmRleDogJ2J5VGltZXN0YW1wJywgZGVzY2VuZGluZzogZmFsc2UgfV0pOwogIGlmICh2b3Rlc1RvUGF5b3V0Lmxlbmd0aCA9PT0gMCkgewogICAgcmVzcG9uc2UuZG9uZSA9IHRydWU7CiAgfSBlbHNlIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdm90ZXNUb1BheW91dC5sZW5ndGg7IGkgKz0gMSkgewogICAgICBjb25zdCB2b3RlID0gdm90ZXNUb1BheW91dFtpXTsKICAgICAgaWYgKGFwaS5CaWdOdW1iZXIodm90ZS5jdXJhdGlvbldlaWdodCkgPiAwKSB7CiAgICAgICAgY29uc3QgdG90YWxDdXJhdGlvbldlaWdodCA9IGNhbGN1bGF0ZUN1cmF0aW9uV2VpZ2h0UnNoYXJlcygKICAgICAgICAgIHJld2FyZFBvb2wsIHBvc3Qudm90ZVBvc2l0aXZlUnNoYXJlU3VtLAogICAgICAgICk7CiAgICAgICAgY29uc3Qgdm90ZVBheSA9IGFwaS5CaWdOdW1iZXIoY3VyYXRvclBvcnRpb24pLm11bHRpcGxpZWRCeSh2b3RlLmN1cmF0aW9uV2VpZ2h0KQogICAgICAgICAgLmRpdmlkZWRCeSh0b3RhbEN1cmF0aW9uV2VpZ2h0KQogICAgICAgICAgLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogICAgICAgIGFwaS5lbWl0KCdjdXJhdGlvblJld2FyZCcsIHsKICAgICAgICAgIHJld2FyZFBvb2xJZCwgYXV0aG9ycGVybSwgc3ltYm9sLCBhY2NvdW50OiB2b3RlLnZvdGVyLCBxdWFudGl0eTogdm90ZVBheSwKICAgICAgICB9KTsKICAgICAgICBhd2FpdCBwYXlVc2VyKHN5bWJvbCwgdm90ZVBheSwgdm90ZS52b3RlciwgcmV3YXJkUG9vbC5jb25maWcuc3Rha2VkUmV3YXJkUGVyY2VudGFnZSk7CiAgICAgIH0KICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgndm90ZXMnLCB2b3RlKTsKICAgIH0KICAgIHJlc3BvbnNlLnZvdGVzUHJvY2Vzc2VkICs9IHZvdGVzVG9QYXlvdXQubGVuZ3RoOwogICAgaWYgKHZvdGVzVG9QYXlvdXQubGVuZ3RoIDwgdm90ZVF1ZXJ5TGltaXQpIHsKICAgICAgcmVzcG9uc2UuZG9uZSA9IHRydWU7CiAgICB9CiAgfQogIHJldHVybiByZXNwb25zZTsKfQoKYXN5bmMgZnVuY3Rpb24gcGF5T3V0UG9zdChyZXdhcmRQb29sLCB0b2tlbiwgcG9zdCwgcGFyYW1zKSB7CiAgY29uc3QgcmVzcG9uc2UgPSB7CiAgICB0b3RhbFBheW91dFZhbHVlOiAwLAogICAgdm90ZXNQcm9jZXNzZWQ6IDAsCiAgICBkb25lOiBmYWxzZSwKICB9OwogIGlmIChwb3N0LmRlY2xpbmVQYXlvdXQpIHsKICAgIGFwaS5lbWl0KCdhdXRob3JSZXdhcmQnLCB7CiAgICAgIHJld2FyZFBvb2xJZDogcG9zdC5yZXdhcmRQb29sSWQsCiAgICAgIGF1dGhvcnBlcm06IHBvc3QuYXV0aG9ycGVybSwKICAgICAgc3ltYm9sOiBwb3N0LnN5bWJvbCwKICAgICAgYWNjb3VudDogcG9zdC5hdXRob3IsCiAgICAgIHF1YW50aXR5OiAnMCcsCiAgICB9KTsKICAgIHJlc3BvbnNlLmRvbmUgPSB0cnVlOwogICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgncG9zdHMnLCBwb3N0KTsKICAgIHJldHVybiByZXNwb25zZTsKICB9CiAgY29uc3QgcG9zdENsYWltcyA9IGNhbGN1bGF0ZVdlaWdodFJzaGFyZXMocmV3YXJkUG9vbCwgcG9zdC52b3RlUnNoYXJlU3VtKTsKICBjb25zdCBwb3N0UGVuZGluZ1Rva2VuID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLmludGVydmFsUGVuZGluZ0NsYWltcykuZ3QoMCkKICAgID8gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLmludGVydmFsUmV3YXJkUG9vbCkubXVsdGlwbGllZEJ5KHBvc3RDbGFpbXMpCiAgICAgIC5kaXZpZGVkQnkocmV3YXJkUG9vbC5pbnRlcnZhbFBlbmRpbmdDbGFpbXMpCiAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKQogICAgOiAnMCc7CiAgcmVzcG9uc2UudG90YWxQYXlvdXRWYWx1ZSA9IHBvc3RQZW5kaW5nVG9rZW47CgogIGNvbnN0IGN1cmF0b3JQb3J0aW9uID0gYXBpLkJpZ051bWJlcihwb3N0UGVuZGluZ1Rva2VuKQogICAgLm11bHRpcGxpZWRCeShyZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UpCiAgICAuZGl2aWRlZEJ5KDEwMCkKICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICBjb25zdCBhdXRob3JCZW5lUG9ydGlvbiA9IGFwaS5CaWdOdW1iZXIocG9zdFBlbmRpbmdUb2tlbikubWludXMoY3VyYXRvclBvcnRpb24pCiAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CgogIGNvbnN0IGJlbmVmaWNpYXJpZXNQYXlvdXRWYWx1ZSA9IGF3YWl0IHBheU91dEJlbmVmaWNpYXJpZXMoCiAgICByZXdhcmRQb29sLCB0b2tlbiwgcG9zdCwgYXV0aG9yQmVuZVBvcnRpb24sCiAgKTsKICBjb25zdCBhdXRob3JQb3J0aW9uID0gYXBpLkJpZ051bWJlcihhdXRob3JCZW5lUG9ydGlvbikubWludXMoYmVuZWZpY2lhcmllc1BheW91dFZhbHVlKQogICAgLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwoKICBjb25zdCBjdXJhdG9yUGF5U3RhdHVzID0gYXdhaXQgcGF5T3V0Q3VyYXRvcnMocmV3YXJkUG9vbCwgdG9rZW4sIHBvc3QsIGN1cmF0b3JQb3J0aW9uLCBwYXJhbXMpOwogIHJlc3BvbnNlLnZvdGVzUHJvY2Vzc2VkICs9IGN1cmF0b3JQYXlTdGF0dXMudm90ZXNQcm9jZXNzZWQ7CiAgcmVzcG9uc2UuZG9uZSA9IGN1cmF0b3JQYXlTdGF0dXMuZG9uZTsKICBpZiAoY3VyYXRvclBheVN0YXR1cy5kb25lKSB7CiAgICBhcGkuZW1pdCgnYXV0aG9yUmV3YXJkJywgewogICAgICByZXdhcmRQb29sSWQ6IHBvc3QucmV3YXJkUG9vbElkLAogICAgICBhdXRob3JwZXJtOiBwb3N0LmF1dGhvcnBlcm0sCiAgICAgIHN5bWJvbDogcG9zdC5zeW1ib2wsCiAgICAgIGFjY291bnQ6IHBvc3QuYXV0aG9yLAogICAgICBxdWFudGl0eTogYXV0aG9yUG9ydGlvbiwKICAgIH0pOwogICAgYXdhaXQgcGF5VXNlcihwb3N0LnN5bWJvbCwgYXV0aG9yUG9ydGlvbiwgcG9zdC5hdXRob3IsCiAgICAgIHJld2FyZFBvb2wuY29uZmlnLnN0YWtlZFJld2FyZFBlcmNlbnRhZ2UpOwogICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgncG9zdHMnLCBwb3N0KTsKICB9CiAgcmV0dXJuIHJlc3BvbnNlOwp9Cgphc3luYyBmdW5jdGlvbiBjb21wdXRlUG9zdFJld2FyZHMocGFyYW1zLCByZXdhcmRQb29sLCB0b2tlbiwgZW5kVGltZXN0YW1wKSB7CiAgY29uc3QgewogICAgbGFzdENsYWltRGVjYXlUaW1lc3RhbXAsCiAgfSA9IHJld2FyZFBvb2w7CiAgY29uc3QgewogICAgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCwKICAgIG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQsCiAgfSA9IHBhcmFtczsKCiAgY29uc3QgcG9zdHNUb1BheW91dCA9IGF3YWl0IGFwaS5kYi5maW5kKCdwb3N0cycsCiAgICB7CiAgICAgIHJld2FyZFBvb2xJZDogcmV3YXJkUG9vbC5faWQsCiAgICAgIGNhc2hvdXRUaW1lOiB7ICRndGU6IGxhc3RDbGFpbURlY2F5VGltZXN0YW1wLCAkbHRlOiBlbmRUaW1lc3RhbXAgfSwKICAgIH0sCiAgICBtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kLAogICAgMCwKICAgIFt7IGluZGV4OiAnYnlDYXNob3V0VGltZScsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICBsZXQgZG9uZSA9IGZhbHNlOwogIGxldCBkZWR1Y3RGcm9tUmV3YXJkUG9vbCA9IGFwaS5CaWdOdW1iZXIoMCk7CiAgbGV0IHZvdGVzUHJvY2Vzc2VkID0gMDsKICBpZiAocG9zdHNUb1BheW91dCAmJiBwb3N0c1RvUGF5b3V0Lmxlbmd0aCA+IDApIHsKICAgIGxldCBsaW1pdFJlYWNoZWQgPSBmYWxzZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zdHNUb1BheW91dC5sZW5ndGg7IGkgKz0gMSkgewogICAgICBjb25zdCBwb3N0ID0gcG9zdHNUb1BheW91dFtpXTsKICAgICAgY29uc3QgcG9zdFBheW91dFJlc3BvbnNlID0gYXdhaXQgcGF5T3V0UG9zdChyZXdhcmRQb29sLCB0b2tlbiwgcG9zdCwgcGFyYW1zKTsKICAgICAgY29uc3QgeyB0b3RhbFBheW91dFZhbHVlIH0gPSBwb3N0UGF5b3V0UmVzcG9uc2U7CiAgICAgIHZvdGVzUHJvY2Vzc2VkICs9IHBvc3RQYXlvdXRSZXNwb25zZS52b3Rlc1Byb2Nlc3NlZDsKICAgICAgaWYgKHBvc3RQYXlvdXRSZXNwb25zZS5kb25lKSB7CiAgICAgICAgZGVkdWN0RnJvbVJld2FyZFBvb2wgPSBkZWR1Y3RGcm9tUmV3YXJkUG9vbC5wbHVzKHRvdGFsUGF5b3V0VmFsdWUpOwogICAgICB9CiAgICAgIGlmICghcG9zdFBheW91dFJlc3BvbnNlLmRvbmUgfHwgdm90ZXNQcm9jZXNzZWQgPj0gbWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZCkgewogICAgICAgIGxpbWl0UmVhY2hlZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghbGltaXRSZWFjaGVkICYmIHBvc3RzVG9QYXlvdXQubGVuZ3RoIDwgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCkgewogICAgICBkb25lID0gdHJ1ZTsKICAgIH0KICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnbgogICAgcmV3YXJkUG9vbC5yZXdhcmRQb29sID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLnJld2FyZFBvb2wpCiAgICAgIC5taW51cyhkZWR1Y3RGcm9tUmV3YXJkUG9vbCkKICAgICAgLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIH0gZWxzZSB7CiAgICBkb25lID0gdHJ1ZTsKICB9CiAgaWYgKGRvbmUpIHsKICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnbgogICAgcmV3YXJkUG9vbC5sYXN0Q2xhaW1EZWNheVRpbWVzdGFtcCA9IGVuZFRpbWVzdGFtcDsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIHBvc3RDbGFpbXNJbkludGVydmFsKHBhcmFtcywgcmV3YXJkUG9vbCwgc3RhcnQsIGVuZCkgewogIGNvbnN0IHsKICAgIG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQsCiAgfSA9IHBhcmFtczsKICBsZXQgcG9zdE9mZnNldCA9IDA7CiAgbGV0IG5ld1BlbmRpbmdDbGFpbXMgPSBhcGkuQmlnTnVtYmVyKDApOwogIGxldCBwb3N0c1RvUGF5b3V0ID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Bvc3RzJywKICAgIHsKICAgICAgcmV3YXJkUG9vbElkOiByZXdhcmRQb29sLl9pZCwKICAgICAgY2FzaG91dFRpbWU6IHsgJGd0ZTogc3RhcnQsICRsdGU6IGVuZCB9LAogICAgfSwKICAgIG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQsCiAgICBwb3N0T2Zmc2V0LAogICAgW3sgaW5kZXg6ICdieUNhc2hvdXRUaW1lJywgZGVzY2VuZGluZzogZmFsc2UgfV0pOwogIHdoaWxlIChwb3N0c1RvUGF5b3V0ICYmIHBvc3RzVG9QYXlvdXQubGVuZ3RoID4gMCkgewogICAgbmV3UGVuZGluZ0NsYWltcyA9IG5ld1BlbmRpbmdDbGFpbXMucGx1cygKICAgICAgcG9zdHNUb1BheW91dC5yZWR1Y2UoKHgsIHkpID0+IHgucGx1cyhjYWxjdWxhdGVXZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHkudm90ZVJzaGFyZVN1bSkpLAogICAgICAgIGFwaS5CaWdOdW1iZXIoMCkpLAogICAgKQogICAgICAuZHAoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIGlmIChwb3N0c1RvUGF5b3V0Lmxlbmd0aCA8IG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBwb3N0T2Zmc2V0ICs9IG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQ7CiAgICBwb3N0c1RvUGF5b3V0ID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Bvc3RzJywKICAgICAgewogICAgICAgIHJld2FyZFBvb2xJZDogcmV3YXJkUG9vbC5faWQsCiAgICAgICAgY2FzaG91dFRpbWU6IHsgJGd0ZTogc3RhcnQsICRsdGU6IGVuZCB9LAogICAgICB9LAogICAgICBtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kLAogICAgICBwb3N0T2Zmc2V0LAogICAgICBbeyBpbmRleDogJ2J5Q2FzaG91dFRpbWUnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgfQogIHJldHVybiBuZXdQZW5kaW5nQ2xhaW1zOwp9Cgphc3luYyBmdW5jdGlvbiB0b2tlbk1haW50ZW5hbmNlKCkgewogIGNvbnN0IGJsb2NrRGF0ZSA9IG5ldyBEYXRlKGAke2FwaS5oaXZlQmxvY2tUaW1lc3RhbXB9LjAwMFpgKTsKICBjb25zdCB0aW1lc3RhbXAgPSBibG9ja0RhdGUuZ2V0VGltZSgpOwogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyBsYXN0TWFpbnRlbmFuY2VCbG9jaywgbGFzdFByb2Nlc3NlZFBvb2xJZCwgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jayB9ID0gcGFyYW1zOwogIGlmIChsYXN0TWFpbnRlbmFuY2VCbG9jayA+PSBhcGkuYmxvY2tOdW1iZXIpIHsKICAgIHJldHVybjsKICB9CiAgcGFyYW1zLmxhc3RNYWludGVuYW5jZUJsb2NrID0gYXBpLmJsb2NrTnVtYmVyOwoKICAvLyBDaGVja3MgaWYgcmVhZHkgdG8gcHJvY2VzcyBuZXh0IHJld2FyZCBpbnRlcnZhbAogIGNvbnN0IHJld2FyZFBvb2xQcm9jZXNzaW5nRXhwcmVzc2lvbiA9IHsKICAgICRsdGU6IFsKICAgICAgJyRsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcCcsCiAgICAgIHsKICAgICAgICAkc3VidHJhY3Q6IFsKICAgICAgICAgIHRpbWVzdGFtcCwKICAgICAgICAgIHsKICAgICAgICAgICAgJG11bHRpcGx5OiBbCiAgICAgICAgICAgICAgJyRjb25maWcucmV3YXJkSW50ZXJ2YWxTZWNvbmRzJywKICAgICAgICAgICAgICAxMDAwLAogICAgICAgICAgICBdLAogICAgICAgICAgfSwKICAgICAgICBdLAogICAgICB9LAogICAgXSwKICB9OwogIGxldCByZXdhcmRQb29scyA9IGF3YWl0IGFwaS5kYi5maW5kKCdyZXdhcmRQb29scycsIHsKICAgIGFjdGl2ZTogdHJ1ZSwKICAgICRleHByOiByZXdhcmRQb29sUHJvY2Vzc2luZ0V4cHJlc3Npb24sCiAgICBfaWQ6IHsgJGd0OiBsYXN0UHJvY2Vzc2VkUG9vbElkIH0sCiAgfSwgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jaywgMCwgW3sgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgaWYgKCFyZXdhcmRQb29scyB8fCByZXdhcmRQb29scy5sZW5ndGggPCBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrKSB7CiAgICBpZiAoIXJld2FyZFBvb2xzKSB7CiAgICAgIHJld2FyZFBvb2xzID0gW107CiAgICB9CiAgICAvLyBhdWdtZW50IGZyb20gYmVnaW5uaW5nCiAgICBjb25zdCBtb3JlUmV3YXJkUG9vbHMgPSBhd2FpdCBhcGkuZGIuZmluZCgncmV3YXJkUG9vbHMnLCB7CiAgICAgIGFjdGl2ZTogdHJ1ZSwKICAgICAgJGV4cHI6IHJld2FyZFBvb2xQcm9jZXNzaW5nRXhwcmVzc2lvbiwKICAgIH0sIG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2sgLSByZXdhcmRQb29scy5sZW5ndGgsIDAsIFt7IGluZGV4OiAnX2lkJywgZGVzY2VuZGluZzogZmFsc2UgfV0pOwogICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHJld2FyZFBvb2xzLm1hcChwID0+IHAuX2lkKSk7CiAgICBtb3JlUmV3YXJkUG9vbHMuZm9yRWFjaCgobXJwKSA9PiB7CiAgICAgIGlmICghZXhpc3RpbmdJZHMuaGFzKG1ycC5faWQpKSB7CiAgICAgICAgcmV3YXJkUG9vbHMucHVzaChtcnApOwogICAgICB9CiAgICB9KTsKICB9CiAgaWYgKHJld2FyZFBvb2xzKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJld2FyZFBvb2xzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgIGNvbnN0IHJld2FyZFBvb2wgPSByZXdhcmRQb29sc1tpXTsKICAgICAgcGFyYW1zLmxhc3RQcm9jZXNzZWRQb29sSWQgPSByZXdhcmRQb29sLl9pZDsKICAgICAgY29uc3QgewogICAgICAgIGxhc3RDbGFpbURlY2F5VGltZXN0YW1wLAogICAgICAgIGxhc3RSZXdhcmRUaW1lc3RhbXAsCiAgICAgICAgY29uZmlnLAogICAgICB9ID0gcmV3YXJkUG9vbDsKICAgICAgY29uc3QgewogICAgICAgIHN5bWJvbCwKICAgICAgICByZXdhcmRJbnRlcnZhbFNlY29uZHMsCiAgICAgICAgcmV3YXJkUGVySW50ZXJ2YWwsCiAgICAgICAgY2FzaG91dFdpbmRvd0RheXMsCiAgICAgIH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2wgfSk7CiAgICAgIGNvbnN0IHJld2FyZEludGVydmFsRHVyYXRpb25NaWxsaXMgPSByZXdhcmRJbnRlcnZhbFNlY29uZHMgKiAxMDAwOwogICAgICBjb25zdCBuZXh0UmV3YXJkVGltZXN0YW1wID0gbGFzdFJld2FyZFRpbWVzdGFtcCArIHJld2FyZEludGVydmFsRHVyYXRpb25NaWxsaXM7CiAgICAgIGNvbnN0IG5leHRDbGFpbURlY2F5VGltZXN0YW1wID0gbGFzdENsYWltRGVjYXlUaW1lc3RhbXAgKyByZXdhcmRJbnRlcnZhbER1cmF0aW9uTWlsbGlzOwogICAgICBpZiAobmV4dENsYWltRGVjYXlUaW1lc3RhbXAgPj0gbmV4dFJld2FyZFRpbWVzdGFtcCkgewogICAgICAgIGNvbnN0IHJld2FyZFRvQWRkID0gYXBpLkJpZ051bWJlcihyZXdhcmRQZXJJbnRlcnZhbCk7CiAgICAgICAgaWYgKGFwaS5CaWdOdW1iZXIocmV3YXJkVG9BZGQpLmd0KDApKSB7CiAgICAgICAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICdpc3N1ZVRvQ29udHJhY3QnLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgc3ltYm9sOiByZXdhcmRQb29sLnN5bWJvbCwgcXVhbnRpdHk6IHJld2FyZFRvQWRkLCB0bzogJ2NvbW1lbnRzJywgaXNTaWduZWRXaXRoQWN0aXZlS2V5OiB0cnVlLAogICAgICAgICAgICB9KTsKICAgICAgICAgIHJld2FyZFBvb2wucmV3YXJkUG9vbCA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5yZXdhcmRQb29sKS5wbHVzKHJld2FyZFRvQWRkKQogICAgICAgICAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICAgICAgfQogICAgICAgIC8vIGNsYWltIGFkanVzdG1lbnRzIChkZWNheSArIHBvc3RzIHRvIHBheSBvdXQgaW4gbmV4dCBpbnRlcnZhbCkKICAgICAgICBjb25zdCBjbGFpbXNEZWNheVBlcmlvZERheXMgPSBjYXNob3V0V2luZG93RGF5cyAqIDIgKyAxOwogICAgICAgIGNvbnN0IGFkanVzdE51bWVyID0gbmV4dFJld2FyZFRpbWVzdGFtcCAtIGxhc3RSZXdhcmRUaW1lc3RhbXA7CiAgICAgICAgY29uc3QgYWRqdXN0RGVub20gPSBjbGFpbXNEZWNheVBlcmlvZERheXMgKiAyNCAqIDM2MDAgKiAxMDAwOwogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnbgogICAgICAgIHJld2FyZFBvb2wucGVuZGluZ0NsYWltcyA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zKQogICAgICAgICAgLm1pbnVzKGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zKQogICAgICAgICAgICAubXVsdGlwbGllZEJ5KGFkanVzdE51bWVyKQogICAgICAgICAgICAuZGl2aWRlZEJ5KGFkanVzdERlbm9tKSkKICAgICAgICAgIC50b0ZpeGVkKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICAgICAgLy8gQWRkIHBvc3RzIGNsYWltcywgY29tcHV0ZSBzdWJzZXF1ZW50IHJld2FyZHMgYmFzZWQgb24gaW5jbHVzaW9uIGludG8gY2xhaW1zIHRvCiAgICAgICAgLy8gZW5zdXJlIGl0IGNhbm5vdCB0YWtlIG1vcmUgb2YgdGhlIGN1cnJlbnQgcG9vbAogICAgICAgIHJld2FyZFBvb2wucGVuZGluZ0NsYWltcyA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zKQogICAgICAgICAgLnBsdXMoCiAgICAgICAgICAgIGF3YWl0IHBvc3RDbGFpbXNJbkludGVydmFsKAogICAgICAgICAgICAgIHBhcmFtcywgcmV3YXJkUG9vbCwgbGFzdFJld2FyZFRpbWVzdGFtcCwgbmV4dFJld2FyZFRpbWVzdGFtcCwKICAgICAgICAgICAgKSwKICAgICAgICAgICkKICAgICAgICAgIC50b0ZpeGVkKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CgogICAgICAgIHJld2FyZFBvb2wubGFzdFJld2FyZFRpbWVzdGFtcCA9IG5leHRSZXdhcmRUaW1lc3RhbXA7CiAgICAgICAgLy8gY29weSBjbGFpbXMgYW5kIHJld2FyZHMgZm9yIGN1cnJlbnQgcmV3YXJkIGludGVydmFsCiAgICAgICAgcmV3YXJkUG9vbC5pbnRlcnZhbFBlbmRpbmdDbGFpbXMgPSByZXdhcmRQb29sLnBlbmRpbmdDbGFpbXM7CiAgICAgICAgcmV3YXJkUG9vbC5pbnRlcnZhbFJld2FyZFBvb2wgPSByZXdhcmRQb29sLnJld2FyZFBvb2w7CiAgICAgIH0KICAgICAgLy8gQ29tcHV0ZSBwb3N0IHJld2FyZHMKICAgICAgYXdhaXQgY29tcHV0ZVBvc3RSZXdhcmRzKHBhcmFtcywgcmV3YXJkUG9vbCwgdG9rZW4sIG5leHRDbGFpbURlY2F5VGltZXN0YW1wKTsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncmV3YXJkUG9vbHMnLCByZXdhcmRQb29sKTsKICAgIH0KICB9CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGFyYW1zJywgcGFyYW1zKTsKfQoKYWN0aW9ucy5jcmVhdGVSZXdhcmRQb29sID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBzeW1ib2wsCiAgICBjb25maWcsCiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CiAgYXdhaXQgdG9rZW5NYWludGVuYW5jZSgpOwogIGlmICghYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICdvcGVyYXRpb24gbXVzdCBiZSBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKSkgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBjb25zdCB7IHNldHVwRmVlLCBtYXhUYWdzUGVyUG9vbCB9ID0gcGFyYW1zOwoKICAvLyBnZXQgYXBpLnNlbmRlcidzIFVUSUxJVFlfVE9LRU5fU1lNQk9MIGJhbGFuY2UKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCiAgY29uc3QgdXRpbGl0eVRva2VuQmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgndG9rZW5zJywgJ2JhbGFuY2VzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyLCBzeW1ib2w6ICJCRUUiIH0pOwoKICBjb25zdCBhdXRob3JpemVkQ3JlYXRpb24gPSBhcGkuQmlnTnVtYmVyKHNldHVwRmVlKS5sdGUoMCkgfHwgYXBpLnNlbmRlciA9PT0gYXBpLm93bmVyCiAgICA/IHRydWUKICAgIDogdXRpbGl0eVRva2VuQmFsYW5jZSAmJiBhcGkuQmlnTnVtYmVyKHV0aWxpdHlUb2tlbkJhbGFuY2UuYmFsYW5jZSkuZ3RlKHNldHVwRmVlKTsKCiAgaWYgKCFhcGkuYXNzZXJ0KGF1dGhvcml6ZWRDcmVhdGlvbiwgJ3lvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciB0aGUgY3JlYXRpb24gZmVlJykpIHJldHVybjsKCgogIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2wgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KHRva2VuLCAndG9rZW4gbm90IGZvdW5kJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoY29uZmlnICYmIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnLCAnY29uZmlnIGludmFsaWQnKSkgcmV0dXJuOwoKICBjb25zdCB7CiAgICBwb3N0UmV3YXJkQ3VydmUsCiAgICBwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIsCiAgICBjdXJhdGlvblJld2FyZEN1cnZlLAogICAgY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlciwKICAgIGN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSwKICAgIGNhc2hvdXRXaW5kb3dEYXlzLAogICAgcmV3YXJkUGVySW50ZXJ2YWwsCiAgICByZXdhcmRJbnRlcnZhbFNlY29uZHMsCiAgICB2b3RlUmVnZW5lcmF0aW9uRGF5cywKICAgIGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cywKICAgIHN0YWtlZFJld2FyZFBlcmNlbnRhZ2UsCiAgICB2b3RlUG93ZXJDb25zdW1wdGlvbiwKICAgIGRvd252b3RlUG93ZXJDb25zdW1wdGlvbiwKICAgIHRhZ3MsCiAgfSA9IGNvbmZpZzsKCiAgaWYgKCFhcGkuYXNzZXJ0KHBvc3RSZXdhcmRDdXJ2ZSAmJiBwb3N0UmV3YXJkQ3VydmUgPT09ICdwb3dlcicsICdwb3N0UmV3YXJkQ3VydmUgc2hvdWxkIGJlIG9uZSBvZjogW3Bvd2VyXScpKSByZXR1cm47CiAgY29uc3QgcG9zdEV4cG9uZW50ID0gYXBpLkJpZ051bWJlcihwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIpOwogIGlmICghYXBpLmFzc2VydCh0eXBlb2YgcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyID09PSAnc3RyaW5nJyAmJiBwb3N0RXhwb25lbnQuaXNGaW5pdGUoKSAmJiBwb3N0RXhwb25lbnQuZ3RlKCcxJykgJiYgcG9zdEV4cG9uZW50Lmx0ZSgnMicpICYmIHBvc3RFeHBvbmVudC5kcCgpIDw9IDIsICdwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIgc2hvdWxkIGJlIGJldHdlZW4gIjEiIGFuZCAiMiIgd2l0aCBwcmVjaXNpb24gYXQgbW9zdCAyJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KGN1cmF0aW9uUmV3YXJkQ3VydmUgJiYgY3VyYXRpb25SZXdhcmRDdXJ2ZSA9PT0gJ3Bvd2VyJywgJ2N1cmF0aW9uUmV3YXJkQ3VydmUgc2hvdWxkIGJlIG9uZSBvZjogW3Bvd2VyXScpKSByZXR1cm47CiAgY29uc3QgY3VyYXRpb25FeHBvbmVudCA9IGFwaS5CaWdOdW1iZXIoY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcik7CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiBjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyID09PSAnc3RyaW5nJyAmJiBjdXJhdGlvbkV4cG9uZW50LmlzRmluaXRlKCkgJiYgY3VyYXRpb25FeHBvbmVudC5ndGUoJzAuNScpICYmIGN1cmF0aW9uRXhwb25lbnQubHRlKCcxJykgJiYgY3VyYXRpb25FeHBvbmVudC5kcCgpIDw9IDIsICdjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyIGNhbiBvbmx5IGJlIGJldHdlZW4gIjAuNSIgYW5kICIxIiB3aXRoIHByZWNpc2lvbiBhdCBtb3N0IDInKSkgcmV0dXJuOwoKICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UpICYmIGN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSA+PSAwICYmIGN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSA8PSAxMDAsICdjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2Ugc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDAnKSkgcmV0dXJuOwoKICBpZiAoIWFwaS5hc3NlcnQoY2FzaG91dFdpbmRvd0RheXMgJiYgTnVtYmVyLmlzSW50ZWdlcihjYXNob3V0V2luZG93RGF5cykgJiYgY2FzaG91dFdpbmRvd0RheXMgPj0gMSAmJiBjYXNob3V0V2luZG93RGF5cyA8PSAzMCwgJ2Nhc2hvdXRXaW5kb3dEYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAnKSkgcmV0dXJuOwoKICBjb25zdCBwYXJzZWRSZXdhcmRQZXJJbnRlcnZhbCA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUGVySW50ZXJ2YWwpOwogIGlmICghYXBpLmFzc2VydCh0eXBlb2YgcmV3YXJkUGVySW50ZXJ2YWwgPT09ICdzdHJpbmcnICYmIHBhcnNlZFJld2FyZFBlckludGVydmFsLmlzRmluaXRlKCkgJiYgcGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwuZ3QoMCksICdyZXdhcmRQZXJJbnRlcnZhbCBpbnZhbGlkJykKICAgICAgICB8fCAhYXBpLmFzc2VydChwYXJzZWRSZXdhcmRQZXJJbnRlcnZhbC5kcCgpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3Rva2VuIHByZWNpc2lvbiBtaXNtYXRjaCBmb3IgcmV3YXJkUGVySW50ZXJ2YWwnKSkgcmV0dXJuOwoKICBpZiAoIWFwaS5hc3NlcnQocmV3YXJkSW50ZXJ2YWxTZWNvbmRzICYmIE51bWJlci5pc0ludGVnZXIocmV3YXJkSW50ZXJ2YWxTZWNvbmRzKSAmJiByZXdhcmRJbnRlcnZhbFNlY29uZHMgPj0gMyAmJiByZXdhcmRJbnRlcnZhbFNlY29uZHMgPD0gODY0MDAgJiYgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzICUgMyA9PT0gMCwgJ3Jld2FyZEludGVydmFsU2Vjb25kcyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDMgYW5kIDg2NDAwLCBhbmQgZGl2aXNpYmxlIGJ5IDMnKSkgcmV0dXJuOwoKICBpZiAoIWFwaS5hc3NlcnQodm90ZVJlZ2VuZXJhdGlvbkRheXMgJiYgTnVtYmVyLmlzSW50ZWdlcih2b3RlUmVnZW5lcmF0aW9uRGF5cykgJiYgdm90ZVJlZ2VuZXJhdGlvbkRheXMgPj0gMSAmJiB2b3RlUmVnZW5lcmF0aW9uRGF5cyA8PSAzMCwgJ3ZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAnKSkgcmV0dXJuOwogIGlmICghYXBpLmFzc2VydChkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMgJiYgTnVtYmVyLmlzSW50ZWdlcihkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMpICYmIGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyA+PSAxICYmIGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyA8PSAzMCwgJ2Rvd252b3RlUmVnZW5lcmF0aW9uRGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihzdGFrZWRSZXdhcmRQZXJjZW50YWdlKSAmJiBzdGFrZWRSZXdhcmRQZXJjZW50YWdlID49IDAgJiYgc3Rha2VkUmV3YXJkUGVyY2VudGFnZSA8PSAxMDAsICdzdGFrZWRSZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQodm90ZVBvd2VyQ29uc3VtcHRpb24gJiYgTnVtYmVyLmlzSW50ZWdlcih2b3RlUG93ZXJDb25zdW1wdGlvbikgJiYgdm90ZVBvd2VyQ29uc3VtcHRpb24gPj0gMSAmJiB2b3RlUG93ZXJDb25zdW1wdGlvbiA8PSAxMDAwMCwgJ3ZvdGVQb3dlckNvbnN1bXB0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAnKSkgcmV0dXJuOwogIGlmICghYXBpLmFzc2VydChkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24gJiYgTnVtYmVyLmlzSW50ZWdlcihkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24pICYmIGRvd252b3RlUG93ZXJDb25zdW1wdGlvbiA+PSAxICYmIGRvd252b3RlUG93ZXJDb25zdW1wdGlvbiA8PSAxMDAwMCwgJ2Rvd252b3RlUG93ZXJDb25zdW1wdGlvbiBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMDAwJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KEFycmF5LmlzQXJyYXkodGFncykgJiYgdGFncy5sZW5ndGggPj0gMSAmJiB0YWdzLmxlbmd0aCA8PSBtYXhUYWdzUGVyUG9vbCAmJiB0YWdzLmV2ZXJ5KHQgPT4gdHlwZW9mIHQgPT09ICdzdHJpbmcnKSwgYHRhZ3Mgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IGFycmF5IG9mIHN0cmluZ3Mgb2YgbGVuZ3RoIGF0IG1vc3QgJHttYXhUYWdzUGVyUG9vbH1gKSkgcmV0dXJuOwoKICAvLyBmb3Igbm93LCByZXN0cmljdCB0byAxIHBvb2wgcGVyIHN5bWJvbCwgYW5kIGNyZWF0b3IgbXVzdCBiZSBpc3N1ZXIuCiAgaWYgKCFhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09IHRva2VuLmlzc3VlciwgJ211c3QgYmUgaXNzdWVyIG9mIHRva2VuJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQodG9rZW4uc3Rha2luZ0VuYWJsZWQsICd0b2tlbiBtdXN0IGhhdmUgc3Rha2luZyBlbmFibGVkJykpIHJldHVybjsKCiAgY29uc3QgZXhpc3RpbmdSZXdhcmRQb29sID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Jld2FyZFBvb2xzJywgeyBzeW1ib2wgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KCFleGlzdGluZ1Jld2FyZFBvb2wsICdjYW5ub3QgY3JlYXRlIG11bHRpcGxlIHJld2FyZCBwb29scyBwZXIgdG9rZW4nKSkgcmV0dXJuOwoKICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CiAgY29uc3QgdGltZXN0YW1wID0gYmxvY2tEYXRlLmdldFRpbWUoKTsKCiAgY29uc3QgcmV3YXJkUG9vbCA9IHsKICAgIHN5bWJvbCwKICAgIHJld2FyZFBvb2w6ICcwJywKICAgIGxhc3RSZXdhcmRUaW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgIGxhc3RDbGFpbURlY2F5VGltZXN0YW1wOiB0aW1lc3RhbXAsCiAgICBjcmVhdGVkVGltZXN0YW1wOiB0aW1lc3RhbXAsCiAgICBjb25maWc6IHsKICAgICAgcG9zdFJld2FyZEN1cnZlLAogICAgICBwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIsCiAgICAgIGN1cmF0aW9uUmV3YXJkQ3VydmUsCiAgICAgIGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIsCiAgICAgIGN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSwKICAgICAgY2FzaG91dFdpbmRvd0RheXMsCiAgICAgIHJld2FyZFBlckludGVydmFsLAogICAgICByZXdhcmRJbnRlcnZhbFNlY29uZHMsCiAgICAgIHZvdGVSZWdlbmVyYXRpb25EYXlzLAogICAgICBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICAgIHN0YWtlZFJld2FyZFBlcmNlbnRhZ2UsCiAgICAgIHZvdGVQb3dlckNvbnN1bXB0aW9uLAogICAgICBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICAgIHRhZ3MsCiAgICB9LAogICAgcGVuZGluZ0NsYWltczogJzAnLAogICAgYWN0aXZlOiB0cnVlLAogIH07CiAgY29uc3QgaW5zZXJ0ZWRSZXdhcmRQb29sID0gYXdhaXQgYXBpLmRiLmluc2VydCgncmV3YXJkUG9vbHMnLCByZXdhcmRQb29sKTsKICAvLyBidXJuIHRoZSB0b2tlbiBjcmVhdGlvbiBmZWVzCiAgaWYgKGFwaS5zZW5kZXIgIT09IGFwaS5vd25lciAmJiBhcGkuQmlnTnVtYmVyKHNldHVwRmVlKS5ndCgwKSkgewogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbnMnLCAndHJhbnNmZXInLCB7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKICAgICAgdG86ICdudWxsJywgc3ltYm9sOiAiQkVFIiwgcXVhbnRpdHk6IHNldHVwRmVlLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICB9KTsKICB9CiAgYXBpLmVtaXQoJ2NyZWF0ZVJld2FyZFBvb2wnLCB7IF9pZDogaW5zZXJ0ZWRSZXdhcmRQb29sLl9pZCB9KTsKfTsKCmFjdGlvbnMudXBkYXRlUmV3YXJkUG9vbCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgcmV3YXJkUG9vbElkLAogICAgY29uZmlnLAogICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwogIGF3YWl0IHRva2VuTWFpbnRlbmFuY2UoKTsKICBpZiAoIWFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAnb3BlcmF0aW9uIG11c3QgYmUgc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykpIHsKICAgIHJldHVybjsKICB9CiAgLy8gZ2V0IGNvbnRyYWN0IHBhcmFtcwogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyB1cGRhdGVGZWUsIG1heFRhZ3NQZXJQb29sIH0gPSBwYXJhbXM7CiAgLy8gZ2V0IGFwaS5zZW5kZXIncyBVVElMSVRZX1RPS0VOX1NZTUJPTCBiYWxhbmNlCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogIGNvbnN0IHV0aWxpdHlUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiAiQkVFIiB9KTsKCiAgY29uc3QgYXV0aG9yaXplZCA9IGFwaS5CaWdOdW1iZXIodXBkYXRlRmVlKS5sdGUoMCkgfHwgYXBpLnNlbmRlciA9PT0gYXBpLm93bmVyCiAgICA/IHRydWUKICAgIDogdXRpbGl0eVRva2VuQmFsYW5jZSAmJiBhcGkuQmlnTnVtYmVyKHV0aWxpdHlUb2tlbkJhbGFuY2UuYmFsYW5jZSkuZ3RlKHVwZGF0ZUZlZSk7CgogIGlmICghYXBpLmFzc2VydChhdXRob3JpemVkLCAneW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSB1cGRhdGUgZmVlJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JywgJ2NvbmZpZyBpbnZhbGlkJykpIHJldHVybjsKCiAgY29uc3QgewogICAgcG9zdFJld2FyZEN1cnZlLAogICAgcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyLAogICAgY3VyYXRpb25SZXdhcmRDdXJ2ZSwKICAgIGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIsCiAgICBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UsCiAgICBjYXNob3V0V2luZG93RGF5cywKICAgIHJld2FyZFBlckludGVydmFsLAogICAgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzLAogICAgdm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBzdGFrZWRSZXdhcmRQZXJjZW50YWdlLAogICAgdm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICB0YWdzLAogIH0gPSBjb25maWc7CgogIGNvbnN0IGV4aXN0aW5nUmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgX2lkOiByZXdhcmRQb29sSWQgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KGV4aXN0aW5nUmV3YXJkUG9vbCwgJ3Jld2FyZCBwb29sIG5vdCBmb3VuZCcpKSByZXR1cm47CgogIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IGV4aXN0aW5nUmV3YXJkUG9vbC5zeW1ib2wgfSk7CgogIGlmICghYXBpLmFzc2VydChwb3N0UmV3YXJkQ3VydmUgJiYgcG9zdFJld2FyZEN1cnZlID09PSAncG93ZXInLCAncG9zdFJld2FyZEN1cnZlIHNob3VsZCBiZSBvbmUgb2Y6IFtwb3dlcl0nKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlID0gcG9zdFJld2FyZEN1cnZlOwoKICBjb25zdCBwb3N0RXhwb25lbnQgPSBhcGkuQmlnTnVtYmVyKHBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcik7CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiBwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIgPT09ICdzdHJpbmcnICYmIHBvc3RFeHBvbmVudC5pc0Zpbml0ZSgpICYmIHBvc3RFeHBvbmVudC5ndGUoJzEnKSAmJiBwb3N0RXhwb25lbnQubHRlKCcyJykgJiYgcG9zdEV4cG9uZW50LmRwKCkgPD0gMiwgJ3Bvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlciBzaG91bGQgYmUgYmV0d2VlbiAiMSIgYW5kICIyIiB3aXRoIHByZWNpc2lvbiBhdCBtb3N0IDInKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyID0gcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyOwoKICBpZiAoIWFwaS5hc3NlcnQoY3VyYXRpb25SZXdhcmRDdXJ2ZSAmJiBjdXJhdGlvblJld2FyZEN1cnZlID09PSAncG93ZXInLCAnY3VyYXRpb25SZXdhcmRDdXJ2ZSBzaG91bGQgYmUgb25lIG9mOiBbcG93ZXJdJykpIHJldHVybjsKICBjb25zdCBjdXJhdGlvbkV4cG9uZW50ID0gYXBpLkJpZ051bWJlcihjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyKTsKICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIgPT09ICdzdHJpbmcnICYmIGN1cmF0aW9uRXhwb25lbnQuaXNGaW5pdGUoKSAmJiBjdXJhdGlvbkV4cG9uZW50Lmd0ZSgnMC41JykgJiYgY3VyYXRpb25FeHBvbmVudC5sdGUoJzEnKSAmJiBjdXJhdGlvbkV4cG9uZW50LmRwKCkgPD0gMiwgJ2N1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIgY2FuIG9ubHkgYmUgYmV0d2VlbiAiMC41IiBhbmQgIjEiIHdpdGggcHJlY2lzaW9uIGF0IG1vc3QgMicpKSByZXR1cm47CiAgZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyID0gY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcjsKCiAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIoY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlKSAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPj0gMCAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPD0gMTAwLCAnY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwJykpIHJldHVybjsKICBleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLmN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSA9IGN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZTsKCiAgaWYgKCFhcGkuYXNzZXJ0KGNhc2hvdXRXaW5kb3dEYXlzICYmIE51bWJlci5pc0ludGVnZXIoY2FzaG91dFdpbmRvd0RheXMpICYmIGNhc2hvdXRXaW5kb3dEYXlzID49IDEgJiYgY2FzaG91dFdpbmRvd0RheXMgPD0gMzAsICdjYXNob3V0V2luZG93RGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwJykpIHJldHVybjsKICBleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLmNhc2hvdXRXaW5kb3dEYXlzID0gY2FzaG91dFdpbmRvd0RheXM7CgogIGNvbnN0IHBhcnNlZFJld2FyZFBlckludGVydmFsID0gYXBpLkJpZ051bWJlcihyZXdhcmRQZXJJbnRlcnZhbCk7CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiByZXdhcmRQZXJJbnRlcnZhbCA9PT0gJ3N0cmluZycgJiYgcGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwuaXNGaW5pdGUoKSAmJiBwYXJzZWRSZXdhcmRQZXJJbnRlcnZhbC5ndCgwKSwgJ3Jld2FyZFBlckludGVydmFsIGludmFsaWQnKQogICAgICAgIHx8ICFhcGkuYXNzZXJ0KHBhcnNlZFJld2FyZFBlckludGVydmFsLmRwKCkgPD0gdG9rZW4ucHJlY2lzaW9uLCAndG9rZW4gcHJlY2lzaW9uIG1pc21hdGNoIGZvciByZXdhcmRQZXJJbnRlcnZhbCcpKSByZXR1cm47CiAgZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5yZXdhcmRQZXJJbnRlcnZhbCA9IHJld2FyZFBlckludGVydmFsOwoKICBpZiAoIWFwaS5hc3NlcnQocmV3YXJkSW50ZXJ2YWxTZWNvbmRzICYmIE51bWJlci5pc0ludGVnZXIocmV3YXJkSW50ZXJ2YWxTZWNvbmRzKSAmJiByZXdhcmRJbnRlcnZhbFNlY29uZHMgPj0gMyAmJiByZXdhcmRJbnRlcnZhbFNlY29uZHMgPD0gODY0MDAgJiYgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzICUgMyA9PT0gMCwgJ3Jld2FyZEludGVydmFsU2Vjb25kcyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDMgYW5kIDg2NDAwLCBhbmQgZGl2aXNpYmxlIGJ5IDMnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucmV3YXJkSW50ZXJ2YWxTZWNvbmRzID0gcmV3YXJkSW50ZXJ2YWxTZWNvbmRzOwoKICBpZiAoIWFwaS5hc3NlcnQodm90ZVJlZ2VuZXJhdGlvbkRheXMgJiYgTnVtYmVyLmlzSW50ZWdlcih2b3RlUmVnZW5lcmF0aW9uRGF5cykgJiYgdm90ZVJlZ2VuZXJhdGlvbkRheXMgPj0gMSAmJiB2b3RlUmVnZW5lcmF0aW9uRGF5cyA8PSAzMCwgJ3ZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcudm90ZVJlZ2VuZXJhdGlvbkRheXMgPSB2b3RlUmVnZW5lcmF0aW9uRGF5czsKCiAgaWYgKCFhcGkuYXNzZXJ0KGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cykgJiYgZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzID49IDEgJiYgZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzIDw9IDMwLCAnZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzID0gZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzOwoKICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihzdGFrZWRSZXdhcmRQZXJjZW50YWdlKSAmJiBzdGFrZWRSZXdhcmRQZXJjZW50YWdlID49IDAgJiYgc3Rha2VkUmV3YXJkUGVyY2VudGFnZSA8PSAxMDAsICdzdGFrZWRSZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwJykpIHJldHVybjsKICBleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLnN0YWtlZFJld2FyZFBlcmNlbnRhZ2UgPSBzdGFrZWRSZXdhcmRQZXJjZW50YWdlOwoKICBpZiAoIWFwaS5hc3NlcnQodm90ZVBvd2VyQ29uc3VtcHRpb24gJiYgTnVtYmVyLmlzSW50ZWdlcih2b3RlUG93ZXJDb25zdW1wdGlvbikgJiYgdm90ZVBvd2VyQ29uc3VtcHRpb24gPj0gMSAmJiB2b3RlUG93ZXJDb25zdW1wdGlvbiA8PSAxMDAwMCwgJ3ZvdGVQb3dlckNvbnN1bXB0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcudm90ZVBvd2VyQ29uc3VtcHRpb24gPSB2b3RlUG93ZXJDb25zdW1wdGlvbjsKCiAgaWYgKCFhcGkuYXNzZXJ0KGRvd252b3RlUG93ZXJDb25zdW1wdGlvbiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUG93ZXJDb25zdW1wdGlvbikgJiYgZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uID49IDEgJiYgZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uIDw9IDEwMDAwLCAnZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uID0gZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uOwoKICBpZiAoIWFwaS5hc3NlcnQoQXJyYXkuaXNBcnJheSh0YWdzKSAmJiB0YWdzLmxlbmd0aCA+PSAxICYmIHRhZ3MubGVuZ3RoIDw9IG1heFRhZ3NQZXJQb29sICYmIHRhZ3MuZXZlcnkodCA9PiB0eXBlb2YgdCA9PT0gJ3N0cmluZycpLCBgdGFncyBzaG91bGQgYmUgYSBub24tZW1wdHkgYXJyYXkgb2Ygc3RyaW5ncyBvZiBsZW5ndGggYXQgbW9zdCAke21heFRhZ3NQZXJQb29sfWApKSByZXR1cm47CiAgZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy50YWdzID0gdGFnczsKCiAgaWYgKCFhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09IHRva2VuLmlzc3VlciwgJ211c3QgYmUgaXNzdWVyIG9mIHRva2VuJykpIHJldHVybjsKCiAgLy8gYnVybiB0aGUgZmVlcwogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIgJiYgYXBpLkJpZ051bWJlcih1cGRhdGVGZWUpLmd0KDApKSB7CiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICd0cmFuc2ZlcicsIHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogICAgICB0bzogJ251bGwnLCBzeW1ib2w6ICJCRUUiLCBxdWFudGl0eTogdXBkYXRlRmVlLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICB9KTsKICB9CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Jld2FyZFBvb2xzJywgZXhpc3RpbmdSZXdhcmRQb29sKTsKfTsKCmFjdGlvbnMuc2V0QWN0aXZlID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICByZXdhcmRQb29sSWQsCiAgICBhY3RpdmUsCiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CiAgaWYgKCFhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ29wZXJhdGlvbiBtdXN0IGJlIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpKSB7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBleGlzdGluZ1Jld2FyZFBvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncmV3YXJkUG9vbHMnLCB7IF9pZDogcmV3YXJkUG9vbElkIH0pOwogIGlmICghYXBpLmFzc2VydChleGlzdGluZ1Jld2FyZFBvb2wsICdyZXdhcmQgcG9vbCBub3QgZm91bmQnKSkgcmV0dXJuOwogIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IGV4aXN0aW5nUmV3YXJkUG9vbC5zeW1ib2wgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09IHRva2VuLmlzc3VlciB8fCBhcGkuc2VuZGVyID09PSBhcGkub3duZXIsICdtdXN0IGJlIGlzc3VlciBvZiB0b2tlbicpKSByZXR1cm47CgogIGV4aXN0aW5nUmV3YXJkUG9vbC5hY3RpdmUgPSBhY3RpdmU7CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncmV3YXJkUG9vbHMnLCBleGlzdGluZ1Jld2FyZFBvb2wpOwogIGF3YWl0IHRva2VuTWFpbnRlbmFuY2UoKTsKfTsKCmFzeW5jIGZ1bmN0aW9uIGdldFJld2FyZFBvb2xJZHMocGF5bG9hZCkgewogIGNvbnN0IHsKICAgIHJld2FyZFBvb2xzLAogICAganNvbk1ldGFkYXRhLAogICAgcGFyZW50QXV0aG9yLAogICAgcGFyZW50UGVybWxpbmssCiAgfSA9IHBheWxvYWQ7CgogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CgogIC8vIENoZWNrIGlmIGl0IGlzIGEgcmVwbHksIGFuZCBpbmhlcml0IHRoZSBzZXR0aW5ncwogIC8vIGZyb20gdGhlIHBhcmVudC4KICBpZiAocGFyZW50QXV0aG9yICYmIHBhcmVudFBlcm1saW5rKSB7CiAgICBjb25zdCBwYXJlbnRBdXRob3JwZXJtID0gYEAke3BhcmVudEF1dGhvcn0vJHtwYXJlbnRQZXJtbGlua31gOwogICAgLy8gQ2FuIG9ubHkgcmV0dXJuIHBhcmFtcy5tYXhQb29sc1BlclBvc3QgKDwxMDAwKSBwb3N0cwogICAgY29uc3QgcGFyZW50UG9zdHMgPSBhd2FpdCBhcGkuZGIuZmluZCgncG9zdHMnLCB7IGF1dGhvcnBlcm06IHBhcmVudEF1dGhvcnBlcm0gfSk7CiAgICBpZiAocGFyZW50UG9zdHMgJiYgcGFyZW50UG9zdHMubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gcGFyZW50UG9zdHMubWFwKHAgPT4gcC5yZXdhcmRQb29sSWQpOwogICAgfQogICAgcmV0dXJuIFtdOwogIH0KICAvLyBDaGVjayBtZXRhZGF0YSBmb3IgdGFncyAvIHBhcmVudCBwZXJtbGluawogIC8vIGZvciBjb21tdW5pdHkuCiAgaWYgKGpzb25NZXRhZGF0YSAmJiBqc29uTWV0YWRhdGEudGFncyAmJiBBcnJheS5pc0FycmF5KGpzb25NZXRhZGF0YS50YWdzKQogICAgICAmJiBqc29uTWV0YWRhdGEudGFncy5ldmVyeSh0ID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJykpIHsKICAgIGNvbnN0IHNlYXJjaFRhZ3MgPSBwYXJlbnRQZXJtbGluayA/IGpzb25NZXRhZGF0YS50YWdzLmNvbmNhdChbcGFyZW50UGVybWxpbmtdKQogICAgICA6IGpzb25NZXRhZGF0YS50YWdzOwogICAgY29uc3QgdGFnUmV3YXJkUG9vbHMgPSBhd2FpdCBhcGkuZGIuZmluZCgncmV3YXJkUG9vbHMnLAogICAgICB7ICdjb25maWcudGFncyc6IHsgJGluOiBzZWFyY2hUYWdzIH0gfSwKICAgICAgcGFyYW1zLm1heFBvb2xzUGVyUG9zdCwgMCwgW3sgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgICBpZiAodGFnUmV3YXJkUG9vbHMgJiYgdGFnUmV3YXJkUG9vbHMubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gdGFnUmV3YXJkUG9vbHMubWFwKHIgPT4gci5faWQpOwogICAgfQogIH0KICBpZiAocmV3YXJkUG9vbHMgJiYgQXJyYXkuaXNBcnJheShyZXdhcmRQb29scykgJiYgcmV3YXJkUG9vbHMubGVuZ3RoID4gMCkgewogICAgcmV0dXJuIHJld2FyZFBvb2xzLnNsaWNlKDAsIHBhcmFtcy5tYXhQb29sc1BlclBvc3QpOwogIH0KICByZXR1cm4gW107Cn0KCmFjdGlvbnMuY29tbWVudCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgYXV0aG9yLAogICAgcGVybWxpbmssCiAgICByZXdhcmRQb29scywKICB9ID0gcGF5bG9hZDsKCiAgYXdhaXQgdG9rZW5NYWludGVuYW5jZSgpOwogIC8vIE5vZGUgZW5mb3JjZXMgYXV0aG9yIC8gcGVybWxpbmtzIGZyb20gSGl2ZS4gQ2hlY2sgdGhhdCBzZW5kZXIgaXMgbnVsbC4KICBpZiAoIWFwaS5hc3NlcnQoYXBpLnNlbmRlciA9PT0gJ251bGwnLCAnYWN0aW9uIG11c3QgdXNlIGNvbW1lbnQgb3BlcmF0aW9uJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoIXJld2FyZFBvb2xzIHx8IChBcnJheS5pc0FycmF5KHJld2FyZFBvb2xzKSAmJiByZXdhcmRQb29scy5ldmVyeShycCA9PiBOdW1iZXIuaXNJbnRlZ2VyKHJwKSkpLCAncmV3YXJkUG9vbHMgbXVzdCBiZSBhbiBhcnJheSBvZiBpbnRlZ2VycycpKSByZXR1cm47CgogIGNvbnN0IHJld2FyZFBvb2xJZHMgPSBhd2FpdCBnZXRSZXdhcmRQb29sSWRzKHBheWxvYWQpOwogIGNvbnN0IGF1dGhvcnBlcm0gPSBgQCR7YXV0aG9yfS8ke3Blcm1saW5rfWA7CgogIC8vIFZhbGlkYXRlIHRoYXQgY29tbWVudCBpcyBub3QgYW4gZWRpdCAoY2Fubm90IGFkZCBtdWx0aXBsZSBwb29scykKICBjb25zdCBleGlzdGluZ1Bvc3QgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncG9zdHMnLCB7IGF1dGhvcnBlcm0gfSk7CiAgaWYgKGV4aXN0aW5nUG9zdCkgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXdhcmRQb29sSWRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBjb25zdCByZXdhcmRQb29sSWQgPSByZXdhcmRQb29sSWRzW2ldOwogICAgY29uc3QgcmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgX2lkOiByZXdhcmRQb29sSWQgfSk7CiAgICBpZiAocmV3YXJkUG9vbCAmJiByZXdhcmRQb29sLmFjdGl2ZSkgewogICAgICBjb25zdCBjYXNob3V0VGltZSA9IHRpbWVzdGFtcCArIHJld2FyZFBvb2wuY29uZmlnLmNhc2hvdXRXaW5kb3dEYXlzICogMjQgKiAzNjAwICogMTAwMDsKCiAgICAgIGNvbnN0IHBvc3QgPSB7CiAgICAgICAgcmV3YXJkUG9vbElkLAogICAgICAgIHN5bWJvbDogcmV3YXJkUG9vbC5zeW1ib2wsCiAgICAgICAgYXV0aG9ycGVybSwKICAgICAgICBhdXRob3IsCiAgICAgICAgY3JlYXRlZDogdGltZXN0YW1wLAogICAgICAgIGNhc2hvdXRUaW1lLAogICAgICAgIHZvdGVQb3NpdGl2ZVJzaGFyZVN1bTogJzAnLAogICAgICAgIHZvdGVSc2hhcmVTdW06ICcwJywKICAgICAgfTsKICAgICAgYXdhaXQgYXBpLmRiLmluc2VydCgncG9zdHMnLCBwb3N0KTsKICAgICAgYXBpLmVtaXQoJ25ld0NvbW1lbnQnLCB7IHJld2FyZFBvb2xJZCwgc3ltYm9sOiByZXdhcmRQb29sLnN5bWJvbCB9KTsKICAgIH0KICB9Cn07CgphY3Rpb25zLmNvbW1lbnRPcHRpb25zID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBhdXRob3IsCiAgICBwZXJtbGluaywKICAgIG1heEFjY2VwdGVkUGF5b3V0LAogICAgYmVuZWZpY2lhcmllcywKICB9ID0gcGF5bG9hZDsKCiAgLy8gTm9kZSBlbmZvcmNlcyBhdXRob3IgLyBwZXJtbGlua3MgZnJvbSBIaXZlLiBDaGVjayB0aGF0IHNlbmRlciBpcyBudWxsLgogIGlmICghYXBpLmFzc2VydChhcGkuc2VuZGVyID09PSAnbnVsbCcsICdhY3Rpb24gbXVzdCB1c2UgY29tbWVudE9wdGlvbnMgb3BlcmF0aW9uJykpIHJldHVybjsKICBjb25zdCBhdXRob3JwZXJtID0gYEAke2F1dGhvcn0vJHtwZXJtbGlua31gOwoKICBjb25zdCBleGlzdGluZ1Bvc3RzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Bvc3RzJywgeyBhdXRob3JwZXJtIH0pOwogIGlmICghZXhpc3RpbmdQb3N0cykgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgZGVjbGluZVBheW91dCA9IG1heEFjY2VwdGVkUGF5b3V0LnN0YXJ0c1dpdGgoJzAuMDAwJyk7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Bvc3RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBjb25zdCBwb3N0ID0gZXhpc3RpbmdQb3N0c1tpXTsKICAgIHBvc3QuZGVjbGluZVBheW91dCA9IGRlY2xpbmVQYXlvdXQ7CiAgICBwb3N0LmJlbmVmaWNpYXJpZXMgPSBiZW5lZmljaWFyaWVzOwogICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncG9zdHMnLCBwb3N0KTsKICB9Cn07Cgphc3luYyBmdW5jdGlvbiBwcm9jZXNzVm90ZShwb3N0LCB2b3Rlciwgd2VpZ2h0LCB0aW1lc3RhbXApIHsKICBjb25zdCB7CiAgICByZXdhcmRQb29sSWQsCiAgICBzeW1ib2wsCiAgICBhdXRob3JwZXJtLAogICAgY2FzaG91dFRpbWUsCiAgfSA9IHBvc3Q7CgogIGlmIChjYXNob3V0VGltZSA8IHRpbWVzdGFtcCkgewogICAgcmV0dXJuOwogIH0KCiAgLy8gY2hlY2sgdm90aW5nIHBvd2VyLCBzdGFrZSwgYW5kIGN1cnJlbnQgdm90ZSByc2hhcmVzLgogIGNvbnN0IHJld2FyZFBvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncmV3YXJkUG9vbHMnLCB7IF9pZDogcmV3YXJkUG9vbElkIH0pOwogIGlmICghcmV3YXJkUG9vbCB8fCAhcmV3YXJkUG9vbC5hY3RpdmUpIHsKICAgIHJldHVybjsKICB9CgogIGxldCB2b3RpbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd2b3RpbmdQb3dlcicsIHsgcmV3YXJkUG9vbElkLCBhY2NvdW50OiB2b3RlciB9KTsKICBpZiAoIXZvdGluZ1Bvd2VyKSB7CiAgICB2b3RpbmdQb3dlciA9IHsKICAgICAgcmV3YXJkUG9vbElkLAogICAgICBhY2NvdW50OiB2b3RlciwKICAgICAgbGFzdFZvdGVUaW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgdm90aW5nUG93ZXI6IE1BWF9WT1RJTkdfUE9XRVIsCiAgICAgIGRvd252b3RpbmdQb3dlcjogTUFYX1ZPVElOR19QT1dFUiwKICAgIH07CiAgICB2b3RpbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3ZvdGluZ1Bvd2VyJywgdm90aW5nUG93ZXIpOwogIH0gZWxzZSB7CiAgICAvLyByZWdlbmVyYXRlIHZvdGluZyBwb3dlcgogICAgdm90aW5nUG93ZXIudm90aW5nUG93ZXIgKz0gKHRpbWVzdGFtcCAtIHZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wKSAqIE1BWF9WT1RJTkdfUE9XRVIKICAgICAgICAgIC8gKHJld2FyZFBvb2wuY29uZmlnLnZvdGVSZWdlbmVyYXRpb25EYXlzICogMjQgKiAzNjAwICogMTAwMCk7CiAgICB2b3RpbmdQb3dlci52b3RpbmdQb3dlciA9IE1hdGguZmxvb3Iodm90aW5nUG93ZXIudm90aW5nUG93ZXIpOwogICAgdm90aW5nUG93ZXIudm90aW5nUG93ZXIgPSBNYXRoLm1pbih2b3RpbmdQb3dlci52b3RpbmdQb3dlciwgTUFYX1ZPVElOR19QT1dFUik7CiAgICB2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIgKz0gKHRpbWVzdGFtcCAtIHZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wKSAqIE1BWF9WT1RJTkdfUE9XRVIKICAgICAgICAgIC8gKHJld2FyZFBvb2wuY29uZmlnLmRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyAqIDI0ICogMzYwMCAqIDEwMDApOwogICAgdm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyID0gTWF0aC5mbG9vcih2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIpOwogICAgdm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyID0gTWF0aC5taW4odm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyLCBNQVhfVk9USU5HX1BPV0VSKTsKICAgIHZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wID0gdGltZXN0YW1wOwogIH0KCiAgY29uc3Qgdm90ZXJUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgc3ltYm9sLCBhY2NvdW50OiB2b3RlciB9KTsKICBsZXQgc3Rha2UgPSB2b3RlclRva2VuQmFsYW5jZSA/IHZvdGVyVG9rZW5CYWxhbmNlLnN0YWtlIDogJzAnOwogIGlmICh2b3RlclRva2VuQmFsYW5jZSAmJiB2b3RlclRva2VuQmFsYW5jZS5kZWxlZ2F0aW9uc0luCiAgICAgICYmIGFwaS5CaWdOdW1iZXIodm90ZXJUb2tlbkJhbGFuY2UuZGVsZWdhdGlvbnNJbikuaXNGaW5pdGUoKSkgewogICAgc3Rha2UgPSBhcGkuQmlnTnVtYmVyKHN0YWtlKS5wbHVzKHZvdGVyVG9rZW5CYWxhbmNlLmRlbGVnYXRpb25zSW4pOwogIH0KCiAgbGV0IHZvdGVSc2hhcmVzID0gJzAnOwogIGxldCB1cGRhdGVkUG9zdFJzaGFyZXMgPSAnMCc7CiAgbGV0IHVzZWRQb3dlciA9IDA7CiAgbGV0IHVzZWREb3dudm90ZVBvd2VyID0gMDsKICBsZXQgY3VyYXRpb25XZWlnaHQgPSAnMCc7CiAgaWYgKHdlaWdodCA+IDApIHsKICAgIHZvdGVSc2hhcmVzID0gYXBpLkJpZ051bWJlcihzdGFrZSkubXVsdGlwbGllZEJ5KHdlaWdodCkubXVsdGlwbGllZEJ5KHZvdGluZ1Bvd2VyLnZvdGluZ1Bvd2VyKQogICAgICAuZGl2aWRlZEJ5KE1BWF9WT1RJTkdfUE9XRVIpCiAgICAgIC5kaXZpZGVkQnkoTUFYX1dFSUdIVCkKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIHVzZWRQb3dlciA9IE1hdGguZmxvb3Iodm90aW5nUG93ZXIudm90aW5nUG93ZXIgKiBNYXRoLmFicyh3ZWlnaHQpICogNjAgKiA2MCAqIDI0IC8gTUFYX1dFSUdIVCk7CiAgICBjb25zdCB1c2VkUG93ZXJEZW5vbSA9IE1hdGguZmxvb3IoTUFYX1ZPVElOR19QT1dFUiAqIDYwICogNjAgKiAyNAogICAgICAgIC8gcmV3YXJkUG9vbC5jb25maWcudm90ZVBvd2VyQ29uc3VtcHRpb24pOwogICAgdXNlZFBvd2VyID0gTWF0aC5mbG9vcigodXNlZFBvd2VyICsgdXNlZFBvd2VyRGVub20gLSAxKSAvIHVzZWRQb3dlckRlbm9tKTsKICAgIHZvdGluZ1Bvd2VyLnZvdGluZ1Bvd2VyID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcih2b3RpbmdQb3dlci52b3RpbmdQb3dlciAtIHVzZWRQb3dlcikpOwogICAgY3VyYXRpb25XZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGNhbGN1bGF0ZUN1cmF0aW9uV2VpZ2h0UnNoYXJlcygKICAgICAgcmV3YXJkUG9vbCwgYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlcykucGx1cyhwb3N0LnZvdGVQb3NpdGl2ZVJzaGFyZVN1bSksCiAgICApKQogICAgICAubWludXMoY2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHBvc3Qudm90ZVBvc2l0aXZlUnNoYXJlU3VtKSkKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICB9IGVsc2UgaWYgKHdlaWdodCA8IDApIHsKICAgIHZvdGVSc2hhcmVzID0gYXBpLkJpZ051bWJlcihzdGFrZSkubXVsdGlwbGllZEJ5KHdlaWdodCkKICAgICAgLm11bHRpcGxpZWRCeSh2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIpCiAgICAgIC5kaXZpZGVkQnkoTUFYX1ZPVElOR19QT1dFUikKICAgICAgLmRpdmlkZWRCeShNQVhfV0VJR0hUKQogICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogICAgdXNlZERvd252b3RlUG93ZXIgPSBNYXRoLmZsb29yKHZvdGluZ1Bvd2VyLmRvd252b3RpbmdQb3dlciAqIE1hdGguYWJzKHdlaWdodCkgKiA2MCAqIDYwICogMjQKICAgICAgICAvIE1BWF9XRUlHSFQpOwogICAgY29uc3QgdXNlZERvd252b3RlUG93ZXJEZW5vbSA9IE1hdGguZmxvb3IoTUFYX1ZPVElOR19QT1dFUiAqIDYwICogNjAgKiAyNAogICAgICAgIC8gcmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uKTsKICAgIHVzZWREb3dudm90ZVBvd2VyID0gTWF0aC5mbG9vcigodXNlZERvd252b3RlUG93ZXIgKyB1c2VkRG93bnZvdGVQb3dlckRlbm9tIC0gMSkKICAgICAgICAvIHVzZWREb3dudm90ZVBvd2VyRGVub20pOwogICAgdm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyID0gTWF0aC5tYXgoCiAgICAgIDAsIE1hdGguZmxvb3Iodm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyIC0gdXNlZERvd252b3RlUG93ZXIpLAogICAgKTsKICB9CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3ZvdGluZ1Bvd2VyJywgdm90aW5nUG93ZXIpOwoKICBsZXQgdm90ZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd2b3RlcycsIHsgcmV3YXJkUG9vbElkLCBhdXRob3JwZXJtLCB2b3RlciB9KTsKICBpZiAodm90ZSkgewogICAgLy8gQSByZS12b3RlIG5lZ2F0ZXMgY3VyYXRpb24gcmV3YXJkcywgc2ltaWxhciB0byBIaXZlLgogICAgdm90ZS50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CiAgICB2b3RlLndlaWdodCA9IHdlaWdodDsKICAgIHZvdGUuY3VyYXRpb25XZWlnaHQgPSAnMCc7CiAgICBjb25zdCBvbGRWb3RlUnNoYXJlcyA9IHZvdGUucnNoYXJlczsKICAgIHZvdGUucnNoYXJlcyA9IHZvdGVSc2hhcmVzOwogICAgdXBkYXRlZFBvc3RSc2hhcmVzID0gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlcykubWludXMob2xkVm90ZVJzaGFyZXMpCiAgICAgIC50b0ZpeGVkKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd2b3RlcycsIHZvdGUpOwogICAgYXBpLmVtaXQoJ3VwZGF0ZVZvdGUnLCB7IHJld2FyZFBvb2xJZCwgc3ltYm9sOiByZXdhcmRQb29sLnN5bWJvbCwgcnNoYXJlczogdm90ZVJzaGFyZXMgfSk7CiAgfSBlbHNlIHsKICAgIHZvdGUgPSB7CiAgICAgIHJld2FyZFBvb2xJZCwKICAgICAgc3ltYm9sLAogICAgICBhdXRob3JwZXJtLAogICAgICB3ZWlnaHQsCiAgICAgIHJzaGFyZXM6IHZvdGVSc2hhcmVzLAogICAgICBjdXJhdGlvbldlaWdodCwKICAgICAgdGltZXN0YW1wLAogICAgICB2b3RlciwKICAgIH07CiAgICB1cGRhdGVkUG9zdFJzaGFyZXMgPSB2b3RlUnNoYXJlczsKICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3ZvdGVzJywgdm90ZSk7CiAgICBhcGkuZW1pdCgnbmV3Vm90ZScsIHsgcmV3YXJkUG9vbElkLCBzeW1ib2w6IHJld2FyZFBvb2wuc3ltYm9sLCByc2hhcmVzOiB2b3RlUnNoYXJlcyB9KTsKICB9CgogIGNvbnN0IG9sZFBvc3RDbGFpbXMgPSBjYWxjdWxhdGVXZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHBvc3Qudm90ZVJzaGFyZVN1bSk7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduCiAgcG9zdC52b3RlUnNoYXJlU3VtID0gYXBpLkJpZ051bWJlcihwb3N0LnZvdGVSc2hhcmVTdW0pLnBsdXModXBkYXRlZFBvc3RSc2hhcmVzKQogICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKCiAgaWYgKGFwaS5CaWdOdW1iZXIodXBkYXRlZFBvc3RSc2hhcmVzKS5ndCgwKSkgewogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduCiAgICBwb3N0LnZvdGVQb3NpdGl2ZVJzaGFyZVN1bSA9IGFwaS5CaWdOdW1iZXIocG9zdC52b3RlUG9zaXRpdmVSc2hhcmVTdW0pLnBsdXModXBkYXRlZFBvc3RSc2hhcmVzKQogICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogICAgaWYgKHRpbWVzdGFtcCA8IHJld2FyZFBvb2wuY3JlYXRlZFRpbWVzdGFtcAogICAgICAgICsgKDIgKiByZXdhcmRQb29sLmNvbmZpZy5jYXNob3V0V2luZG93RGF5cyArIDEpICogMjQgKiAzNjAwICogMTAwMCkgewogICAgICBjb25zdCBuZXdQb3N0Q2xhaW1zID0gY2FsY3VsYXRlV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLCBwb3N0LnZvdGVSc2hhcmVTdW0pOwogICAgICByZXdhcmRQb29sLnBlbmRpbmdDbGFpbXMgPSBhcGkuQmlnTnVtYmVyKHJld2FyZFBvb2wucGVuZGluZ0NsYWltcykKICAgICAgICAucGx1cyhuZXdQb3N0Q2xhaW1zKQogICAgICAgIC5taW51cyhvbGRQb3N0Q2xhaW1zKQogICAgICAgIC50b0ZpeGVkKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Jld2FyZFBvb2xzJywgcmV3YXJkUG9vbCk7CiAgICB9CiAgfQogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Bvc3RzJywgcG9zdCk7Cn0KCmFjdGlvbnMudm90ZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgdm90ZXIsCiAgICBhdXRob3IsCiAgICBwZXJtbGluaywKICAgIHdlaWdodCwKICB9ID0gcGF5bG9hZDsKICBhd2FpdCB0b2tlbk1haW50ZW5hbmNlKCk7CgogIGlmICghYXBpLmFzc2VydChhcGkuc2VuZGVyID09PSAnbnVsbCcsICdjYW4gb25seSB2b3RlIHdpdGggdm90aW5nIG9wJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIod2VpZ2h0KSAmJiB3ZWlnaHQgPj0gLTEwMDAwICYmIHdlaWdodCA8PSAxMDAwMCwKICAgICd3ZWlnaHQgbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gLTEwMDAwIHRvIDEwMDAwJykpIHJldHVybjsKCiAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CiAgY29uc3QgYXV0aG9ycGVybSA9IGBAJHthdXRob3J9LyR7cGVybWxpbmt9YDsKICAvLyBDYW4gb25seSByZXR1cm4gcGFyYW1zLm1heFBvb2xzUGVyUG9zdCAoPDEwMDApIHBvc3RzCiAgY29uc3QgcG9zdHMgPSBhd2FpdCBhcGkuZGIuZmluZCgncG9zdHMnLCB7IGF1dGhvcnBlcm0gfSk7CgogIGlmICghcG9zdHMpIHJldHVybjsKICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc3RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBjb25zdCBwb3N0ID0gcG9zdHNbaV07CiAgICBhd2FpdCBwcm9jZXNzVm90ZShwb3N0LCB2b3Rlciwgd2VpZ2h0LCB0aW1lc3RhbXApOwogIH0KfTsK" } }}