testnet

in #test2 years ago

{ "id": "ssc-testnet-hive", "json": { "contractName":"contract", "contractAction":"update", "contractPayload":{"name":"comments","params":"","code":"LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IFsiZXJyb3IiLCB7ICJhbGxvdyI6IFsiX2lkIl0gfV0gKi8KLyogZ2xvYmFsIGFjdGlvbnMsIGFwaSAqLwoKY29uc3QgU01UX1BSRUNJU0lPTiA9IDEwOwpjb25zdCBNQVhfVk9USU5HX1BPV0VSID0gMTAwMDA7CmNvbnN0IE1BWF9XRUlHSFQgPSAxMDAwMDsKY29uc3QgUE9TVF9RVUVSWV9MSU1JVCA9IDEwMDA7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cygncmV3YXJkUG9vbHMnKTsKICBpZiAodGFibGVFeGlzdHMgPT09IGZhbHNlKSB7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3BhcmFtcycpOwogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdyZXdhcmRQb29scycsIFsnY29uZmlnLnRhZ3MnLCAnbGFzdENsYWltRGVjYXlUaW1lc3RhbXAnXSk7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3Bvc3RzJywgWwogICAgICAnYXV0aG9ycGVybScsCiAgICAgIHsgbmFtZTogJ2J5Q2FzaG91dFRpbWUnLCBpbmRleDogeyByZXdhcmRQb29sSWQ6IDEsIGNhc2hvdXRUaW1lOiAxIH0gfSwKICAgIF0sIHsgcHJpbWFyeUtleTogWydhdXRob3JwZXJtJywgJ3Jld2FyZFBvb2xJZCddIH0pOwogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdwb3N0TWV0YWRhdGEnLCBbXSwgeyBwcmltYXJ5S2V5OiBbJ2F1dGhvcnBlcm0nXSB9KTsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgndm90ZXMnLCBbeyBuYW1lOiAnYnlUaW1lc3RhbXAnLCBpbmRleDogeyByZXdhcmRQb29sSWQ6IDEsIGF1dGhvcnBlcm06IDEsIHRpbWVzdGFtcDogMSB9IH1dLCB7IHByaW1hcnlLZXk6IFsncmV3YXJkUG9vbElkJywgJ2F1dGhvcnBlcm0nLCAndm90ZXInXSB9KTsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgndm90aW5nUG93ZXInLCBbXSwgeyBwcmltYXJ5S2V5OiBbJ3Jld2FyZFBvb2xJZCcsICdhY2NvdW50J10gfSk7CgogICAgY29uc3QgcGFyYW1zID0gewogICAgICBzZXR1cEZlZTogJzEwMDAnLAogICAgICB1cGRhdGVGZWU6ICcyMCcsCiAgICAgIG1heFBvb2xzUGVyUG9zdDogMjAsCiAgICAgIG1heFRhZ3NQZXJQb29sOiA1LAogICAgICBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrOiAyLAogICAgICBsYXN0TWFpbnRlbmFuY2VCbG9jazogYXBpLmJsb2NrTnVtYmVyLAogICAgICBtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kOiAyMCwKICAgICAgdm90ZVF1ZXJ5TGltaXQ6IDEwMCwKICAgICAgbWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZDogMTAwLAogICAgICBsYXN0UHJvY2Vzc2VkUG9vbElkOiAwLAogICAgfTsKICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3BhcmFtcycsIHBhcmFtcyk7CiAgfQp9OwoKYWN0aW9ucy51cGRhdGVQYXJhbXMgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIpIHJldHVybjsKCiAgY29uc3QgewogICAgc2V0dXBGZWUsCiAgICB1cGRhdGVGZWUsCiAgICBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrLAogICAgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCwKICAgIG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQsCiAgICB2b3RlUXVlcnlMaW1pdCwKICB9ID0gcGF5bG9hZDsKCiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKCiAgaWYgKHNldHVwRmVlKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHNldHVwRmVlID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihzZXR1cEZlZSkuaXNOYU4oKSAmJiBhcGkuQmlnTnVtYmVyKHNldHVwRmVlKS5ndGUoMCksICdpbnZhbGlkIHNldHVwRmVlJykpIHJldHVybjsKICAgIHBhcmFtcy5zZXR1cEZlZSA9IHNldHVwRmVlOwogIH0KICBpZiAodXBkYXRlRmVlKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHVwZGF0ZUZlZSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIodXBkYXRlRmVlKS5pc05hTigpICYmIGFwaS5CaWdOdW1iZXIodXBkYXRlRmVlKS5ndGUoMCksICdpbnZhbGlkIHVwZGF0ZUZlZScpKSByZXR1cm47CiAgICBwYXJhbXMudXBkYXRlRmVlID0gdXBkYXRlRmVlOwogIH0KICBpZiAobWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jaykgewogICAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jaykgJiYgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jayA+PSAxLCAnaW52YWxpZCBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrJykpIHJldHVybjsKICAgIHBhcmFtcy5tYWludGVuYW5jZVRva2Vuc1BlckJsb2NrID0gbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jazsKICB9CiAgaWYgKG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQpIHsKICAgIGlmICghYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQpICYmIG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQgPj0gMSwgJ2ludmFsaWQgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCcpKSByZXR1cm47CiAgICBwYXJhbXMubWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCA9IG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQ7CiAgfQogIGlmIChtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kKSAmJiBtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kID49IDEsICdpbnZhbGlkIG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQnKSkgcmV0dXJuOwogICAgcGFyYW1zLm1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQgPSBtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kOwogIH0KICBpZiAodm90ZVF1ZXJ5TGltaXQpIHsKICAgIGlmICghYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKHZvdGVRdWVyeUxpbWl0KSAmJiB2b3RlUXVlcnlMaW1pdCA+PSAxLCAnaW52YWxpZCB2b3RlUXVlcnlMaW1pdCcpKSByZXR1cm47CiAgICBwYXJhbXMudm90ZVF1ZXJ5TGltaXQgPSB2b3RlUXVlcnlMaW1pdDsKICB9CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7Cn07CgpmdW5jdGlvbiBjYWxjdWxhdGVXZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHZvdGVSc2hhcmVTdW0pIHsKICBpZiAoYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5sdGUoMCkpIHJldHVybiBhcGkuQmlnTnVtYmVyKDApOwogIGlmIChyZXdhcmRQb29sLmNvbmZpZy5wb3N0UmV3YXJkQ3VydmUgPT09ICdwb3dlcicpIHsKICAgIGNvbnN0IHBvc3RSZXdhcmRFeHBvbmVudCA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyKTsKICAgIGlmIChwb3N0UmV3YXJkRXhwb25lbnQuZXEoJzEnKSB8fCBwb3N0UmV3YXJkRXhwb25lbnQuZXEoJzInKSkgewogICAgICByZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5wb3cocmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyKQogICAgICAgIC50b0ZpeGVkKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICB9CiAgICByZXR1cm4gYXBpLkJpZ051bWJlcihwYXJzZUZsb2F0KHZvdGVSc2hhcmVTdW0pCiAgICAgICAgKiogcGFyc2VGbG9hdChyZXdhcmRQb29sLmNvbmZpZy5wb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIpKQogICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIH0KICByZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKTsKfQoKZnVuY3Rpb24gY2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHZvdGVSc2hhcmVTdW0pIHsKICBpZiAoYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5sdGUoMCkpIHJldHVybiBhcGkuQmlnTnVtYmVyKDApOwogIGlmIChyZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlID09PSAncG93ZXInKSB7CiAgICBjb25zdCBjdXJhdGlvblJld2FyZEV4cG9uZW50ID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyKTsKICAgIGlmIChjdXJhdGlvblJld2FyZEV4cG9uZW50LmVxKCcwLjUnKSkgewogICAgICByZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5zcXJ0KCkKICAgICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogICAgfSBpZiAoY3VyYXRpb25SZXdhcmRFeHBvbmVudC5lcSgnMScpKSB7CiAgICAgIHJldHVybiBhcGkuQmlnTnVtYmVyKHZvdGVSc2hhcmVTdW0pLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIH0KICAgIHJldHVybiBhcGkuQmlnTnVtYmVyKHBhcnNlRmxvYXQodm90ZVJzaGFyZVN1bSkKICAgICAgICAqKiBwYXJzZUZsb2F0KHJld2FyZFBvb2wuY29uZmlnLmN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIpKQogICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIH0KICByZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKTsKfQoKYXN5bmMgZnVuY3Rpb24gcGF5VXNlcihzeW1ib2wsIHF1YW50aXR5LCB1c2VyLCBzdGFrZWRSZXdhcmRQZXJjZW50YWdlLCBtdXRlKSB7CiAgaWYgKG11dGUpIHJldHVybjsKICBjb25zdCBxdWFudGl0eUJpZ251bSA9IGFwaS5CaWdOdW1iZXIocXVhbnRpdHkpOwogIGNvbnN0IHN0YWtlZFF1YW50aXR5ID0gcXVhbnRpdHlCaWdudW0ubXVsdGlwbGllZEJ5KHN0YWtlZFJld2FyZFBlcmNlbnRhZ2UpLmRpdmlkZWRCeSgxMDApCiAgICAudG9GaXhlZChxdWFudGl0eUJpZ251bS5kcCgpLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIGNvbnN0IGxpcXVpZFF1YW50aXR5ID0gcXVhbnRpdHlCaWdudW0ubWludXMoc3Rha2VkUXVhbnRpdHkpCiAgICAudG9GaXhlZChxdWFudGl0eUJpZ251bS5kcCgpLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIGxldCByZXM7CiAgaWYgKGFwaS5CaWdOdW1iZXIobGlxdWlkUXVhbnRpdHkpLmd0KDApKSB7CiAgICByZXMgPSBhd2FpdCBhcGkudHJhbnNmZXJUb2tlbnModXNlciwgc3ltYm9sLCBsaXF1aWRRdWFudGl0eSwgJ3VzZXInKTsKICAgIGlmIChyZXMuZXJyb3JzKSB7CiAgICAgIGFwaS5kZWJ1ZyhgRXJyb3IgcGF5aW5nIG91dCBsaXF1aWQgJHtsaXF1aWRRdWFudGl0eX0gJHtzeW1ib2x9IHRvICR7dXNlcn0gKFRYSUQgJHthcGkudHJhbnNhY3Rpb25JZH0pOiBcbiR7cmVzLmVycm9yc31gKTsKICAgIH0KICB9CiAgaWYgKGFwaS5CaWdOdW1iZXIoc3Rha2VkUXVhbnRpdHkpLmd0KDApKSB7CiAgICByZXMgPSBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICdzdGFrZUZyb21Db250cmFjdCcsIHsgdG86IHVzZXIsIHN5bWJvbCwgcXVhbnRpdHk6IHN0YWtlZFF1YW50aXR5IH0pOwogICAgaWYgKHJlcy5lcnJvcnMpIHsKICAgICAgYXBpLmRlYnVnKGBFcnJvciBwYXlpbmcgb3V0IHN0YWtlZCAke3N0YWtlZFF1YW50aXR5fSAke3N5bWJvbH0gdG8gJHt1c2VyfSAoVFhJRCAke2FwaS50cmFuc2FjdGlvbklkfSk6IFxuJHtyZXMuZXJyb3JzfWApOwogICAgfQogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TXV0ZShyZXdhcmRQb29sSWQsIGFjY291bnQpIHsKICBjb25zdCB2b3RpbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd2b3RpbmdQb3dlcicsIHsgcmV3YXJkUG9vbElkLCBhY2NvdW50IH0pOwogIHJldHVybiB2b3RpbmdQb3dlciA/IHZvdGluZ1Bvd2VyLm11dGUgOiBmYWxzZTsKfQoKYXN5bmMgZnVuY3Rpb24gcGF5T3V0QmVuZWZpY2lhcmllcyhyZXdhcmRQb29sLCB0b2tlbiwgcG9zdCwgYXV0aG9yQmVuZVBvcnRpb24pIHsKICBjb25zdCB7CiAgICBhdXRob3JwZXJtLAogICAgc3ltYm9sLAogICAgcmV3YXJkUG9vbElkLAogICAgYmVuZWZpY2lhcmllcywKICB9ID0gcG9zdDsKICBpZiAoIWJlbmVmaWNpYXJpZXMgfHwgYmVuZWZpY2lhcmllcy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBhcGkuQmlnTnVtYmVyKDApOwogIH0KICBsZXQgdG90YWxCZW5lUGF5ID0gYXBpLkJpZ051bWJlcigwKTsKICBmb3IgKGxldCBpID0gMDsgaSA8IGJlbmVmaWNpYXJpZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGNvbnN0IGJlbmVmaWNpYXJ5ID0gYmVuZWZpY2lhcmllc1tpXTsKICAgIGNvbnN0IGJlbmVQYXkgPSBhcGkuQmlnTnVtYmVyKGF1dGhvckJlbmVQb3J0aW9uKS5tdWx0aXBsaWVkQnkoYmVuZWZpY2lhcnkud2VpZ2h0KQogICAgICAuZGl2aWRlZEJ5KDEwMDAwKQogICAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICBjb25zdCBtdXRlID0gYXdhaXQgZ2V0TXV0ZShyZXdhcmRQb29sSWQsIGJlbmVmaWNpYXJ5LmFjY291bnQpOwogICAgY29uc3QgcmV3YXJkTG9nID0gewogICAgICByZXdhcmRQb29sSWQsIGF1dGhvcnBlcm0sIHN5bWJvbCwgYWNjb3VudDogYmVuZWZpY2lhcnkuYWNjb3VudCwgcXVhbnRpdHk6IGJlbmVQYXksCiAgICB9OwogICAgaWYgKG11dGUpIHsKICAgICAgcmV3YXJkTG9nLm11dGUgPSB0cnVlOwogICAgfQogICAgYXBpLmVtaXQoJ2JlbmVmaWNpYXJ5UmV3YXJkJywgcmV3YXJkTG9nKTsKICAgIGF3YWl0IHBheVVzZXIoc3ltYm9sLCBiZW5lUGF5LCBiZW5lZmljaWFyeS5hY2NvdW50LCByZXdhcmRQb29sLmNvbmZpZy5zdGFrZWRSZXdhcmRQZXJjZW50YWdlLAogICAgICBtdXRlKTsKICAgIHRvdGFsQmVuZVBheSA9IGFwaS5CaWdOdW1iZXIodG90YWxCZW5lUGF5KS5wbHVzKGJlbmVQYXkpOwogIH0KICByZXR1cm4gdG90YWxCZW5lUGF5Owp9Cgphc3luYyBmdW5jdGlvbiBwYXlPdXRDdXJhdG9ycyhyZXdhcmRQb29sLCB0b2tlbiwgcG9zdCwgY3VyYXRvclBvcnRpb24sIHBhcmFtcykgewogIGNvbnN0IHsKICAgIGF1dGhvcnBlcm0sCiAgICBzeW1ib2wsCiAgICByZXdhcmRQb29sSWQsCiAgfSA9IHBvc3Q7CiAgY29uc3QgewogICAgdm90ZVF1ZXJ5TGltaXQsCiAgfSA9IHBhcmFtczsKICBjb25zdCByZXNwb25zZSA9IHsKICAgIGRvbmU6IGZhbHNlLAogICAgdm90ZXNQcm9jZXNzZWQ6IDAsCiAgfTsKICBjb25zdCB2b3Rlc1RvUGF5b3V0ID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3ZvdGVzJywgeyByZXdhcmRQb29sSWQsIGF1dGhvcnBlcm0gfSwgdm90ZVF1ZXJ5TGltaXQsIDAsIFt7IGluZGV4OiAnYnlUaW1lc3RhbXAnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgaWYgKHZvdGVzVG9QYXlvdXQubGVuZ3RoID09PSAwKSB7CiAgICByZXNwb25zZS5kb25lID0gdHJ1ZTsKICB9IGVsc2UgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2b3Rlc1RvUGF5b3V0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICAgIGNvbnN0IHZvdGUgPSB2b3Rlc1RvUGF5b3V0W2ldOwogICAgICBpZiAoYXBpLkJpZ051bWJlcih2b3RlLmN1cmF0aW9uV2VpZ2h0KSA+IDApIHsKICAgICAgICBjb25zdCB0b3RhbEN1cmF0aW9uV2VpZ2h0ID0gY2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKAogICAgICAgICAgcmV3YXJkUG9vbCwgcG9zdC52b3RlUG9zaXRpdmVSc2hhcmVTdW0sCiAgICAgICAgKTsKICAgICAgICBjb25zdCB2b3RlUGF5ID0gYXBpLkJpZ051bWJlcihjdXJhdG9yUG9ydGlvbikubXVsdGlwbGllZEJ5KHZvdGUuY3VyYXRpb25XZWlnaHQpCiAgICAgICAgICAuZGl2aWRlZEJ5KHRvdGFsQ3VyYXRpb25XZWlnaHQpCiAgICAgICAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICAgICAgY29uc3QgbXV0ZSA9IGF3YWl0IGdldE11dGUocmV3YXJkUG9vbElkLCB2b3RlLnZvdGVyKTsKICAgICAgICBjb25zdCByZXdhcmRMb2cgPSB7CiAgICAgICAgICByZXdhcmRQb29sSWQsIGF1dGhvcnBlcm0sIHN5bWJvbCwgYWNjb3VudDogdm90ZS52b3RlciwgcXVhbnRpdHk6IHZvdGVQYXksCiAgICAgICAgfTsKICAgICAgICBpZiAobXV0ZSkgewogICAgICAgICAgcmV3YXJkTG9nLm11dGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBhcGkuZW1pdCgnY3VyYXRpb25SZXdhcmQnLCByZXdhcmRMb2cpOwogICAgICAgIGF3YWl0IHBheVVzZXIoc3ltYm9sLCB2b3RlUGF5LCB2b3RlLnZvdGVyLCByZXdhcmRQb29sLmNvbmZpZy5zdGFrZWRSZXdhcmRQZXJjZW50YWdlLCBtdXRlKTsKICAgICAgfQogICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCd2b3RlcycsIHZvdGUpOwogICAgfQogICAgcmVzcG9uc2Uudm90ZXNQcm9jZXNzZWQgKz0gdm90ZXNUb1BheW91dC5sZW5ndGg7CiAgICBpZiAodm90ZXNUb1BheW91dC5sZW5ndGggPCB2b3RlUXVlcnlMaW1pdCkgewogICAgICByZXNwb25zZS5kb25lID0gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3BvbnNlOwp9Cgphc3luYyBmdW5jdGlvbiBwYXlPdXRQb3N0KHJld2FyZFBvb2wsIHRva2VuLCBwb3N0LCBwYXJhbXMpIHsKICBjb25zdCByZXNwb25zZSA9IHsKICAgIHRvdGFsUGF5b3V0VmFsdWU6IDAsCiAgICB2b3Rlc1Byb2Nlc3NlZDogMCwKICAgIGRvbmU6IGZhbHNlLAogIH07CiAgaWYgKHBvc3QuZGVjbGluZVBheW91dCkgewogICAgYXBpLmVtaXQoJ2F1dGhvclJld2FyZCcsIHsKICAgICAgcmV3YXJkUG9vbElkOiBwb3N0LnJld2FyZFBvb2xJZCwKICAgICAgYXV0aG9ycGVybTogcG9zdC5hdXRob3JwZXJtLAogICAgICBzeW1ib2w6IHBvc3Quc3ltYm9sLAogICAgICBhY2NvdW50OiBwb3N0LmF1dGhvciwKICAgICAgcXVhbnRpdHk6ICcwJywKICAgIH0pOwogICAgcmVzcG9uc2UuZG9uZSA9IHRydWU7CiAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCdwb3N0cycsIHBvc3QpOwogICAgcmV0dXJuIHJlc3BvbnNlOwogIH0KICBjb25zdCBwb3N0Q2xhaW1zID0gY2FsY3VsYXRlV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLCBwb3N0LnZvdGVSc2hhcmVTdW0pOwogIGNvbnN0IHBvc3RQZW5kaW5nVG9rZW4gPSBhcGkuQmlnTnVtYmVyKHJld2FyZFBvb2wuaW50ZXJ2YWxQZW5kaW5nQ2xhaW1zKS5ndCgwKQogICAgPyBhcGkuQmlnTnVtYmVyKHJld2FyZFBvb2wuaW50ZXJ2YWxSZXdhcmRQb29sKS5tdWx0aXBsaWVkQnkocG9zdENsYWltcykKICAgICAgLmRpdmlkZWRCeShyZXdhcmRQb29sLmludGVydmFsUGVuZGluZ0NsYWltcykKICAgICAgLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pCiAgICA6ICcwJzsKICByZXNwb25zZS50b3RhbFBheW91dFZhbHVlID0gcG9zdFBlbmRpbmdUb2tlbjsKCiAgY29uc3QgY3VyYXRvclBvcnRpb24gPSBhcGkuQmlnTnVtYmVyKHBvc3RQZW5kaW5nVG9rZW4pCiAgICAubXVsdGlwbGllZEJ5KHJld2FyZFBvb2wuY29uZmlnLmN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSkKICAgIC5kaXZpZGVkQnkoMTAwKQogICAgLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIGNvbnN0IGF1dGhvckJlbmVQb3J0aW9uID0gYXBpLkJpZ051bWJlcihwb3N0UGVuZGluZ1Rva2VuKS5taW51cyhjdXJhdG9yUG9ydGlvbikKICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKCiAgY29uc3QgYmVuZWZpY2lhcmllc1BheW91dFZhbHVlID0gYXdhaXQgcGF5T3V0QmVuZWZpY2lhcmllcygKICAgIHJld2FyZFBvb2wsIHRva2VuLCBwb3N0LCBhdXRob3JCZW5lUG9ydGlvbiwKICApOwogIGNvbnN0IGF1dGhvclBvcnRpb24gPSBhcGkuQmlnTnVtYmVyKGF1dGhvckJlbmVQb3J0aW9uKS5taW51cyhiZW5lZmljaWFyaWVzUGF5b3V0VmFsdWUpCiAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CgogIGNvbnN0IGN1cmF0b3JQYXlTdGF0dXMgPSBhd2FpdCBwYXlPdXRDdXJhdG9ycyhyZXdhcmRQb29sLCB0b2tlbiwgcG9zdCwgY3VyYXRvclBvcnRpb24sIHBhcmFtcyk7CiAgcmVzcG9uc2Uudm90ZXNQcm9jZXNzZWQgKz0gY3VyYXRvclBheVN0YXR1cy52b3Rlc1Byb2Nlc3NlZDsKICByZXNwb25zZS5kb25lID0gY3VyYXRvclBheVN0YXR1cy5kb25lOwogIGlmIChjdXJhdG9yUGF5U3RhdHVzLmRvbmUpIHsKICAgIGNvbnN0IG11dGUgPSBhd2FpdCBnZXRNdXRlKHBvc3QucmV3YXJkUG9vbElkLCBwb3N0LmF1dGhvcik7CiAgICBjb25zdCByZXdhcmRMb2cgPSB7CiAgICAgIHJld2FyZFBvb2xJZDogcG9zdC5yZXdhcmRQb29sSWQsCiAgICAgIGF1dGhvcnBlcm06IHBvc3QuYXV0aG9ycGVybSwKICAgICAgc3ltYm9sOiBwb3N0LnN5bWJvbCwKICAgICAgYWNjb3VudDogcG9zdC5hdXRob3IsCiAgICAgIHF1YW50aXR5OiBhdXRob3JQb3J0aW9uLAogICAgfTsKICAgIGlmIChtdXRlKSB7CiAgICAgIHJld2FyZExvZy5tdXRlID0gdHJ1ZTsKICAgIH0KICAgIGFwaS5lbWl0KCdhdXRob3JSZXdhcmQnLCByZXdhcmRMb2cpOwogICAgYXdhaXQgcGF5VXNlcihwb3N0LnN5bWJvbCwgYXV0aG9yUG9ydGlvbiwgcG9zdC5hdXRob3IsCiAgICAgIHJld2FyZFBvb2wuY29uZmlnLnN0YWtlZFJld2FyZFBlcmNlbnRhZ2UsIG11dGUpOwogICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgncG9zdHMnLCBwb3N0KTsKICB9CiAgcmV0dXJuIHJlc3BvbnNlOwp9Cgphc3luYyBmdW5jdGlvbiBjb21wdXRlUG9zdFJld2FyZHMocGFyYW1zLCByZXdhcmRQb29sLCB0b2tlbiwgZW5kVGltZXN0YW1wKSB7CiAgY29uc3QgewogICAgbGFzdENsYWltRGVjYXlUaW1lc3RhbXAsCiAgfSA9IHJld2FyZFBvb2w7CiAgY29uc3QgewogICAgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCwKICAgIG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQsCiAgfSA9IHBhcmFtczsKCiAgY29uc3QgcG9zdHNUb1BheW91dCA9IGF3YWl0IGFwaS5kYi5maW5kKCdwb3N0cycsCiAgICB7CiAgICAgIHJld2FyZFBvb2xJZDogcmV3YXJkUG9vbC5faWQsCiAgICAgIGNhc2hvdXRUaW1lOiB7ICRndGU6IGxhc3RDbGFpbURlY2F5VGltZXN0YW1wLCAkbHRlOiBlbmRUaW1lc3RhbXAgfSwKICAgIH0sCiAgICBtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kLAogICAgMCwKICAgIFt7IGluZGV4OiAnYnlDYXNob3V0VGltZScsIGRlc2NlbmRpbmc6IGZhbHNlIH0sIHsgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgbGV0IGRvbmUgPSBmYWxzZTsKICBsZXQgZGVkdWN0RnJvbVJld2FyZFBvb2wgPSBhcGkuQmlnTnVtYmVyKDApOwogIGxldCB2b3Rlc1Byb2Nlc3NlZCA9IDA7CiAgaWYgKHBvc3RzVG9QYXlvdXQgJiYgcG9zdHNUb1BheW91dC5sZW5ndGggPiAwKSB7CiAgICBsZXQgbGltaXRSZWFjaGVkID0gZmFsc2U7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc3RzVG9QYXlvdXQubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgY29uc3QgcG9zdCA9IHBvc3RzVG9QYXlvdXRbaV07CiAgICAgIGNvbnN0IHBvc3RQYXlvdXRSZXNwb25zZSA9IGF3YWl0IHBheU91dFBvc3QocmV3YXJkUG9vbCwgdG9rZW4sIHBvc3QsIHBhcmFtcyk7CiAgICAgIGNvbnN0IHsgdG90YWxQYXlvdXRWYWx1ZSB9ID0gcG9zdFBheW91dFJlc3BvbnNlOwogICAgICB2b3Rlc1Byb2Nlc3NlZCArPSBwb3N0UGF5b3V0UmVzcG9uc2Uudm90ZXNQcm9jZXNzZWQ7CiAgICAgIGlmIChwb3N0UGF5b3V0UmVzcG9uc2UuZG9uZSkgewogICAgICAgIGRlZHVjdEZyb21SZXdhcmRQb29sID0gZGVkdWN0RnJvbVJld2FyZFBvb2wucGx1cyh0b3RhbFBheW91dFZhbHVlKTsKICAgICAgfQogICAgICBpZiAoIXBvc3RQYXlvdXRSZXNwb25zZS5kb25lIHx8IHZvdGVzUHJvY2Vzc2VkID49IG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQpIHsKICAgICAgICBsaW1pdFJlYWNoZWQgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoIWxpbWl0UmVhY2hlZCAmJiBwb3N0c1RvUGF5b3V0Lmxlbmd0aCA8IG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQpIHsKICAgICAgZG9uZSA9IHRydWU7CiAgICB9CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24KICAgIHJld2FyZFBvb2wucmV3YXJkUG9vbCA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5yZXdhcmRQb29sKQogICAgICAubWludXMoZGVkdWN0RnJvbVJld2FyZFBvb2wpCiAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICB9IGVsc2UgewogICAgZG9uZSA9IHRydWU7CiAgfQogIGlmIChkb25lKSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24KICAgIHJld2FyZFBvb2wubGFzdENsYWltRGVjYXlUaW1lc3RhbXAgPSBlbmRUaW1lc3RhbXA7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBwb3N0Q2xhaW1zSW5JbnRlcnZhbChwYXJhbXMsIHJld2FyZFBvb2wsIHN0YXJ0LCBlbmQpIHsKICBsZXQgcG9zdE9mZnNldCA9IDA7CiAgbGV0IG5ld1BlbmRpbmdDbGFpbXMgPSBhcGkuQmlnTnVtYmVyKDApOwogIGxldCBwb3N0c1RvUGF5b3V0ID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Bvc3RzJywKICAgIHsKICAgICAgcmV3YXJkUG9vbElkOiByZXdhcmRQb29sLl9pZCwKICAgICAgY2FzaG91dFRpbWU6IHsgJGd0ZTogc3RhcnQsICRsdGU6IGVuZCB9LAogICAgfSwKICAgIFBPU1RfUVVFUllfTElNSVQsCiAgICBwb3N0T2Zmc2V0LAogICAgW3sgaW5kZXg6ICdieUNhc2hvdXRUaW1lJywgZGVzY2VuZGluZzogZmFsc2UgfSwgeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICB3aGlsZSAocG9zdHNUb1BheW91dCAmJiBwb3N0c1RvUGF5b3V0Lmxlbmd0aCA+IDApIHsKICAgIG5ld1BlbmRpbmdDbGFpbXMgPSBuZXdQZW5kaW5nQ2xhaW1zLnBsdXMoCiAgICAgIHBvc3RzVG9QYXlvdXQucmVkdWNlKCh4LCB5KSA9PiB4LnBsdXMoY2FsY3VsYXRlV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLCB5LnZvdGVSc2hhcmVTdW0pKSwKICAgICAgICBhcGkuQmlnTnVtYmVyKDApKSwKICAgICkKICAgICAgLmRwKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICBpZiAocG9zdHNUb1BheW91dC5sZW5ndGggPCBQT1NUX1FVRVJZX0xJTUlUKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgcG9zdE9mZnNldCArPSBQT1NUX1FVRVJZX0xJTUlUOwogICAgcG9zdHNUb1BheW91dCA9IGF3YWl0IGFwaS5kYi5maW5kKCdwb3N0cycsCiAgICAgIHsKICAgICAgICByZXdhcmRQb29sSWQ6IHJld2FyZFBvb2wuX2lkLAogICAgICAgIGNhc2hvdXRUaW1lOiB7ICRndGU6IHN0YXJ0LCAkbHRlOiBlbmQgfSwKICAgICAgfSwKICAgICAgUE9TVF9RVUVSWV9MSU1JVCwKICAgICAgcG9zdE9mZnNldCwKICAgICAgW3sgaW5kZXg6ICdieUNhc2hvdXRUaW1lJywgZGVzY2VuZGluZzogZmFsc2UgfSwgeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICB9CiAgcmV0dXJuIG5ld1BlbmRpbmdDbGFpbXM7Cn0KCmFzeW5jIGZ1bmN0aW9uIHRva2VuTWFpbnRlbmFuY2UoKSB7CiAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBjb25zdCB7IGxhc3RNYWludGVuYW5jZUJsb2NrLCBsYXN0UHJvY2Vzc2VkUG9vbElkLCBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrIH0gPSBwYXJhbXM7CiAgaWYgKGxhc3RNYWludGVuYW5jZUJsb2NrID49IGFwaS5ibG9ja051bWJlcikgewogICAgcmV0dXJuOwogIH0KICBwYXJhbXMubGFzdE1haW50ZW5hbmNlQmxvY2sgPSBhcGkuYmxvY2tOdW1iZXI7CgogIC8vIENoZWNrcyBpZiByZWFkeSB0byBwcm9jZXNzIG5leHQgcmV3YXJkIGludGVydmFsCiAgY29uc3QgcmV3YXJkUG9vbFByb2Nlc3NpbmdFeHByZXNzaW9uID0gewogICAgJGx0ZTogWwogICAgICAnJGxhc3RDbGFpbURlY2F5VGltZXN0YW1wJywKICAgICAgewogICAgICAgICRzdWJ0cmFjdDogWwogICAgICAgICAgdGltZXN0YW1wLAogICAgICAgICAgewogICAgICAgICAgICAkbXVsdGlwbHk6IFsKICAgICAgICAgICAgICAnJGNvbmZpZy5yZXdhcmRJbnRlcnZhbFNlY29uZHMnLAogICAgICAgICAgICAgIDEwMDAsCiAgICAgICAgICAgIF0sCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgIH0sCiAgICBdLAogIH07CiAgbGV0IHJld2FyZFBvb2xzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Jld2FyZFBvb2xzJywgewogICAgYWN0aXZlOiB0cnVlLAogICAgJGV4cHI6IHJld2FyZFBvb2xQcm9jZXNzaW5nRXhwcmVzc2lvbiwKICAgIF9pZDogeyAkZ3Q6IGxhc3RQcm9jZXNzZWRQb29sSWQgfSwKICB9LCBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrLCAwLCBbeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICBpZiAoIXJld2FyZFBvb2xzIHx8IHJld2FyZFBvb2xzLmxlbmd0aCA8IG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2spIHsKICAgIGlmICghcmV3YXJkUG9vbHMpIHsKICAgICAgcmV3YXJkUG9vbHMgPSBbXTsKICAgIH0KICAgIC8vIGF1Z21lbnQgZnJvbSBiZWdpbm5pbmcKICAgIGNvbnN0IG1vcmVSZXdhcmRQb29scyA9IGF3YWl0IGFwaS5kYi5maW5kKCdyZXdhcmRQb29scycsIHsKICAgICAgYWN0aXZlOiB0cnVlLAogICAgICAkZXhwcjogcmV3YXJkUG9vbFByb2Nlc3NpbmdFeHByZXNzaW9uLAogICAgfSwgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jayAtIHJld2FyZFBvb2xzLmxlbmd0aCwgMCwgW3sgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocmV3YXJkUG9vbHMubWFwKHAgPT4gcC5faWQpKTsKICAgIG1vcmVSZXdhcmRQb29scy5mb3JFYWNoKChtcnApID0+IHsKICAgICAgaWYgKCFleGlzdGluZ0lkcy5oYXMobXJwLl9pZCkpIHsKICAgICAgICByZXdhcmRQb29scy5wdXNoKG1ycCk7CiAgICAgIH0KICAgIH0pOwogIH0KICBpZiAocmV3YXJkUG9vbHMpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV3YXJkUG9vbHMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgY29uc3QgcmV3YXJkUG9vbCA9IHJld2FyZFBvb2xzW2ldOwogICAgICBwYXJhbXMubGFzdFByb2Nlc3NlZFBvb2xJZCA9IHJld2FyZFBvb2wuX2lkOwogICAgICBjb25zdCB7CiAgICAgICAgc3ltYm9sLAogICAgICAgIGxhc3RDbGFpbURlY2F5VGltZXN0YW1wLAogICAgICAgIGxhc3RSZXdhcmRUaW1lc3RhbXAsCiAgICAgICAgY29uZmlnLAogICAgICB9ID0gcmV3YXJkUG9vbDsKICAgICAgY29uc3QgewogICAgICAgIHJld2FyZEludGVydmFsU2Vjb25kcywKICAgICAgICByZXdhcmRQZXJJbnRlcnZhbCwKICAgICAgICBjYXNob3V0V2luZG93RGF5cywKICAgICAgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKICAgICAgY29uc3QgcmV3YXJkSW50ZXJ2YWxEdXJhdGlvbk1pbGxpcyA9IHJld2FyZEludGVydmFsU2Vjb25kcyAqIDEwMDA7CiAgICAgIGNvbnN0IG5leHRSZXdhcmRUaW1lc3RhbXAgPSBsYXN0UmV3YXJkVGltZXN0YW1wICsgcmV3YXJkSW50ZXJ2YWxEdXJhdGlvbk1pbGxpczsKICAgICAgY29uc3QgbmV4dENsYWltRGVjYXlUaW1lc3RhbXAgPSBsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcCArIHJld2FyZEludGVydmFsRHVyYXRpb25NaWxsaXM7CiAgICAgIGlmIChuZXh0Q2xhaW1EZWNheVRpbWVzdGFtcCA+PSBuZXh0UmV3YXJkVGltZXN0YW1wKSB7CiAgICAgICAgY29uc3QgcmV3YXJkVG9BZGQgPSBhcGkuQmlnTnVtYmVyKHJld2FyZFBlckludGVydmFsKTsKICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihyZXdhcmRUb0FkZCkuZ3QoMCkpIHsKICAgICAgICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgJ2lzc3VlVG9Db250cmFjdCcsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBzeW1ib2w6IHJld2FyZFBvb2wuc3ltYm9sLCBxdWFudGl0eTogcmV3YXJkVG9BZGQsIHRvOiAnY29tbWVudHMnLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXk6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgcmV3YXJkUG9vbC5yZXdhcmRQb29sID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLnJld2FyZFBvb2wpLnBsdXMocmV3YXJkVG9BZGQpCiAgICAgICAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgICAgICB9CiAgICAgICAgLy8gY2xhaW0gYWRqdXN0bWVudHMgKGRlY2F5ICsgcG9zdHMgdG8gcGF5IG91dCBpbiBuZXh0IGludGVydmFsKQogICAgICAgIGNvbnN0IGNsYWltc0RlY2F5UGVyaW9kRGF5cyA9IGNhc2hvdXRXaW5kb3dEYXlzICogMiArIDE7CiAgICAgICAgY29uc3QgYWRqdXN0TnVtZXIgPSBuZXh0UmV3YXJkVGltZXN0YW1wIC0gbGFzdFJld2FyZFRpbWVzdGFtcDsKICAgICAgICBjb25zdCBhZGp1c3REZW5vbSA9IGNsYWltc0RlY2F5UGVyaW9kRGF5cyAqIDI0ICogMzYwMCAqIDEwMDA7CiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduCiAgICAgICAgcmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLnBlbmRpbmdDbGFpbXMpCiAgICAgICAgICAubWludXMoYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLnBlbmRpbmdDbGFpbXMpCiAgICAgICAgICAgIC5tdWx0aXBsaWVkQnkoYWRqdXN0TnVtZXIpCiAgICAgICAgICAgIC5kaXZpZGVkQnkoYWRqdXN0RGVub20pKQogICAgICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgICAgICAvLyBBZGQgcG9zdHMgY2xhaW1zLCBjb21wdXRlIHN1YnNlcXVlbnQgcmV3YXJkcyBiYXNlZCBvbiBpbmNsdXNpb24gaW50byBjbGFpbXMgdG8KICAgICAgICAvLyBlbnN1cmUgaXQgY2Fubm90IHRha2UgbW9yZSBvZiB0aGUgY3VycmVudCBwb29sCiAgICAgICAgcmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLnBlbmRpbmdDbGFpbXMpCiAgICAgICAgICAucGx1cygKICAgICAgICAgICAgYXdhaXQgcG9zdENsYWltc0luSW50ZXJ2YWwoCiAgICAgICAgICAgICAgcGFyYW1zLCByZXdhcmRQb29sLCBsYXN0UmV3YXJkVGltZXN0YW1wLCBuZXh0UmV3YXJkVGltZXN0YW1wLAogICAgICAgICAgICApLAogICAgICAgICAgKQogICAgICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKCiAgICAgICAgcmV3YXJkUG9vbC5sYXN0UmV3YXJkVGltZXN0YW1wID0gbmV4dFJld2FyZFRpbWVzdGFtcDsKICAgICAgICAvLyBjb3B5IGNsYWltcyBhbmQgcmV3YXJkcyBmb3IgY3VycmVudCByZXdhcmQgaW50ZXJ2YWwKICAgICAgICByZXdhcmRQb29sLmludGVydmFsUGVuZGluZ0NsYWltcyA9IHJld2FyZFBvb2wucGVuZGluZ0NsYWltczsKICAgICAgICByZXdhcmRQb29sLmludGVydmFsUmV3YXJkUG9vbCA9IHJld2FyZFBvb2wucmV3YXJkUG9vbDsKICAgICAgfQogICAgICAvLyBDb21wdXRlIHBvc3QgcmV3YXJkcwogICAgICBhd2FpdCBjb21wdXRlUG9zdFJld2FyZHMocGFyYW1zLCByZXdhcmRQb29sLCB0b2tlbiwgbmV4dENsYWltRGVjYXlUaW1lc3RhbXApOwogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdyZXdhcmRQb29scycsIHJld2FyZFBvb2wpOwogICAgfQogIH0KICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwYXJhbXMnLCBwYXJhbXMpOwp9CgphY3Rpb25zLmNyZWF0ZVJld2FyZFBvb2wgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHN5bWJvbCwKICAgIGNvbmZpZywKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKICBpZiAoIWFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAnb3BlcmF0aW9uIG11c3QgYmUgc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykpIHsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyBzZXR1cEZlZSwgbWF4VGFnc1BlclBvb2wgfSA9IHBhcmFtczsKCiAgLy8gZ2V0IGFwaS5zZW5kZXIncyBVVElMSVRZX1RPS0VOX1NZTUJPTCBiYWxhbmNlCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogIGNvbnN0IHV0aWxpdHlUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiAiQkVFIiB9KTsKCiAgY29uc3QgYXV0aG9yaXplZENyZWF0aW9uID0gYXBpLkJpZ051bWJlcihzZXR1cEZlZSkubHRlKDApIHx8IGFwaS5zZW5kZXIgPT09IGFwaS5vd25lcgogICAgPyB0cnVlCiAgICA6IHV0aWxpdHlUb2tlbkJhbGFuY2UgJiYgYXBpLkJpZ051bWJlcih1dGlsaXR5VG9rZW5CYWxhbmNlLmJhbGFuY2UpLmd0ZShzZXR1cEZlZSk7CgogIGlmICghYXBpLmFzc2VydChhdXRob3JpemVkQ3JlYXRpb24sICd5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGNyZWF0aW9uIGZlZScpKSByZXR1cm47CgoKICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgndG9rZW5zJywgJ3Rva2VucycsIHsgc3ltYm9sIH0pOwogIGlmICghYXBpLmFzc2VydCh0b2tlbiwgJ3Rva2VuIG5vdCBmb3VuZCcpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JywgJ2NvbmZpZyBpbnZhbGlkJykpIHJldHVybjsKCiAgY29uc3QgewogICAgcG9zdFJld2FyZEN1cnZlLAogICAgcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyLAogICAgY3VyYXRpb25SZXdhcmRDdXJ2ZSwKICAgIGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIsCiAgICBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UsCiAgICBjYXNob3V0V2luZG93RGF5cywKICAgIHJld2FyZFBlckludGVydmFsLAogICAgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzLAogICAgdm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBzdGFrZWRSZXdhcmRQZXJjZW50YWdlLAogICAgdm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICB0YWdzLAogIH0gPSBjb25maWc7CgogIGlmICghYXBpLmFzc2VydChwb3N0UmV3YXJkQ3VydmUgJiYgcG9zdFJld2FyZEN1cnZlID09PSAncG93ZXInLCAncG9zdFJld2FyZEN1cnZlIHNob3VsZCBiZSBvbmUgb2Y6IFtwb3dlcl0nKSkgcmV0dXJuOwogIGNvbnN0IHBvc3RFeHBvbmVudCA9IGFwaS5CaWdOdW1iZXIocG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyKTsKICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlciA9PT0gJ3N0cmluZycgJiYgcG9zdEV4cG9uZW50LmlzRmluaXRlKCkgJiYgcG9zdEV4cG9uZW50Lmd0ZSgnMScpICYmIHBvc3RFeHBvbmVudC5sdGUoJzInKSAmJiBwb3N0RXhwb25lbnQuZHAoKSA8PSAyLCAncG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyIHNob3VsZCBiZSBiZXR3ZWVuICIxIiBhbmQgIjIiIHdpdGggcHJlY2lzaW9uIGF0IG1vc3QgMicpKSByZXR1cm47CgogIGlmICghYXBpLmFzc2VydChjdXJhdGlvblJld2FyZEN1cnZlICYmIGN1cmF0aW9uUmV3YXJkQ3VydmUgPT09ICdwb3dlcicsICdjdXJhdGlvblJld2FyZEN1cnZlIHNob3VsZCBiZSBvbmUgb2Y6IFtwb3dlcl0nKSkgcmV0dXJuOwogIGNvbnN0IGN1cmF0aW9uRXhwb25lbnQgPSBhcGkuQmlnTnVtYmVyKGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIpOwogIGlmICghYXBpLmFzc2VydCh0eXBlb2YgY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlciA9PT0gJ3N0cmluZycgJiYgY3VyYXRpb25FeHBvbmVudC5pc0Zpbml0ZSgpICYmIGN1cmF0aW9uRXhwb25lbnQuZ3RlKCcwLjUnKSAmJiBjdXJhdGlvbkV4cG9uZW50Lmx0ZSgnMScpICYmIGN1cmF0aW9uRXhwb25lbnQuZHAoKSA8PSAyLCAnY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlciBjYW4gb25seSBiZSBiZXR3ZWVuICIwLjUiIGFuZCAiMSIgd2l0aCBwcmVjaXNpb24gYXQgbW9zdCAyJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIoY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlKSAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPj0gMCAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPD0gMTAwLCAnY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KGNhc2hvdXRXaW5kb3dEYXlzICYmIE51bWJlci5pc0ludGVnZXIoY2FzaG91dFdpbmRvd0RheXMpICYmIGNhc2hvdXRXaW5kb3dEYXlzID49IDEgJiYgY2FzaG91dFdpbmRvd0RheXMgPD0gMzAsICdjYXNob3V0V2luZG93RGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwJykpIHJldHVybjsKCiAgY29uc3QgcGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwgPSBhcGkuQmlnTnVtYmVyKHJld2FyZFBlckludGVydmFsKTsKICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHJld2FyZFBlckludGVydmFsID09PSAnc3RyaW5nJyAmJiBwYXJzZWRSZXdhcmRQZXJJbnRlcnZhbC5pc0Zpbml0ZSgpICYmIHBhcnNlZFJld2FyZFBlckludGVydmFsLmd0KDApLCAncmV3YXJkUGVySW50ZXJ2YWwgaW52YWxpZCcpCiAgICAgICAgfHwgIWFwaS5hc3NlcnQocGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwuZHAoKSA8PSB0b2tlbi5wcmVjaXNpb24sICd0b2tlbiBwcmVjaXNpb24gbWlzbWF0Y2ggZm9yIHJld2FyZFBlckludGVydmFsJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KHJld2FyZEludGVydmFsU2Vjb25kcyAmJiBOdW1iZXIuaXNJbnRlZ2VyKHJld2FyZEludGVydmFsU2Vjb25kcykgJiYgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzID49IDMgJiYgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzIDw9IDg2NDAwICYmIHJld2FyZEludGVydmFsU2Vjb25kcyAlIDMgPT09IDAsICdyZXdhcmRJbnRlcnZhbFNlY29uZHMgc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAzIGFuZCA4NjQwMCwgYW5kIGRpdmlzaWJsZSBieSAzJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KHZvdGVSZWdlbmVyYXRpb25EYXlzICYmIE51bWJlci5pc0ludGVnZXIodm90ZVJlZ2VuZXJhdGlvbkRheXMpICYmIHZvdGVSZWdlbmVyYXRpb25EYXlzID49IDEgJiYgdm90ZVJlZ2VuZXJhdGlvbkRheXMgPD0gMzAsICd2b3RlUmVnZW5lcmF0aW9uRGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzICYmIE51bWJlci5pc0ludGVnZXIoZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzKSAmJiBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMgPj0gMSAmJiBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMgPD0gMzAsICdkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMgc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAzMCcpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIoc3Rha2VkUmV3YXJkUGVyY2VudGFnZSkgJiYgc3Rha2VkUmV3YXJkUGVyY2VudGFnZSA+PSAwICYmIHN0YWtlZFJld2FyZFBlcmNlbnRhZ2UgPD0gMTAwLCAnc3Rha2VkUmV3YXJkUGVyY2VudGFnZSBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMCcpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KHZvdGVQb3dlckNvbnN1bXB0aW9uICYmIE51bWJlci5pc0ludGVnZXIodm90ZVBvd2VyQ29uc3VtcHRpb24pICYmIHZvdGVQb3dlckNvbnN1bXB0aW9uID49IDEgJiYgdm90ZVBvd2VyQ29uc3VtcHRpb24gPD0gMTAwMDAsICd2b3RlUG93ZXJDb25zdW1wdGlvbiBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMDAwJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uICYmIE51bWJlci5pc0ludGVnZXIoZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uKSAmJiBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24gPj0gMSAmJiBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24gPD0gMTAwMDAsICdkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24gc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAwMCcpKSByZXR1cm47CgogIGlmICghYXBpLmFzc2VydChBcnJheS5pc0FycmF5KHRhZ3MpICYmIHRhZ3MubGVuZ3RoID49IDEgJiYgdGFncy5sZW5ndGggPD0gbWF4VGFnc1BlclBvb2wgJiYgdGFncy5ldmVyeSh0ID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyksIGB0YWdzIHNob3VsZCBiZSBhIG5vbi1lbXB0eSBhcnJheSBvZiBzdHJpbmdzIG9mIGxlbmd0aCBhdCBtb3N0ICR7bWF4VGFnc1BlclBvb2x9YCkpIHJldHVybjsKCiAgLy8gZm9yIG5vdywgcmVzdHJpY3QgdG8gMSBwb29sIHBlciBzeW1ib2wsIGFuZCBjcmVhdG9yIG11c3QgYmUgaXNzdWVyLgogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKICBpZiAoIWFwaS5hc3NlcnQoYXBpLnNlbmRlciA9PT0gdG9rZW4uaXNzdWVyIHx8IChhcGkuc2VuZGVyID09PSBhcGkub3duZXIgJiYgdG9rZW4uc3ltYm9sID09PSAiQkVFIiksICdtdXN0IGJlIGlzc3VlciBvZiB0b2tlbicpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KHRva2VuLnN0YWtpbmdFbmFibGVkLCAndG9rZW4gbXVzdCBoYXZlIHN0YWtpbmcgZW5hYmxlZCcpKSByZXR1cm47CgogIGNvbnN0IGV4aXN0aW5nUmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgc3ltYm9sIH0pOwogIGlmICghYXBpLmFzc2VydCghZXhpc3RpbmdSZXdhcmRQb29sLCAnY2Fubm90IGNyZWF0ZSBtdWx0aXBsZSByZXdhcmQgcG9vbHMgcGVyIHRva2VuJykpIHJldHVybjsKCiAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CgogIGNvbnN0IHJld2FyZFBvb2wgPSB7CiAgICBzeW1ib2wsCiAgICByZXdhcmRQb29sOiAnMCcsCiAgICBsYXN0UmV3YXJkVGltZXN0YW1wOiB0aW1lc3RhbXAsCiAgICBsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcDogdGltZXN0YW1wLAogICAgY3JlYXRlZFRpbWVzdGFtcDogdGltZXN0YW1wLAogICAgY29uZmlnOiB7CiAgICAgIHBvc3RSZXdhcmRDdXJ2ZSwKICAgICAgcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyLAogICAgICBjdXJhdGlvblJld2FyZEN1cnZlLAogICAgICBjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyLAogICAgICBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UsCiAgICAgIGNhc2hvdXRXaW5kb3dEYXlzLAogICAgICByZXdhcmRQZXJJbnRlcnZhbCwKICAgICAgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzLAogICAgICB2b3RlUmVnZW5lcmF0aW9uRGF5cywKICAgICAgZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzLAogICAgICBzdGFrZWRSZXdhcmRQZXJjZW50YWdlLAogICAgICB2b3RlUG93ZXJDb25zdW1wdGlvbiwKICAgICAgZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uLAogICAgICB0YWdzLAogICAgfSwKICAgIHBlbmRpbmdDbGFpbXM6ICcwJywKICAgIGFjdGl2ZTogdHJ1ZSwKICB9OwogIGNvbnN0IGluc2VydGVkUmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3Jld2FyZFBvb2xzJywgcmV3YXJkUG9vbCk7CiAgLy8gYnVybiB0aGUgdG9rZW4gY3JlYXRpb24gZmVlcwogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIgJiYgYXBpLkJpZ051bWJlcihzZXR1cEZlZSkuZ3QoMCkpIHsKICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgJ3RyYW5zZmVyJywgewogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCiAgICAgIHRvOiAnbnVsbCcsIHN5bWJvbDogIkJFRSIsIHF1YW50aXR5OiBzZXR1cEZlZSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CiAgfQogIGFwaS5lbWl0KCdjcmVhdGVSZXdhcmRQb29sJywgeyBfaWQ6IGluc2VydGVkUmV3YXJkUG9vbC5faWQgfSk7Cn07CgphY3Rpb25zLnVwZGF0ZVJld2FyZFBvb2wgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHJld2FyZFBvb2xJZCwKICAgIGNvbmZpZywKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKICBpZiAoIWFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAnb3BlcmF0aW9uIG11c3QgYmUgc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykpIHsKICAgIHJldHVybjsKICB9CiAgLy8gZ2V0IGNvbnRyYWN0IHBhcmFtcwogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyB1cGRhdGVGZWUsIG1heFRhZ3NQZXJQb29sIH0gPSBwYXJhbXM7CiAgLy8gZ2V0IGFwaS5zZW5kZXIncyBVVElMSVRZX1RPS0VOX1NZTUJPTCBiYWxhbmNlCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogIGNvbnN0IHV0aWxpdHlUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiAiQkVFIiB9KTsKCiAgY29uc3QgYXV0aG9yaXplZCA9IGFwaS5CaWdOdW1iZXIodXBkYXRlRmVlKS5sdGUoMCkgfHwgYXBpLnNlbmRlciA9PT0gYXBpLm93bmVyCiAgICA/IHRydWUKICAgIDogdXRpbGl0eVRva2VuQmFsYW5jZSAmJiBhcGkuQmlnTnVtYmVyKHV0aWxpdHlUb2tlbkJhbGFuY2UuYmFsYW5jZSkuZ3RlKHVwZGF0ZUZlZSk7CgogIGlmICghYXBpLmFzc2VydChhdXRob3JpemVkLCAneW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSB1cGRhdGUgZmVlJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JywgJ2NvbmZpZyBpbnZhbGlkJykpIHJldHVybjsKCiAgY29uc3QgewogICAgcG9zdFJld2FyZEN1cnZlLAogICAgcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyLAogICAgY3VyYXRpb25SZXdhcmRDdXJ2ZSwKICAgIGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIsCiAgICBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UsCiAgICBjYXNob3V0V2luZG93RGF5cywKICAgIHJld2FyZFBlckludGVydmFsLAogICAgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzLAogICAgdm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBzdGFrZWRSZXdhcmRQZXJjZW50YWdlLAogICAgdm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICB0YWdzLAogIH0gPSBjb25maWc7CgogIGNvbnN0IGV4aXN0aW5nUmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgX2lkOiByZXdhcmRQb29sSWQgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KGV4aXN0aW5nUmV3YXJkUG9vbCwgJ3Jld2FyZCBwb29sIG5vdCBmb3VuZCcpKSByZXR1cm47CgogIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IGV4aXN0aW5nUmV3YXJkUG9vbC5zeW1ib2wgfSk7CgogIGlmICghYXBpLmFzc2VydChwb3N0UmV3YXJkQ3VydmUgJiYgcG9zdFJld2FyZEN1cnZlID09PSAncG93ZXInLCAncG9zdFJld2FyZEN1cnZlIHNob3VsZCBiZSBvbmUgb2Y6IFtwb3dlcl0nKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlID0gcG9zdFJld2FyZEN1cnZlOwoKICBjb25zdCBwb3N0RXhwb25lbnQgPSBhcGkuQmlnTnVtYmVyKHBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcik7CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiBwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIgPT09ICdzdHJpbmcnICYmIHBvc3RFeHBvbmVudC5pc0Zpbml0ZSgpICYmIHBvc3RFeHBvbmVudC5ndGUoJzEnKSAmJiBwb3N0RXhwb25lbnQubHRlKCcyJykgJiYgcG9zdEV4cG9uZW50LmRwKCkgPD0gMiwgJ3Bvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlciBzaG91bGQgYmUgYmV0d2VlbiAiMSIgYW5kICIyIiB3aXRoIHByZWNpc2lvbiBhdCBtb3N0IDInKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyID0gcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyOwoKICBpZiAoIWFwaS5hc3NlcnQoY3VyYXRpb25SZXdhcmRDdXJ2ZSAmJiBjdXJhdGlvblJld2FyZEN1cnZlID09PSAncG93ZXInLCAnY3VyYXRpb25SZXdhcmRDdXJ2ZSBzaG91bGQgYmUgb25lIG9mOiBbcG93ZXJdJykpIHJldHVybjsKICBjb25zdCBjdXJhdGlvbkV4cG9uZW50ID0gYXBpLkJpZ051bWJlcihjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyKTsKICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIgPT09ICdzdHJpbmcnICYmIGN1cmF0aW9uRXhwb25lbnQuaXNGaW5pdGUoKSAmJiBjdXJhdGlvbkV4cG9uZW50Lmd0ZSgnMC41JykgJiYgY3VyYXRpb25FeHBvbmVudC5sdGUoJzEnKSAmJiBjdXJhdGlvbkV4cG9uZW50LmRwKCkgPD0gMiwgJ2N1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIgY2FuIG9ubHkgYmUgYmV0d2VlbiAiMC41IiBhbmQgIjEiIHdpdGggcHJlY2lzaW9uIGF0IG1vc3QgMicpKSByZXR1cm47CiAgZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyID0gY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcjsKCiAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIoY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlKSAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPj0gMCAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPD0gMTAwLCAnY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwJykpIHJldHVybjsKICBleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLmN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSA9IGN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZTsKCiAgaWYgKCFhcGkuYXNzZXJ0KGNhc2hvdXRXaW5kb3dEYXlzICYmIE51bWJlci5pc0ludGVnZXIoY2FzaG91dFdpbmRvd0RheXMpICYmIGNhc2hvdXRXaW5kb3dEYXlzID49IDEgJiYgY2FzaG91dFdpbmRvd0RheXMgPD0gMzAsICdjYXNob3V0V2luZG93RGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwJykpIHJldHVybjsKICBleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLmNhc2hvdXRXaW5kb3dEYXlzID0gY2FzaG91dFdpbmRvd0RheXM7CgogIGNvbnN0IHBhcnNlZFJld2FyZFBlckludGVydmFsID0gYXBpLkJpZ051bWJlcihyZXdhcmRQZXJJbnRlcnZhbCk7CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiByZXdhcmRQZXJJbnRlcnZhbCA9PT0gJ3N0cmluZycgJiYgcGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwuaXNGaW5pdGUoKSAmJiBwYXJzZWRSZXdhcmRQZXJJbnRlcnZhbC5ndCgwKSwgJ3Jld2FyZFBlckludGVydmFsIGludmFsaWQnKQogICAgICAgIHx8ICFhcGkuYXNzZXJ0KHBhcnNlZFJld2FyZFBlckludGVydmFsLmRwKCkgPD0gdG9rZW4ucHJlY2lzaW9uLCAndG9rZW4gcHJlY2lzaW9uIG1pc21hdGNoIGZvciByZXdhcmRQZXJJbnRlcnZhbCcpKSByZXR1cm47CiAgZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5yZXdhcmRQZXJJbnRlcnZhbCA9IHJld2FyZFBlckludGVydmFsOwoKICBpZiAoIWFwaS5hc3NlcnQocmV3YXJkSW50ZXJ2YWxTZWNvbmRzICYmIE51bWJlci5pc0ludGVnZXIocmV3YXJkSW50ZXJ2YWxTZWNvbmRzKSAmJiByZXdhcmRJbnRlcnZhbFNlY29uZHMgPj0gMyAmJiByZXdhcmRJbnRlcnZhbFNlY29uZHMgPD0gODY0MDAgJiYgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzICUgMyA9PT0gMCwgJ3Jld2FyZEludGVydmFsU2Vjb25kcyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDMgYW5kIDg2NDAwLCBhbmQgZGl2aXNpYmxlIGJ5IDMnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucmV3YXJkSW50ZXJ2YWxTZWNvbmRzID0gcmV3YXJkSW50ZXJ2YWxTZWNvbmRzOwoKICBpZiAoIWFwaS5hc3NlcnQodm90ZVJlZ2VuZXJhdGlvbkRheXMgJiYgTnVtYmVyLmlzSW50ZWdlcih2b3RlUmVnZW5lcmF0aW9uRGF5cykgJiYgdm90ZVJlZ2VuZXJhdGlvbkRheXMgPj0gMSAmJiB2b3RlUmVnZW5lcmF0aW9uRGF5cyA8PSAzMCwgJ3ZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcudm90ZVJlZ2VuZXJhdGlvbkRheXMgPSB2b3RlUmVnZW5lcmF0aW9uRGF5czsKCiAgaWYgKCFhcGkuYXNzZXJ0KGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cykgJiYgZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzID49IDEgJiYgZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzIDw9IDMwLCAnZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzID0gZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzOwoKICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihzdGFrZWRSZXdhcmRQZXJjZW50YWdlKSAmJiBzdGFrZWRSZXdhcmRQZXJjZW50YWdlID49IDAgJiYgc3Rha2VkUmV3YXJkUGVyY2VudGFnZSA8PSAxMDAsICdzdGFrZWRSZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwJykpIHJldHVybjsKICBleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLnN0YWtlZFJld2FyZFBlcmNlbnRhZ2UgPSBzdGFrZWRSZXdhcmRQZXJjZW50YWdlOwoKICBpZiAoIWFwaS5hc3NlcnQodm90ZVBvd2VyQ29uc3VtcHRpb24gJiYgTnVtYmVyLmlzSW50ZWdlcih2b3RlUG93ZXJDb25zdW1wdGlvbikgJiYgdm90ZVBvd2VyQ29uc3VtcHRpb24gPj0gMSAmJiB2b3RlUG93ZXJDb25zdW1wdGlvbiA8PSAxMDAwMCwgJ3ZvdGVQb3dlckNvbnN1bXB0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcudm90ZVBvd2VyQ29uc3VtcHRpb24gPSB2b3RlUG93ZXJDb25zdW1wdGlvbjsKCiAgaWYgKCFhcGkuYXNzZXJ0KGRvd252b3RlUG93ZXJDb25zdW1wdGlvbiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUG93ZXJDb25zdW1wdGlvbikgJiYgZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uID49IDEgJiYgZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uIDw9IDEwMDAwLCAnZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uID0gZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uOwoKICBpZiAoIWFwaS5hc3NlcnQoQXJyYXkuaXNBcnJheSh0YWdzKSAmJiB0YWdzLmxlbmd0aCA+PSAxICYmIHRhZ3MubGVuZ3RoIDw9IG1heFRhZ3NQZXJQb29sICYmIHRhZ3MuZXZlcnkodCA9PiB0eXBlb2YgdCA9PT0gJ3N0cmluZycpLCBgdGFncyBzaG91bGQgYmUgYSBub24tZW1wdHkgYXJyYXkgb2Ygc3RyaW5ncyBvZiBsZW5ndGggYXQgbW9zdCAke21heFRhZ3NQZXJQb29sfWApKSByZXR1cm47CiAgZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy50YWdzID0gdGFnczsKCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogIGlmICghYXBpLmFzc2VydChhcGkuc2VuZGVyID09PSB0b2tlbi5pc3N1ZXIgfHwgKGFwaS5zZW5kZXIgPT09IGFwaS5vd25lciAmJiB0b2tlbi5zeW1ib2wgPT09ICJCRUUiKSwgJ211c3QgYmUgaXNzdWVyIG9mIHRva2VuJykpIHJldHVybjsKCiAgLy8gYnVybiB0aGUgZmVlcwogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIgJiYgYXBpLkJpZ051bWJlcih1cGRhdGVGZWUpLmd0KDApKSB7CiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICd0cmFuc2ZlcicsIHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogICAgICB0bzogJ251bGwnLCBzeW1ib2w6ICJCRUUiLCBxdWFudGl0eTogdXBkYXRlRmVlLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICB9KTsKICB9CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Jld2FyZFBvb2xzJywgZXhpc3RpbmdSZXdhcmRQb29sKTsKfTsKCmFjdGlvbnMuc2V0QWN0aXZlID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICByZXdhcmRQb29sSWQsCiAgICBhY3RpdmUsCiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CiAgaWYgKCFhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ29wZXJhdGlvbiBtdXN0IGJlIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpKSB7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBleGlzdGluZ1Jld2FyZFBvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncmV3YXJkUG9vbHMnLCB7IF9pZDogcmV3YXJkUG9vbElkIH0pOwogIGlmICghYXBpLmFzc2VydChleGlzdGluZ1Jld2FyZFBvb2wsICdyZXdhcmQgcG9vbCBub3QgZm91bmQnKSkgcmV0dXJuOwogIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IGV4aXN0aW5nUmV3YXJkUG9vbC5zeW1ib2wgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09IHRva2VuLmlzc3VlciB8fCBhcGkuc2VuZGVyID09PSBhcGkub3duZXIsICdtdXN0IGJlIGlzc3VlciBvZiB0b2tlbicpKSByZXR1cm47CgogIGV4aXN0aW5nUmV3YXJkUG9vbC5hY3RpdmUgPSBhY3RpdmU7CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncmV3YXJkUG9vbHMnLCBleGlzdGluZ1Jld2FyZFBvb2wpOwp9OwoKYWN0aW9ucy5zZXRNdXRlID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICByZXdhcmRQb29sSWQsCiAgICBhY2NvdW50LAogICAgbXV0ZSwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKCFhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ29wZXJhdGlvbiBtdXN0IGJlIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IGV4aXN0aW5nUmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgX2lkOiByZXdhcmRQb29sSWQgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KGV4aXN0aW5nUmV3YXJkUG9vbCwgJ3Jld2FyZCBwb29sIG5vdCBmb3VuZCcpKSByZXR1cm47CiAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbDogZXhpc3RpbmdSZXdhcmRQb29sLnN5bWJvbCB9KTsKICBpZiAoIWFwaS5hc3NlcnQoYXBpLnNlbmRlciA9PT0gdG9rZW4uaXNzdWVyIHx8IGFwaS5zZW5kZXIgPT09IGFwaS5vd25lciwgJ211c3QgYmUgaXNzdWVyIG9mIHRva2VuJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoYXBpLmlzVmFsaWRBY2NvdW50TmFtZShhY2NvdW50KSwgJ2ludmFsaWQgYWNjb3VudCcpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiBtdXRlID09PSAnYm9vbGVhbicsICdtdXRlIG11c3QgYmUgYSBib29sZWFuJykpIHJldHVybjsKCiAgY29uc3Qgdm90aW5nUG93ZXIgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndm90aW5nUG93ZXInLCB7IHJld2FyZFBvb2xJZCwgYWNjb3VudCB9KTsKICBpZiAoIXZvdGluZ1Bvd2VyKSB7CiAgICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CiAgICBjb25zdCB0aW1lc3RhbXAgPSBibG9ja0RhdGUuZ2V0VGltZSgpOwogICAgY29uc3QgbmV3Vm90aW5nUG93ZXIgPSB7CiAgICAgIHJld2FyZFBvb2xJZCwKICAgICAgYWNjb3VudCwKICAgICAgbGFzdFZvdGVUaW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgdm90aW5nUG93ZXI6IE1BWF9WT1RJTkdfUE9XRVIsCiAgICAgIGRvd252b3RpbmdQb3dlcjogTUFYX1ZPVElOR19QT1dFUiwKICAgICAgbXV0ZSwKICAgIH07CiAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCd2b3RpbmdQb3dlcicsIG5ld1ZvdGluZ1Bvd2VyKTsKICB9IGVsc2UgewogICAgdm90aW5nUG93ZXIubXV0ZSA9IG11dGU7CiAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd2b3RpbmdQb3dlcicsIHZvdGluZ1Bvd2VyKTsKICB9Cn07Cgphc3luYyBmdW5jdGlvbiBnZXRSZXdhcmRQb29sSWRzKHBheWxvYWQpIHsKICBjb25zdCB7CiAgICByZXdhcmRQb29scywKICAgIGpzb25NZXRhZGF0YSwKICAgIHBhcmVudEF1dGhvciwKICAgIHBhcmVudFBlcm1saW5rLAogIH0gPSBwYXlsb2FkOwoKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwoKICAvLyBDaGVjayBpZiBpdCBpcyBhIHJlcGx5LCBhbmQgaW5oZXJpdCB0aGUgc2V0dGluZ3MKICAvLyBmcm9tIHRoZSBwYXJlbnQuCiAgaWYgKHBhcmVudEF1dGhvciAmJiBwYXJlbnRQZXJtbGluaykgewogICAgY29uc3QgcGFyZW50QXV0aG9ycGVybSA9IGBAJHtwYXJlbnRBdXRob3J9LyR7cGFyZW50UGVybWxpbmt9YDsKICAgIGNvbnN0IHBhcmVudFBvc3RNZXRhZGF0YSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwb3N0TWV0YWRhdGEnLCB7IGF1dGhvcnBlcm06IHBhcmVudEF1dGhvcnBlcm0gfSk7CiAgICBpZiAocGFyZW50UG9zdE1ldGFkYXRhKSB7CiAgICAgIHJldHVybiBwYXJlbnRQb3N0TWV0YWRhdGEucmV3YXJkUG9vbElkczsKICAgIH0KICAgIC8vIFRoaXMgZmFsbGJhY2sgaXMgbmVlZGVkIHdoaWxlIHdlIHBvcHVsYXRlIG1ldGFkYXRhLCBjYW4gYmUgcmVtb3ZlZCBhZnRlcgogICAgLy8gYWxsIG91c3RhbmRpbmcgcG9zdHMgYXJlIGFsc28gaW4gbWV0YWRhdGEuCiAgICAvLyBDYW4gb25seSByZXR1cm4gcGFyYW1zLm1heFBvb2xzUGVyUG9zdCAoPDEwMDApIHBvc3RzCiAgICBjb25zdCBwYXJlbnRQb3N0cyA9IGF3YWl0IGFwaS5kYi5maW5kKCdwb3N0cycsIHsgYXV0aG9ycGVybTogcGFyZW50QXV0aG9ycGVybSB9KTsKICAgIGlmIChwYXJlbnRQb3N0cyAmJiBwYXJlbnRQb3N0cy5sZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiBwYXJlbnRQb3N0cy5tYXAocCA9PiBwLnJld2FyZFBvb2xJZCk7CiAgICB9CiAgICByZXR1cm4gW107CiAgfQogIC8vIENoZWNrIG1ldGFkYXRhIGZvciB0YWdzIC8gcGFyZW50IHBlcm1saW5rCiAgLy8gZm9yIGNvbW11bml0eS4KICBpZiAoanNvbk1ldGFkYXRhICYmIGpzb25NZXRhZGF0YS50YWdzICYmIEFycmF5LmlzQXJyYXkoanNvbk1ldGFkYXRhLnRhZ3MpCiAgICAgICYmIGpzb25NZXRhZGF0YS50YWdzLmV2ZXJ5KHQgPT4gdHlwZW9mIHQgPT09ICdzdHJpbmcnKSkgewogICAgY29uc3Qgc2VhcmNoVGFncyA9IHBhcmVudFBlcm1saW5rID8ganNvbk1ldGFkYXRhLnRhZ3MuY29uY2F0KFtwYXJlbnRQZXJtbGlua10pCiAgICAgIDoganNvbk1ldGFkYXRhLnRhZ3M7CiAgICBjb25zdCB0YWdSZXdhcmRQb29scyA9IGF3YWl0IGFwaS5kYi5maW5kKCdyZXdhcmRQb29scycsCiAgICAgIHsgJ2NvbmZpZy50YWdzJzogeyAkaW46IHNlYXJjaFRhZ3MgfSB9LAogICAgICBwYXJhbXMubWF4UG9vbHNQZXJQb3N0LCAwLCBbeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICAgIGlmICh0YWdSZXdhcmRQb29scyAmJiB0YWdSZXdhcmRQb29scy5sZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiB0YWdSZXdhcmRQb29scy5tYXAociA9PiByLl9pZCk7CiAgICB9CiAgfQogIGlmIChyZXdhcmRQb29scyAmJiBBcnJheS5pc0FycmF5KHJld2FyZFBvb2xzKSAmJiByZXdhcmRQb29scy5sZW5ndGggPiAwKSB7CiAgICByZXR1cm4gcmV3YXJkUG9vbHMuc2xpY2UoMCwgcGFyYW1zLm1heFBvb2xzUGVyUG9zdCk7CiAgfQogIHJldHVybiBbXTsKfQoKYWN0aW9ucy5jb21tZW50ID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBhdXRob3IsCiAgICBwZXJtbGluaywKICAgIHJld2FyZFBvb2xzLAogIH0gPSBwYXlsb2FkOwoKICAvLyBOb2RlIGVuZm9yY2VzIGF1dGhvciAvIHBlcm1saW5rcyBmcm9tIEhpdmUuIENoZWNrIHRoYXQgc2VuZGVyIGlzIG51bGwuCiAgaWYgKCFhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09ICdudWxsJywgJ2FjdGlvbiBtdXN0IHVzZSBjb21tZW50IG9wZXJhdGlvbicpKSByZXR1cm47CiAgYXdhaXQgdG9rZW5NYWludGVuYW5jZSgpOwoKICBpZiAoIWFwaS5hc3NlcnQoIXJld2FyZFBvb2xzIHx8IChBcnJheS5pc0FycmF5KHJld2FyZFBvb2xzKSAmJiByZXdhcmRQb29scy5ldmVyeShycCA9PiBOdW1iZXIuaXNJbnRlZ2VyKHJwKSkpLCAncmV3YXJkUG9vbHMgbXVzdCBiZSBhbiBhcnJheSBvZiBpbnRlZ2VycycpKSByZXR1cm47CgogIGNvbnN0IHJld2FyZFBvb2xJZHMgPSBhd2FpdCBnZXRSZXdhcmRQb29sSWRzKHBheWxvYWQpOwogIGNvbnN0IGF1dGhvcnBlcm0gPSBgQCR7YXV0aG9yfS8ke3Blcm1saW5rfWA7CgogIC8vIFZhbGlkYXRlIHRoYXQgY29tbWVudCBpcyBub3QgYW4gZWRpdCAoY2Fubm90IGFkZCBtdWx0aXBsZSBwb29scykKICBjb25zdCBleGlzdGluZ1Bvc3RNZXRhZGF0YSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwb3N0TWV0YWRhdGEnLCB7IGF1dGhvcnBlcm0gfSk7CiAgaWYgKGV4aXN0aW5nUG9zdE1ldGFkYXRhKSB7CiAgICByZXR1cm47CiAgfQogIC8vIE5lZWRlZCBmb3IgcG9zdHMgYmVmb3JlIG1ldGFkYXRhIHVwZGF0ZWQuIENhbiBiZSByZW1vdmVkIG9uY2UgYWxsIHBvc3RzIGhhdmUgbWV0YWRhdGEuCiAgY29uc3QgZXhpc3RpbmdQb3N0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Bvc3RzJywgeyBhdXRob3JwZXJtIH0pOwogIGlmIChleGlzdGluZ1Bvc3QpIHsKICAgIHJldHVybjsKICB9CgogIGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3Bvc3RNZXRhZGF0YScsIHsgYXV0aG9ycGVybSwgcmV3YXJkUG9vbElkcyB9KTsKCiAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXdhcmRQb29sSWRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBjb25zdCByZXdhcmRQb29sSWQgPSByZXdhcmRQb29sSWRzW2ldOwogICAgY29uc3QgcmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgX2lkOiByZXdhcmRQb29sSWQgfSk7CiAgICBpZiAocmV3YXJkUG9vbCAmJiByZXdhcmRQb29sLmFjdGl2ZSkgewogICAgICBjb25zdCBjYXNob3V0VGltZSA9IHRpbWVzdGFtcCArIHJld2FyZFBvb2wuY29uZmlnLmNhc2hvdXRXaW5kb3dEYXlzICogMjQgKiAzNjAwICogMTAwMDsKCiAgICAgIGNvbnN0IHBvc3QgPSB7CiAgICAgICAgcmV3YXJkUG9vbElkLAogICAgICAgIHN5bWJvbDogcmV3YXJkUG9vbC5zeW1ib2wsCiAgICAgICAgYXV0aG9ycGVybSwKICAgICAgICBhdXRob3IsCiAgICAgICAgY3JlYXRlZDogdGltZXN0YW1wLAogICAgICAgIGNhc2hvdXRUaW1lLAogICAgICAgIHZvdGVQb3NpdGl2ZVJzaGFyZVN1bTogJzAnLAogICAgICAgIHZvdGVSc2hhcmVTdW06ICcwJywKICAgICAgfTsKICAgICAgYXdhaXQgYXBpLmRiLmluc2VydCgncG9zdHMnLCBwb3N0KTsKICAgICAgYXBpLmVtaXQoJ25ld0NvbW1lbnQnLCB7IHJld2FyZFBvb2xJZCwgc3ltYm9sOiByZXdhcmRQb29sLnN5bWJvbCB9KTsKICAgIH0KICB9Cn07CgphY3Rpb25zLmNvbW1lbnRPcHRpb25zID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBhdXRob3IsCiAgICBwZXJtbGluaywKICAgIG1heEFjY2VwdGVkUGF5b3V0LAogICAgYmVuZWZpY2lhcmllcywKICB9ID0gcGF5bG9hZDsKCiAgLy8gTm9kZSBlbmZvcmNlcyBhdXRob3IgLyBwZXJtbGlua3MgZnJvbSBIaXZlLiBDaGVjayB0aGF0IHNlbmRlciBpcyBudWxsLgogIGlmICghYXBpLmFzc2VydChhcGkuc2VuZGVyID09PSAnbnVsbCcsICdhY3Rpb24gbXVzdCB1c2UgY29tbWVudE9wdGlvbnMgb3BlcmF0aW9uJykpIHJldHVybjsKICBjb25zdCBhdXRob3JwZXJtID0gYEAke2F1dGhvcn0vJHtwZXJtbGlua31gOwoKICBjb25zdCBleGlzdGluZ1Bvc3RzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Bvc3RzJywgeyBhdXRob3JwZXJtIH0pOwogIGlmICghZXhpc3RpbmdQb3N0cykgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgZGVjbGluZVBheW91dCA9IG1heEFjY2VwdGVkUGF5b3V0LnN0YXJ0c1dpdGgoJzAuMDAwJyk7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Bvc3RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBjb25zdCBwb3N0ID0gZXhpc3RpbmdQb3N0c1tpXTsKICAgIHBvc3QuZGVjbGluZVBheW91dCA9IGRlY2xpbmVQYXlvdXQ7CiAgICBwb3N0LmJlbmVmaWNpYXJpZXMgPSBiZW5lZmljaWFyaWVzOwogICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncG9zdHMnLCBwb3N0KTsKICB9Cn07Cgphc3luYyBmdW5jdGlvbiBwcm9jZXNzVm90ZShwb3N0LCB2b3Rlciwgd2VpZ2h0LCB0aW1lc3RhbXApIHsKICBjb25zdCB7CiAgICByZXdhcmRQb29sSWQsCiAgICBzeW1ib2wsCiAgICBhdXRob3JwZXJtLAogICAgY2FzaG91dFRpbWUsCiAgfSA9IHBvc3Q7CgogIGlmIChjYXNob3V0VGltZSA8IHRpbWVzdGFtcCkgewogICAgcmV0dXJuOwogIH0KCiAgLy8gY2hlY2sgdm90aW5nIHBvd2VyLCBzdGFrZSwgYW5kIGN1cnJlbnQgdm90ZSByc2hhcmVzLgogIGNvbnN0IHJld2FyZFBvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncmV3YXJkUG9vbHMnLCB7IF9pZDogcmV3YXJkUG9vbElkIH0pOwogIGlmICghcmV3YXJkUG9vbCB8fCAhcmV3YXJkUG9vbC5hY3RpdmUpIHsKICAgIHJldHVybjsKICB9CgogIGxldCB2b3RpbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd2b3RpbmdQb3dlcicsIHsgcmV3YXJkUG9vbElkLCBhY2NvdW50OiB2b3RlciB9KTsKICBpZiAoIXZvdGluZ1Bvd2VyKSB7CiAgICB2b3RpbmdQb3dlciA9IHsKICAgICAgcmV3YXJkUG9vbElkLAogICAgICBhY2NvdW50OiB2b3RlciwKICAgICAgbGFzdFZvdGVUaW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgdm90aW5nUG93ZXI6IE1BWF9WT1RJTkdfUE9XRVIsCiAgICAgIGRvd252b3RpbmdQb3dlcjogTUFYX1ZPVElOR19QT1dFUiwKICAgIH07CiAgICB2b3RpbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3ZvdGluZ1Bvd2VyJywgdm90aW5nUG93ZXIpOwogIH0gZWxzZSB7CiAgICAvLyByZWdlbmVyYXRlIHZvdGluZyBwb3dlcgogICAgdm90aW5nUG93ZXIudm90aW5nUG93ZXIgKz0gKHRpbWVzdGFtcCAtIHZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wKSAqIE1BWF9WT1RJTkdfUE9XRVIKICAgICAgICAgIC8gKHJld2FyZFBvb2wuY29uZmlnLnZvdGVSZWdlbmVyYXRpb25EYXlzICogMjQgKiAzNjAwICogMTAwMCk7CiAgICB2b3RpbmdQb3dlci52b3RpbmdQb3dlciA9IE1hdGguZmxvb3Iodm90aW5nUG93ZXIudm90aW5nUG93ZXIpOwogICAgdm90aW5nUG93ZXIudm90aW5nUG93ZXIgPSBNYXRoLm1pbih2b3RpbmdQb3dlci52b3RpbmdQb3dlciwgTUFYX1ZPVElOR19QT1dFUik7CiAgICB2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIgKz0gKHRpbWVzdGFtcCAtIHZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wKSAqIE1BWF9WT1RJTkdfUE9XRVIKICAgICAgICAgIC8gKHJld2FyZFBvb2wuY29uZmlnLmRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyAqIDI0ICogMzYwMCAqIDEwMDApOwogICAgdm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyID0gTWF0aC5mbG9vcih2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIpOwogICAgdm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyID0gTWF0aC5taW4odm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyLCBNQVhfVk9USU5HX1BPV0VSKTsKICAgIHZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wID0gdGltZXN0YW1wOwogIH0KCiAgY29uc3Qgdm90ZXJUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgc3ltYm9sLCBhY2NvdW50OiB2b3RlciB9KTsKICBsZXQgc3Rha2UgPSB2b3RlclRva2VuQmFsYW5jZSA/IHZvdGVyVG9rZW5CYWxhbmNlLnN0YWtlIDogJzAnOwogIGlmICh2b3RlclRva2VuQmFsYW5jZSAmJiB2b3RlclRva2VuQmFsYW5jZS5kZWxlZ2F0aW9uc0luCiAgICAgICYmIGFwaS5CaWdOdW1iZXIodm90ZXJUb2tlbkJhbGFuY2UuZGVsZWdhdGlvbnNJbikuaXNGaW5pdGUoKSkgewogICAgc3Rha2UgPSBhcGkuQmlnTnVtYmVyKHN0YWtlKS5wbHVzKHZvdGVyVG9rZW5CYWxhbmNlLmRlbGVnYXRpb25zSW4pOwogIH0KCiAgbGV0IHZvdGVSc2hhcmVzID0gJzAnOwogIGxldCB1cGRhdGVkUG9zdFJzaGFyZXMgPSAnMCc7CiAgbGV0IHVzZWRQb3dlciA9IDA7CiAgbGV0IHVzZWREb3dudm90ZVBvd2VyID0gMDsKICBsZXQgY3VyYXRpb25XZWlnaHQgPSAnMCc7CiAgaWYgKHdlaWdodCA+IDApIHsKICAgIHZvdGVSc2hhcmVzID0gYXBpLkJpZ051bWJlcihzdGFrZSkubXVsdGlwbGllZEJ5KHdlaWdodCkubXVsdGlwbGllZEJ5KHZvdGluZ1Bvd2VyLnZvdGluZ1Bvd2VyKQogICAgICAuZGl2aWRlZEJ5KE1BWF9WT1RJTkdfUE9XRVIpCiAgICAgIC5kaXZpZGVkQnkoTUFYX1dFSUdIVCkKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIHVzZWRQb3dlciA9IE1hdGguZmxvb3Iodm90aW5nUG93ZXIudm90aW5nUG93ZXIgKiBNYXRoLmFicyh3ZWlnaHQpICogNjAgKiA2MCAqIDI0IC8gTUFYX1dFSUdIVCk7CiAgICBjb25zdCB1c2VkUG93ZXJEZW5vbSA9IE1hdGguZmxvb3IoTUFYX1ZPVElOR19QT1dFUiAqIDYwICogNjAgKiAyNAogICAgICAgIC8gcmV3YXJkUG9vbC5jb25maWcudm90ZVBvd2VyQ29uc3VtcHRpb24pOwogICAgdXNlZFBvd2VyID0gTWF0aC5mbG9vcigodXNlZFBvd2VyICsgdXNlZFBvd2VyRGVub20gLSAxKSAvIHVzZWRQb3dlckRlbm9tKTsKICAgIHZvdGluZ1Bvd2VyLnZvdGluZ1Bvd2VyID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcih2b3RpbmdQb3dlci52b3RpbmdQb3dlciAtIHVzZWRQb3dlcikpOwogICAgY3VyYXRpb25XZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGNhbGN1bGF0ZUN1cmF0aW9uV2VpZ2h0UnNoYXJlcygKICAgICAgcmV3YXJkUG9vbCwgYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlcykucGx1cyhwb3N0LnZvdGVQb3NpdGl2ZVJzaGFyZVN1bSksCiAgICApKQogICAgICAubWludXMoY2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHBvc3Qudm90ZVBvc2l0aXZlUnNoYXJlU3VtKSkKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICB9IGVsc2UgaWYgKHdlaWdodCA8IDApIHsKICAgIHZvdGVSc2hhcmVzID0gYXBpLkJpZ051bWJlcihzdGFrZSkubXVsdGlwbGllZEJ5KHdlaWdodCkKICAgICAgLm11bHRpcGxpZWRCeSh2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIpCiAgICAgIC5kaXZpZGVkQnkoTUFYX1ZPVElOR19QT1dFUikKICAgICAgLmRpdmlkZWRCeShNQVhfV0VJR0hUKQogICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogICAgdXNlZERvd252b3RlUG93ZXIgPSBNYXRoLmZsb29yKHZvdGluZ1Bvd2VyLmRvd252b3RpbmdQb3dlciAqIE1hdGguYWJzKHdlaWdodCkgKiA2MCAqIDYwICogMjQKICAgICAgICAvIE1BWF9XRUlHSFQpOwogICAgY29uc3QgdXNlZERvd252b3RlUG93ZXJEZW5vbSA9IE1hdGguZmxvb3IoTUFYX1ZPVElOR19QT1dFUiAqIDYwICogNjAgKiAyNAogICAgICAgIC8gcmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uKTsKICAgIHVzZWREb3dudm90ZVBvd2VyID0gTWF0aC5mbG9vcigodXNlZERvd252b3RlUG93ZXIgKyB1c2VkRG93bnZvdGVQb3dlckRlbm9tIC0gMSkKICAgICAgICAvIHVzZWREb3dudm90ZVBvd2VyRGVub20pOwogICAgdm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyID0gTWF0aC5tYXgoCiAgICAgIDAsIE1hdGguZmxvb3Iodm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyIC0gdXNlZERvd252b3RlUG93ZXIpLAogICAgKTsKICB9CgogIGlmICh2b3RpbmdQb3dlci5tdXRlKSB7CiAgICB2b3RlUnNoYXJlcyA9ICcwJzsKICAgIGN1cmF0aW9uV2VpZ2h0ID0gJzAnOwogIH0KCiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgndm90aW5nUG93ZXInLCB2b3RpbmdQb3dlcik7CgogIGxldCB2b3RlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3ZvdGVzJywgeyByZXdhcmRQb29sSWQsIGF1dGhvcnBlcm0sIHZvdGVyIH0pOwogIGlmICh2b3RlKSB7CiAgICAvLyBBIHJlLXZvdGUgbmVnYXRlcyBjdXJhdGlvbiByZXdhcmRzLCBzaW1pbGFyIHRvIEhpdmUuCiAgICB2b3RlLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKICAgIHZvdGUud2VpZ2h0ID0gd2VpZ2h0OwogICAgdm90ZS5jdXJhdGlvbldlaWdodCA9ICcwJzsKICAgIGNvbnN0IG9sZFZvdGVSc2hhcmVzID0gdm90ZS5yc2hhcmVzOwogICAgdm90ZS5yc2hhcmVzID0gdm90ZVJzaGFyZXM7CiAgICB1cGRhdGVkUG9zdFJzaGFyZXMgPSBhcGkuQmlnTnVtYmVyKHZvdGVSc2hhcmVzKS5taW51cyhvbGRWb3RlUnNoYXJlcykKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3ZvdGVzJywgdm90ZSk7CiAgICBjb25zdCB2b3RlTG9nID0geyByZXdhcmRQb29sSWQsIHN5bWJvbDogcmV3YXJkUG9vbC5zeW1ib2wsIHJzaGFyZXM6IHZvdGVSc2hhcmVzIH07CiAgICBpZiAodm90aW5nUG93ZXIubXV0ZSkgewogICAgICB2b3RlTG9nLm11dGUgPSB0cnVlOwogICAgfQogICAgYXBpLmVtaXQoJ3VwZGF0ZVZvdGUnLCB2b3RlTG9nKTsKICB9IGVsc2UgewogICAgdm90ZSA9IHsKICAgICAgcmV3YXJkUG9vbElkLAogICAgICBzeW1ib2wsCiAgICAgIGF1dGhvcnBlcm0sCiAgICAgIHdlaWdodCwKICAgICAgcnNoYXJlczogdm90ZVJzaGFyZXMsCiAgICAgIGN1cmF0aW9uV2VpZ2h0LAogICAgICB0aW1lc3RhbXAsCiAgICAgIHZvdGVyLAogICAgfTsKICAgIHVwZGF0ZWRQb3N0UnNoYXJlcyA9IHZvdGVSc2hhcmVzOwogICAgYXdhaXQgYXBpLmRiLmluc2VydCgndm90ZXMnLCB2b3RlKTsKICAgIGNvbnN0IHZvdGVMb2cgPSB7IHJld2FyZFBvb2xJZCwgc3ltYm9sOiByZXdhcmRQb29sLnN5bWJvbCwgcnNoYXJlczogdm90ZVJzaGFyZXMgfTsKICAgIGlmICh2b3RpbmdQb3dlci5tdXRlKSB7CiAgICAgIHZvdGVMb2cubXV0ZSA9IHRydWU7CiAgICB9CiAgICBhcGkuZW1pdCgnbmV3Vm90ZScsIHZvdGVMb2cpOwogIH0KCiAgY29uc3Qgb2xkUG9zdENsYWltcyA9IGNhbGN1bGF0ZVdlaWdodFJzaGFyZXMocmV3YXJkUG9vbCwgcG9zdC52b3RlUnNoYXJlU3VtKTsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24KICBwb3N0LnZvdGVSc2hhcmVTdW0gPSBhcGkuQmlnTnVtYmVyKHBvc3Qudm90ZVJzaGFyZVN1bSkucGx1cyh1cGRhdGVkUG9zdFJzaGFyZXMpCiAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwoKICBpZiAoYXBpLkJpZ051bWJlcih1cGRhdGVkUG9zdFJzaGFyZXMpLmd0KDApKSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24KICAgIHBvc3Qudm90ZVBvc2l0aXZlUnNoYXJlU3VtID0gYXBpLkJpZ051bWJlcihwb3N0LnZvdGVQb3NpdGl2ZVJzaGFyZVN1bSkucGx1cyh1cGRhdGVkUG9zdFJzaGFyZXMpCiAgICAgIC50b0ZpeGVkKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICBpZiAodGltZXN0YW1wIDwgcmV3YXJkUG9vbC5jcmVhdGVkVGltZXN0YW1wCiAgICAgICAgKyAoMiAqIHJld2FyZFBvb2wuY29uZmlnLmNhc2hvdXRXaW5kb3dEYXlzICsgMSkgKiAyNCAqIDM2MDAgKiAxMDAwKSB7CiAgICAgIGNvbnN0IG5ld1Bvc3RDbGFpbXMgPSBjYWxjdWxhdGVXZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHBvc3Qudm90ZVJzaGFyZVN1bSk7CiAgICAgIHJld2FyZFBvb2wucGVuZGluZ0NsYWltcyA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zKQogICAgICAgIC5wbHVzKG5ld1Bvc3RDbGFpbXMpCiAgICAgICAgLm1pbnVzKG9sZFBvc3RDbGFpbXMpCiAgICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncmV3YXJkUG9vbHMnLCByZXdhcmRQb29sKTsKICAgIH0KICB9CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncG9zdHMnLCBwb3N0KTsKfQoKYWN0aW9ucy52b3RlID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICB2b3RlciwKICAgIGF1dGhvciwKICAgIHBlcm1saW5rLAogICAgd2VpZ2h0LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoIWFwaS5hc3NlcnQoYXBpLnNlbmRlciA9PT0gJ251bGwnLCAnY2FuIG9ubHkgdm90ZSB3aXRoIHZvdGluZyBvcCcpKSByZXR1cm47CiAgYXdhaXQgdG9rZW5NYWludGVuYW5jZSgpOwoKICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcih3ZWlnaHQpICYmIHdlaWdodCA+PSAtMTAwMDAgJiYgd2VpZ2h0IDw9IDEwMDAwLAogICAgJ3dlaWdodCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAtMTAwMDAgdG8gMTAwMDAnKSkgcmV0dXJuOwoKICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CiAgY29uc3QgdGltZXN0YW1wID0gYmxvY2tEYXRlLmdldFRpbWUoKTsKICBjb25zdCBhdXRob3JwZXJtID0gYEAke2F1dGhvcn0vJHtwZXJtbGlua31gOwogIC8vIENhbiBvbmx5IHJldHVybiBwYXJhbXMubWF4UG9vbHNQZXJQb3N0ICg8MTAwMCkgcG9zdHMKICBjb25zdCBwb3N0cyA9IGF3YWl0IGFwaS5kYi5maW5kKCdwb3N0cycsIHsgYXV0aG9ycGVybSB9KTsKCiAgaWYgKCFwb3N0cykgcmV0dXJuOwogIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zdHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGNvbnN0IHBvc3QgPSBwb3N0c1tpXTsKICAgIGF3YWl0IHByb2Nlc3NWb3RlKHBvc3QsIHZvdGVyLCB3ZWlnaHQsIHRpbWVzdGFtcCk7CiAgfQp9Owo="}}

Sort:  

{ "id": "ssc-testnet-hive", "json": { "contractName":"contract", "contractAction":"update", "contractPayload":{"name":"comments","params":"","code":"LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IFsiZXJyb3IiLCB7ICJhbGxvdyI6IFsiX2lkIl0gfV0gKi8KLyogZ2xvYmFsIGFjdGlvbnMsIGFwaSAqLwoKY29uc3QgU01UX1BSRUNJU0lPTiA9IDEwOwpjb25zdCBNQVhfVk9USU5HX1BPV0VSID0gMTAwMDA7CmNvbnN0IE1BWF9XRUlHSFQgPSAxMDAwMDsKY29uc3QgUE9TVF9RVUVSWV9MSU1JVCA9IDEwMDA7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cygncmV3YXJkUG9vbHMnKTsKICBpZiAodGFibGVFeGlzdHMgPT09IGZhbHNlKSB7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3BhcmFtcycpOwogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdyZXdhcmRQb29scycsIFsnY29uZmlnLnRhZ3MnLCAnbGFzdENsYWltRGVjYXlUaW1lc3RhbXAnXSk7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3Bvc3RzJywgWwogICAgICAnYXV0aG9ycGVybScsCiAgICAgIHsgbmFtZTogJ2J5Q2FzaG91dFRpbWUnLCBpbmRleDogeyByZXdhcmRQb29sSWQ6IDEsIGNhc2hvdXRUaW1lOiAxIH0gfSwKICAgIF0sIHsgcHJpbWFyeUtleTogWydhdXRob3JwZXJtJywgJ3Jld2FyZFBvb2xJZCddIH0pOwogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdwb3N0TWV0YWRhdGEnLCBbXSwgeyBwcmltYXJ5S2V5OiBbJ2F1dGhvcnBlcm0nXSB9KTsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgndm90ZXMnLCBbeyBuYW1lOiAnYnlUaW1lc3RhbXAnLCBpbmRleDogeyByZXdhcmRQb29sSWQ6IDEsIGF1dGhvcnBlcm06IDEsIHRpbWVzdGFtcDogMSB9IH1dLCB7IHByaW1hcnlLZXk6IFsncmV3YXJkUG9vbElkJywgJ2F1dGhvcnBlcm0nLCAndm90ZXInXSB9KTsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgndm90aW5nUG93ZXInLCBbXSwgeyBwcmltYXJ5S2V5OiBbJ3Jld2FyZFBvb2xJZCcsICdhY2NvdW50J10gfSk7CgogICAgY29uc3QgcGFyYW1zID0gewogICAgICBzZXR1cEZlZTogJzEwMDAnLAogICAgICB1cGRhdGVGZWU6ICcyMCcsCiAgICAgIG1heFBvb2xzUGVyUG9zdDogMjAsCiAgICAgIG1heFRhZ3NQZXJQb29sOiA1LAogICAgICBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrOiAyLAogICAgICBsYXN0TWFpbnRlbmFuY2VCbG9jazogYXBpLmJsb2NrTnVtYmVyLAogICAgICBtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kOiAyMCwKICAgICAgdm90ZVF1ZXJ5TGltaXQ6IDEwMCwKICAgICAgbWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZDogMTAwLAogICAgICBsYXN0UHJvY2Vzc2VkUG9vbElkOiAwLAogICAgfTsKICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3BhcmFtcycsIHBhcmFtcyk7CiAgfQp9OwoKYWN0aW9ucy51cGRhdGVQYXJhbXMgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIpIHJldHVybjsKCiAgY29uc3QgewogICAgc2V0dXBGZWUsCiAgICB1cGRhdGVGZWUsCiAgICBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrLAogICAgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCwKICAgIG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQsCiAgICB2b3RlUXVlcnlMaW1pdCwKICB9ID0gcGF5bG9hZDsKCiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKCiAgaWYgKHNldHVwRmVlKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHNldHVwRmVlID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihzZXR1cEZlZSkuaXNOYU4oKSAmJiBhcGkuQmlnTnVtYmVyKHNldHVwRmVlKS5ndGUoMCksICdpbnZhbGlkIHNldHVwRmVlJykpIHJldHVybjsKICAgIHBhcmFtcy5zZXR1cEZlZSA9IHNldHVwRmVlOwogIH0KICBpZiAodXBkYXRlRmVlKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHVwZGF0ZUZlZSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIodXBkYXRlRmVlKS5pc05hTigpICYmIGFwaS5CaWdOdW1iZXIodXBkYXRlRmVlKS5ndGUoMCksICdpbnZhbGlkIHVwZGF0ZUZlZScpKSByZXR1cm47CiAgICBwYXJhbXMudXBkYXRlRmVlID0gdXBkYXRlRmVlOwogIH0KICBpZiAobWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jaykgewogICAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jaykgJiYgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jayA+PSAxLCAnaW52YWxpZCBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrJykpIHJldHVybjsKICAgIHBhcmFtcy5tYWludGVuYW5jZVRva2Vuc1BlckJsb2NrID0gbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jazsKICB9CiAgaWYgKG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQpIHsKICAgIGlmICghYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQpICYmIG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQgPj0gMSwgJ2ludmFsaWQgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCcpKSByZXR1cm47CiAgICBwYXJhbXMubWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCA9IG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQ7CiAgfQogIGlmIChtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kKSAmJiBtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kID49IDEsICdpbnZhbGlkIG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQnKSkgcmV0dXJuOwogICAgcGFyYW1zLm1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQgPSBtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kOwogIH0KICBpZiAodm90ZVF1ZXJ5TGltaXQpIHsKICAgIGlmICghYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKHZvdGVRdWVyeUxpbWl0KSAmJiB2b3RlUXVlcnlMaW1pdCA+PSAxLCAnaW52YWxpZCB2b3RlUXVlcnlMaW1pdCcpKSByZXR1cm47CiAgICBwYXJhbXMudm90ZVF1ZXJ5TGltaXQgPSB2b3RlUXVlcnlMaW1pdDsKICB9CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7Cn07CgpmdW5jdGlvbiBjYWxjdWxhdGVXZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHZvdGVSc2hhcmVTdW0pIHsKICBpZiAoYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5sdGUoMCkpIHJldHVybiBhcGkuQmlnTnVtYmVyKDApOwogIGlmIChyZXdhcmRQb29sLmNvbmZpZy5wb3N0UmV3YXJkQ3VydmUgPT09ICdwb3dlcicpIHsKICAgIGNvbnN0IHBvc3RSZXdhcmRFeHBvbmVudCA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyKTsKICAgIGlmIChwb3N0UmV3YXJkRXhwb25lbnQuZXEoJzEnKSB8fCBwb3N0UmV3YXJkRXhwb25lbnQuZXEoJzInKSkgewogICAgICByZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5wb3cocmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyKQogICAgICAgIC50b0ZpeGVkKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICB9CiAgICByZXR1cm4gYXBpLkJpZ051bWJlcihwYXJzZUZsb2F0KHZvdGVSc2hhcmVTdW0pCiAgICAgICAgKiogcGFyc2VGbG9hdChyZXdhcmRQb29sLmNvbmZpZy5wb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIpKQogICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIH0KICByZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKTsKfQoKZnVuY3Rpb24gY2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHZvdGVSc2hhcmVTdW0pIHsKICBpZiAoYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5sdGUoMCkpIHJldHVybiBhcGkuQmlnTnVtYmVyKDApOwogIGlmIChyZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlID09PSAncG93ZXInKSB7CiAgICBjb25zdCBjdXJhdGlvblJld2FyZEV4cG9uZW50ID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyKTsKICAgIGlmIChjdXJhdGlvblJld2FyZEV4cG9uZW50LmVxKCcwLjUnKSkgewogICAgICByZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5zcXJ0KCkKICAgICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogICAgfSBpZiAoY3VyYXRpb25SZXdhcmRFeHBvbmVudC5lcSgnMScpKSB7CiAgICAgIHJldHVybiBhcGkuQmlnTnVtYmVyKHZvdGVSc2hhcmVTdW0pLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIH0KICAgIHJldHVybiBhcGkuQmlnTnVtYmVyKHBhcnNlRmxvYXQodm90ZVJzaGFyZVN1bSkKICAgICAgICAqKiBwYXJzZUZsb2F0KHJld2FyZFBvb2wuY29uZmlnLmN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIpKQogICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIH0KICByZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKTsKfQoKYXN5bmMgZnVuY3Rpb24gcGF5VXNlcihzeW1ib2wsIHF1YW50aXR5LCB1c2VyLCBzdGFrZWRSZXdhcmRQZXJjZW50YWdlLCBtdXRlKSB7CiAgaWYgKG11dGUpIHJldHVybjsKICBjb25zdCBxdWFudGl0eUJpZ251bSA9IGFwaS5CaWdOdW1iZXIocXVhbnRpdHkpOwogIGNvbnN0IHN0YWtlZFF1YW50aXR5ID0gcXVhbnRpdHlCaWdudW0ubXVsdGlwbGllZEJ5KHN0YWtlZFJld2FyZFBlcmNlbnRhZ2UpLmRpdmlkZWRCeSgxMDApCiAgICAudG9GaXhlZChxdWFudGl0eUJpZ251bS5kcCgpLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIGNvbnN0IGxpcXVpZFF1YW50aXR5ID0gcXVhbnRpdHlCaWdudW0ubWludXMoc3Rha2VkUXVhbnRpdHkpCiAgICAudG9GaXhlZChxdWFudGl0eUJpZ251bS5kcCgpLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIGxldCByZXM7CiAgaWYgKGFwaS5CaWdOdW1iZXIobGlxdWlkUXVhbnRpdHkpLmd0KDApKSB7CiAgICByZXMgPSBhd2FpdCBhcGkudHJhbnNmZXJUb2tlbnModXNlciwgc3ltYm9sLCBsaXF1aWRRdWFudGl0eSwgJ3VzZXInKTsKICAgIGlmIChyZXMuZXJyb3JzKSB7CiAgICAgIGFwaS5kZWJ1ZyhgRXJyb3IgcGF5aW5nIG91dCBsaXF1aWQgJHtsaXF1aWRRdWFudGl0eX0gJHtzeW1ib2x9IHRvICR7dXNlcn0gKFRYSUQgJHthcGkudHJhbnNhY3Rpb25JZH0pOiBcbiR7cmVzLmVycm9yc31gKTsKICAgIH0KICB9CiAgaWYgKGFwaS5CaWdOdW1iZXIoc3Rha2VkUXVhbnRpdHkpLmd0KDApKSB7CiAgICByZXMgPSBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICdzdGFrZUZyb21Db250cmFjdCcsIHsgdG86IHVzZXIsIHN5bWJvbCwgcXVhbnRpdHk6IHN0YWtlZFF1YW50aXR5IH0pOwogICAgaWYgKHJlcy5lcnJvcnMpIHsKICAgICAgYXBpLmRlYnVnKGBFcnJvciBwYXlpbmcgb3V0IHN0YWtlZCAke3N0YWtlZFF1YW50aXR5fSAke3N5bWJvbH0gdG8gJHt1c2VyfSAoVFhJRCAke2FwaS50cmFuc2FjdGlvbklkfSk6IFxuJHtyZXMuZXJyb3JzfWApOwogICAgfQogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TXV0ZShyZXdhcmRQb29sSWQsIGFjY291bnQpIHsKICBjb25zdCB2b3RpbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd2b3RpbmdQb3dlcicsIHsgcmV3YXJkUG9vbElkLCBhY2NvdW50IH0pOwogIHJldHVybiB2b3RpbmdQb3dlciA/IHZvdGluZ1Bvd2VyLm11dGUgOiBmYWxzZTsKfQoKYXN5bmMgZnVuY3Rpb24gcGF5T3V0QmVuZWZpY2lhcmllcyhyZXdhcmRQb29sLCB0b2tlbiwgcG9zdCwgYXV0aG9yQmVuZVBvcnRpb24pIHsKICBjb25zdCB7CiAgICBhdXRob3JwZXJtLAogICAgc3ltYm9sLAogICAgcmV3YXJkUG9vbElkLAogICAgYmVuZWZpY2lhcmllcywKICB9ID0gcG9zdDsKICBpZiAoIWJlbmVmaWNpYXJpZXMgfHwgYmVuZWZpY2lhcmllcy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBhcGkuQmlnTnVtYmVyKDApOwogIH0KICBsZXQgdG90YWxCZW5lUGF5ID0gYXBpLkJpZ051bWJlcigwKTsKICBmb3IgKGxldCBpID0gMDsgaSA8IGJlbmVmaWNpYXJpZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGNvbnN0IGJlbmVmaWNpYXJ5ID0gYmVuZWZpY2lhcmllc1tpXTsKICAgIGNvbnN0IGJlbmVQYXkgPSBhcGkuQmlnTnVtYmVyKGF1dGhvckJlbmVQb3J0aW9uKS5tdWx0aXBsaWVkQnkoYmVuZWZpY2lhcnkud2VpZ2h0KQogICAgICAuZGl2aWRlZEJ5KDEwMDAwKQogICAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICBjb25zdCBtdXRlID0gYXdhaXQgZ2V0TXV0ZShyZXdhcmRQb29sSWQsIGJlbmVmaWNpYXJ5LmFjY291bnQpOwogICAgY29uc3QgcmV3YXJkTG9nID0gewogICAgICByZXdhcmRQb29sSWQsIGF1dGhvcnBlcm0sIHN5bWJvbCwgYWNjb3VudDogYmVuZWZpY2lhcnkuYWNjb3VudCwgcXVhbnRpdHk6IGJlbmVQYXksCiAgICB9OwogICAgaWYgKG11dGUpIHsKICAgICAgcmV3YXJkTG9nLm11dGUgPSB0cnVlOwogICAgfQogICAgYXBpLmVtaXQoJ2JlbmVmaWNpYXJ5UmV3YXJkJywgcmV3YXJkTG9nKTsKICAgIGF3YWl0IHBheVVzZXIoc3ltYm9sLCBiZW5lUGF5LCBiZW5lZmljaWFyeS5hY2NvdW50LCByZXdhcmRQb29sLmNvbmZpZy5zdGFrZWRSZXdhcmRQZXJjZW50YWdlLAogICAgICBtdXRlKTsKICAgIHRvdGFsQmVuZVBheSA9IGFwaS5CaWdOdW1iZXIodG90YWxCZW5lUGF5KS5wbHVzKGJlbmVQYXkpOwogIH0KICByZXR1cm4gdG90YWxCZW5lUGF5Owp9Cgphc3luYyBmdW5jdGlvbiBwYXlPdXRDdXJhdG9ycyhyZXdhcmRQb29sLCB0b2tlbiwgcG9zdCwgY3VyYXRvclBvcnRpb24sIHBhcmFtcykgewogIGNvbnN0IHsKICAgIGF1dGhvcnBlcm0sCiAgICBzeW1ib2wsCiAgICByZXdhcmRQb29sSWQsCiAgfSA9IHBvc3Q7CiAgY29uc3QgewogICAgdm90ZVF1ZXJ5TGltaXQsCiAgfSA9IHBhcmFtczsKICBjb25zdCByZXNwb25zZSA9IHsKICAgIGRvbmU6IGZhbHNlLAogICAgdm90ZXNQcm9jZXNzZWQ6IDAsCiAgfTsKICBjb25zdCB2b3Rlc1RvUGF5b3V0ID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3ZvdGVzJywgeyByZXdhcmRQb29sSWQsIGF1dGhvcnBlcm0gfSwgdm90ZVF1ZXJ5TGltaXQsIDAsIFt7IGluZGV4OiAnYnlUaW1lc3RhbXAnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgaWYgKHZvdGVzVG9QYXlvdXQubGVuZ3RoID09PSAwKSB7CiAgICByZXNwb25zZS5kb25lID0gdHJ1ZTsKICB9IGVsc2UgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2b3Rlc1RvUGF5b3V0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICAgIGNvbnN0IHZvdGUgPSB2b3Rlc1RvUGF5b3V0W2ldOwogICAgICBpZiAoYXBpLkJpZ051bWJlcih2b3RlLmN1cmF0aW9uV2VpZ2h0KSA+IDApIHsKICAgICAgICBjb25zdCB0b3RhbEN1cmF0aW9uV2VpZ2h0ID0gY2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKAogICAgICAgICAgcmV3YXJkUG9vbCwgcG9zdC52b3RlUG9zaXRpdmVSc2hhcmVTdW0sCiAgICAgICAgKTsKICAgICAgICBjb25zdCB2b3RlUGF5ID0gYXBpLkJpZ051bWJlcihjdXJhdG9yUG9ydGlvbikubXVsdGlwbGllZEJ5KHZvdGUuY3VyYXRpb25XZWlnaHQpCiAgICAgICAgICAuZGl2aWRlZEJ5KHRvdGFsQ3VyYXRpb25XZWlnaHQpCiAgICAgICAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICAgICAgY29uc3QgbXV0ZSA9IGF3YWl0IGdldE11dGUocmV3YXJkUG9vbElkLCB2b3RlLnZvdGVyKTsKICAgICAgICBjb25zdCByZXdhcmRMb2cgPSB7CiAgICAgICAgICByZXdhcmRQb29sSWQsIGF1dGhvcnBlcm0sIHN5bWJvbCwgYWNjb3VudDogdm90ZS52b3RlciwgcXVhbnRpdHk6IHZvdGVQYXksCiAgICAgICAgfTsKICAgICAgICBpZiAobXV0ZSkgewogICAgICAgICAgcmV3YXJkTG9nLm11dGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBhcGkuZW1pdCgnY3VyYXRpb25SZXdhcmQnLCByZXdhcmRMb2cpOwogICAgICAgIGF3YWl0IHBheVVzZXIoc3ltYm9sLCB2b3RlUGF5LCB2b3RlLnZvdGVyLCByZXdhcmRQb29sLmNvbmZpZy5zdGFrZWRSZXdhcmRQZXJjZW50YWdlLCBtdXRlKTsKICAgICAgfQogICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCd2b3RlcycsIHZvdGUpOwogICAgfQogICAgcmVzcG9uc2Uudm90ZXNQcm9jZXNzZWQgKz0gdm90ZXNUb1BheW91dC5sZW5ndGg7CiAgICBpZiAodm90ZXNUb1BheW91dC5sZW5ndGggPCB2b3RlUXVlcnlMaW1pdCkgewogICAgICByZXNwb25zZS5kb25lID0gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3BvbnNlOwp9Cgphc3luYyBmdW5jdGlvbiBwYXlPdXRQb3N0KHJld2FyZFBvb2wsIHRva2VuLCBwb3N0LCBwYXJhbXMpIHsKICBjb25zdCByZXNwb25zZSA9IHsKICAgIHRvdGFsUGF5b3V0VmFsdWU6IDAsCiAgICB2b3Rlc1Byb2Nlc3NlZDogMCwKICAgIGRvbmU6IGZhbHNlLAogIH07CiAgaWYgKHBvc3QuZGVjbGluZVBheW91dCkgewogICAgYXBpLmVtaXQoJ2F1dGhvclJld2FyZCcsIHsKICAgICAgcmV3YXJkUG9vbElkOiBwb3N0LnJld2FyZFBvb2xJZCwKICAgICAgYXV0aG9ycGVybTogcG9zdC5hdXRob3JwZXJtLAogICAgICBzeW1ib2w6IHBvc3Quc3ltYm9sLAogICAgICBhY2NvdW50OiBwb3N0LmF1dGhvciwKICAgICAgcXVhbnRpdHk6ICcwJywKICAgIH0pOwogICAgcmVzcG9uc2UuZG9uZSA9IHRydWU7CiAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCdwb3N0cycsIHBvc3QpOwogICAgcmV0dXJuIHJlc3BvbnNlOwogIH0KICBjb25zdCBwb3N0Q2xhaW1zID0gY2FsY3VsYXRlV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLCBwb3N0LnZvdGVSc2hhcmVTdW0pOwogIGNvbnN0IHBvc3RQZW5kaW5nVG9rZW4gPSBhcGkuQmlnTnVtYmVyKHJld2FyZFBvb2wuaW50ZXJ2YWxQZW5kaW5nQ2xhaW1zKS5ndCgwKQogICAgPyBhcGkuQmlnTnVtYmVyKHJld2FyZFBvb2wuaW50ZXJ2YWxSZXdhcmRQb29sKS5tdWx0aXBsaWVkQnkocG9zdENsYWltcykKICAgICAgLmRpdmlkZWRCeShyZXdhcmRQb29sLmludGVydmFsUGVuZGluZ0NsYWltcykKICAgICAgLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pCiAgICA6ICcwJzsKICByZXNwb25zZS50b3RhbFBheW91dFZhbHVlID0gcG9zdFBlbmRpbmdUb2tlbjsKCiAgY29uc3QgY3VyYXRvclBvcnRpb24gPSBhcGkuQmlnTnVtYmVyKHBvc3RQZW5kaW5nVG9rZW4pCiAgICAubXVsdGlwbGllZEJ5KHJld2FyZFBvb2wuY29uZmlnLmN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSkKICAgIC5kaXZpZGVkQnkoMTAwKQogICAgLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogIGNvbnN0IGF1dGhvckJlbmVQb3J0aW9uID0gYXBpLkJpZ051bWJlcihwb3N0UGVuZGluZ1Rva2VuKS5taW51cyhjdXJhdG9yUG9ydGlvbikKICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKCiAgY29uc3QgYmVuZWZpY2lhcmllc1BheW91dFZhbHVlID0gYXdhaXQgcGF5T3V0QmVuZWZpY2lhcmllcygKICAgIHJld2FyZFBvb2wsIHRva2VuLCBwb3N0LCBhdXRob3JCZW5lUG9ydGlvbiwKICApOwogIGNvbnN0IGF1dGhvclBvcnRpb24gPSBhcGkuQmlnTnVtYmVyKGF1dGhvckJlbmVQb3J0aW9uKS5taW51cyhiZW5lZmljaWFyaWVzUGF5b3V0VmFsdWUpCiAgICAudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CgogIGNvbnN0IGN1cmF0b3JQYXlTdGF0dXMgPSBhd2FpdCBwYXlPdXRDdXJhdG9ycyhyZXdhcmRQb29sLCB0b2tlbiwgcG9zdCwgY3VyYXRvclBvcnRpb24sIHBhcmFtcyk7CiAgcmVzcG9uc2Uudm90ZXNQcm9jZXNzZWQgKz0gY3VyYXRvclBheVN0YXR1cy52b3Rlc1Byb2Nlc3NlZDsKICByZXNwb25zZS5kb25lID0gY3VyYXRvclBheVN0YXR1cy5kb25lOwogIGlmIChjdXJhdG9yUGF5U3RhdHVzLmRvbmUpIHsKICAgIGNvbnN0IG11dGUgPSBhd2FpdCBnZXRNdXRlKHBvc3QucmV3YXJkUG9vbElkLCBwb3N0LmF1dGhvcik7CiAgICBjb25zdCByZXdhcmRMb2cgPSB7CiAgICAgIHJld2FyZFBvb2xJZDogcG9zdC5yZXdhcmRQb29sSWQsCiAgICAgIGF1dGhvcnBlcm06IHBvc3QuYXV0aG9ycGVybSwKICAgICAgc3ltYm9sOiBwb3N0LnN5bWJvbCwKICAgICAgYWNjb3VudDogcG9zdC5hdXRob3IsCiAgICAgIHF1YW50aXR5OiBhdXRob3JQb3J0aW9uLAogICAgfTsKICAgIGlmIChtdXRlKSB7CiAgICAgIHJld2FyZExvZy5tdXRlID0gdHJ1ZTsKICAgIH0KICAgIGFwaS5lbWl0KCdhdXRob3JSZXdhcmQnLCByZXdhcmRMb2cpOwogICAgYXdhaXQgcGF5VXNlcihwb3N0LnN5bWJvbCwgYXV0aG9yUG9ydGlvbiwgcG9zdC5hdXRob3IsCiAgICAgIHJld2FyZFBvb2wuY29uZmlnLnN0YWtlZFJld2FyZFBlcmNlbnRhZ2UsIG11dGUpOwogICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgncG9zdHMnLCBwb3N0KTsKICB9CiAgcmV0dXJuIHJlc3BvbnNlOwp9Cgphc3luYyBmdW5jdGlvbiBjb21wdXRlUG9zdFJld2FyZHMocGFyYW1zLCByZXdhcmRQb29sLCB0b2tlbiwgZW5kVGltZXN0YW1wKSB7CiAgY29uc3QgewogICAgbGFzdENsYWltRGVjYXlUaW1lc3RhbXAsCiAgfSA9IHJld2FyZFBvb2w7CiAgY29uc3QgewogICAgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCwKICAgIG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQsCiAgfSA9IHBhcmFtczsKCiAgY29uc3QgcG9zdHNUb1BheW91dCA9IGF3YWl0IGFwaS5kYi5maW5kKCdwb3N0cycsCiAgICB7CiAgICAgIHJld2FyZFBvb2xJZDogcmV3YXJkUG9vbC5faWQsCiAgICAgIGNhc2hvdXRUaW1lOiB7ICRndGU6IGxhc3RDbGFpbURlY2F5VGltZXN0YW1wLCAkbHRlOiBlbmRUaW1lc3RhbXAgfSwKICAgIH0sCiAgICBtYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kLAogICAgMCwKICAgIFt7IGluZGV4OiAnYnlDYXNob3V0VGltZScsIGRlc2NlbmRpbmc6IGZhbHNlIH0sIHsgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgbGV0IGRvbmUgPSBmYWxzZTsKICBsZXQgZGVkdWN0RnJvbVJld2FyZFBvb2wgPSBhcGkuQmlnTnVtYmVyKDApOwogIGxldCB2b3Rlc1Byb2Nlc3NlZCA9IDA7CiAgaWYgKHBvc3RzVG9QYXlvdXQgJiYgcG9zdHNUb1BheW91dC5sZW5ndGggPiAwKSB7CiAgICBsZXQgbGltaXRSZWFjaGVkID0gZmFsc2U7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc3RzVG9QYXlvdXQubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgY29uc3QgcG9zdCA9IHBvc3RzVG9QYXlvdXRbaV07CiAgICAgIGNvbnN0IHBvc3RQYXlvdXRSZXNwb25zZSA9IGF3YWl0IHBheU91dFBvc3QocmV3YXJkUG9vbCwgdG9rZW4sIHBvc3QsIHBhcmFtcyk7CiAgICAgIGNvbnN0IHsgdG90YWxQYXlvdXRWYWx1ZSB9ID0gcG9zdFBheW91dFJlc3BvbnNlOwogICAgICB2b3Rlc1Byb2Nlc3NlZCArPSBwb3N0UGF5b3V0UmVzcG9uc2Uudm90ZXNQcm9jZXNzZWQ7CiAgICAgIGlmIChwb3N0UGF5b3V0UmVzcG9uc2UuZG9uZSkgewogICAgICAgIGRlZHVjdEZyb21SZXdhcmRQb29sID0gZGVkdWN0RnJvbVJld2FyZFBvb2wucGx1cyh0b3RhbFBheW91dFZhbHVlKTsKICAgICAgfQogICAgICBpZiAoIXBvc3RQYXlvdXRSZXNwb25zZS5kb25lIHx8IHZvdGVzUHJvY2Vzc2VkID49IG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQpIHsKICAgICAgICBsaW1pdFJlYWNoZWQgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoIWxpbWl0UmVhY2hlZCAmJiBwb3N0c1RvUGF5b3V0Lmxlbmd0aCA8IG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQpIHsKICAgICAgZG9uZSA9IHRydWU7CiAgICB9CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24KICAgIHJld2FyZFBvb2wucmV3YXJkUG9vbCA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5yZXdhcmRQb29sKQogICAgICAubWludXMoZGVkdWN0RnJvbVJld2FyZFBvb2wpCiAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICB9IGVsc2UgewogICAgZG9uZSA9IHRydWU7CiAgfQogIGlmIChkb25lKSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24KICAgIHJld2FyZFBvb2wubGFzdENsYWltRGVjYXlUaW1lc3RhbXAgPSBlbmRUaW1lc3RhbXA7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBwb3N0Q2xhaW1zSW5JbnRlcnZhbChwYXJhbXMsIHJld2FyZFBvb2wsIHN0YXJ0LCBlbmQpIHsKICBsZXQgcG9zdE9mZnNldCA9IDA7CiAgbGV0IG5ld1BlbmRpbmdDbGFpbXMgPSBhcGkuQmlnTnVtYmVyKDApOwogIGxldCBwb3N0c1RvUGF5b3V0ID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Bvc3RzJywKICAgIHsKICAgICAgcmV3YXJkUG9vbElkOiByZXdhcmRQb29sLl9pZCwKICAgICAgY2FzaG91dFRpbWU6IHsgJGd0ZTogc3RhcnQsICRsdGU6IGVuZCB9LAogICAgfSwKICAgIFBPU1RfUVVFUllfTElNSVQsCiAgICBwb3N0T2Zmc2V0LAogICAgW3sgaW5kZXg6ICdieUNhc2hvdXRUaW1lJywgZGVzY2VuZGluZzogZmFsc2UgfSwgeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICB3aGlsZSAocG9zdHNUb1BheW91dCAmJiBwb3N0c1RvUGF5b3V0Lmxlbmd0aCA+IDApIHsKICAgIG5ld1BlbmRpbmdDbGFpbXMgPSBuZXdQZW5kaW5nQ2xhaW1zLnBsdXMoCiAgICAgIHBvc3RzVG9QYXlvdXQucmVkdWNlKCh4LCB5KSA9PiB4LnBsdXMoY2FsY3VsYXRlV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLCB5LnZvdGVSc2hhcmVTdW0pKSwKICAgICAgICBhcGkuQmlnTnVtYmVyKDApKSwKICAgICkKICAgICAgLmRwKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICBpZiAocG9zdHNUb1BheW91dC5sZW5ndGggPCBQT1NUX1FVRVJZX0xJTUlUKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgcG9zdE9mZnNldCArPSBQT1NUX1FVRVJZX0xJTUlUOwogICAgcG9zdHNUb1BheW91dCA9IGF3YWl0IGFwaS5kYi5maW5kKCdwb3N0cycsCiAgICAgIHsKICAgICAgICByZXdhcmRQb29sSWQ6IHJld2FyZFBvb2wuX2lkLAogICAgICAgIGNhc2hvdXRUaW1lOiB7ICRndGU6IHN0YXJ0LCAkbHRlOiBlbmQgfSwKICAgICAgfSwKICAgICAgUE9TVF9RVUVSWV9MSU1JVCwKICAgICAgcG9zdE9mZnNldCwKICAgICAgW3sgaW5kZXg6ICdieUNhc2hvdXRUaW1lJywgZGVzY2VuZGluZzogZmFsc2UgfSwgeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICB9CiAgcmV0dXJuIG5ld1BlbmRpbmdDbGFpbXM7Cn0KCmFzeW5jIGZ1bmN0aW9uIHRva2VuTWFpbnRlbmFuY2UoKSB7CiAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBjb25zdCB7IGxhc3RNYWludGVuYW5jZUJsb2NrLCBsYXN0UHJvY2Vzc2VkUG9vbElkLCBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrIH0gPSBwYXJhbXM7CiAgaWYgKGxhc3RNYWludGVuYW5jZUJsb2NrID49IGFwaS5ibG9ja051bWJlcikgewogICAgcmV0dXJuOwogIH0KICBwYXJhbXMubGFzdE1haW50ZW5hbmNlQmxvY2sgPSBhcGkuYmxvY2tOdW1iZXI7CgogIC8vIENoZWNrcyBpZiByZWFkeSB0byBwcm9jZXNzIG5leHQgcmV3YXJkIGludGVydmFsCiAgY29uc3QgcmV3YXJkUG9vbFByb2Nlc3NpbmdFeHByZXNzaW9uID0gewogICAgJGx0ZTogWwogICAgICAnJGxhc3RDbGFpbURlY2F5VGltZXN0YW1wJywKICAgICAgewogICAgICAgICRzdWJ0cmFjdDogWwogICAgICAgICAgdGltZXN0YW1wLAogICAgICAgICAgewogICAgICAgICAgICAkbXVsdGlwbHk6IFsKICAgICAgICAgICAgICAnJGNvbmZpZy5yZXdhcmRJbnRlcnZhbFNlY29uZHMnLAogICAgICAgICAgICAgIDEwMDAsCiAgICAgICAgICAgIF0sCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgIH0sCiAgICBdLAogIH07CiAgbGV0IHJld2FyZFBvb2xzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Jld2FyZFBvb2xzJywgewogICAgYWN0aXZlOiB0cnVlLAogICAgJGV4cHI6IHJld2FyZFBvb2xQcm9jZXNzaW5nRXhwcmVzc2lvbiwKICAgIF9pZDogeyAkZ3Q6IGxhc3RQcm9jZXNzZWRQb29sSWQgfSwKICB9LCBtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrLCAwLCBbeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICBpZiAoIXJld2FyZFBvb2xzIHx8IHJld2FyZFBvb2xzLmxlbmd0aCA8IG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2spIHsKICAgIGlmICghcmV3YXJkUG9vbHMpIHsKICAgICAgcmV3YXJkUG9vbHMgPSBbXTsKICAgIH0KICAgIC8vIGF1Z21lbnQgZnJvbSBiZWdpbm5pbmcKICAgIGNvbnN0IG1vcmVSZXdhcmRQb29scyA9IGF3YWl0IGFwaS5kYi5maW5kKCdyZXdhcmRQb29scycsIHsKICAgICAgYWN0aXZlOiB0cnVlLAogICAgICAkZXhwcjogcmV3YXJkUG9vbFByb2Nlc3NpbmdFeHByZXNzaW9uLAogICAgfSwgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jayAtIHJld2FyZFBvb2xzLmxlbmd0aCwgMCwgW3sgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocmV3YXJkUG9vbHMubWFwKHAgPT4gcC5faWQpKTsKICAgIG1vcmVSZXdhcmRQb29scy5mb3JFYWNoKChtcnApID0+IHsKICAgICAgaWYgKCFleGlzdGluZ0lkcy5oYXMobXJwLl9pZCkpIHsKICAgICAgICByZXdhcmRQb29scy5wdXNoKG1ycCk7CiAgICAgIH0KICAgIH0pOwogIH0KICBpZiAocmV3YXJkUG9vbHMpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV3YXJkUG9vbHMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgY29uc3QgcmV3YXJkUG9vbCA9IHJld2FyZFBvb2xzW2ldOwogICAgICBwYXJhbXMubGFzdFByb2Nlc3NlZFBvb2xJZCA9IHJld2FyZFBvb2wuX2lkOwogICAgICBjb25zdCB7CiAgICAgICAgc3ltYm9sLAogICAgICAgIGxhc3RDbGFpbURlY2F5VGltZXN0YW1wLAogICAgICAgIGxhc3RSZXdhcmRUaW1lc3RhbXAsCiAgICAgICAgY29uZmlnLAogICAgICB9ID0gcmV3YXJkUG9vbDsKICAgICAgY29uc3QgewogICAgICAgIHJld2FyZEludGVydmFsU2Vjb25kcywKICAgICAgICByZXdhcmRQZXJJbnRlcnZhbCwKICAgICAgICBjYXNob3V0V2luZG93RGF5cywKICAgICAgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKICAgICAgY29uc3QgcmV3YXJkSW50ZXJ2YWxEdXJhdGlvbk1pbGxpcyA9IHJld2FyZEludGVydmFsU2Vjb25kcyAqIDEwMDA7CiAgICAgIGNvbnN0IG5leHRSZXdhcmRUaW1lc3RhbXAgPSBsYXN0UmV3YXJkVGltZXN0YW1wICsgcmV3YXJkSW50ZXJ2YWxEdXJhdGlvbk1pbGxpczsKICAgICAgY29uc3QgbmV4dENsYWltRGVjYXlUaW1lc3RhbXAgPSBsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcCArIHJld2FyZEludGVydmFsRHVyYXRpb25NaWxsaXM7CiAgICAgIGlmIChuZXh0Q2xhaW1EZWNheVRpbWVzdGFtcCA+PSBuZXh0UmV3YXJkVGltZXN0YW1wKSB7CiAgICAgICAgY29uc3QgcmV3YXJkVG9BZGQgPSBhcGkuQmlnTnVtYmVyKHJld2FyZFBlckludGVydmFsKTsKICAgICAgICBpZiAoYXBpLkJpZ051bWJlcihyZXdhcmRUb0FkZCkuZ3QoMCkpIHsKICAgICAgICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgJ2lzc3VlVG9Db250cmFjdCcsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBzeW1ib2w6IHJld2FyZFBvb2wuc3ltYm9sLCBxdWFudGl0eTogcmV3YXJkVG9BZGQsIHRvOiAnY29tbWVudHMnLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXk6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgcmV3YXJkUG9vbC5yZXdhcmRQb29sID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLnJld2FyZFBvb2wpLnBsdXMocmV3YXJkVG9BZGQpCiAgICAgICAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgICAgICB9CiAgICAgICAgLy8gY2xhaW0gYWRqdXN0bWVudHMgKGRlY2F5ICsgcG9zdHMgdG8gcGF5IG91dCBpbiBuZXh0IGludGVydmFsKQogICAgICAgIGNvbnN0IGNsYWltc0RlY2F5UGVyaW9kRGF5cyA9IGNhc2hvdXRXaW5kb3dEYXlzICogMiArIDE7CiAgICAgICAgY29uc3QgYWRqdXN0TnVtZXIgPSBuZXh0UmV3YXJkVGltZXN0YW1wIC0gbGFzdFJld2FyZFRpbWVzdGFtcDsKICAgICAgICBjb25zdCBhZGp1c3REZW5vbSA9IGNsYWltc0RlY2F5UGVyaW9kRGF5cyAqIDI0ICogMzYwMCAqIDEwMDA7CiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduCiAgICAgICAgcmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLnBlbmRpbmdDbGFpbXMpCiAgICAgICAgICAubWludXMoYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLnBlbmRpbmdDbGFpbXMpCiAgICAgICAgICAgIC5tdWx0aXBsaWVkQnkoYWRqdXN0TnVtZXIpCiAgICAgICAgICAgIC5kaXZpZGVkQnkoYWRqdXN0RGVub20pKQogICAgICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgICAgICAvLyBBZGQgcG9zdHMgY2xhaW1zLCBjb21wdXRlIHN1YnNlcXVlbnQgcmV3YXJkcyBiYXNlZCBvbiBpbmNsdXNpb24gaW50byBjbGFpbXMgdG8KICAgICAgICAvLyBlbnN1cmUgaXQgY2Fubm90IHRha2UgbW9yZSBvZiB0aGUgY3VycmVudCBwb29sCiAgICAgICAgcmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zID0gYXBpLkJpZ051bWJlcihyZXdhcmRQb29sLnBlbmRpbmdDbGFpbXMpCiAgICAgICAgICAucGx1cygKICAgICAgICAgICAgYXdhaXQgcG9zdENsYWltc0luSW50ZXJ2YWwoCiAgICAgICAgICAgICAgcGFyYW1zLCByZXdhcmRQb29sLCBsYXN0UmV3YXJkVGltZXN0YW1wLCBuZXh0UmV3YXJkVGltZXN0YW1wLAogICAgICAgICAgICApLAogICAgICAgICAgKQogICAgICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKCiAgICAgICAgcmV3YXJkUG9vbC5sYXN0UmV3YXJkVGltZXN0YW1wID0gbmV4dFJld2FyZFRpbWVzdGFtcDsKICAgICAgICAvLyBjb3B5IGNsYWltcyBhbmQgcmV3YXJkcyBmb3IgY3VycmVudCByZXdhcmQgaW50ZXJ2YWwKICAgICAgICByZXdhcmRQb29sLmludGVydmFsUGVuZGluZ0NsYWltcyA9IHJld2FyZFBvb2wucGVuZGluZ0NsYWltczsKICAgICAgICByZXdhcmRQb29sLmludGVydmFsUmV3YXJkUG9vbCA9IHJld2FyZFBvb2wucmV3YXJkUG9vbDsKICAgICAgfQogICAgICAvLyBDb21wdXRlIHBvc3QgcmV3YXJkcwogICAgICBhd2FpdCBjb21wdXRlUG9zdFJld2FyZHMocGFyYW1zLCByZXdhcmRQb29sLCB0b2tlbiwgbmV4dENsYWltRGVjYXlUaW1lc3RhbXApOwogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdyZXdhcmRQb29scycsIHJld2FyZFBvb2wpOwogICAgfQogIH0KICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwYXJhbXMnLCBwYXJhbXMpOwp9CgphY3Rpb25zLmNyZWF0ZVJld2FyZFBvb2wgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHN5bWJvbCwKICAgIGNvbmZpZywKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKICBpZiAoIWFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAnb3BlcmF0aW9uIG11c3QgYmUgc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykpIHsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyBzZXR1cEZlZSwgbWF4VGFnc1BlclBvb2wgfSA9IHBhcmFtczsKCiAgLy8gZ2V0IGFwaS5zZW5kZXIncyBVVElMSVRZX1RPS0VOX1NZTUJPTCBiYWxhbmNlCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogIGNvbnN0IHV0aWxpdHlUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiAiQkVFIiB9KTsKCiAgY29uc3QgYXV0aG9yaXplZENyZWF0aW9uID0gYXBpLkJpZ051bWJlcihzZXR1cEZlZSkubHRlKDApIHx8IGFwaS5zZW5kZXIgPT09IGFwaS5vd25lcgogICAgPyB0cnVlCiAgICA6IHV0aWxpdHlUb2tlbkJhbGFuY2UgJiYgYXBpLkJpZ051bWJlcih1dGlsaXR5VG9rZW5CYWxhbmNlLmJhbGFuY2UpLmd0ZShzZXR1cEZlZSk7CgogIGlmICghYXBpLmFzc2VydChhdXRob3JpemVkQ3JlYXRpb24sICd5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGNyZWF0aW9uIGZlZScpKSByZXR1cm47CgoKICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgndG9rZW5zJywgJ3Rva2VucycsIHsgc3ltYm9sIH0pOwogIGlmICghYXBpLmFzc2VydCh0b2tlbiwgJ3Rva2VuIG5vdCBmb3VuZCcpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JywgJ2NvbmZpZyBpbnZhbGlkJykpIHJldHVybjsKCiAgY29uc3QgewogICAgcG9zdFJld2FyZEN1cnZlLAogICAgcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyLAogICAgY3VyYXRpb25SZXdhcmRDdXJ2ZSwKICAgIGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIsCiAgICBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UsCiAgICBjYXNob3V0V2luZG93RGF5cywKICAgIHJld2FyZFBlckludGVydmFsLAogICAgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzLAogICAgdm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBzdGFrZWRSZXdhcmRQZXJjZW50YWdlLAogICAgdm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICB0YWdzLAogIH0gPSBjb25maWc7CgogIGlmICghYXBpLmFzc2VydChwb3N0UmV3YXJkQ3VydmUgJiYgcG9zdFJld2FyZEN1cnZlID09PSAncG93ZXInLCAncG9zdFJld2FyZEN1cnZlIHNob3VsZCBiZSBvbmUgb2Y6IFtwb3dlcl0nKSkgcmV0dXJuOwogIGNvbnN0IHBvc3RFeHBvbmVudCA9IGFwaS5CaWdOdW1iZXIocG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyKTsKICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlciA9PT0gJ3N0cmluZycgJiYgcG9zdEV4cG9uZW50LmlzRmluaXRlKCkgJiYgcG9zdEV4cG9uZW50Lmd0ZSgnMScpICYmIHBvc3RFeHBvbmVudC5sdGUoJzInKSAmJiBwb3N0RXhwb25lbnQuZHAoKSA8PSAyLCAncG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyIHNob3VsZCBiZSBiZXR3ZWVuICIxIiBhbmQgIjIiIHdpdGggcHJlY2lzaW9uIGF0IG1vc3QgMicpKSByZXR1cm47CgogIGlmICghYXBpLmFzc2VydChjdXJhdGlvblJld2FyZEN1cnZlICYmIGN1cmF0aW9uUmV3YXJkQ3VydmUgPT09ICdwb3dlcicsICdjdXJhdGlvblJld2FyZEN1cnZlIHNob3VsZCBiZSBvbmUgb2Y6IFtwb3dlcl0nKSkgcmV0dXJuOwogIGNvbnN0IGN1cmF0aW9uRXhwb25lbnQgPSBhcGkuQmlnTnVtYmVyKGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIpOwogIGlmICghYXBpLmFzc2VydCh0eXBlb2YgY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlciA9PT0gJ3N0cmluZycgJiYgY3VyYXRpb25FeHBvbmVudC5pc0Zpbml0ZSgpICYmIGN1cmF0aW9uRXhwb25lbnQuZ3RlKCcwLjUnKSAmJiBjdXJhdGlvbkV4cG9uZW50Lmx0ZSgnMScpICYmIGN1cmF0aW9uRXhwb25lbnQuZHAoKSA8PSAyLCAnY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlciBjYW4gb25seSBiZSBiZXR3ZWVuICIwLjUiIGFuZCAiMSIgd2l0aCBwcmVjaXNpb24gYXQgbW9zdCAyJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIoY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlKSAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPj0gMCAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPD0gMTAwLCAnY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KGNhc2hvdXRXaW5kb3dEYXlzICYmIE51bWJlci5pc0ludGVnZXIoY2FzaG91dFdpbmRvd0RheXMpICYmIGNhc2hvdXRXaW5kb3dEYXlzID49IDEgJiYgY2FzaG91dFdpbmRvd0RheXMgPD0gMzAsICdjYXNob3V0V2luZG93RGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwJykpIHJldHVybjsKCiAgY29uc3QgcGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwgPSBhcGkuQmlnTnVtYmVyKHJld2FyZFBlckludGVydmFsKTsKICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHJld2FyZFBlckludGVydmFsID09PSAnc3RyaW5nJyAmJiBwYXJzZWRSZXdhcmRQZXJJbnRlcnZhbC5pc0Zpbml0ZSgpICYmIHBhcnNlZFJld2FyZFBlckludGVydmFsLmd0KDApLCAncmV3YXJkUGVySW50ZXJ2YWwgaW52YWxpZCcpCiAgICAgICAgfHwgIWFwaS5hc3NlcnQocGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwuZHAoKSA8PSB0b2tlbi5wcmVjaXNpb24sICd0b2tlbiBwcmVjaXNpb24gbWlzbWF0Y2ggZm9yIHJld2FyZFBlckludGVydmFsJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KHJld2FyZEludGVydmFsU2Vjb25kcyAmJiBOdW1iZXIuaXNJbnRlZ2VyKHJld2FyZEludGVydmFsU2Vjb25kcykgJiYgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzID49IDMgJiYgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzIDw9IDg2NDAwICYmIHJld2FyZEludGVydmFsU2Vjb25kcyAlIDMgPT09IDAsICdyZXdhcmRJbnRlcnZhbFNlY29uZHMgc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAzIGFuZCA4NjQwMCwgYW5kIGRpdmlzaWJsZSBieSAzJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KHZvdGVSZWdlbmVyYXRpb25EYXlzICYmIE51bWJlci5pc0ludGVnZXIodm90ZVJlZ2VuZXJhdGlvbkRheXMpICYmIHZvdGVSZWdlbmVyYXRpb25EYXlzID49IDEgJiYgdm90ZVJlZ2VuZXJhdGlvbkRheXMgPD0gMzAsICd2b3RlUmVnZW5lcmF0aW9uRGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzICYmIE51bWJlci5pc0ludGVnZXIoZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzKSAmJiBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMgPj0gMSAmJiBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMgPD0gMzAsICdkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMgc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAzMCcpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIoc3Rha2VkUmV3YXJkUGVyY2VudGFnZSkgJiYgc3Rha2VkUmV3YXJkUGVyY2VudGFnZSA+PSAwICYmIHN0YWtlZFJld2FyZFBlcmNlbnRhZ2UgPD0gMTAwLCAnc3Rha2VkUmV3YXJkUGVyY2VudGFnZSBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMCcpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KHZvdGVQb3dlckNvbnN1bXB0aW9uICYmIE51bWJlci5pc0ludGVnZXIodm90ZVBvd2VyQ29uc3VtcHRpb24pICYmIHZvdGVQb3dlckNvbnN1bXB0aW9uID49IDEgJiYgdm90ZVBvd2VyQ29uc3VtcHRpb24gPD0gMTAwMDAsICd2b3RlUG93ZXJDb25zdW1wdGlvbiBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMDAwJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uICYmIE51bWJlci5pc0ludGVnZXIoZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uKSAmJiBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24gPj0gMSAmJiBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24gPD0gMTAwMDAsICdkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24gc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAwMCcpKSByZXR1cm47CgogIGlmICghYXBpLmFzc2VydChBcnJheS5pc0FycmF5KHRhZ3MpICYmIHRhZ3MubGVuZ3RoID49IDEgJiYgdGFncy5sZW5ndGggPD0gbWF4VGFnc1BlclBvb2wgJiYgdGFncy5ldmVyeSh0ID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyksIGB0YWdzIHNob3VsZCBiZSBhIG5vbi1lbXB0eSBhcnJheSBvZiBzdHJpbmdzIG9mIGxlbmd0aCBhdCBtb3N0ICR7bWF4VGFnc1BlclBvb2x9YCkpIHJldHVybjsKCiAgLy8gZm9yIG5vdywgcmVzdHJpY3QgdG8gMSBwb29sIHBlciBzeW1ib2wsIGFuZCBjcmVhdG9yIG11c3QgYmUgaXNzdWVyLgogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKICBpZiAoIWFwaS5hc3NlcnQoYXBpLnNlbmRlciA9PT0gdG9rZW4uaXNzdWVyIHx8IChhcGkuc2VuZGVyID09PSBhcGkub3duZXIgJiYgdG9rZW4uc3ltYm9sID09PSAiQkVFIiksICdtdXN0IGJlIGlzc3VlciBvZiB0b2tlbicpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KHRva2VuLnN0YWtpbmdFbmFibGVkLCAndG9rZW4gbXVzdCBoYXZlIHN0YWtpbmcgZW5hYmxlZCcpKSByZXR1cm47CgogIGNvbnN0IGV4aXN0aW5nUmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgc3ltYm9sIH0pOwogIGlmICghYXBpLmFzc2VydCghZXhpc3RpbmdSZXdhcmRQb29sLCAnY2Fubm90IGNyZWF0ZSBtdWx0aXBsZSByZXdhcmQgcG9vbHMgcGVyIHRva2VuJykpIHJldHVybjsKCiAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CgogIGNvbnN0IHJld2FyZFBvb2wgPSB7CiAgICBzeW1ib2wsCiAgICByZXdhcmRQb29sOiAnMCcsCiAgICBsYXN0UmV3YXJkVGltZXN0YW1wOiB0aW1lc3RhbXAsCiAgICBsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcDogdGltZXN0YW1wLAogICAgY3JlYXRlZFRpbWVzdGFtcDogdGltZXN0YW1wLAogICAgY29uZmlnOiB7CiAgICAgIHBvc3RSZXdhcmRDdXJ2ZSwKICAgICAgcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyLAogICAgICBjdXJhdGlvblJld2FyZEN1cnZlLAogICAgICBjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyLAogICAgICBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UsCiAgICAgIGNhc2hvdXRXaW5kb3dEYXlzLAogICAgICByZXdhcmRQZXJJbnRlcnZhbCwKICAgICAgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzLAogICAgICB2b3RlUmVnZW5lcmF0aW9uRGF5cywKICAgICAgZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzLAogICAgICBzdGFrZWRSZXdhcmRQZXJjZW50YWdlLAogICAgICB2b3RlUG93ZXJDb25zdW1wdGlvbiwKICAgICAgZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uLAogICAgICB0YWdzLAogICAgfSwKICAgIHBlbmRpbmdDbGFpbXM6ICcwJywKICAgIGFjdGl2ZTogdHJ1ZSwKICB9OwogIGNvbnN0IGluc2VydGVkUmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3Jld2FyZFBvb2xzJywgcmV3YXJkUG9vbCk7CiAgLy8gYnVybiB0aGUgdG9rZW4gY3JlYXRpb24gZmVlcwogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIgJiYgYXBpLkJpZ051bWJlcihzZXR1cEZlZSkuZ3QoMCkpIHsKICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgJ3RyYW5zZmVyJywgewogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCiAgICAgIHRvOiAnbnVsbCcsIHN5bWJvbDogIkJFRSIsIHF1YW50aXR5OiBzZXR1cEZlZSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CiAgfQogIGFwaS5lbWl0KCdjcmVhdGVSZXdhcmRQb29sJywgeyBfaWQ6IGluc2VydGVkUmV3YXJkUG9vbC5faWQgfSk7Cn07CgphY3Rpb25zLnVwZGF0ZVJld2FyZFBvb2wgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHJld2FyZFBvb2xJZCwKICAgIGNvbmZpZywKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKICBpZiAoIWFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAnb3BlcmF0aW9uIG11c3QgYmUgc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykpIHsKICAgIHJldHVybjsKICB9CiAgLy8gZ2V0IGNvbnRyYWN0IHBhcmFtcwogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyB1cGRhdGVGZWUsIG1heFRhZ3NQZXJQb29sIH0gPSBwYXJhbXM7CiAgLy8gZ2V0IGFwaS5zZW5kZXIncyBVVElMSVRZX1RPS0VOX1NZTUJPTCBiYWxhbmNlCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogIGNvbnN0IHV0aWxpdHlUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiAiQkVFIiB9KTsKCiAgY29uc3QgYXV0aG9yaXplZCA9IGFwaS5CaWdOdW1iZXIodXBkYXRlRmVlKS5sdGUoMCkgfHwgYXBpLnNlbmRlciA9PT0gYXBpLm93bmVyCiAgICA/IHRydWUKICAgIDogdXRpbGl0eVRva2VuQmFsYW5jZSAmJiBhcGkuQmlnTnVtYmVyKHV0aWxpdHlUb2tlbkJhbGFuY2UuYmFsYW5jZSkuZ3RlKHVwZGF0ZUZlZSk7CgogIGlmICghYXBpLmFzc2VydChhdXRob3JpemVkLCAneW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSB1cGRhdGUgZmVlJykpIHJldHVybjsKCiAgaWYgKCFhcGkuYXNzZXJ0KGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JywgJ2NvbmZpZyBpbnZhbGlkJykpIHJldHVybjsKCiAgY29uc3QgewogICAgcG9zdFJld2FyZEN1cnZlLAogICAgcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyLAogICAgY3VyYXRpb25SZXdhcmRDdXJ2ZSwKICAgIGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIsCiAgICBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UsCiAgICBjYXNob3V0V2luZG93RGF5cywKICAgIHJld2FyZFBlckludGVydmFsLAogICAgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzLAogICAgdm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMsCiAgICBzdGFrZWRSZXdhcmRQZXJjZW50YWdlLAogICAgdm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICBkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24sCiAgICB0YWdzLAogIH0gPSBjb25maWc7CgogIGNvbnN0IGV4aXN0aW5nUmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgX2lkOiByZXdhcmRQb29sSWQgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KGV4aXN0aW5nUmV3YXJkUG9vbCwgJ3Jld2FyZCBwb29sIG5vdCBmb3VuZCcpKSByZXR1cm47CgogIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IGV4aXN0aW5nUmV3YXJkUG9vbC5zeW1ib2wgfSk7CgogIGlmICghYXBpLmFzc2VydChwb3N0UmV3YXJkQ3VydmUgJiYgcG9zdFJld2FyZEN1cnZlID09PSAncG93ZXInLCAncG9zdFJld2FyZEN1cnZlIHNob3VsZCBiZSBvbmUgb2Y6IFtwb3dlcl0nKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlID0gcG9zdFJld2FyZEN1cnZlOwoKICBjb25zdCBwb3N0RXhwb25lbnQgPSBhcGkuQmlnTnVtYmVyKHBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcik7CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiBwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIgPT09ICdzdHJpbmcnICYmIHBvc3RFeHBvbmVudC5pc0Zpbml0ZSgpICYmIHBvc3RFeHBvbmVudC5ndGUoJzEnKSAmJiBwb3N0RXhwb25lbnQubHRlKCcyJykgJiYgcG9zdEV4cG9uZW50LmRwKCkgPD0gMiwgJ3Bvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlciBzaG91bGQgYmUgYmV0d2VlbiAiMSIgYW5kICIyIiB3aXRoIHByZWNpc2lvbiBhdCBtb3N0IDInKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyID0gcG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyOwoKICBpZiAoIWFwaS5hc3NlcnQoY3VyYXRpb25SZXdhcmRDdXJ2ZSAmJiBjdXJhdGlvblJld2FyZEN1cnZlID09PSAncG93ZXInLCAnY3VyYXRpb25SZXdhcmRDdXJ2ZSBzaG91bGQgYmUgb25lIG9mOiBbcG93ZXJdJykpIHJldHVybjsKICBjb25zdCBjdXJhdGlvbkV4cG9uZW50ID0gYXBpLkJpZ051bWJlcihjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyKTsKICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIgPT09ICdzdHJpbmcnICYmIGN1cmF0aW9uRXhwb25lbnQuaXNGaW5pdGUoKSAmJiBjdXJhdGlvbkV4cG9uZW50Lmd0ZSgnMC41JykgJiYgY3VyYXRpb25FeHBvbmVudC5sdGUoJzEnKSAmJiBjdXJhdGlvbkV4cG9uZW50LmRwKCkgPD0gMiwgJ2N1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIgY2FuIG9ubHkgYmUgYmV0d2VlbiAiMC41IiBhbmQgIjEiIHdpdGggcHJlY2lzaW9uIGF0IG1vc3QgMicpKSByZXR1cm47CiAgZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyID0gY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcjsKCiAgaWYgKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIoY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlKSAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPj0gMCAmJiBjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UgPD0gMTAwLCAnY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwJykpIHJldHVybjsKICBleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLmN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSA9IGN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZTsKCiAgaWYgKCFhcGkuYXNzZXJ0KGNhc2hvdXRXaW5kb3dEYXlzICYmIE51bWJlci5pc0ludGVnZXIoY2FzaG91dFdpbmRvd0RheXMpICYmIGNhc2hvdXRXaW5kb3dEYXlzID49IDEgJiYgY2FzaG91dFdpbmRvd0RheXMgPD0gMzAsICdjYXNob3V0V2luZG93RGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwJykpIHJldHVybjsKICBleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLmNhc2hvdXRXaW5kb3dEYXlzID0gY2FzaG91dFdpbmRvd0RheXM7CgogIGNvbnN0IHBhcnNlZFJld2FyZFBlckludGVydmFsID0gYXBpLkJpZ051bWJlcihyZXdhcmRQZXJJbnRlcnZhbCk7CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiByZXdhcmRQZXJJbnRlcnZhbCA9PT0gJ3N0cmluZycgJiYgcGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwuaXNGaW5pdGUoKSAmJiBwYXJzZWRSZXdhcmRQZXJJbnRlcnZhbC5ndCgwKSwgJ3Jld2FyZFBlckludGVydmFsIGludmFsaWQnKQogICAgICAgIHx8ICFhcGkuYXNzZXJ0KHBhcnNlZFJld2FyZFBlckludGVydmFsLmRwKCkgPD0gdG9rZW4ucHJlY2lzaW9uLCAndG9rZW4gcHJlY2lzaW9uIG1pc21hdGNoIGZvciByZXdhcmRQZXJJbnRlcnZhbCcpKSByZXR1cm47CiAgZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5yZXdhcmRQZXJJbnRlcnZhbCA9IHJld2FyZFBlckludGVydmFsOwoKICBpZiAoIWFwaS5hc3NlcnQocmV3YXJkSW50ZXJ2YWxTZWNvbmRzICYmIE51bWJlci5pc0ludGVnZXIocmV3YXJkSW50ZXJ2YWxTZWNvbmRzKSAmJiByZXdhcmRJbnRlcnZhbFNlY29uZHMgPj0gMyAmJiByZXdhcmRJbnRlcnZhbFNlY29uZHMgPD0gODY0MDAgJiYgcmV3YXJkSW50ZXJ2YWxTZWNvbmRzICUgMyA9PT0gMCwgJ3Jld2FyZEludGVydmFsU2Vjb25kcyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDMgYW5kIDg2NDAwLCBhbmQgZGl2aXNpYmxlIGJ5IDMnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucmV3YXJkSW50ZXJ2YWxTZWNvbmRzID0gcmV3YXJkSW50ZXJ2YWxTZWNvbmRzOwoKICBpZiAoIWFwaS5hc3NlcnQodm90ZVJlZ2VuZXJhdGlvbkRheXMgJiYgTnVtYmVyLmlzSW50ZWdlcih2b3RlUmVnZW5lcmF0aW9uRGF5cykgJiYgdm90ZVJlZ2VuZXJhdGlvbkRheXMgPj0gMSAmJiB2b3RlUmVnZW5lcmF0aW9uRGF5cyA8PSAzMCwgJ3ZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcudm90ZVJlZ2VuZXJhdGlvbkRheXMgPSB2b3RlUmVnZW5lcmF0aW9uRGF5czsKCiAgaWYgKCFhcGkuYXNzZXJ0KGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cykgJiYgZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzID49IDEgJiYgZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzIDw9IDMwLCAnZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzID0gZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzOwoKICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihzdGFrZWRSZXdhcmRQZXJjZW50YWdlKSAmJiBzdGFrZWRSZXdhcmRQZXJjZW50YWdlID49IDAgJiYgc3Rha2VkUmV3YXJkUGVyY2VudGFnZSA8PSAxMDAsICdzdGFrZWRSZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwJykpIHJldHVybjsKICBleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLnN0YWtlZFJld2FyZFBlcmNlbnRhZ2UgPSBzdGFrZWRSZXdhcmRQZXJjZW50YWdlOwoKICBpZiAoIWFwaS5hc3NlcnQodm90ZVBvd2VyQ29uc3VtcHRpb24gJiYgTnVtYmVyLmlzSW50ZWdlcih2b3RlUG93ZXJDb25zdW1wdGlvbikgJiYgdm90ZVBvd2VyQ29uc3VtcHRpb24gPj0gMSAmJiB2b3RlUG93ZXJDb25zdW1wdGlvbiA8PSAxMDAwMCwgJ3ZvdGVQb3dlckNvbnN1bXB0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcudm90ZVBvd2VyQ29uc3VtcHRpb24gPSB2b3RlUG93ZXJDb25zdW1wdGlvbjsKCiAgaWYgKCFhcGkuYXNzZXJ0KGRvd252b3RlUG93ZXJDb25zdW1wdGlvbiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUG93ZXJDb25zdW1wdGlvbikgJiYgZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uID49IDEgJiYgZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uIDw9IDEwMDAwLCAnZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAnKSkgcmV0dXJuOwogIGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uID0gZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uOwoKICBpZiAoIWFwaS5hc3NlcnQoQXJyYXkuaXNBcnJheSh0YWdzKSAmJiB0YWdzLmxlbmd0aCA+PSAxICYmIHRhZ3MubGVuZ3RoIDw9IG1heFRhZ3NQZXJQb29sICYmIHRhZ3MuZXZlcnkodCA9PiB0eXBlb2YgdCA9PT0gJ3N0cmluZycpLCBgdGFncyBzaG91bGQgYmUgYSBub24tZW1wdHkgYXJyYXkgb2Ygc3RyaW5ncyBvZiBsZW5ndGggYXQgbW9zdCAke21heFRhZ3NQZXJQb29sfWApKSByZXR1cm47CiAgZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy50YWdzID0gdGFnczsKCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogIGlmICghYXBpLmFzc2VydChhcGkuc2VuZGVyID09PSB0b2tlbi5pc3N1ZXIgfHwgKGFwaS5zZW5kZXIgPT09IGFwaS5vd25lciAmJiB0b2tlbi5zeW1ib2wgPT09ICJCRUUiKSwgJ211c3QgYmUgaXNzdWVyIG9mIHRva2VuJykpIHJldHVybjsKCiAgLy8gYnVybiB0aGUgZmVlcwogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIgJiYgYXBpLkJpZ051bWJlcih1cGRhdGVGZWUpLmd0KDApKSB7CiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICd0cmFuc2ZlcicsIHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogICAgICB0bzogJ251bGwnLCBzeW1ib2w6ICJCRUUiLCBxdWFudGl0eTogdXBkYXRlRmVlLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICB9KTsKICB9CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Jld2FyZFBvb2xzJywgZXhpc3RpbmdSZXdhcmRQb29sKTsKfTsKCmFjdGlvbnMuc2V0QWN0aXZlID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICByZXdhcmRQb29sSWQsCiAgICBhY3RpdmUsCiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CiAgaWYgKCFhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ29wZXJhdGlvbiBtdXN0IGJlIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpKSB7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBleGlzdGluZ1Jld2FyZFBvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncmV3YXJkUG9vbHMnLCB7IF9pZDogcmV3YXJkUG9vbElkIH0pOwogIGlmICghYXBpLmFzc2VydChleGlzdGluZ1Jld2FyZFBvb2wsICdyZXdhcmQgcG9vbCBub3QgZm91bmQnKSkgcmV0dXJuOwogIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IGV4aXN0aW5nUmV3YXJkUG9vbC5zeW1ib2wgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09IHRva2VuLmlzc3VlciB8fCBhcGkuc2VuZGVyID09PSBhcGkub3duZXIsICdtdXN0IGJlIGlzc3VlciBvZiB0b2tlbicpKSByZXR1cm47CgogIGV4aXN0aW5nUmV3YXJkUG9vbC5hY3RpdmUgPSBhY3RpdmU7CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncmV3YXJkUG9vbHMnLCBleGlzdGluZ1Jld2FyZFBvb2wpOwp9OwoKYWN0aW9ucy5zZXRNdXRlID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICByZXdhcmRQb29sSWQsCiAgICBhY2NvdW50LAogICAgbXV0ZSwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKCFhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ29wZXJhdGlvbiBtdXN0IGJlIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IGV4aXN0aW5nUmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgX2lkOiByZXdhcmRQb29sSWQgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KGV4aXN0aW5nUmV3YXJkUG9vbCwgJ3Jld2FyZCBwb29sIG5vdCBmb3VuZCcpKSByZXR1cm47CiAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbDogZXhpc3RpbmdSZXdhcmRQb29sLnN5bWJvbCB9KTsKICBpZiAoIWFwaS5hc3NlcnQoYXBpLnNlbmRlciA9PT0gdG9rZW4uaXNzdWVyIHx8IGFwaS5zZW5kZXIgPT09IGFwaS5vd25lciwgJ211c3QgYmUgaXNzdWVyIG9mIHRva2VuJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoYXBpLmlzVmFsaWRBY2NvdW50TmFtZShhY2NvdW50KSwgJ2ludmFsaWQgYWNjb3VudCcpKSByZXR1cm47CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiBtdXRlID09PSAnYm9vbGVhbicsICdtdXRlIG11c3QgYmUgYSBib29sZWFuJykpIHJldHVybjsKCiAgY29uc3Qgdm90aW5nUG93ZXIgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndm90aW5nUG93ZXInLCB7IHJld2FyZFBvb2xJZCwgYWNjb3VudCB9KTsKICBpZiAoIXZvdGluZ1Bvd2VyKSB7CiAgICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CiAgICBjb25zdCB0aW1lc3RhbXAgPSBibG9ja0RhdGUuZ2V0VGltZSgpOwogICAgY29uc3QgbmV3Vm90aW5nUG93ZXIgPSB7CiAgICAgIHJld2FyZFBvb2xJZCwKICAgICAgYWNjb3VudCwKICAgICAgbGFzdFZvdGVUaW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgdm90aW5nUG93ZXI6IE1BWF9WT1RJTkdfUE9XRVIsCiAgICAgIGRvd252b3RpbmdQb3dlcjogTUFYX1ZPVElOR19QT1dFUiwKICAgICAgbXV0ZSwKICAgIH07CiAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCd2b3RpbmdQb3dlcicsIG5ld1ZvdGluZ1Bvd2VyKTsKICB9IGVsc2UgewogICAgdm90aW5nUG93ZXIubXV0ZSA9IG11dGU7CiAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd2b3RpbmdQb3dlcicsIHZvdGluZ1Bvd2VyKTsKICB9Cn07Cgphc3luYyBmdW5jdGlvbiBnZXRSZXdhcmRQb29sSWRzKHBheWxvYWQpIHsKICBjb25zdCB7CiAgICByZXdhcmRQb29scywKICAgIGpzb25NZXRhZGF0YSwKICAgIHBhcmVudEF1dGhvciwKICAgIHBhcmVudFBlcm1saW5rLAogIH0gPSBwYXlsb2FkOwoKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwoKICAvLyBDaGVjayBpZiBpdCBpcyBhIHJlcGx5LCBhbmQgaW5oZXJpdCB0aGUgc2V0dGluZ3MKICAvLyBmcm9tIHRoZSBwYXJlbnQuCiAgaWYgKHBhcmVudEF1dGhvciAmJiBwYXJlbnRQZXJtbGluaykgewogICAgY29uc3QgcGFyZW50QXV0aG9ycGVybSA9IGBAJHtwYXJlbnRBdXRob3J9LyR7cGFyZW50UGVybWxpbmt9YDsKICAgIGNvbnN0IHBhcmVudFBvc3RNZXRhZGF0YSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwb3N0TWV0YWRhdGEnLCB7IGF1dGhvcnBlcm06IHBhcmVudEF1dGhvcnBlcm0gfSk7CiAgICBpZiAocGFyZW50UG9zdE1ldGFkYXRhKSB7CiAgICAgIHJldHVybiBwYXJlbnRQb3N0TWV0YWRhdGEucmV3YXJkUG9vbElkczsKICAgIH0KICAgIC8vIFRoaXMgZmFsbGJhY2sgaXMgbmVlZGVkIHdoaWxlIHdlIHBvcHVsYXRlIG1ldGFkYXRhLCBjYW4gYmUgcmVtb3ZlZCBhZnRlcgogICAgLy8gYWxsIG91c3RhbmRpbmcgcG9zdHMgYXJlIGFsc28gaW4gbWV0YWRhdGEuCiAgICAvLyBDYW4gb25seSByZXR1cm4gcGFyYW1zLm1heFBvb2xzUGVyUG9zdCAoPDEwMDApIHBvc3RzCiAgICBjb25zdCBwYXJlbnRQb3N0cyA9IGF3YWl0IGFwaS5kYi5maW5kKCdwb3N0cycsIHsgYXV0aG9ycGVybTogcGFyZW50QXV0aG9ycGVybSB9KTsKICAgIGlmIChwYXJlbnRQb3N0cyAmJiBwYXJlbnRQb3N0cy5sZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiBwYXJlbnRQb3N0cy5tYXAocCA9PiBwLnJld2FyZFBvb2xJZCk7CiAgICB9CiAgICByZXR1cm4gW107CiAgfQogIC8vIENoZWNrIG1ldGFkYXRhIGZvciB0YWdzIC8gcGFyZW50IHBlcm1saW5rCiAgLy8gZm9yIGNvbW11bml0eS4KICBpZiAoanNvbk1ldGFkYXRhICYmIGpzb25NZXRhZGF0YS50YWdzICYmIEFycmF5LmlzQXJyYXkoanNvbk1ldGFkYXRhLnRhZ3MpCiAgICAgICYmIGpzb25NZXRhZGF0YS50YWdzLmV2ZXJ5KHQgPT4gdHlwZW9mIHQgPT09ICdzdHJpbmcnKSkgewogICAgY29uc3Qgc2VhcmNoVGFncyA9IHBhcmVudFBlcm1saW5rID8ganNvbk1ldGFkYXRhLnRhZ3MuY29uY2F0KFtwYXJlbnRQZXJtbGlua10pCiAgICAgIDoganNvbk1ldGFkYXRhLnRhZ3M7CiAgICBjb25zdCB0YWdSZXdhcmRQb29scyA9IGF3YWl0IGFwaS5kYi5maW5kKCdyZXdhcmRQb29scycsCiAgICAgIHsgJ2NvbmZpZy50YWdzJzogeyAkaW46IHNlYXJjaFRhZ3MgfSB9LAogICAgICBwYXJhbXMubWF4UG9vbHNQZXJQb3N0LCAwLCBbeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICAgIGlmICh0YWdSZXdhcmRQb29scyAmJiB0YWdSZXdhcmRQb29scy5sZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiB0YWdSZXdhcmRQb29scy5tYXAociA9PiByLl9pZCk7CiAgICB9CiAgfQogIGlmIChyZXdhcmRQb29scyAmJiBBcnJheS5pc0FycmF5KHJld2FyZFBvb2xzKSAmJiByZXdhcmRQb29scy5sZW5ndGggPiAwKSB7CiAgICByZXR1cm4gcmV3YXJkUG9vbHMuc2xpY2UoMCwgcGFyYW1zLm1heFBvb2xzUGVyUG9zdCk7CiAgfQogIHJldHVybiBbXTsKfQoKYWN0aW9ucy5jb21tZW50ID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBhdXRob3IsCiAgICBwZXJtbGluaywKICAgIHJld2FyZFBvb2xzLAogIH0gPSBwYXlsb2FkOwoKICAvLyBOb2RlIGVuZm9yY2VzIGF1dGhvciAvIHBlcm1saW5rcyBmcm9tIEhpdmUuIENoZWNrIHRoYXQgc2VuZGVyIGlzIG51bGwuCiAgaWYgKCFhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09ICdudWxsJywgJ2FjdGlvbiBtdXN0IHVzZSBjb21tZW50IG9wZXJhdGlvbicpKSByZXR1cm47CiAgYXdhaXQgdG9rZW5NYWludGVuYW5jZSgpOwoKICBpZiAoIWFwaS5hc3NlcnQoIXJld2FyZFBvb2xzIHx8IChBcnJheS5pc0FycmF5KHJld2FyZFBvb2xzKSAmJiByZXdhcmRQb29scy5ldmVyeShycCA9PiBOdW1iZXIuaXNJbnRlZ2VyKHJwKSkpLCAncmV3YXJkUG9vbHMgbXVzdCBiZSBhbiBhcnJheSBvZiBpbnRlZ2VycycpKSByZXR1cm47CgogIGNvbnN0IHJld2FyZFBvb2xJZHMgPSBhd2FpdCBnZXRSZXdhcmRQb29sSWRzKHBheWxvYWQpOwogIGNvbnN0IGF1dGhvcnBlcm0gPSBgQCR7YXV0aG9yfS8ke3Blcm1saW5rfWA7CgogIC8vIFZhbGlkYXRlIHRoYXQgY29tbWVudCBpcyBub3QgYW4gZWRpdCAoY2Fubm90IGFkZCBtdWx0aXBsZSBwb29scykKICBjb25zdCBleGlzdGluZ1Bvc3RNZXRhZGF0YSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwb3N0TWV0YWRhdGEnLCB7IGF1dGhvcnBlcm0gfSk7CiAgaWYgKGV4aXN0aW5nUG9zdE1ldGFkYXRhKSB7CiAgICByZXR1cm47CiAgfQogIC8vIE5lZWRlZCBmb3IgcG9zdHMgYmVmb3JlIG1ldGFkYXRhIHVwZGF0ZWQuIENhbiBiZSByZW1vdmVkIG9uY2UgYWxsIHBvc3RzIGhhdmUgbWV0YWRhdGEuCiAgY29uc3QgZXhpc3RpbmdQb3N0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Bvc3RzJywgeyBhdXRob3JwZXJtIH0pOwogIGlmIChleGlzdGluZ1Bvc3QpIHsKICAgIHJldHVybjsKICB9CgogIGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3Bvc3RNZXRhZGF0YScsIHsgYXV0aG9ycGVybSwgcmV3YXJkUG9vbElkcyB9KTsKCiAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXdhcmRQb29sSWRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBjb25zdCByZXdhcmRQb29sSWQgPSByZXdhcmRQb29sSWRzW2ldOwogICAgY29uc3QgcmV3YXJkUG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdyZXdhcmRQb29scycsIHsgX2lkOiByZXdhcmRQb29sSWQgfSk7CiAgICBpZiAocmV3YXJkUG9vbCAmJiByZXdhcmRQb29sLmFjdGl2ZSkgewogICAgICBjb25zdCBjYXNob3V0VGltZSA9IHRpbWVzdGFtcCArIHJld2FyZFBvb2wuY29uZmlnLmNhc2hvdXRXaW5kb3dEYXlzICogMjQgKiAzNjAwICogMTAwMDsKCiAgICAgIGNvbnN0IHBvc3QgPSB7CiAgICAgICAgcmV3YXJkUG9vbElkLAogICAgICAgIHN5bWJvbDogcmV3YXJkUG9vbC5zeW1ib2wsCiAgICAgICAgYXV0aG9ycGVybSwKICAgICAgICBhdXRob3IsCiAgICAgICAgY3JlYXRlZDogdGltZXN0YW1wLAogICAgICAgIGNhc2hvdXRUaW1lLAogICAgICAgIHZvdGVQb3NpdGl2ZVJzaGFyZVN1bTogJzAnLAogICAgICAgIHZvdGVSc2hhcmVTdW06ICcwJywKICAgICAgfTsKICAgICAgYXdhaXQgYXBpLmRiLmluc2VydCgncG9zdHMnLCBwb3N0KTsKICAgICAgYXBpLmVtaXQoJ25ld0NvbW1lbnQnLCB7IHJld2FyZFBvb2xJZCwgc3ltYm9sOiByZXdhcmRQb29sLnN5bWJvbCB9KTsKICAgIH0KICB9Cn07CgphY3Rpb25zLmNvbW1lbnRPcHRpb25zID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBhdXRob3IsCiAgICBwZXJtbGluaywKICAgIG1heEFjY2VwdGVkUGF5b3V0LAogICAgYmVuZWZpY2lhcmllcywKICB9ID0gcGF5bG9hZDsKCiAgLy8gTm9kZSBlbmZvcmNlcyBhdXRob3IgLyBwZXJtbGlua3MgZnJvbSBIaXZlLiBDaGVjayB0aGF0IHNlbmRlciBpcyBudWxsLgogIGlmICghYXBpLmFzc2VydChhcGkuc2VuZGVyID09PSAnbnVsbCcsICdhY3Rpb24gbXVzdCB1c2UgY29tbWVudE9wdGlvbnMgb3BlcmF0aW9uJykpIHJldHVybjsKICBjb25zdCBhdXRob3JwZXJtID0gYEAke2F1dGhvcn0vJHtwZXJtbGlua31gOwoKICBjb25zdCBleGlzdGluZ1Bvc3RzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Bvc3RzJywgeyBhdXRob3JwZXJtIH0pOwogIGlmICghZXhpc3RpbmdQb3N0cykgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgZGVjbGluZVBheW91dCA9IG1heEFjY2VwdGVkUGF5b3V0LnN0YXJ0c1dpdGgoJzAuMDAwJyk7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Bvc3RzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBjb25zdCBwb3N0ID0gZXhpc3RpbmdQb3N0c1tpXTsKICAgIHBvc3QuZGVjbGluZVBheW91dCA9IGRlY2xpbmVQYXlvdXQ7CiAgICBwb3N0LmJlbmVmaWNpYXJpZXMgPSBiZW5lZmljaWFyaWVzOwogICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncG9zdHMnLCBwb3N0KTsKICB9Cn07Cgphc3luYyBmdW5jdGlvbiBwcm9jZXNzVm90ZShwb3N0LCB2b3Rlciwgd2VpZ2h0LCB0aW1lc3RhbXApIHsKICBjb25zdCB7CiAgICByZXdhcmRQb29sSWQsCiAgICBzeW1ib2wsCiAgICBhdXRob3JwZXJtLAogICAgY2FzaG91dFRpbWUsCiAgfSA9IHBvc3Q7CgogIGlmIChjYXNob3V0VGltZSA8IHRpbWVzdGFtcCkgewogICAgcmV0dXJuOwogIH0KCiAgLy8gY2hlY2sgdm90aW5nIHBvd2VyLCBzdGFrZSwgYW5kIGN1cnJlbnQgdm90ZSByc2hhcmVzLgogIGNvbnN0IHJld2FyZFBvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncmV3YXJkUG9vbHMnLCB7IF9pZDogcmV3YXJkUG9vbElkIH0pOwogIGlmICghcmV3YXJkUG9vbCB8fCAhcmV3YXJkUG9vbC5hY3RpdmUpIHsKICAgIHJldHVybjsKICB9CgogIGxldCB2b3RpbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd2b3RpbmdQb3dlcicsIHsgcmV3YXJkUG9vbElkLCBhY2NvdW50OiB2b3RlciB9KTsKICBpZiAoIXZvdGluZ1Bvd2VyKSB7CiAgICB2b3RpbmdQb3dlciA9IHsKICAgICAgcmV3YXJkUG9vbElkLAogICAgICBhY2NvdW50OiB2b3RlciwKICAgICAgbGFzdFZvdGVUaW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgdm90aW5nUG93ZXI6IE1BWF9WT1RJTkdfUE9XRVIsCiAgICAgIGRvd252b3RpbmdQb3dlcjogTUFYX1ZPVElOR19QT1dFUiwKICAgIH07CiAgICB2b3RpbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3ZvdGluZ1Bvd2VyJywgdm90aW5nUG93ZXIpOwogIH0gZWxzZSB7CiAgICAvLyByZWdlbmVyYXRlIHZvdGluZyBwb3dlcgogICAgdm90aW5nUG93ZXIudm90aW5nUG93ZXIgKz0gKHRpbWVzdGFtcCAtIHZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wKSAqIE1BWF9WT1RJTkdfUE9XRVIKICAgICAgICAgIC8gKHJld2FyZFBvb2wuY29uZmlnLnZvdGVSZWdlbmVyYXRpb25EYXlzICogMjQgKiAzNjAwICogMTAwMCk7CiAgICB2b3RpbmdQb3dlci52b3RpbmdQb3dlciA9IE1hdGguZmxvb3Iodm90aW5nUG93ZXIudm90aW5nUG93ZXIpOwogICAgdm90aW5nUG93ZXIudm90aW5nUG93ZXIgPSBNYXRoLm1pbih2b3RpbmdQb3dlci52b3RpbmdQb3dlciwgTUFYX1ZPVElOR19QT1dFUik7CiAgICB2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIgKz0gKHRpbWVzdGFtcCAtIHZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wKSAqIE1BWF9WT1RJTkdfUE9XRVIKICAgICAgICAgIC8gKHJld2FyZFBvb2wuY29uZmlnLmRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyAqIDI0ICogMzYwMCAqIDEwMDApOwogICAgdm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyID0gTWF0aC5mbG9vcih2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIpOwogICAgdm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyID0gTWF0aC5taW4odm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyLCBNQVhfVk9USU5HX1BPV0VSKTsKICAgIHZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wID0gdGltZXN0YW1wOwogIH0KCiAgY29uc3Qgdm90ZXJUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgc3ltYm9sLCBhY2NvdW50OiB2b3RlciB9KTsKICBsZXQgc3Rha2UgPSB2b3RlclRva2VuQmFsYW5jZSA/IHZvdGVyVG9rZW5CYWxhbmNlLnN0YWtlIDogJzAnOwogIGlmICh2b3RlclRva2VuQmFsYW5jZSAmJiB2b3RlclRva2VuQmFsYW5jZS5kZWxlZ2F0aW9uc0luCiAgICAgICYmIGFwaS5CaWdOdW1iZXIodm90ZXJUb2tlbkJhbGFuY2UuZGVsZWdhdGlvbnNJbikuaXNGaW5pdGUoKSkgewogICAgc3Rha2UgPSBhcGkuQmlnTnVtYmVyKHN0YWtlKS5wbHVzKHZvdGVyVG9rZW5CYWxhbmNlLmRlbGVnYXRpb25zSW4pOwogIH0KCiAgbGV0IHZvdGVSc2hhcmVzID0gJzAnOwogIGxldCB1cGRhdGVkUG9zdFJzaGFyZXMgPSAnMCc7CiAgbGV0IHVzZWRQb3dlciA9IDA7CiAgbGV0IHVzZWREb3dudm90ZVBvd2VyID0gMDsKICBsZXQgY3VyYXRpb25XZWlnaHQgPSAnMCc7CiAgaWYgKHdlaWdodCA+IDApIHsKICAgIHZvdGVSc2hhcmVzID0gYXBpLkJpZ051bWJlcihzdGFrZSkubXVsdGlwbGllZEJ5KHdlaWdodCkubXVsdGlwbGllZEJ5KHZvdGluZ1Bvd2VyLnZvdGluZ1Bvd2VyKQogICAgICAuZGl2aWRlZEJ5KE1BWF9WT1RJTkdfUE9XRVIpCiAgICAgIC5kaXZpZGVkQnkoTUFYX1dFSUdIVCkKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIHVzZWRQb3dlciA9IE1hdGguZmxvb3Iodm90aW5nUG93ZXIudm90aW5nUG93ZXIgKiBNYXRoLmFicyh3ZWlnaHQpICogNjAgKiA2MCAqIDI0IC8gTUFYX1dFSUdIVCk7CiAgICBjb25zdCB1c2VkUG93ZXJEZW5vbSA9IE1hdGguZmxvb3IoTUFYX1ZPVElOR19QT1dFUiAqIDYwICogNjAgKiAyNAogICAgICAgIC8gcmV3YXJkUG9vbC5jb25maWcudm90ZVBvd2VyQ29uc3VtcHRpb24pOwogICAgdXNlZFBvd2VyID0gTWF0aC5mbG9vcigodXNlZFBvd2VyICsgdXNlZFBvd2VyRGVub20gLSAxKSAvIHVzZWRQb3dlckRlbm9tKTsKICAgIHZvdGluZ1Bvd2VyLnZvdGluZ1Bvd2VyID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcih2b3RpbmdQb3dlci52b3RpbmdQb3dlciAtIHVzZWRQb3dlcikpOwogICAgY3VyYXRpb25XZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGNhbGN1bGF0ZUN1cmF0aW9uV2VpZ2h0UnNoYXJlcygKICAgICAgcmV3YXJkUG9vbCwgYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlcykucGx1cyhwb3N0LnZvdGVQb3NpdGl2ZVJzaGFyZVN1bSksCiAgICApKQogICAgICAubWludXMoY2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHBvc3Qudm90ZVBvc2l0aXZlUnNoYXJlU3VtKSkKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICB9IGVsc2UgaWYgKHdlaWdodCA8IDApIHsKICAgIHZvdGVSc2hhcmVzID0gYXBpLkJpZ051bWJlcihzdGFrZSkubXVsdGlwbGllZEJ5KHdlaWdodCkKICAgICAgLm11bHRpcGxpZWRCeSh2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIpCiAgICAgIC5kaXZpZGVkQnkoTUFYX1ZPVElOR19QT1dFUikKICAgICAgLmRpdmlkZWRCeShNQVhfV0VJR0hUKQogICAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwogICAgdXNlZERvd252b3RlUG93ZXIgPSBNYXRoLmZsb29yKHZvdGluZ1Bvd2VyLmRvd252b3RpbmdQb3dlciAqIE1hdGguYWJzKHdlaWdodCkgKiA2MCAqIDYwICogMjQKICAgICAgICAvIE1BWF9XRUlHSFQpOwogICAgY29uc3QgdXNlZERvd252b3RlUG93ZXJEZW5vbSA9IE1hdGguZmxvb3IoTUFYX1ZPVElOR19QT1dFUiAqIDYwICogNjAgKiAyNAogICAgICAgIC8gcmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uKTsKICAgIHVzZWREb3dudm90ZVBvd2VyID0gTWF0aC5mbG9vcigodXNlZERvd252b3RlUG93ZXIgKyB1c2VkRG93bnZvdGVQb3dlckRlbm9tIC0gMSkKICAgICAgICAvIHVzZWREb3dudm90ZVBvd2VyRGVub20pOwogICAgdm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyID0gTWF0aC5tYXgoCiAgICAgIDAsIE1hdGguZmxvb3Iodm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyIC0gdXNlZERvd252b3RlUG93ZXIpLAogICAgKTsKICB9CgogIGlmICh2b3RpbmdQb3dlci5tdXRlKSB7CiAgICB2b3RlUnNoYXJlcyA9ICcwJzsKICAgIGN1cmF0aW9uV2VpZ2h0ID0gJzAnOwogIH0KCiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgndm90aW5nUG93ZXInLCB2b3RpbmdQb3dlcik7CgogIGxldCB2b3RlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3ZvdGVzJywgeyByZXdhcmRQb29sSWQsIGF1dGhvcnBlcm0sIHZvdGVyIH0pOwogIGlmICh2b3RlKSB7CiAgICAvLyBBIHJlLXZvdGUgbmVnYXRlcyBjdXJhdGlvbiByZXdhcmRzLCBzaW1pbGFyIHRvIEhpdmUuCiAgICB2b3RlLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKICAgIHZvdGUud2VpZ2h0ID0gd2VpZ2h0OwogICAgdm90ZS5jdXJhdGlvbldlaWdodCA9ICcwJzsKICAgIGNvbnN0IG9sZFZvdGVSc2hhcmVzID0gdm90ZS5yc2hhcmVzOwogICAgdm90ZS5yc2hhcmVzID0gdm90ZVJzaGFyZXM7CiAgICB1cGRhdGVkUG9zdFJzaGFyZXMgPSBhcGkuQmlnTnVtYmVyKHZvdGVSc2hhcmVzKS5taW51cyhvbGRWb3RlUnNoYXJlcykKICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3ZvdGVzJywgdm90ZSk7CiAgICBjb25zdCB2b3RlTG9nID0geyByZXdhcmRQb29sSWQsIHN5bWJvbDogcmV3YXJkUG9vbC5zeW1ib2wsIHJzaGFyZXM6IHZvdGVSc2hhcmVzIH07CiAgICBpZiAodm90aW5nUG93ZXIubXV0ZSkgewogICAgICB2b3RlTG9nLm11dGUgPSB0cnVlOwogICAgfQogICAgYXBpLmVtaXQoJ3VwZGF0ZVZvdGUnLCB2b3RlTG9nKTsKICB9IGVsc2UgewogICAgdm90ZSA9IHsKICAgICAgcmV3YXJkUG9vbElkLAogICAgICBzeW1ib2wsCiAgICAgIGF1dGhvcnBlcm0sCiAgICAgIHdlaWdodCwKICAgICAgcnNoYXJlczogdm90ZVJzaGFyZXMsCiAgICAgIGN1cmF0aW9uV2VpZ2h0LAogICAgICB0aW1lc3RhbXAsCiAgICAgIHZvdGVyLAogICAgfTsKICAgIHVwZGF0ZWRQb3N0UnNoYXJlcyA9IHZvdGVSc2hhcmVzOwogICAgYXdhaXQgYXBpLmRiLmluc2VydCgndm90ZXMnLCB2b3RlKTsKICAgIGNvbnN0IHZvdGVMb2cgPSB7IHJld2FyZFBvb2xJZCwgc3ltYm9sOiByZXdhcmRQb29sLnN5bWJvbCwgcnNoYXJlczogdm90ZVJzaGFyZXMgfTsKICAgIGlmICh2b3RpbmdQb3dlci5tdXRlKSB7CiAgICAgIHZvdGVMb2cubXV0ZSA9IHRydWU7CiAgICB9CiAgICBhcGkuZW1pdCgnbmV3Vm90ZScsIHZvdGVMb2cpOwogIH0KCiAgY29uc3Qgb2xkUG9zdENsYWltcyA9IGNhbGN1bGF0ZVdlaWdodFJzaGFyZXMocmV3YXJkUG9vbCwgcG9zdC52b3RlUnNoYXJlU3VtKTsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24KICBwb3N0LnZvdGVSc2hhcmVTdW0gPSBhcGkuQmlnTnVtYmVyKHBvc3Qudm90ZVJzaGFyZVN1bSkucGx1cyh1cGRhdGVkUG9zdFJzaGFyZXMpCiAgICAudG9GaXhlZChTTVRfUFJFQ0lTSU9OLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOwoKICBpZiAoYXBpLkJpZ051bWJlcih1cGRhdGVkUG9zdFJzaGFyZXMpLmd0KDApKSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24KICAgIHBvc3Qudm90ZVBvc2l0aXZlUnNoYXJlU3VtID0gYXBpLkJpZ051bWJlcihwb3N0LnZvdGVQb3NpdGl2ZVJzaGFyZVN1bSkucGx1cyh1cGRhdGVkUG9zdFJzaGFyZXMpCiAgICAgIC50b0ZpeGVkKFNNVF9QUkVDSVNJT04sIGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTik7CiAgICBpZiAodGltZXN0YW1wIDwgcmV3YXJkUG9vbC5jcmVhdGVkVGltZXN0YW1wCiAgICAgICAgKyAoMiAqIHJld2FyZFBvb2wuY29uZmlnLmNhc2hvdXRXaW5kb3dEYXlzICsgMSkgKiAyNCAqIDM2MDAgKiAxMDAwKSB7CiAgICAgIGNvbnN0IG5ld1Bvc3RDbGFpbXMgPSBjYWxjdWxhdGVXZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsIHBvc3Qudm90ZVJzaGFyZVN1bSk7CiAgICAgIHJld2FyZFBvb2wucGVuZGluZ0NsYWltcyA9IGFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zKQogICAgICAgIC5wbHVzKG5ld1Bvc3RDbGFpbXMpCiAgICAgICAgLm1pbnVzKG9sZFBvc3RDbGFpbXMpCiAgICAgICAgLnRvRml4ZWQoU01UX1BSRUNJU0lPTiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncmV3YXJkUG9vbHMnLCByZXdhcmRQb29sKTsKICAgIH0KICB9CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncG9zdHMnLCBwb3N0KTsKfQoKYWN0aW9ucy52b3RlID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICB2b3RlciwKICAgIGF1dGhvciwKICAgIHBlcm1saW5rLAogICAgd2VpZ2h0LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoIWFwaS5hc3NlcnQoYXBpLnNlbmRlciA9PT0gJ251bGwnLCAnY2FuIG9ubHkgdm90ZSB3aXRoIHZvdGluZyBvcCcpKSByZXR1cm47CiAgYXdhaXQgdG9rZW5NYWludGVuYW5jZSgpOwoKICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcih3ZWlnaHQpICYmIHdlaWdodCA+PSAtMTAwMDAgJiYgd2VpZ2h0IDw9IDEwMDAwLAogICAgJ3dlaWdodCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAtMTAwMDAgdG8gMTAwMDAnKSkgcmV0dXJuOwoKICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CiAgY29uc3QgdGltZXN0YW1wID0gYmxvY2tEYXRlLmdldFRpbWUoKTsKICBjb25zdCBhdXRob3JwZXJtID0gYEAke2F1dGhvcn0vJHtwZXJtbGlua31gOwogIC8vIENhbiBvbmx5IHJldHVybiBwYXJhbXMubWF4UG9vbHNQZXJQb3N0ICg8MTAwMCkgcG9zdHMKICBjb25zdCBwb3N0cyA9IGF3YWl0IGFwaS5kYi5maW5kKCdwb3N0cycsIHsgYXV0aG9ycGVybSB9KTsKCiAgaWYgKCFwb3N0cykgcmV0dXJuOwogIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zdHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGNvbnN0IHBvc3QgPSBwb3N0c1tpXTsKICAgIGF3YWl0IHByb2Nlc3NWb3RlKHBvc3QsIHZvdGVyLCB3ZWlnaHQsIHRpbWVzdGFtcCk7CiAgfQp9Owo="}}}

{ "id": "ssc-testnet-hive", "json": { "contractName":"contract", "contractAction":"update", "contractPayload":{"name":"mining","params":"","code":"LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IFsiZXJyb3IiLCB7ICJhbGxvdyI6IFsiX2lkIl0gfV0gKi8KLyogZ2xvYmFsIGFjdGlvbnMsIGFwaSAqLwoKY29uc3QgTUFYX0RJR0lUUyA9IDIwOwpjb25zdCBQUk9QRVJUWV9PUFMgPSB7CiAgQUREOiB7CiAgICBhZGQ6ICh4LCB5KSA9PiBhcGkuQmlnTnVtYmVyKHgpLnBsdXMoeSksCiAgICByZW1vdmU6ICh4LCB5KSA9PiBhcGkuQmlnTnVtYmVyKHgpLm1pbnVzKHkpLAogICAgZGVmYXVsdFZhbHVlOiAwLAogIH0sCiAgTVVMVElQTFk6IHsKICAgIGFkZDogKHgsIHkpID0+IGFwaS5CaWdOdW1iZXIoeCkubXVsdGlwbGllZEJ5KHkpLmRwKE1BWF9ESUdJVFMpLAogICAgcmVtb3ZlOiAoeCwgeSkgPT4gYXBpLkJpZ051bWJlcih4KS5kaXZpZGVkQnkoeSkuZHAoTUFYX0RJR0lUUyksCiAgICBkZWZhdWx0VmFsdWU6IDEsCiAgfSwKfTsKY29uc3QgTUlOSU5HX1BPV0VSX0ZJRUxEX0lOREVYID0gJ19taW5pbmdQb3dlcic7CgoKYWN0aW9ucy5jcmVhdGVTU0MgPSBhc3luYyAoKSA9PiB7CiAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoJ21pbmluZ1Bvd2VyJyk7CiAgaWYgKHRhYmxlRXhpc3RzID09PSBmYWxzZSkgewogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdtaW5pbmdQb3dlcicsIFsnaWQnLCAncG93ZXInXSk7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3Bvb2xzJywgWydpZCddKTsKICAgIC8vIEdpdmVuIHN5bWJvbCwgb3V0cHV0IHdoaWNoIHBvb2xzIGFyZSB1c2luZyBpdC4KICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgndG9rZW5Qb29scycsIFsnc3ltYm9sJ10pOwogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCduZnRUb2tlblBvb2xzJywgWydzeW1ib2wnXSk7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3BhcmFtcycpOwoKICAgIGNvbnN0IHBhcmFtcyA9IHt9OwogICAgcGFyYW1zLnBvb2xDcmVhdGlvbkZlZSA9ICcxMDAwJzsKICAgIHBhcmFtcy5wb29sVXBkYXRlRmVlID0gJzMwMCc7CiAgICBwYXJhbXMubWF4TG90dGVyaWVzUGVyQmxvY2sgPSAyMDsKICAgIHBhcmFtcy5tYXhCYWxhbmNlc1Byb2Nlc3NlZFBlckJsb2NrID0gMTAwMDA7CiAgICBwYXJhbXMucHJvY2Vzc1F1ZXJ5TGltaXQgPSAxMDAwOwogICAgYXdhaXQgYXBpLmRiLmluc2VydCgncGFyYW1zJywgcGFyYW1zKTsKICB9IGVsc2UgewogICAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICAgIGlmICghcGFyYW1zLnVwZGF0ZUluZGV4KSB7CiAgICAgIC8vIHdvdWxkIHdhbnQgdGhpcyB0byBiZSBhIHByaW1hcnkga2V5LCBidXQgY2Fubm90IGFsdGVyIHByaW1hcnkga2V5cwogICAgICBhd2FpdCBhcGkuZGIuYWRkSW5kZXhlcygnbWluaW5nUG93ZXInLCBbeyBuYW1lOiAnYnlQb29sSWRBbmRBY2NvdW50JywgaW5kZXg6IHsgaWQ6IDEsIGFjY291bnQ6IDEgfSB9XSk7CiAgICAgIHBhcmFtcy51cGRhdGVJbmRleCA9IDE7CiAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7CiAgICB9CiAgfQp9OwoKYWN0aW9ucy51cGRhdGVQYXJhbXMgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIpIHJldHVybjsKCiAgY29uc3QgewogICAgcG9vbENyZWF0aW9uRmVlLAogICAgcG9vbFVwZGF0ZUZlZSwKICAgIG1heExvdHRlcmllc1BlckJsb2NrLAogICAgbWF4QmFsYW5jZXNQcm9jZXNzZWRQZXJCbG9jaywKICAgIHByb2Nlc3NRdWVyeUxpbWl0LAogIH0gPSBwYXlsb2FkOwoKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwoKICBpZiAocG9vbENyZWF0aW9uRmVlKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHBvb2xDcmVhdGlvbkZlZSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIocG9vbENyZWF0aW9uRmVlKS5pc05hTigpICYmIGFwaS5CaWdOdW1iZXIocG9vbENyZWF0aW9uRmVlKS5ndGUoMCksICdpbnZhbGlkIHBvb2xDcmVhdGlvbkZlZScpKSByZXR1cm47CiAgICBwYXJhbXMucG9vbENyZWF0aW9uRmVlID0gcG9vbENyZWF0aW9uRmVlOwogIH0KICBpZiAocG9vbFVwZGF0ZUZlZSkgewogICAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVvZiBwb29sVXBkYXRlRmVlID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihwb29sVXBkYXRlRmVlKS5pc05hTigpICYmIGFwaS5CaWdOdW1iZXIocG9vbFVwZGF0ZUZlZSkuZ3RlKDApLCAnaW52YWxpZCBwb29sVXBkYXRlRmVlJykpIHJldHVybjsKICAgIHBhcmFtcy5wb29sVXBkYXRlRmVlID0gcG9vbFVwZGF0ZUZlZTsKICB9CiAgaWYgKG1heExvdHRlcmllc1BlckJsb2NrKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihtYXhMb3R0ZXJpZXNQZXJCbG9jaykgJiYgbWF4TG90dGVyaWVzUGVyQmxvY2sgPj0gMSwgJ2ludmFsaWQgbWF4TG90dGVyaWVzUGVyQmxvY2snKSkgcmV0dXJuOwogICAgcGFyYW1zLm1heExvdHRlcmllc1BlckJsb2NrID0gbWF4TG90dGVyaWVzUGVyQmxvY2s7CiAgfQogIGlmIChtYXhCYWxhbmNlc1Byb2Nlc3NlZFBlckJsb2NrKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihtYXhCYWxhbmNlc1Byb2Nlc3NlZFBlckJsb2NrKSAmJiBtYXhCYWxhbmNlc1Byb2Nlc3NlZFBlckJsb2NrID49IDEsICdpbnZhbGlkIG1heEJhbGFuY2VzUHJvY2Vzc2VkUGVyQmxvY2snKSkgcmV0dXJuOwogICAgcGFyYW1zLm1heEJhbGFuY2VzUHJvY2Vzc2VkUGVyQmxvY2sgPSBtYXhCYWxhbmNlc1Byb2Nlc3NlZFBlckJsb2NrOwogIH0KICBpZiAocHJvY2Vzc1F1ZXJ5TGltaXQpIHsKICAgIGlmICghYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKHByb2Nlc3NRdWVyeUxpbWl0KSAmJiBwcm9jZXNzUXVlcnlMaW1pdCA+PSAxLCAnaW52YWxpZCBwcm9jZXNzUXVlcnlMaW1pdCcpKSByZXR1cm47CiAgICBwYXJhbXMucHJvY2Vzc1F1ZXJ5TGltaXQgPSBwcm9jZXNzUXVlcnlMaW1pdDsKICB9CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7Cn07Cgpjb25zdCBmaW5kQW5kUHJvY2Vzc0FsbCA9IGFzeW5jIChjb250cmFjdE5hbWUsIHRhYmxlLCBxdWVyeSwgY2FsbGJhY2spID0+IHsKICBsZXQgb2Zmc2V0ID0gMDsKICBsZXQgcmVzdWx0cyA9IFtdOwogIGxldCBkb25lID0gZmFsc2U7CiAgd2hpbGUgKCFkb25lKSB7CiAgICByZXN1bHRzID0gYXdhaXQgYXBpLmRiLmZpbmRJblRhYmxlKGNvbnRyYWN0TmFtZSwgdGFibGUsIHF1ZXJ5LCAxMDAwLCBvZmZzZXQpOwogICAgaWYgKHJlc3VsdHMpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgYXdhaXQgY2FsbGJhY2socmVzdWx0c1tpXSk7CiAgICAgIH0KICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoIDwgMTAwMCkgewogICAgICAgIGRvbmUgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIG9mZnNldCArPSAxMDAwOwogICAgICB9CiAgICB9CiAgfQp9OwoKYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVOZnRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHsKICBpZiAoIWFwaS5hc3NlcnQocHJvcGVydGllcyAmJiBBcnJheS5pc0FycmF5KHByb3BlcnRpZXMpLCAnaW52YWxpZCBuZnRUb2tlbk1pbmVyIHByb3BlcnRpZXMnKSkgcmV0dXJuIGZhbHNlOwogIGlmICghYXBpLmFzc2VydChwcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgcHJvcGVydGllcy5sZW5ndGggPD0gNCwgJ25mdFRva2VuTWluZXIgcHJvcGVydGllcyBzaXplIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0JykpIHJldHVybiBmYWxzZTsKCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBjb25zdCBwcm9wID0gcHJvcGVydGllc1tpXTsKICAgIGNvbnN0IHByb3BLZXlzID0gT2JqZWN0LmtleXMocHJvcCk7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHByb3BLZXlzLmxlbmd0aDsgaiArPSAxKSB7CiAgICAgIGNvbnN0IHByb3BLZXkgPSBwcm9wS2V5c1tqXTsKICAgICAgaWYgKHByb3BLZXkgPT09ICdvcCcpIHsKICAgICAgICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHByb3Aub3AgPT09ICdzdHJpbmcnICYmIFBST1BFUlRZX09QU1twcm9wLm9wXSwgJ25mdFRva2VuTWluZXIgcHJvcGVydGllcyBvcCBzaG91bGQgYmUgQUREIG9yIE1VTFRJUExZJykpIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSAnbmFtZScpIHsKICAgICAgICBpZiAoIWFwaS5hc3NlcnQodHlwZW9mIHByb3AubmFtZSA9PT0gJ3N0cmluZycgJiYgcHJvcC5uYW1lLmxlbmd0aCA8PSAxNiwgJ25mdFRva2VuTWluZXIgcHJvcGVydGllcyBuYW1lIHNob3VsZCBiZSBhIHN0cmluZyBvZiBsZW5ndGggPD0gMTYnKSkgcmV0dXJuIGZhbHNlOwogICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09ICdidXJuQ2hhbmdlJykgewogICAgICAgIGlmICghYXBpLmFzc2VydCh0eXBlb2YgcHJvcC5idXJuQ2hhbmdlID09PSAnb2JqZWN0JwogICAgICAgICAgICAmJiB0eXBlb2YgcHJvcC5idXJuQ2hhbmdlLnN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgICAgICAgJiYgYXBpLkJpZ051bWJlcihwcm9wLmJ1cm5DaGFuZ2UucXVhbnRpdHkpLmlzRmluaXRlKCkKICAgICAgICAgICAgJiYgYXBpLkJpZ051bWJlcihwcm9wLmJ1cm5DaGFuZ2UucXVhbnRpdHkpLmlzUG9zaXRpdmUoKSwgJ25mdFRva2VuTWluZXIgcHJvcGVydGllcyBidXJuQ2hhbmdlIGludmFsaWQnKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IHByb3AuYnVybkNoYW5nZS5zeW1ib2wgfSk7CiAgICAgICAgaWYgKCFhcGkuYXNzZXJ0KHRva2VuLCAnbmZ0VG9rZW5NaW5lciBwcm9wZXJ0aWVzIGJ1cm5DaGFuZ2Ugc3ltYm9sIG5vdCBmb3VuZCcpKSByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXBpLmFzc2VydChmYWxzZSwgJ25mdFRva2VuTWluZXIgcHJvcGVydGllcyBmaWVsZCBpbnZhbGlkJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiB2YWxpZGF0ZU5mdFR5cGVNYXAodHlwZU1hcCwgcHJvcGVydGllcykgewogIGlmICghYXBpLmFzc2VydCh0eXBlTWFwICYmIHR5cGVvZiB0eXBlTWFwID09PSAnb2JqZWN0JywgJ2ludmFsaWQgbmZ0VG9rZW5NaW5lciB0eXBlTWFwJykpIHJldHVybiBmYWxzZTsKICBjb25zdCB0eXBlcyA9IE9iamVjdC5rZXlzKHR5cGVNYXApOwogIGZvciAobGV0IGogPSAwOyBqIDwgdHlwZXMubGVuZ3RoOyBqICs9IDEpIHsKICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tqXTsKICAgIGNvbnN0IHR5cGVDb25maWcgPSB0eXBlTWFwW3R5cGVdOwogICAgaWYgKCFhcGkuYXNzZXJ0KEFycmF5LmlzQXJyYXkodHlwZUNvbmZpZykgJiYgdHlwZUNvbmZpZy5sZW5ndGggPT09IHByb3BlcnRpZXMubGVuZ3RoLCAnbmZ0VG9rZW5NaW5lciB0eXBlQ29uZmlnIGxlbmd0aCBtaXNtYXRjaCcpKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKGxldCBrID0gMDsgayA8IHR5cGVDb25maWcubGVuZ3RoOyBrICs9IDEpIHsKICAgICAgY29uc3QgdHlwZVByb3BlcnR5ID0gYXBpLkJpZ051bWJlcih0eXBlQ29uZmlnW2tdKTsKICAgICAgaWYgKCFhcGkuYXNzZXJ0KCF0eXBlUHJvcGVydHkuaXNOYU4oKSAmJiB0eXBlUHJvcGVydHkuaXNGaW5pdGUoKSwgJ25mdFRva2VuTWluZXIgdHlwZUNvbmZpZyBpbnZhbGlkJykpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKHByb3BlcnRpZXNba10ub3AgPT09ICdNVUxUSVBMWScpIHsKICAgICAgICBpZiAoIWFwaS5hc3NlcnQodHlwZVByb3BlcnR5Lmd0ZSgwLjAxKSAmJiB0eXBlUHJvcGVydHkubHRlKDEwMCksCiAgICAgICAgICAnbmZ0VG9rZW5NaW5lciB0eXBlQ29uZmlnIE1VTFRJUExZIHByb3BlcnR5IHNob3VsZCBiZSBiZXR3ZWVuIDAuMDEgYW5kIDEwMCcpKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KCmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlVG9rZW5NaW5lcnModG9rZW5NaW5lcnMsIG5mdFRva2VuTWluZXIpIHsKICBpZiAoIWFwaS5hc3NlcnQodG9rZW5NaW5lcnMgJiYgQXJyYXkuaXNBcnJheSh0b2tlbk1pbmVycyksICd0b2tlbk1pbmVycyBpbnZhbGlkJykpIHJldHVybiBmYWxzZTsKICBpZiAoIWFwaS5hc3NlcnQoKHRva2VuTWluZXJzLmxlbmd0aCA+PSAxICYmIHRva2VuTWluZXJzLmxlbmd0aCA8PSAyKQogICAgICB8fCAobmZ0VG9rZW5NaW5lciAmJiB0b2tlbk1pbmVycy5sZW5ndGggPT09IDApLAogICdvbmx5IDEgb3IgMiB0b2tlbk1pbmVycyBhbGxvd2VkJykpIHJldHVybiBmYWxzZTsKICBjb25zdCB0b2tlbk1pbmVyU3ltYm9scyA9IG5ldyBTZXQoKTsKICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuTWluZXJzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBjb25zdCB0b2tlbk1pbmVyQ29uZmlnID0gdG9rZW5NaW5lcnNbaV07CiAgICBpZiAoIWFwaS5hc3NlcnQodG9rZW5NaW5lckNvbmZpZyAmJiB0b2tlbk1pbmVyQ29uZmlnLnN5bWJvbAogICAgICAmJiB0eXBlb2YgKHRva2VuTWluZXJDb25maWcuc3ltYm9sKSA9PT0gJ3N0cmluZycsICd0b2tlbk1pbmVycyBpbnZhbGlkJykpIHJldHVybiBmYWxzZTsKICAgIGlmICghYXBpLmFzc2VydCghdG9rZW5NaW5lclN5bWJvbHMuaGFzKHRva2VuTWluZXJDb25maWcuc3ltYm9sKSwgJ3Rva2VuTWluZXJzIGNhbm5vdCBoYXZlIGR1cGxpY2F0ZSBzeW1ib2xzJykpIHJldHVybiBmYWxzZTsKICAgIHRva2VuTWluZXJTeW1ib2xzLmFkZCh0b2tlbk1pbmVyQ29uZmlnLnN5bWJvbCk7CiAgICBjb25zdCB7IHN5bWJvbCB9ID0gdG9rZW5NaW5lckNvbmZpZzsKICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2wgfSk7CiAgICBpZiAoIWFwaS5hc3NlcnQodG9rZW4gJiYgdG9rZW4uc3Rha2luZ0VuYWJsZWQsICd0b2tlbk1pbmVycyBtdXN0IGhhdmUgc3Rha2luZyBlbmFibGVkJykpIHJldHVybiBmYWxzZTsKICAgIGlmICghYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKHRva2VuTWluZXJDb25maWcubXVsdGlwbGllcikKICAgICAgJiYgdG9rZW5NaW5lckNvbmZpZy5tdWx0aXBsaWVyID49IDEgJiYgdG9rZW5NaW5lckNvbmZpZy5tdWx0aXBsaWVyIDw9IDEwMCwKICAgICd0b2tlbk1pbmVyIG11bHRpcGxpZXIgbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMSB0byAxMDAnKSkgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAobmZ0VG9rZW5NaW5lcikgewogICAgaWYgKCFhcGkuYXNzZXJ0KG5mdFRva2VuTWluZXIuc3ltYm9sCiAgICAgICAgJiYgdHlwZW9mIChuZnRUb2tlbk1pbmVyLnN5bWJvbCkgPT09ICdzdHJpbmcnLCAnbmZ0VG9rZW5NaW5lciBpbnZhbGlkJykpIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IHsKICAgICAgc3ltYm9sLCB0eXBlTWFwLCBwcm9wZXJ0aWVzLCB0eXBlRmllbGQsCiAgICAgIGVxdWlwRmllbGQsIG1pbmluZ1Bvd2VyRmllbGQsCiAgICB9ID0gbmZ0VG9rZW5NaW5lcjsKICAgIGNvbnN0IG5mdCA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgnbmZ0JywgJ25mdHMnLCB7IHN5bWJvbCB9KTsKICAgIGlmICghYXBpLmFzc2VydChuZnQgJiYgbmZ0LmRlbGVnYXRpb25FbmFibGVkLCAnbmZ0VG9rZW5NaW5lciBtdXN0IGhhdmUgZGVsZWdhdGlvbiBlbmFibGVkJykpIHJldHVybiBmYWxzZTsKICAgIGlmICghYXBpLmFzc2VydCh0eXBlRmllbGQgJiYgdHlwZW9mIHR5cGVGaWVsZCA9PT0gJ3N0cmluZycsICd0eXBlRmllbGQgbXVzdCBiZSBhIHN0cmluZycpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoIWFwaS5hc3NlcnQobmZ0LnByb3BlcnRpZXNbdHlwZUZpZWxkXSAmJiBuZnQucHJvcGVydGllc1t0eXBlRmllbGRdLnR5cGUgPT09ICdzdHJpbmcnLCAnbmZ0VG9rZW5NaW5lciBtdXN0IGhhdmUgc3RyaW5nIHR5cGUgcHJvcGVydHknKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGVxdWlwRmllbGQgIT09IHVuZGVmaW5lZCkgewogICAgICBpZiAoIWFwaS5hc3NlcnQoZXF1aXBGaWVsZCAmJiB0eXBlb2YgZXF1aXBGaWVsZCA9PT0gJ3N0cmluZycsICdlcXVpcEZpZWxkIG11c3QgYmUgYSBzdHJpbmcnKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoIWFwaS5hc3NlcnQobmZ0LnByb3BlcnRpZXNbZXF1aXBGaWVsZF0gJiYgbmZ0LnByb3BlcnRpZXNbZXF1aXBGaWVsZF0udHlwZSA9PT0gJ3N0cmluZycsICduZnRUb2tlbk1pbmVyIG11c3QgaGF2ZSBzdHJpbmcgZXF1aXAgcHJvcGVydHknKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKG1pbmluZ1Bvd2VyRmllbGQgIT09IHVuZGVmaW5lZCkgewogICAgICBpZiAoIWFwaS5hc3NlcnQobWluaW5nUG93ZXJGaWVsZCAmJiB0eXBlb2YgbWluaW5nUG93ZXJGaWVsZCA9PT0gJ3N0cmluZycsICdtaW5pbmdQb3dlckZpZWxkIG11c3QgYmUgYSBzdHJpbmcnKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoIWFwaS5hc3NlcnQobmZ0LnByb3BlcnRpZXNbbWluaW5nUG93ZXJGaWVsZF0gJiYgbmZ0LnByb3BlcnRpZXNbbWluaW5nUG93ZXJGaWVsZF0udHlwZSA9PT0gJ3N0cmluZycsICduZnRUb2tlbk1pbmVyIG11c3QgaGF2ZSBzdHJpbmcgbWluaW5nUG93ZXIgcHJvcGVydHknKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCEoYXdhaXQgdmFsaWRhdGVOZnRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKCF2YWxpZGF0ZU5mdFR5cGVNYXAodHlwZU1hcCwgcHJvcGVydGllcykpIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlVG9rZW5NaW5lcnNDaGFuZ2Uob2xkVG9rZW5NaW5lcnMsIHRva2VuTWluZXJzLCBvbGROZnRUb2tlbk1pbmVyLAogIG5mdFRva2VuTWluZXIpIHsKICBpZiAoIWFwaS5hc3NlcnQodG9rZW5NaW5lcnMubGVuZ3RoID09PSBvbGRUb2tlbk1pbmVycy5sZW5ndGgsICdjYW5ub3QgY2hhbmdlIHdoaWNoIHRva2VucyBhcmUgaW4gdG9rZW5NaW5lcnMnKSkgcmV0dXJuIGZhbHNlOwogIGxldCBjaGFuZ2VkID0gZmFsc2U7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbk1pbmVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgY29uc3Qgb2xkQ29uZmlnID0gb2xkVG9rZW5NaW5lcnNbaV07CiAgICBjb25zdCBuZXdDb25maWcgPSB0b2tlbk1pbmVyc1tpXTsKICAgIGlmICghYXBpLmFzc2VydChvbGRDb25maWcuc3ltYm9sID09PSBuZXdDb25maWcuc3ltYm9sLCAnY2Fubm90IGNoYW5nZSB3aGljaCB0b2tlbnMgYXJlIGluIHRva2VuTWluZXJzJykpIHJldHVybiBmYWxzZTsKICAgIGlmICghYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKG5ld0NvbmZpZy5tdWx0aXBsaWVyKSAmJiBuZXdDb25maWcubXVsdGlwbGllciA+PSAxICYmIG5ld0NvbmZpZy5tdWx0aXBsaWVyIDw9IDEwMCwgJ3Rva2VuTWluZXIgbXVsdGlwbGllciBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDEwMCcpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAob2xkQ29uZmlnLm11bHRpcGxpZXIgIT09IG5ld0NvbmZpZy5tdWx0aXBsaWVyKSB7CiAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgfQogIH0KICBpZiAoIWFwaS5hc3NlcnQoISFvbGROZnRUb2tlbk1pbmVyID09PSAhIW5mdFRva2VuTWluZXIsICdjYW5ub3QgY2hhbmdlIG5mdFRva2VuTWluZXIgdG9rZW4nKSkgcmV0dXJuIGZhbHNlOwogIGlmIChuZnRUb2tlbk1pbmVyKSB7CiAgICBpZiAoIWFwaS5hc3NlcnQob2xkTmZ0VG9rZW5NaW5lci5zeW1ib2wgPT09IG5mdFRva2VuTWluZXIuc3ltYm9sLCAnY2Fubm90IGNoYW5nZSBuZnRUb2tlbk1pbmVyIHRva2VuJykpIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IHsKICAgICAgdHlwZU1hcCwgcHJvcGVydGllcywgdHlwZUZpZWxkLCBlcXVpcEZpZWxkLCBtaW5pbmdQb3dlckZpZWxkLAogICAgfSA9IG5mdFRva2VuTWluZXI7CiAgICBpZiAoIWFwaS5hc3NlcnQodHlwZUZpZWxkICYmIHR5cGVvZiB0eXBlRmllbGQgPT09ICdzdHJpbmcnCiAgICAgICAgJiYgdHlwZUZpZWxkID09PSBvbGROZnRUb2tlbk1pbmVyLnR5cGVGaWVsZCwgJ2Nhbm5vdCBjaGFuZ2UgbmZ0VG9rZW5NaW5lciB0eXBlRmllbGQnKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG9sZE5mdFRva2VuTWluZXIuZXF1aXBGaWVsZCkgewogICAgICBpZiAoIWFwaS5hc3NlcnQoZXF1aXBGaWVsZCAmJiB0eXBlb2YgZXF1aXBGaWVsZCA9PT0gJ3N0cmluZycKICAgICAgICAgICYmIGVxdWlwRmllbGQgPT09IG9sZE5mdFRva2VuTWluZXIuZXF1aXBGaWVsZCwgJ2Nhbm5vdCBjaGFuZ2UgbmZ0VG9rZW5NaW5lciBlcXVpcEZpZWxkJykpIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAoIWFwaS5hc3NlcnQoIWVxdWlwRmllbGQsICdjYW5ub3QgY2hhbmdlIG5mdFRva2VuTWluZXIgZXF1aXBGaWVsZCcpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAob2xkTmZ0VG9rZW5NaW5lci5taW5pbmdQb3dlckZpZWxkKSB7CiAgICAgIGlmICghYXBpLmFzc2VydChtaW5pbmdQb3dlckZpZWxkICYmIHR5cGVvZiBtaW5pbmdQb3dlckZpZWxkID09PSAnc3RyaW5nJwogICAgICAgICAgICAmJiBtaW5pbmdQb3dlckZpZWxkID09PSBvbGROZnRUb2tlbk1pbmVyLm1pbmluZ1Bvd2VyRmllbGQsICdjYW5ub3QgY2hhbmdlIG5mdFRva2VuTWluZXIgbWluaW5nUG93ZXJGaWVsZCcpKSByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCFhcGkuYXNzZXJ0KCFtaW5pbmdQb3dlckZpZWxkLCAnY2Fubm90IGNoYW5nZSBuZnRUb2tlbk1pbmVyIG1pbmluZ1Bvd2VyRmllbGQnKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVNYXAgJiYgdHlwZW9mIHR5cGVNYXAgPT09ICdvYmplY3QnLCAnaW52YWxpZCBuZnRUb2tlbk1pbmVyIHR5cGVNYXAnKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKCEoYXdhaXQgdmFsaWRhdGVOZnRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHByb3BlcnRpZXMubGVuZ3RoICE9PSBvbGROZnRUb2tlbk1pbmVyLnByb3BlcnRpZXMubGVuZ3RoKSB7CiAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNbaV07CiAgICAgICAgY29uc3Qgb2xkUHJvcCA9IG9sZE5mdFRva2VuTWluZXIucHJvcGVydGllc1tpXTsKICAgICAgICBpZiAocHJvcC5vcCAhPT0gb2xkUHJvcC5vcCkgY2hhbmdlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmICghdmFsaWRhdGVOZnRUeXBlTWFwKHR5cGVNYXAsIHByb3BlcnRpZXMpKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBvbGRUeXBlcyA9IE9iamVjdC5rZXlzKG9sZE5mdFRva2VuTWluZXIudHlwZU1hcCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZFR5cGVzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgIGNvbnN0IG9sZFR5cGUgPSBvbGRUeXBlc1tpXTsKICAgICAgY29uc3Qgb2xkVHlwZUNvbmZpZyA9IG9sZE5mdFRva2VuTWluZXIudHlwZU1hcFtvbGRUeXBlXTsKICAgICAgY29uc3QgdHlwZUNvbmZpZyA9IHR5cGVNYXBbb2xkVHlwZV07CiAgICAgIGlmICghYXBpLmFzc2VydCh0eXBlQ29uZmlnLCAndHlwZUNvbmZpZyB0eXBlcyBtdXN0IGJlIGEgc3VwZXJzZXQgb2Ygb2xkIHR5cGVDb25maWcgdHlwZXMnKSkgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHR5cGVDb25maWcubGVuZ3RoOyBqICs9IDEpIHsKICAgICAgICBpZiAob2xkVHlwZUNvbmZpZ1tqXSAhPT0gdHlwZUNvbmZpZ1tqXSkgY2hhbmdlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHsgY2hhbmdlZCB9Owp9CgpmdW5jdGlvbiBjb21wdXRlTWluaW5nUG93ZXIobWluaW5nUG93ZXIsIHRva2VuTWluZXJzLCBuZnRUb2tlbk1pbmVyKSB7CiAgbGV0IHBvd2VyID0gYXBpLkJpZ051bWJlcigwKTsKICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuTWluZXJzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpZiAobWluaW5nUG93ZXIuYmFsYW5jZXNbaV0pIHsKICAgICAgcG93ZXIgPSBwb3dlci5wbHVzKGFwaS5CaWdOdW1iZXIobWluaW5nUG93ZXIuYmFsYW5jZXNbaV0pCiAgICAgICAgLm11bHRpcGxpZWRCeSh0b2tlbk1pbmVyc1tpXS5tdWx0aXBsaWVyKSk7CiAgICB9CiAgfQogIGlmIChuZnRUb2tlbk1pbmVyICYmIG1pbmluZ1Bvd2VyLm5mdEJhbGFuY2VzKSB7CiAgICBsZXQgbmZ0UG93ZXIgPSBhcGkuQmlnTnVtYmVyKDEpOwogICAgLy8gTm90ZSBuZnRCYWxhbmNlcyBpcyBvYmplY3QgdHlwZS4KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmZ0VG9rZW5NaW5lci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgIG5mdFBvd2VyID0gbmZ0UG93ZXIubXVsdGlwbGllZEJ5KG1pbmluZ1Bvd2VyLm5mdEJhbGFuY2VzW2ldKS5kcChNQVhfRElHSVRTKTsKICAgIH0KICAgIGlmICghbmZ0UG93ZXIuaXNGaW5pdGUoKSkgewogICAgICBuZnRQb3dlciA9IGFwaS5CaWdOdW1iZXIoMCk7CiAgICB9CiAgICBpZiAobWluaW5nUG93ZXIubmZ0QmFsYW5jZXNbTUlOSU5HX1BPV0VSX0ZJRUxEX0lOREVYXSkgewogICAgICBuZnRQb3dlciA9IG5mdFBvd2VyLnBsdXMobWluaW5nUG93ZXIubmZ0QmFsYW5jZXNbTUlOSU5HX1BPV0VSX0ZJRUxEX0lOREVYXSk7CiAgICB9CiAgICBwb3dlciA9IHBvd2VyLnBsdXMobmZ0UG93ZXIpOwogIH0KICBpZiAocG93ZXIuaXNQb3NpdGl2ZSgpICYmIHBvd2VyLmlzRmluaXRlKCkpIHsKICAgIHJldHVybiBwb3dlcjsKICB9CiAgcmV0dXJuIGFwaS5CaWdOdW1iZXIoMCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU1pbmluZ1Bvd2VyKAogIHBvb2wsIHRva2VuLCBhY2NvdW50LCBzdGFrZWRRdWFudGl0eSwgZGVsZWdhdGVkUXVhbnRpdHksIHVwZGF0ZVBvb2xUaW1lc3RhbXAsCikgewogIGxldCBtaW5pbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdtaW5pbmdQb3dlcicsIHsgaWQ6IHBvb2wuaWQsIGFjY291bnQgfSk7CiAgbGV0IHN0YWtlID0gYXBpLkJpZ051bWJlcihzdGFrZWRRdWFudGl0eSk7CiAgbGV0IG9sZE1pbmluZ1Bvd2VyID0gYXBpLkJpZ051bWJlcigwKTsKICBzdGFrZSA9IHN0YWtlLnBsdXMoZGVsZWdhdGVkUXVhbnRpdHkpOwogIGNvbnN0IHRva2VuSW5kZXggPSBwb29sLnRva2VuTWluZXJzLmZpbmRJbmRleCh0ID0+IHQuc3ltYm9sID09PSB0b2tlbik7CiAgaWYgKCFtaW5pbmdQb3dlcikgewogICAgY29uc3QgYmFsYW5jZXMgPSB7fTsKICAgIGJhbGFuY2VzW3Rva2VuSW5kZXhdID0gc3Rha2U7CiAgICBtaW5pbmdQb3dlciA9IHsKICAgICAgaWQ6IHBvb2wuaWQsCiAgICAgIGFjY291bnQsCiAgICAgIGJhbGFuY2VzLAogICAgICBwb3dlcjogeyAkbnVtYmVyRGVjaW1hbDogJzAnIH0sCiAgICB9OwogICAgbWluaW5nUG93ZXIgPSBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdtaW5pbmdQb3dlcicsIG1pbmluZ1Bvd2VyKTsKICB9IGVsc2UgewogICAgaWYgKHVwZGF0ZVBvb2xUaW1lc3RhbXAgJiYgbWluaW5nUG93ZXIudXBkYXRlUG9vbFRpbWVzdGFtcCAhPT0gdXBkYXRlUG9vbFRpbWVzdGFtcCkgewogICAgICAvLyByZXNldCBhbGwgYmFsYW5jZXMKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sLnRva2VuTWluZXJzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgbWluaW5nUG93ZXIuYmFsYW5jZXNbaV0gPSAnMCc7CiAgICAgIH0KICAgICAgaWYgKG1pbmluZ1Bvd2VyLm5mdEJhbGFuY2VzKSB7CiAgICAgICAgbWluaW5nUG93ZXIubmZ0QmFsYW5jZXMgPSB7fTsKICAgICAgICBjb25zdCB7IG5mdEJhbGFuY2VzIH0gPSBtaW5pbmdQb3dlcjsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBvb2wubmZ0VG9rZW5NaW5lci5wcm9wZXJ0aWVzLmxlbmd0aDsgaiArPSAxKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHBvb2wubmZ0VG9rZW5NaW5lci5wcm9wZXJ0aWVzW2pdOwogICAgICAgICAgY29uc3Qgb3BJbmZvID0gUFJPUEVSVFlfT1BTW3Byb3BlcnR5Lm9wXTsKICAgICAgICAgIG5mdEJhbGFuY2VzW2pdID0gb3BJbmZvLmRlZmF1bHRWYWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoIW1pbmluZ1Bvd2VyLmJhbGFuY2VzW3Rva2VuSW5kZXhdKSB7CiAgICAgIG1pbmluZ1Bvd2VyLmJhbGFuY2VzW3Rva2VuSW5kZXhdID0gJzAnOwogICAgfQogICAgb2xkTWluaW5nUG93ZXIgPSBjb21wdXRlTWluaW5nUG93ZXIobWluaW5nUG93ZXIsIHBvb2wudG9rZW5NaW5lcnMsIHBvb2wubmZ0VG9rZW5NaW5lcik7CiAgICBtaW5pbmdQb3dlci5iYWxhbmNlc1t0b2tlbkluZGV4XSA9IHN0YWtlLnBsdXMobWluaW5nUG93ZXIuYmFsYW5jZXNbdG9rZW5JbmRleF0pOwogIH0KICBjb25zdCBuZXdNaW5pbmdQb3dlciA9IGNvbXB1dGVNaW5pbmdQb3dlcihtaW5pbmdQb3dlciwgcG9vbC50b2tlbk1pbmVycywgcG9vbC5uZnRUb2tlbk1pbmVyKTsKICBtaW5pbmdQb3dlci5wb3dlciA9IHsgJG51bWJlckRlY2ltYWw6IG5ld01pbmluZ1Bvd2VyIH07CiAgaWYgKHVwZGF0ZVBvb2xUaW1lc3RhbXApIHsKICAgIG1pbmluZ1Bvd2VyLnVwZGF0ZVBvb2xUaW1lc3RhbXAgPSB1cGRhdGVQb29sVGltZXN0YW1wOwogIH0KICBhd2FpdCBhcGkuZGIudXBkYXRlKCdtaW5pbmdQb3dlcicsIG1pbmluZ1Bvd2VyKTsKICByZXR1cm4gbmV3TWluaW5nUG93ZXIubWludXMob2xkTWluaW5nUG93ZXIpOwp9CgpmdW5jdGlvbiBnZXROZnRBY2NvdW50KG5mdCkgewogIGlmIChuZnQuZGVsZWdhdGVkVG8uYWNjb3VudCA9PT0gJ21pbmluZycgJiYgbmZ0LmRlbGVnYXRlZFRvLm93bmVkQnkgPT09ICdjJykgewogICAgcmV0dXJuIG5mdC5hY2NvdW50OwogIH0gaWYgKG5mdC5kZWxlZ2F0ZWRUby5vd25lZEJ5ID09PSAndScpIHsKICAgIHJldHVybiBuZnQuZGVsZWdhdGVkVG8uYWNjb3VudDsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIHNhbml0aXplTmZ0TWluaW5nUG93ZXIobmZ0TWluaW5nUG93ZXIpIHsKICBsZXQgZXh0cmFOZnRNaW5pbmdQb3dlciA9IGFwaS5CaWdOdW1iZXIobmZ0TWluaW5nUG93ZXIpOwogIGlmIChleHRyYU5mdE1pbmluZ1Bvd2VyLmlzTmFOKCkgfHwgIWV4dHJhTmZ0TWluaW5nUG93ZXIuaXNGaW5pdGUoKSkgewogICAgZXh0cmFOZnRNaW5pbmdQb3dlciA9IGFwaS5CaWdOdW1iZXIoMCk7CiAgfQogIHJldHVybiBleHRyYU5mdE1pbmluZ1Bvd2VyLmRwKE1BWF9ESUdJVFMpOwp9CgovKioKICogUGFyYW1zOgogKiAgIC0gcG9vbDogcmV3YXJkIHBvb2wgb2JqZWN0CiAqICAgLSBuZnQ6IG5mdCBpbnN0YW5jZQogKiAgIC0gYWRkOiB3aGV0aGVyIHRvIGFkZCBvciByZW1vdmUgdGhlIG5mdAogKiAgIC0gdXBkYXRlUG9vbFRpbWVzdGFtcDogY29udHJvbHMgd2hldGhlciB0byByZXNldCB0aGUgbWluaW5nIHBvd2VyIChkdXJpbmcgYSBuZXcgdXBkYXRlIHJlcXVlc3QpCiAqICAgLSBhY2NvdW50T3ZlcnJpZGU6IG9wdGlvbmFsIG92ZXJyaWRlLCB1c2VkIGZvciBlcXVpcEZpZWxkIHBvb2xzCiAqLwphc3luYyBmdW5jdGlvbiB1cGRhdGVOZnRNaW5pbmdQb3dlcihwb29sLCBuZnQsIGFkZCwgdXBkYXRlUG9vbFRpbWVzdGFtcCwgYWNjb3VudE92ZXJyaWRlKSB7CiAgY29uc3QgYWNjb3VudCA9IGFjY291bnRPdmVycmlkZSB8fCBnZXROZnRBY2NvdW50KG5mdCk7CgogIGlmICghYWNjb3VudCkgcmV0dXJuIGFwaS5CaWdOdW1iZXIoMCk7CgogIGxldCBtaW5pbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdtaW5pbmdQb3dlcicsIHsgaWQ6IHBvb2wuaWQsIGFjY291bnQgfSk7CiAgbGV0IG9sZE1pbmluZ1Bvd2VyID0gYXBpLkJpZ051bWJlcigwKTsKICBsZXQgZXh0cmFOZnRNaW5pbmdQb3dlciA9IGFwaS5CaWdOdW1iZXIoMCk7CiAgY29uc3QgewogICAgdHlwZU1hcCwKICAgIHByb3BlcnRpZXMsCiAgICB0eXBlRmllbGQsCiAgICBlcXVpcEZpZWxkLAogICAgbWluaW5nUG93ZXJGaWVsZCwKICB9ID0gcG9vbC5uZnRUb2tlbk1pbmVyOwoKICBjb25zdCBuZnRUeXBlID0gbmZ0LnByb3BlcnRpZXNbdHlwZUZpZWxkXTsKICBjb25zdCB0eXBlUHJvcGVydGllcyA9IHR5cGVNYXBbbmZ0VHlwZV07CiAgaWYgKG1pbmluZ1Bvd2VyRmllbGQpIHsKICAgIGV4dHJhTmZ0TWluaW5nUG93ZXIgPSBzYW5pdGl6ZU5mdE1pbmluZ1Bvd2VyKG5mdC5wcm9wZXJ0aWVzW21pbmluZ1Bvd2VyRmllbGRdKTsKICB9CiAgaWYgKCFtaW5pbmdQb3dlcikgewogICAgY29uc3QgbmZ0QmFsYW5jZXMgPSB7fTsKICAgIGNvbnN0IGVxdWlwcGVkTmZ0ID0geyB0eXBlOiBuZnRUeXBlIH07CgogICAgaWYgKHR5cGVQcm9wZXJ0aWVzKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgIGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTsKICAgICAgICBjb25zdCBvcEluZm8gPSBQUk9QRVJUWV9PUFNbcHJvcGVydHkub3BdOwogICAgICAgIGlmIChhZGQpIHsKICAgICAgICAgIG5mdEJhbGFuY2VzW2ldID0gb3BJbmZvLmFkZChvcEluZm8uZGVmYXVsdFZhbHVlLCB0eXBlUHJvcGVydGllc1tpXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFwaS5hc3NlcnQoZmFsc2UsICd1bmV4cGVjdGVkIGNvbmRpdGlvbjogcmVtb3ZlIHdpdGhvdXQgcHJldmlvdXMgbWluaW5nUG93ZXInKTsKICAgICAgICAgIHJldHVybiBhcGkuQmlnTnVtYmVyKDApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKG1pbmluZ1Bvd2VyRmllbGQpIHsKICAgICAgbmZ0QmFsYW5jZXNbTUlOSU5HX1BPV0VSX0ZJRUxEX0lOREVYXSA9IGV4dHJhTmZ0TWluaW5nUG93ZXI7CiAgICAgIGVxdWlwcGVkTmZ0LmV4dHJhTWluaW5nUG93ZXIgPSBleHRyYU5mdE1pbmluZ1Bvd2VyOwogICAgfQogICAgY29uc3QgZXF1aXBwZWROZnRzID0ge307CiAgICBlcXVpcHBlZE5mdHNbbmZ0Ll9pZF0gPSBlcXVpcHBlZE5mdDsKICAgIG1pbmluZ1Bvd2VyID0gewogICAgICBpZDogcG9vbC5pZCwKICAgICAgYWNjb3VudCwKICAgICAgYmFsYW5jZXM6IHt9LAogICAgICBuZnRCYWxhbmNlcywKICAgICAgcG93ZXI6IHsgJG51bWJlckRlY2ltYWw6ICcwJyB9LAogICAgICBlcXVpcHBlZE5mdHMsCiAgICB9OwogICAgbWluaW5nUG93ZXIgPSBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdtaW5pbmdQb3dlcicsIG1pbmluZ1Bvd2VyKTsKICB9IGVsc2UgewogICAgaWYgKCFtaW5pbmdQb3dlci5uZnRCYWxhbmNlcykgewogICAgICBtaW5pbmdQb3dlci5uZnRCYWxhbmNlcyA9IHt9OwogICAgfQogICAgaWYgKCFtaW5pbmdQb3dlci5lcXVpcHBlZE5mdHMpIHsKICAgICAgbWluaW5nUG93ZXIuZXF1aXBwZWROZnRzID0ge307CiAgICB9CiAgICBjb25zdCBvbGRFeHRyYU5mdE1pbmluZ1Bvd2VyID0gMDsKICAgIGxldCBlcXVpcHBlZE5mdCA9IG1pbmluZ1Bvd2VyLmVxdWlwcGVkTmZ0c1tuZnQuX2lkXTsKICAgIGlmICghZXF1aXBwZWROZnQpIHsKICAgICAgLy8gSWYgdXNpbmcgZXF1aXAgZmllbGQsIHZlcmlmeSBhbHJlYWR5IHRyYWNrZWQgaW4gZXF1aXBwZWROZnRzCiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIGNhbiBoYXBwZW4gaWYgYW4gTkZUIGlzIGlzc3VlZCB3aXRoIGVxdWlwIGZpZWxkIHBvcHVsYXRlZCB1cCBmcm9udC4KICAgICAgaWYgKGVxdWlwRmllbGQgJiYgIWFkZCkgewogICAgICAgIHJldHVybiBhcGkuQmlnTnVtYmVyKDApOwogICAgICB9CgogICAgICBlcXVpcHBlZE5mdCA9IHsgdHlwZTogbmZ0VHlwZSB9OwogICAgICBtaW5pbmdQb3dlci5lcXVpcHBlZE5mdHNbbmZ0Ll9pZF0gPSBlcXVpcHBlZE5mdDsKICAgIH0KICAgIGNvbnN0IHsgbmZ0QmFsYW5jZXMgfSA9IG1pbmluZ1Bvd2VyOwogICAgaWYgKHR5cGVQcm9wZXJ0aWVzKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgIGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTsKICAgICAgICBjb25zdCBvcEluZm8gPSBQUk9QRVJUWV9PUFNbcHJvcGVydHkub3BdOwogICAgICAgIGlmICghbmZ0QmFsYW5jZXNbaV0gfHwgbWluaW5nUG93ZXIudXBkYXRlUG9vbFRpbWVzdGFtcCAhPT0gdXBkYXRlUG9vbFRpbWVzdGFtcCkgewogICAgICAgICAgbmZ0QmFsYW5jZXNbaV0gPSBvcEluZm8uZGVmYXVsdFZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKG1pbmluZ1Bvd2VyRmllbGQgJiYgbWluaW5nUG93ZXIudXBkYXRlUG9vbFRpbWVzdGFtcCAhPT0gdXBkYXRlUG9vbFRpbWVzdGFtcCkgewogICAgICBuZnRCYWxhbmNlc1tNSU5JTkdfUE9XRVJfRklFTERfSU5ERVhdID0gYXBpLkJpZ051bWJlcigwKTsKICAgIH0KICAgIG9sZE1pbmluZ1Bvd2VyID0gY29tcHV0ZU1pbmluZ1Bvd2VyKG1pbmluZ1Bvd2VyLCBwb29sLnRva2VuTWluZXJzLCBwb29sLm5mdFRva2VuTWluZXIpOwogICAgaWYgKHR5cGVQcm9wZXJ0aWVzKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgIGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTsKICAgICAgICBjb25zdCBvcEluZm8gPSBQUk9QRVJUWV9PUFNbcHJvcGVydHkub3BdOwogICAgICAgIGlmIChhZGQpIHsKICAgICAgICAgIG5mdEJhbGFuY2VzW2ldID0gb3BJbmZvLmFkZChuZnRCYWxhbmNlc1tpXSwgdHlwZVByb3BlcnRpZXNbaV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZnRCYWxhbmNlc1tpXSA9IG9wSW5mby5yZW1vdmUobmZ0QmFsYW5jZXNbaV0sIHR5cGVQcm9wZXJ0aWVzW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChtaW5pbmdQb3dlckZpZWxkKSB7CiAgICAgIGlmICghbmZ0QmFsYW5jZXNbTUlOSU5HX1BPV0VSX0ZJRUxEX0lOREVYXSkgewogICAgICAgIG5mdEJhbGFuY2VzW01JTklOR19QT1dFUl9GSUVMRF9JTkRFWF0gPSBhcGkuQmlnTnVtYmVyKDApOwogICAgICB9CiAgICAgIGlmIChhZGQpIHsKICAgICAgICBlcXVpcHBlZE5mdC5leHRyYU1pbmluZ1Bvd2VyID0gZXh0cmFOZnRNaW5pbmdQb3dlcjsKICAgICAgICBuZnRCYWxhbmNlc1tNSU5JTkdfUE9XRVJfRklFTERfSU5ERVhdID0gYXBpLkJpZ051bWJlcihuZnRCYWxhbmNlc1tNSU5JTkdfUE9XRVJfRklFTERfSU5ERVhdKQogICAgICAgICAgLm1pbnVzKG9sZEV4dHJhTmZ0TWluaW5nUG93ZXIpCiAgICAgICAgICAucGx1cyhleHRyYU5mdE1pbmluZ1Bvd2VyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZnRCYWxhbmNlc1tNSU5JTkdfUE9XRVJfRklFTERfSU5ERVhdID0gYXBpLkJpZ051bWJlcihuZnRCYWxhbmNlc1tNSU5JTkdfUE9XRVJfRklFTERfSU5ERVhdKQogICAgICAgICAgLm1pbnVzKGV4dHJhTmZ0TWluaW5nUG93ZXIpOwogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IG5ld01pbmluZ1Bvd2VyID0gY29tcHV0ZU1pbmluZ1Bvd2VyKG1pbmluZ1Bvd2VyLCBwb29sLnRva2VuTWluZXJzLCBwb29sLm5mdFRva2VuTWluZXIpOwogIG1pbmluZ1Bvd2VyLnBvd2VyID0geyAkbnVtYmVyRGVjaW1hbDogbmV3TWluaW5nUG93ZXIgfTsKICBtaW5pbmdQb3dlci51cGRhdGVQb29sVGltZXN0YW1wID0gdXBkYXRlUG9vbFRpbWVzdGFtcDsKICBpZiAoIWFkZCkgewogICAgZGVsZXRlIG1pbmluZ1Bvd2VyLmVxdWlwcGVkTmZ0c1tuZnQuX2lkXTsKICB9CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgnbWluaW5nUG93ZXInLCBtaW5pbmdQb3dlcik7CgogIHJldHVybiBuZXdNaW5pbmdQb3dlci5taW51cyhvbGRNaW5pbmdQb3dlcik7Cn0KCmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU5mdE1pbmluZ1Bvd2VyRnJvbVByb3BlcnR5VXBkYXRlKHBvb2wsIG5mdCwgYWNjb3VudE92ZXJyaWRlKSB7CiAgY29uc3QgYWNjb3VudCA9IGFjY291bnRPdmVycmlkZSB8fCBnZXROZnRBY2NvdW50KG5mdCk7CgogIGlmICghYWNjb3VudCkgcmV0dXJuIGFwaS5CaWdOdW1iZXIoMCk7CgogIGxldCBtaW5pbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdtaW5pbmdQb3dlcicsIHsgaWQ6IHBvb2wuaWQsIGFjY291bnQgfSk7CiAgbGV0IG9sZE1pbmluZ1Bvd2VyID0gYXBpLkJpZ051bWJlcigwKTsKICBsZXQgZXh0cmFOZnRNaW5pbmdQb3dlciA9IGFwaS5CaWdOdW1iZXIoMCk7CiAgY29uc3QgewogICAgdHlwZUZpZWxkLAogICAgZXF1aXBGaWVsZCwKICAgIG1pbmluZ1Bvd2VyRmllbGQsCiAgfSA9IHBvb2wubmZ0VG9rZW5NaW5lcjsKCiAgY29uc3QgbmZ0VHlwZSA9IG5mdC5wcm9wZXJ0aWVzW3R5cGVGaWVsZF07CiAgaWYgKG1pbmluZ1Bvd2VyRmllbGQpIHsKICAgIGV4dHJhTmZ0TWluaW5nUG93ZXIgPSBzYW5pdGl6ZU5mdE1pbmluZ1Bvd2VyKG5mdC5wcm9wZXJ0aWVzW21pbmluZ1Bvd2VyRmllbGRdKTsKICB9IGVsc2UgewogICAgcmV0dXJuIGFwaS5CaWdOdW1iZXIoMCk7CiAgfQogIGlmICghbWluaW5nUG93ZXIpIHsKICAgIGNvbnN0IG5mdEJhbGFuY2VzID0ge307CiAgICBjb25zdCBlcXVpcHBlZE5mdCA9IHsgdHlwZTogbmZ0VHlwZSB9OwoKICAgIG5mdEJhbGFuY2VzW01JTklOR19QT1dFUl9GSUVMRF9JTkRFWF0gPSBleHRyYU5mdE1pbmluZ1Bvd2VyOwogICAgZXF1aXBwZWROZnQuZXh0cmFNaW5pbmdQb3dlciA9IGV4dHJhTmZ0TWluaW5nUG93ZXI7CiAgICBjb25zdCBlcXVpcHBlZE5mdHMgPSB7fTsKICAgIGVxdWlwcGVkTmZ0c1tuZnQuX2lkXSA9IGVxdWlwcGVkTmZ0OwogICAgbWluaW5nUG93ZXIgPSB7CiAgICAgIGlkOiBwb29sLmlkLAogICAgICBhY2NvdW50LAogICAgICBiYWxhbmNlczoge30sCiAgICAgIG5mdEJhbGFuY2VzLAogICAgICBwb3dlcjogeyAkbnVtYmVyRGVjaW1hbDogJzAnIH0sCiAgICAgIGVxdWlwcGVkTmZ0cywKICAgIH07CiAgICBtaW5pbmdQb3dlciA9IGF3YWl0IGFwaS5kYi5pbnNlcnQoJ21pbmluZ1Bvd2VyJywgbWluaW5nUG93ZXIpOwogIH0gZWxzZSB7CiAgICBpZiAoIW1pbmluZ1Bvd2VyLm5mdEJhbGFuY2VzKSB7CiAgICAgIG1pbmluZ1Bvd2VyLm5mdEJhbGFuY2VzID0ge307CiAgICB9CiAgICBpZiAoIW1pbmluZ1Bvd2VyLmVxdWlwcGVkTmZ0cykgewogICAgICBtaW5pbmdQb3dlci5lcXVpcHBlZE5mdHMgPSB7fTsKICAgIH0KICAgIGxldCBvbGRFeHRyYU5mdE1pbmluZ1Bvd2VyID0gMDsKICAgIGxldCBlcXVpcHBlZE5mdCA9IG1pbmluZ1Bvd2VyLmVxdWlwcGVkTmZ0c1tuZnQuX2lkXTsKICAgIGlmICghZXF1aXBwZWROZnQpIHsKICAgICAgLy8gSWYgdXNpbmcgZXF1aXAgZmllbGQsIHZlcmlmeSBhbHJlYWR5IHRyYWNrZWQgaW4gZXF1aXBwZWROZnRzCiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIGNhbiBoYXBwZW4gaWYgYW4gTkZUIGlzIGlzc3VlZCB3aXRoIGVxdWlwIGZpZWxkIHBvcHVsYXRlZCB1cCBmcm9udC4KICAgICAgaWYgKGVxdWlwRmllbGQpIHsKICAgICAgICByZXR1cm4gYXBpLkJpZ051bWJlcigwKTsKICAgICAgfQoKICAgICAgZXF1aXBwZWROZnQgPSB7IHR5cGU6IG5mdFR5cGUgfTsKICAgICAgbWluaW5nUG93ZXIuZXF1aXBwZWROZnRzW25mdC5faWRdID0gZXF1aXBwZWROZnQ7CiAgICB9IGVsc2UgewogICAgICBvbGRFeHRyYU5mdE1pbmluZ1Bvd2VyID0gZXF1aXBwZWROZnQuZXh0cmFNaW5pbmdQb3dlcjsKICAgIH0KICAgIGNvbnN0IHsgbmZ0QmFsYW5jZXMgfSA9IG1pbmluZ1Bvd2VyOwogICAgb2xkTWluaW5nUG93ZXIgPSBjb21wdXRlTWluaW5nUG93ZXIobWluaW5nUG93ZXIsIHBvb2wudG9rZW5NaW5lcnMsIHBvb2wubmZ0VG9rZW5NaW5lcik7CiAgICBpZiAoIW5mdEJhbGFuY2VzW01JTklOR19QT1dFUl9GSUVMRF9JTkRFWF0pIHsKICAgICAgbmZ0QmFsYW5jZXNbTUlOSU5HX1BPV0VSX0ZJRUxEX0lOREVYXSA9IGFwaS5CaWdOdW1iZXIoMCk7CiAgICB9CiAgICBlcXVpcHBlZE5mdC5leHRyYU1pbmluZ1Bvd2VyID0gZXh0cmFOZnRNaW5pbmdQb3dlcjsKICAgIG5mdEJhbGFuY2VzW01JTklOR19QT1dFUl9GSUVMRF9JTkRFWF0gPSBhcGkuQmlnTnVtYmVyKG5mdEJhbGFuY2VzW01JTklOR19QT1dFUl9GSUVMRF9JTkRFWF0pCiAgICAgIC5taW51cyhvbGRFeHRyYU5mdE1pbmluZ1Bvd2VyKQogICAgICAucGx1cyhleHRyYU5mdE1pbmluZ1Bvd2VyKTsKICB9CiAgY29uc3QgbmV3TWluaW5nUG93ZXIgPSBjb21wdXRlTWluaW5nUG93ZXIobWluaW5nUG93ZXIsIHBvb2wudG9rZW5NaW5lcnMsIHBvb2wubmZ0VG9rZW5NaW5lcik7CiAgbWluaW5nUG93ZXIucG93ZXIgPSB7ICRudW1iZXJEZWNpbWFsOiBuZXdNaW5pbmdQb3dlciB9OwogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ21pbmluZ1Bvd2VyJywgbWluaW5nUG93ZXIpOwoKICByZXR1cm4gbmV3TWluaW5nUG93ZXIubWludXMob2xkTWluaW5nUG93ZXIpOwp9Cgphc3luYyBmdW5jdGlvbiBpbml0TWluaW5nUG93ZXIocG9vbCwgdXBkYXRlUG9vbFRpbWVzdGFtcCwgcGFyYW1zLCB0b2tlbiwgbGFzdElkKSB7CiAgbGV0IGFkanVzdGVkUG93ZXIgPSBhcGkuQmlnTnVtYmVyKDApOwogIGxldCBvZmZzZXQgPSAwOwogIGxldCBsYXN0SWRQcm9jZXNzZWQgPSBsYXN0SWQ7CiAgbGV0IGNvbXBsZXRlID0gZmFsc2U7CiAgbGV0IGJhbGFuY2VzOwogIHdoaWxlICghY29tcGxldGUgJiYgb2Zmc2V0IDwgcGFyYW1zLm1heEJhbGFuY2VzUHJvY2Vzc2VkUGVyQmxvY2spIHsKICAgIGJhbGFuY2VzID0gYXdhaXQgYXBpLmRiLmZpbmRJblRhYmxlKCd0b2tlbnMnLCAnYmFsYW5jZXMnLCB7IHN5bWJvbDogdG9rZW4sIF9pZDogeyAkZ3Q6IGxhc3RJZCB9IH0sIHBhcmFtcy5wcm9jZXNzUXVlcnlMaW1pdCwgb2Zmc2V0LCBbeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFsYW5jZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgY29uc3QgYmFsYW5jZSA9IGJhbGFuY2VzW2ldOwogICAgICBpZiAoYXBpLkJpZ051bWJlcihiYWxhbmNlLnN0YWtlKS5ndCgwKSB8fCBhcGkuQmlnTnVtYmVyKGJhbGFuY2UuZGVsZWdhdGlvbnNJbikuZ3QoMCkpIHsKICAgICAgICBjb25zdCBhZGp1c3RlZCA9IGF3YWl0IHVwZGF0ZU1pbmluZ1Bvd2VyKAogICAgICAgICAgcG9vbCwgdG9rZW4sIGJhbGFuY2UuYWNjb3VudCwgYmFsYW5jZS5zdGFrZSwgYmFsYW5jZS5kZWxlZ2F0aW9uc0luLCB1cGRhdGVQb29sVGltZXN0YW1wLAogICAgICAgICk7CiAgICAgICAgYWRqdXN0ZWRQb3dlciA9IGFkanVzdGVkUG93ZXIucGx1cyhhZGp1c3RlZCk7CiAgICAgIH0KICAgICAgbGFzdElkUHJvY2Vzc2VkID0gYmFsYW5jZS5faWQ7CiAgICB9CiAgICBpZiAoYmFsYW5jZXMubGVuZ3RoIDwgcGFyYW1zLnByb2Nlc3NRdWVyeUxpbWl0KSB7CiAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKICAgIH0KICAgIG9mZnNldCArPSBwYXJhbXMucHJvY2Vzc1F1ZXJ5TGltaXQ7CiAgfQogIHJldHVybiB7IGFkanVzdGVkUG93ZXIsIG5leHRJZDogbGFzdElkUHJvY2Vzc2VkLCBjb21wbGV0ZSB9Owp9Cgphc3luYyBmdW5jdGlvbiBpbml0TmZ0TWluaW5nUG93ZXIocG9vbCwgdXBkYXRlUG9vbFRpbWVzdGFtcCwgcGFyYW1zLCBuZnRUb2tlbk1pbmVyLCBsYXN0SWQpIHsKICBsZXQgYWRqdXN0ZWRQb3dlciA9IGFwaS5CaWdOdW1iZXIoMCk7CiAgbGV0IG9mZnNldCA9IDA7CiAgbGV0IGxhc3RJZFByb2Nlc3NlZCA9IGxhc3RJZDsKICBsZXQgY29tcGxldGUgPSBmYWxzZTsKICBsZXQgbmZ0czsKICBjb25zdCB7CiAgICBzeW1ib2wsCiAgICBlcXVpcEZpZWxkLAogIH0gPSBuZnRUb2tlbk1pbmVyOwogIHdoaWxlICghY29tcGxldGUgJiYgb2Zmc2V0IDwgcGFyYW1zLm1heEJhbGFuY2VzUHJvY2Vzc2VkUGVyQmxvY2spIHsKICAgIGNvbnN0IG5mdFF1ZXJ5ID0gewogICAgICBfaWQ6IHsgJGd0OiBsYXN0SWQgfSwKICAgIH07CiAgICBpZiAoZXF1aXBGaWVsZCkgewogICAgICBuZnRRdWVyeVtgcHJvcGVydGllcy4ke2VxdWlwRmllbGR9YF0gPSB7ICRleGlzdHM6IHRydWUsICRuZTogJycgfTsKICAgIH0gZWxzZSB7CiAgICAgIG5mdFF1ZXJ5LmRlbGVnYXRlZFRvID0geyAkbmU6IG51bGwgfTsKICAgICAgbmZ0UXVlcnlbJ2RlbGVnYXRlZFRvLnVuZGVsZWdhdGVBdCddID0geyAkZXE6IG51bGwgfTsKICAgIH0KICAgIG5mdHMgPSBhd2FpdCBhcGkuZGIuZmluZEluVGFibGUoJ25mdCcsIGAke3N5bWJvbH1pbnN0YW5jZXNgLCBuZnRRdWVyeSwgcGFyYW1zLnByb2Nlc3NRdWVyeUxpbWl0LCBvZmZzZXQsIFt7IGluZGV4OiAnX2lkJywgZGVzY2VuZGluZzogZmFsc2UgfV0pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZnRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgIGNvbnN0IG5mdCA9IG5mdHNbaV07CiAgICAgIGlmICghZXF1aXBGaWVsZCB8fCBuZnQucHJvcGVydGllc1tlcXVpcEZpZWxkXSkgewogICAgICAgIGNvbnN0IGFkanVzdGVkID0gYXdhaXQgdXBkYXRlTmZ0TWluaW5nUG93ZXIoCiAgICAgICAgICBwb29sLAogICAgICAgICAgbmZ0LAogICAgICAgICAgLyogYWRkICovIHRydWUsCiAgICAgICAgICB1cGRhdGVQb29sVGltZXN0YW1wLAogICAgICAgICAgZXF1aXBGaWVsZCA/IG5mdC5wcm9wZXJ0aWVzW2VxdWlwRmllbGRdIDogbnVsbCwKICAgICAgICApOwogICAgICAgIGFkanVzdGVkUG93ZXIgPSBhZGp1c3RlZFBvd2VyLnBsdXMoYWRqdXN0ZWQpOwogICAgICB9CiAgICAgIGxhc3RJZFByb2Nlc3NlZCA9IG5mdC5faWQ7CiAgICB9CiAgICBpZiAobmZ0cy5sZW5ndGggPCBwYXJhbXMucHJvY2Vzc1F1ZXJ5TGltaXQpIHsKICAgICAgY29tcGxldGUgPSB0cnVlOwogICAgfQogICAgb2Zmc2V0ICs9IHBhcmFtcy5wcm9jZXNzUXVlcnlMaW1pdDsKICB9CiAgcmV0dXJuIHsgYWRqdXN0ZWRQb3dlciwgbmV4dElkOiBsYXN0SWRQcm9jZXNzZWQsIGNvbXBsZXRlIH07Cn0KCmFzeW5jIGZ1bmN0aW9uIHJlc3VtZVBvd2VyVXBkYXRlKHBvb2wsIHBhcmFtcykgewogIGxldCB7CiAgICBpblByb2dyZXNzLCB0b2tlbkluZGV4LCBuZnRUb2tlbkluZGV4LCBsYXN0SWQsCiAgfSA9IHBvb2wudXBkYXRpbmc7CiAgY29uc3QgeyB1cGRhdGVQb29sVGltZXN0YW1wIH0gPSBwb29sLnVwZGF0aW5nOwogIGlmICghaW5Qcm9ncmVzcykgewogICAgcmV0dXJuOwogIH0KCiAgaWYgKHRva2VuSW5kZXggPCBwb29sLnRva2VuTWluZXJzLmxlbmd0aCkgewogICAgY29uc3QgdG9rZW5Db25maWcgPSBwb29sLnRva2VuTWluZXJzW3Rva2VuSW5kZXhdOwogICAgY29uc3QgeyBhZGp1c3RlZFBvd2VyLCBuZXh0SWQsIGNvbXBsZXRlIH0gPSBhd2FpdCBpbml0TWluaW5nUG93ZXIoCiAgICAgIHBvb2wsIHVwZGF0ZVBvb2xUaW1lc3RhbXAsIHBhcmFtcywgdG9rZW5Db25maWcuc3ltYm9sLCBsYXN0SWQsCiAgICApOwogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduCiAgICBwb29sLnRvdGFsUG93ZXIgPSBhcGkuQmlnTnVtYmVyKHBvb2wudG90YWxQb3dlcikKICAgICAgLnBsdXMoYWRqdXN0ZWRQb3dlcik7CiAgICBpZiAoY29tcGxldGUpIHsKICAgICAgbGFzdElkID0gMDsKICAgICAgdG9rZW5JbmRleCArPSAxOwogICAgfSBlbHNlIHsKICAgICAgbGFzdElkID0gbmV4dElkOwogICAgfQogIH0gZWxzZSBpZiAocG9vbC5uZnRUb2tlbk1pbmVyICYmIG5mdFRva2VuSW5kZXggPCAxKSB7CiAgICBjb25zdCB7IG5mdFRva2VuTWluZXIgfSA9IHBvb2w7CiAgICBjb25zdCB7IGFkanVzdGVkUG93ZXIsIG5leHRJZCwgY29tcGxldGUgfSA9IGF3YWl0IGluaXROZnRNaW5pbmdQb3dlcigKICAgICAgcG9vbCwgdXBkYXRlUG9vbFRpbWVzdGFtcCwgcGFyYW1zLCBuZnRUb2tlbk1pbmVyLCBsYXN0SWQsCiAgICApOwogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduCiAgICBwb29sLnRvdGFsUG93ZXIgPSBhcGkuQmlnTnVtYmVyKHBvb2wudG90YWxQb3dlcikKICAgICAgLnBsdXMoYWRqdXN0ZWRQb3dlcik7CiAgICBpZiAoY29tcGxldGUpIHsKICAgICAgbGFzdElkID0gMDsKICAgICAgbmZ0VG9rZW5JbmRleCArPSAxOwogICAgfSBlbHNlIHsKICAgICAgbGFzdElkID0gbmV4dElkOwogICAgfQogIH0KCiAgaWYgKHRva2VuSW5kZXggPT09IHBvb2wudG9rZW5NaW5lcnMubGVuZ3RoCiAgICAgICYmICghcG9vbC5uZnRUb2tlbk1pbmVyIHx8IG5mdFRva2VuSW5kZXggPT09IDEpKSB7CiAgICBpblByb2dyZXNzID0gZmFsc2U7CiAgICB0b2tlbkluZGV4ID0gMDsKICAgIG5mdFRva2VuSW5kZXggPSAwOwogIH0KCiAgY29uc3QgeyB1cGRhdGluZyB9ID0gcG9vbDsKICB1cGRhdGluZy5pblByb2dyZXNzID0gaW5Qcm9ncmVzczsKICB1cGRhdGluZy50b2tlbkluZGV4ID0gdG9rZW5JbmRleDsKICB1cGRhdGluZy5uZnRUb2tlbkluZGV4ID0gbmZ0VG9rZW5JbmRleDsKICB1cGRhdGluZy5sYXN0SWQgPSBsYXN0SWQ7CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncG9vbHMnLCBwb29sKTsKfQoKYWN0aW9ucy5zZXRBY3RpdmUgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIGlkLAogICAgYWN0aXZlLAogICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoIWFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykpIHsKICAgIHJldHVybjsKICB9CiAgY29uc3QgcG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwb29scycsIHsgaWQgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KHBvb2wsICdwb29sIGlkIG5vdCBmb3VuZCcpKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IG1pbmVkVG9rZW5PYmplY3QgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbDogcG9vbC5taW5lZFRva2VuIH0pOwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKICBpZiAoIWFwaS5hc3NlcnQobWluZWRUb2tlbk9iamVjdCAmJiAobWluZWRUb2tlbk9iamVjdC5pc3N1ZXIgPT09IGFwaS5zZW5kZXIgfHwgKG1pbmVkVG9rZW5PYmplY3Quc3ltYm9sID09PSAiQkVFIiAmJiBhcGkuc2VuZGVyID09PSBhcGkub3duZXIpKSwgJ211c3QgYmUgaXNzdWVyIG9mIG1pbmVkVG9rZW4nKSkgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgeyBuZnRUb2tlbk1pbmVyIH0gPSBwb29sOwogIGlmIChuZnRUb2tlbk1pbmVyKSB7CiAgICBjb25zdCBuZnRUb2tlblBvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnbmZ0VG9rZW5Qb29scycsIHsgc3ltYm9sOiBuZnRUb2tlbk1pbmVyLnN5bWJvbCwgaWQ6IHBvb2wuaWQgfSk7CiAgICBpZiAoYWN0aXZlICYmICFuZnRUb2tlblBvb2wpIHsKICAgICAgY29uc3Qgb3RoZXJOZnRUb2tlblBvb2xzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ25mdFRva2VuUG9vbHMnLCB7IHN5bWJvbDogbmZ0VG9rZW5NaW5lci5zeW1ib2wgfSk7CiAgICAgIGlmICghYXBpLmFzc2VydCghb3RoZXJOZnRUb2tlblBvb2xzIHx8IG90aGVyTmZ0VG9rZW5Qb29scy5sZW5ndGggPCAyLCAnY2FuIGhhdmUgYXQgbW9zdCAyIGFjdGl2ZSBuZnQgdG9rZW4gcG9vbHMgZm9yIG5mdCB0b2tlbicpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQoJ25mdFRva2VuUG9vbHMnLCB7IHN5bWJvbDogbmZ0VG9rZW5NaW5lci5zeW1ib2wsIGlkOiBwb29sLmlkIH0pOwogICAgfSBlbHNlIGlmICghYWN0aXZlICYmIG5mdFRva2VuUG9vbCkgewogICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCduZnRUb2tlblBvb2xzJywgbmZ0VG9rZW5Qb29sKTsKICAgIH0KICB9CiAgcG9vbC5hY3RpdmUgPSAhIWFjdGl2ZTsKICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CiAgcG9vbC5uZXh0TG90dGVyeVRpbWVzdGFtcCA9IGFwaS5CaWdOdW1iZXIoYmxvY2tEYXRlLmdldFRpbWUoKSkKICAgIC5wbHVzKHBvb2wubG90dGVyeUludGVydmFsSG91cnMgKiAzNjAwICogMTAwMCkudG9OdW1iZXIoKTsKICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwb29scycsIHBvb2wpOwp9OwoKYWN0aW9ucy51cGRhdGVQb29sID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBpZCwgbG90dGVyeVdpbm5lcnMsIGxvdHRlcnlJbnRlcnZhbEhvdXJzLCBsb3R0ZXJ5QW1vdW50LCB0b2tlbk1pbmVycywKICAgIG5mdFRva2VuTWluZXIsIGNhbGxpbmdDb250cmFjdEluZm8sIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgLy8gZ2V0IGNvbnRyYWN0IHBhcmFtcwogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyBwb29sVXBkYXRlRmVlIH0gPSBwYXJhbXM7CiAgLy8gZ2V0IGFwaS5zZW5kZXIncyBVVElMSVRZX1RPS0VOX1NZTUJPTCBiYWxhbmNlCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwogIGNvbnN0IHV0aWxpdHlUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiAiQkVFIiB9KTsKCiAgY29uc3QgYXV0aG9yaXplZCA9IGFwaS5CaWdOdW1iZXIocG9vbFVwZGF0ZUZlZSkubHRlKDApIHx8IGFwaS5zZW5kZXIgPT09IGFwaS5vd25lcgogICAgPyB0cnVlCiAgICA6IHV0aWxpdHlUb2tlbkJhbGFuY2UgJiYgYXBpLkJpZ051bWJlcih1dGlsaXR5VG9rZW5CYWxhbmNlLmJhbGFuY2UpLmd0ZShwb29sVXBkYXRlRmVlKTsKCiAgaWYgKGFwaS5hc3NlcnQoYXV0aG9yaXplZCwgJ3lvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciB0aGUgdXBkYXRlIGZlZScpCiAgICAmJiBhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpCiAgICAmJiBhcGkuYXNzZXJ0KGlkICYmIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycKICAgICAgJiYgbG90dGVyeUFtb3VudCAmJiB0eXBlb2YgbG90dGVyeUFtb3VudCA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIobG90dGVyeUFtb3VudCkuaXNOYU4oKSAmJiBhcGkuQmlnTnVtYmVyKGxvdHRlcnlBbW91bnQpLmd0KDApLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgaWYgKGFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihsb3R0ZXJ5V2lubmVycykgJiYgbG90dGVyeVdpbm5lcnMgPj0gMSAmJiBsb3R0ZXJ5V2lubmVycyA8PSAyMCwgJ2ludmFsaWQgbG90dGVyeVdpbm5lcnM6IGludGVnZXIgYmV0d2VlbiAxIGFuZCAyMCBvbmx5JykKICAgICAgJiYgYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKGxvdHRlcnlJbnRlcnZhbEhvdXJzKSAmJiBsb3R0ZXJ5SW50ZXJ2YWxIb3VycyA+PSAxICYmIGxvdHRlcnlJbnRlcnZhbEhvdXJzIDw9IDcyMCwgJ2ludmFsaWQgbG90dGVyeUludGVydmFsSG91cnM6IGludGVnZXIgYmV0d2VlbiAxIGFuZCA3MjAgb25seScpKSB7CiAgICAgIGNvbnN0IHBvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncG9vbHMnLCB7IGlkIH0pOwogICAgICBpZiAoYXBpLmFzc2VydChwb29sLCAncG9vbCBpZCBub3QgZm91bmQnKSkgewogICAgICAgIGNvbnN0IG1pbmVkVG9rZW5PYmplY3QgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbDogcG9vbC5taW5lZFRva2VuIH0pOwogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKICAgICAgICBpZiAoYXBpLmFzc2VydChtaW5lZFRva2VuT2JqZWN0ICYmIChtaW5lZFRva2VuT2JqZWN0Lmlzc3VlciA9PT0gYXBpLnNlbmRlciB8fCAobWluZWRUb2tlbk9iamVjdC5zeW1ib2wgPT09ICJCRUUiICYmIGFwaS5zZW5kZXIgPT09IGFwaS5vd25lcikpLCAnbXVzdCBiZSBpc3N1ZXIgb2YgbWluZWRUb2tlbicpCiAgICAgICAgICAmJiBhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIobG90dGVyeUFtb3VudCkuZHAoKSA8PSBtaW5lZFRva2VuT2JqZWN0LnByZWNpc2lvbiwgJ21pbmVkVG9rZW4gcHJlY2lzaW9uIG1pc21hdGNoIGZvciBsb3R0ZXJ5QW1vdW50JykpIHsKICAgICAgICAgIGlmICghY2FsbGluZ0NvbnRyYWN0SW5mbykgewogICAgICAgICAgICBjb25zdCB2YWxpZE1pbmVyc0NoYW5nZSA9IGF3YWl0IHZhbGlkYXRlVG9rZW5NaW5lcnNDaGFuZ2UoCiAgICAgICAgICAgICAgcG9vbC50b2tlbk1pbmVycywgdG9rZW5NaW5lcnMsIHBvb2wubmZ0VG9rZW5NaW5lciwgbmZ0VG9rZW5NaW5lciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHZhbGlkTWluZXJzQ2hhbmdlKSB7CiAgICAgICAgICAgICAgcG9vbC5sb3R0ZXJ5V2lubmVycyA9IGxvdHRlcnlXaW5uZXJzOwogICAgICAgICAgICAgIHBvb2wubG90dGVyeUludGVydmFsSG91cnMgPSBsb3R0ZXJ5SW50ZXJ2YWxIb3VyczsKICAgICAgICAgICAgICBwb29sLmxvdHRlcnlBbW91bnQgPSBsb3R0ZXJ5QW1vdW50OwogICAgICAgICAgICAgIHBvb2wudG9rZW5NaW5lcnMgPSB0b2tlbk1pbmVyczsKICAgICAgICAgICAgICBwb29sLm5mdFRva2VuTWluZXIgPSBuZnRUb2tlbk1pbmVyOwoKICAgICAgICAgICAgICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CgogICAgICAgICAgICAgIGlmICh2YWxpZE1pbmVyc0NoYW5nZS5jaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICBwb29sLnVwZGF0aW5nLnVwZGF0ZVBvb2xUaW1lc3RhbXAgPSBhcGkuQmlnTnVtYmVyKGJsb2NrRGF0ZS5nZXRUaW1lKCkpLnRvTnVtYmVyKCk7CiAgICAgICAgICAgICAgICBwb29sLnVwZGF0aW5nLmluUHJvZ3Jlc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgcG9vbC51cGRhdGluZy50b2tlbkluZGV4ID0gMDsKICAgICAgICAgICAgICAgIHBvb2wudXBkYXRpbmcubmZ0VG9rZW5JbmRleCA9IDA7CiAgICAgICAgICAgICAgICBwb29sLnVwZGF0aW5nLmxhc3RJZCA9IDA7CiAgICAgICAgICAgICAgICBwb29sLnRvdGFsUG93ZXIgPSAnMCc7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBwb29sLm5leHRMb3R0ZXJ5VGltZXN0YW1wID0gYXBpLkJpZ051bWJlcihibG9ja0RhdGUuZ2V0VGltZSgpKQogICAgICAgICAgICAgICAgLnBsdXMobG90dGVyeUludGVydmFsSG91cnMgKiAzNjAwICogMTAwMCkudG9OdW1iZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcG9vbC5sb3R0ZXJ5V2lubmVycyA9IGxvdHRlcnlXaW5uZXJzOwogICAgICAgICAgICBwb29sLmxvdHRlcnlJbnRlcnZhbEhvdXJzID0gbG90dGVyeUludGVydmFsSG91cnM7CiAgICAgICAgICAgIHBvb2wubG90dGVyeUFtb3VudCA9IGxvdHRlcnlBbW91bnQ7CiAgICAgICAgICB9CiAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwb29scycsIHBvb2wpOwoKICAgICAgICAgIC8vIGJ1cm4gdGhlIHRva2VuIGNyZWF0aW9uIGZlZXMKICAgICAgICAgIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIgJiYgYXBpLkJpZ051bWJlcihwb29sVXBkYXRlRmVlKS5ndCgwKSkgewogICAgICAgICAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICd0cmFuc2ZlcicsIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCiAgICAgICAgICAgICAgdG86ICdudWxsJywgc3ltYm9sOiAiQkVFIiwgcXVhbnRpdHk6IHBvb2xVcGRhdGVGZWUsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5jaGFuZ2VOZnRQcm9wZXJ0eSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgaWQsIHR5cGUsIHByb3BlcnR5TmFtZSwgY2hhbmdlQW1vdW50LAogICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoIWFwaS5hc3NlcnQoaWQgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJwogICAgICAmJiB0eXBlICYmIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJwogICAgICAmJiBwcm9wZXJ0eU5hbWUgJiYgdHlwZW9mIHByb3BlcnR5TmFtZSA9PT0gJ3N0cmluZycKICAgICAgJiYgY2hhbmdlQW1vdW50ICYmIHR5cGVvZiBjaGFuZ2VBbW91bnQgPT09ICdzdHJpbmcnCiAgICAgICYmICFhcGkuQmlnTnVtYmVyKGNoYW5nZUFtb3VudCkuaXNOYU4oKQogICAgICAmJiBhcGkuQmlnTnVtYmVyKGNoYW5nZUFtb3VudCkuaXNGaW5pdGUoKSwgJ2ludmFsaWQgcGFyYW1zJykpIHJldHVybjsKICBpZiAoIWFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykpIHJldHVybjsKCiAgY29uc3QgcG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwb29scycsIHsgaWQgfSk7CiAgaWYgKCFhcGkuYXNzZXJ0KHBvb2wsICdwb29sIGlkIG5vdCBmb3VuZCcpKSByZXR1cm47CgogIGNvbnN0IHByb3BlcnR5SW5kZXggPSBwb29sLm5mdFRva2VuTWluZXIucHJvcGVydGllcy5maW5kSW5kZXgocCA9PiBwLm5hbWUgPT09IHByb3BlcnR5TmFtZSk7CiAgY29uc3QgcHJvcGVydHkgPSBwb29sLm5mdFRva2VuTWluZXIucHJvcGVydGllc1twcm9wZXJ0eUluZGV4XTsKICBpZiAoIWFwaS5hc3NlcnQocHJvcGVydHkgJiYgcHJvcGVydHkuYnVybkNoYW5nZSwgJ3Byb3BlcnR5IG5vdCBlbmFibGVkIGZvciBidXJuIGNoYW5nZScpKSByZXR1cm47CgogIGNvbnN0IHR5cGVQcm9wZXJ0aWVzID0gcG9vbC5uZnRUb2tlbk1pbmVyLnR5cGVNYXBbdHlwZV07CiAgaWYgKCFhcGkuYXNzZXJ0KHR5cGVQcm9wZXJ0aWVzLCAndHlwZSBub3QgZm91bmQnKSkgcmV0dXJuOwoKICBjb25zdCBidXJuU3ltYm9sID0gcHJvcGVydHkuYnVybkNoYW5nZS5zeW1ib2w7CiAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbDogYnVyblN5bWJvbCB9KTsKCiAgY29uc3QgZmVlID0gYXBpLkJpZ051bWJlcihjaGFuZ2VBbW91bnQpLmFicygpLm11bHRpcGxpZWRCeShwcm9wZXJ0eS5idXJuQ2hhbmdlLnF1YW50aXR5KTsKCiAgaWYgKCFhcGkuYXNzZXJ0KGZlZS5kcCgpIDw9IHRva2VuLnByZWNpc2lvbiwgYGZlZSBwcmVjaXNpb24gbWlzbWF0Y2ggZm9yIGFtb3VudCAke2ZlZX1gKSkgcmV0dXJuOwoKICBjb25zdCBiYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAnYmFsYW5jZXMnLCB7IGFjY291bnQ6IGFwaS5zZW5kZXIsIHN5bWJvbDogYnVyblN5bWJvbCB9KTsKICBjb25zdCBhdXRob3JpemVkID0gYXBpLkJpZ051bWJlcihmZWUpLmx0ZSgwKQogICAgICAgIHx8IChiYWxhbmNlICYmIGFwaS5CaWdOdW1iZXIoYmFsYW5jZS5iYWxhbmNlKS5ndGUoZmVlKSk7CgogIGlmICghYXBpLmFzc2VydChhdXRob3JpemVkLCBgeW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSB1cGRhdGUgZmVlIG9mICR7ZmVlfSAke2J1cm5TeW1ib2x9YCkpIHJldHVybjsKCiAgdHlwZVByb3BlcnRpZXNbcHJvcGVydHlJbmRleF0gPSBhcGkuQmlnTnVtYmVyKHR5cGVQcm9wZXJ0aWVzW3Byb3BlcnR5SW5kZXhdKS5wbHVzKGNoYW5nZUFtb3VudCk7CgogIGlmICghdmFsaWRhdGVOZnRUeXBlTWFwKHBvb2wubmZ0VG9rZW5NaW5lci50eXBlTWFwLCBwb29sLm5mdFRva2VuTWluZXIucHJvcGVydGllcykpIHJldHVybjsKCiAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIHBvb2wudXBkYXRpbmcudXBkYXRlUG9vbFRpbWVzdGFtcCA9IGFwaS5CaWdOdW1iZXIoYmxvY2tEYXRlLmdldFRpbWUoKSkudG9OdW1iZXIoKTsKICBwb29sLnVwZGF0aW5nLmluUHJvZ3Jlc3MgPSB0cnVlOwogIHBvb2wudXBkYXRpbmcudG9rZW5JbmRleCA9IDA7CiAgcG9vbC51cGRhdGluZy5uZnRUb2tlbkluZGV4ID0gMDsKICBwb29sLnVwZGF0aW5nLmxhc3RJZCA9IDA7CiAgcG9vbC50b3RhbFBvd2VyID0gJzAnOwoKICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwb29scycsIHBvb2wpOwoKICAvLyBidXJuIHRoZSB0b2tlbiBjcmVhdGlvbiBmZWVzCiAgaWYgKGFwaS5CaWdOdW1iZXIoZmVlKS5ndCgwKSkgewogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbnMnLCAndHJhbnNmZXInLCB7CiAgICAgIHRvOiAnbnVsbCcsIHN5bWJvbDogYnVyblN5bWJvbCwgcXVhbnRpdHk6IGZlZSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CiAgfQp9OwoKZnVuY3Rpb24gZ2VuZXJhdGVQb29sSWQocG9vbCkgewogIGNvbnN0IHRva2VuTWluZXJTdHJpbmcgPSBwb29sLmV4dGVybmFsQ29udHJhY3QgJiYgcG9vbC5leHRlcm5hbE1pbmVycwogICAgPyBgRVhULSR7cG9vbC5leHRlcm5hbE1pbmVycy5yZXBsYWNlKCc6JywgJycpfWAKICAgIDogcG9vbC50b2tlbk1pbmVycy5tYXAodCA9PiB0LnN5bWJvbC5yZXBsYWNlKCcuJywgJy0nKSkuc29ydCgpLmpvaW4oJywnKTsKICBjb25zdCBuZnRUb2tlbk1pbmVyU3RyaW5nID0gcG9vbC5uZnRUb2tlbk1pbmVyID8gYDoke3Bvb2wubmZ0VG9rZW5NaW5lci5zeW1ib2x9YCA6ICcnOwogIHJldHVybiBgJHtwb29sLm1pbmVkVG9rZW4ucmVwbGFjZSgnLicsICctJyl9OiR7dG9rZW5NaW5lclN0cmluZ30ke25mdFRva2VuTWluZXJTdHJpbmd9YDsKfQoKYWN0aW9ucy5jcmVhdGVQb29sID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBsb3R0ZXJ5V2lubmVycywgbG90dGVyeUludGVydmFsSG91cnMsIGxvdHRlcnlBbW91bnQsIG1pbmVkVG9rZW4sIHRva2VuTWluZXJzLCBuZnRUb2tlbk1pbmVyLAogICAgZXh0ZXJuYWxNaW5lcnMsIGNhbGxpbmdDb250cmFjdEluZm8sIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgLy8gZ2V0IGNvbnRyYWN0IHBhcmFtcwogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyBwb29sQ3JlYXRpb25GZWUgfSA9IHBhcmFtczsKCiAgaWYgKGV4dGVybmFsTWluZXJzICE9PSB1bmRlZmluZWQpIHsKICAgIGlmICghYXBpLmFzc2VydCh0eXBlb2YgZXh0ZXJuYWxNaW5lcnMgPT09ICdzdHJpbmcnLCAnZXh0ZXJuYWxNaW5lcnMgbXVzdCBiZSBhIHN0cmluZycpCiAgICB8fCAhYXBpLmFzc2VydChjYWxsaW5nQ29udHJhY3RJbmZvLCAnbXVzdCBiZSBjYWxsZWQgZnJvbSBhIGNvbnRyYWN0JykpIHJldHVybjsKICB9CgogIC8vIGdldCBhcGkuc2VuZGVyJ3MgVVRJTElUWV9UT0tFTl9TWU1CT0wgYmFsYW5jZQogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKICBjb25zdCB1dGlsaXR5VG9rZW5CYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAnYmFsYW5jZXMnLCB7IGFjY291bnQ6IGFwaS5zZW5kZXIsIHN5bWJvbDogIkJFRSIgfSk7CgogIGNvbnN0IGF1dGhvcml6ZWRDcmVhdGlvbiA9IGFwaS5CaWdOdW1iZXIocG9vbENyZWF0aW9uRmVlKS5sdGUoMCkgfHwgYXBpLnNlbmRlciA9PT0gYXBpLm93bmVyCiAgICA/IHRydWUKICAgIDogdXRpbGl0eVRva2VuQmFsYW5jZSAmJiBhcGkuQmlnTnVtYmVyKHV0aWxpdHlUb2tlbkJhbGFuY2UuYmFsYW5jZSkuZ3RlKHBvb2xDcmVhdGlvbkZlZSk7CgogIGlmIChhcGkuYXNzZXJ0KGF1dGhvcml6ZWRDcmVhdGlvbiwgJ3lvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciB0aGUgY3JlYXRpb24gZmVlJykKICAgICAgJiYgYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgICAmJiBhcGkuYXNzZXJ0KG1pbmVkVG9rZW4gJiYgdHlwZW9mIG1pbmVkVG9rZW4gPT09ICdzdHJpbmcnCiAgICAgICAgJiYgbG90dGVyeUFtb3VudCAmJiB0eXBlb2YgbG90dGVyeUFtb3VudCA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIobG90dGVyeUFtb3VudCkuaXNOYU4oKSAmJiBhcGkuQmlnTnVtYmVyKGxvdHRlcnlBbW91bnQpLmd0KDApLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgaWYgKGFwaS5hc3NlcnQobWluZWRUb2tlbi5sZW5ndGggPiAwICYmIG1pbmVkVG9rZW4ubGVuZ3RoIDw9IDEwLCAnaW52YWxpZCBzeW1ib2w6IHVwcGVyY2FzZSBsZXR0ZXJzIG9ubHksIG1heCBsZW5ndGggb2YgMTAnKQogICAgICAmJiBhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobG90dGVyeVdpbm5lcnMpICYmIGxvdHRlcnlXaW5uZXJzID49IDEgJiYgbG90dGVyeVdpbm5lcnMgPD0gMjAsICdpbnZhbGlkIGxvdHRlcnlXaW5uZXJzOiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMjAgb25seScpCiAgICAgICYmIGFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihsb3R0ZXJ5SW50ZXJ2YWxIb3VycykgJiYgbG90dGVyeUludGVydmFsSG91cnMgPj0gMSAmJiBsb3R0ZXJ5SW50ZXJ2YWxIb3VycyA8PSA3MjAsICdpbnZhbGlkIGxvdHRlcnlJbnRlcnZhbEhvdXJzOiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgNzIwIG9ubHknKQogICAgKSB7CiAgICAgIGNvbnN0IG1pbmVkVG9rZW5PYmplY3QgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICd0b2tlbnMnLCB7IHN5bWJvbDogbWluZWRUb2tlbiB9KTsKCiAgICAgIGlmIChhcGkuYXNzZXJ0KG1pbmVkVG9rZW5PYmplY3QsICdtaW5lZFRva2VuIGRvZXMgbm90IGV4aXN0JykKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCiAgICAgICAgJiYgYXBpLmFzc2VydChtaW5lZFRva2VuT2JqZWN0Lmlzc3VlciA9PT0gYXBpLnNlbmRlciB8fCAobWluZWRUb2tlbk9iamVjdC5zeW1ib2wgPT09ICJCRUUiICYmIGFwaS5zZW5kZXIgPT09IGFwaS5vd25lciksICdtdXN0IGJlIGlzc3VlciBvZiBtaW5lZFRva2VuJykKICAgICAgICAmJiBhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIobG90dGVyeUFtb3VudCkuZHAoKSA8PSBtaW5lZFRva2VuT2JqZWN0LnByZWNpc2lvbiwgJ21pbmVkVG9rZW4gcHJlY2lzaW9uIG1pc21hdGNoIGZvciBsb3R0ZXJ5QW1vdW50JykpIHsKICAgICAgICBpZiAoY2FsbGluZ0NvbnRyYWN0SW5mbyB8fCBhd2FpdCB2YWxpZGF0ZVRva2VuTWluZXJzKHRva2VuTWluZXJzLCBuZnRUb2tlbk1pbmVyKSkgewogICAgICAgICAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogICAgICAgICAgY29uc3QgbmV3UG9vbCA9IHsKICAgICAgICAgICAgbWluZWRUb2tlbiwKICAgICAgICAgICAgbG90dGVyeVdpbm5lcnMsCiAgICAgICAgICAgIGxvdHRlcnlJbnRlcnZhbEhvdXJzLAogICAgICAgICAgICBsb3R0ZXJ5QW1vdW50LAogICAgICAgICAgICB0b2tlbk1pbmVyczogdG9rZW5NaW5lcnMgfHwgW10sCiAgICAgICAgICAgIG5mdFRva2VuTWluZXIsCiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsCiAgICAgICAgICAgIG5leHRMb3R0ZXJ5VGltZXN0YW1wOiBhcGkuQmlnTnVtYmVyKGJsb2NrRGF0ZS5nZXRUaW1lKCkpCiAgICAgICAgICAgICAgLnBsdXMobG90dGVyeUludGVydmFsSG91cnMgKiAzNjAwICogMTAwMCkudG9OdW1iZXIoKSwKICAgICAgICAgICAgdG90YWxQb3dlcjogJzAnLAogICAgICAgICAgfTsKICAgICAgICAgIGlmIChjYWxsaW5nQ29udHJhY3RJbmZvKSB7CiAgICAgICAgICAgIGlmICghYXBpLmFzc2VydCghbmZ0VG9rZW5NaW5lciwgJ2V4dGVybmFsIG5mdFRva2VuTWluZXIgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQnKSkgcmV0dXJuOwogICAgICAgICAgICBuZXdQb29sLmV4dGVybmFsQ29udHJhY3QgPSBjYWxsaW5nQ29udHJhY3RJbmZvLm5hbWU7CiAgICAgICAgICAgIG5ld1Bvb2wuZXh0ZXJuYWxNaW5lcnMgPSBleHRlcm5hbE1pbmVyczsKICAgICAgICAgIH0KICAgICAgICAgIG5ld1Bvb2wuaWQgPSBnZW5lcmF0ZVBvb2xJZChuZXdQb29sKTsKCiAgICAgICAgICBjb25zdCBleGlzdGluZ1Bvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncG9vbHMnLCB7IGlkOiBuZXdQb29sLmlkIH0pOwogICAgICAgICAgaWYgKGFwaS5hc3NlcnQoIWV4aXN0aW5nUG9vbCwgJ3Bvb2wgYWxyZWFkeSBleGlzdHMnKSkgewogICAgICAgICAgICBpZiAodG9rZW5NaW5lcnMpIHsKICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuTWluZXJzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbkNvbmZpZyA9IHRva2VuTWluZXJzW2ldOwogICAgICAgICAgICAgICAgYXdhaXQgYXBpLmRiLmluc2VydCgndG9rZW5Qb29scycsIHsgc3ltYm9sOiB0b2tlbkNvbmZpZy5zeW1ib2wsIGlkOiBuZXdQb29sLmlkIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBuZXdQb29sLnVwZGF0aW5nID0gewogICAgICAgICAgICAgIGluUHJvZ3Jlc3M6IHRydWUsCiAgICAgICAgICAgICAgdXBkYXRlUG9vbFRpbWVzdGFtcDogYXBpLkJpZ051bWJlcihibG9ja0RhdGUuZ2V0VGltZSgpKS50b051bWJlcigpLAogICAgICAgICAgICAgIHRva2VuSW5kZXg6IDAsCiAgICAgICAgICAgICAgbmZ0VG9rZW5JbmRleDogMCwKICAgICAgICAgICAgICBsYXN0SWQ6IDAsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkUG9vbCA9IGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3Bvb2xzJywgbmV3UG9vbCk7CgogICAgICAgICAgICAvLyBidXJuIHRoZSB0b2tlbiBjcmVhdGlvbiBmZWVzCiAgICAgICAgICAgIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIgJiYgYXBpLkJpZ051bWJlcihwb29sQ3JlYXRpb25GZWUpLmd0KDApKSB7CiAgICAgICAgICAgICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbnMnLCAndHJhbnNmZXInLCB7CiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCiAgICAgICAgICAgICAgICB0bzogJ251bGwnLCBzeW1ib2w6ICJCRUUiLCBxdWFudGl0eTogcG9vbENyZWF0aW9uRmVlLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBpLmVtaXQoJ2NyZWF0ZVBvb2wnLCB7IGlkOiBpbnNlcnRlZFBvb2wuaWQgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKYXN5bmMgZnVuY3Rpb24gcnVuTG90dGVyeShwb29sLCBwYXJhbXMpIHsKICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CiAgY29uc3Qgd2lubmluZ051bWJlcnMgPSBbXTsKICBjb25zdCBtaW5lZFRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywKICAgIHsgc3ltYm9sOiBwb29sLm1pbmVkVG9rZW4gfSk7CiAgY29uc3Qgd2lubmluZ0Ftb3VudCA9IGFwaS5CaWdOdW1iZXIocG9vbC5sb3R0ZXJ5QW1vdW50KS5kaXZpZGVkQnkocG9vbC5sb3R0ZXJ5V2lubmVycykKICAgIC50b0ZpeGVkKG1pbmVkVG9rZW4ucHJlY2lzaW9uLCBhcGkuQmlnTnVtYmVyLlJPVU5EX0hBTEZfVVApOwogIC8vIGRldGVybWluZSB3aW5uaW5nIG51bWJlcnMKICBpZiAoIXBvb2wuZXh0ZXJuYWxDb250cmFjdCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb29sLmxvdHRlcnlXaW5uZXJzOyBpICs9IDEpIHsKICAgICAgd2lubmluZ051bWJlcnNbaV0gPSBhcGkuQmlnTnVtYmVyKHBvb2wudG90YWxQb3dlcikubXVsdGlwbGllZEJ5KGFwaS5yYW5kb20oKSk7CiAgICB9CiAgfSBlbHNlIGlmIChwb29sLmV4dGVybmFsQ29udHJhY3QgPT09ICdtYXJrZXRwb29scycpIHsKICAgIGNvbnN0IG1hcmtldHBvb2wgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ21hcmtldHBvb2xzJywgJ3Bvb2xzJywgeyB0b2tlblBhaXI6IHBvb2wuZXh0ZXJuYWxNaW5lcnMgfSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvb2wubG90dGVyeVdpbm5lcnM7IGkgKz0gMSkgewogICAgICB3aW5uaW5nTnVtYmVyc1tpXSA9IGFwaS5CaWdOdW1iZXIobWFya2V0cG9vbC50b3RhbFNoYXJlcykubXVsdGlwbGllZEJ5KGFwaS5yYW5kb20oKSk7CiAgICB9CiAgfQogIGxldCBvZmZzZXQgPSAwOwogIGxldCBtaW5pbmdQb3dlcnM7CiAgbGV0IGN1bXVsYXRpdmVQb3dlciA9IGFwaS5CaWdOdW1iZXIoMCk7CiAgbGV0IG5leHRDdW11bGF0aXZlUG93ZXIgPSBhcGkuQmlnTnVtYmVyKDApOwogIGxldCBjb21wdXRlZFdpbm5lcnMgPSAwOwogIGNvbnN0IHdpbm5lcnMgPSBbXTsKICB3aGlsZSAoY29tcHV0ZWRXaW5uZXJzIDwgcG9vbC5sb3R0ZXJ5V2lubmVycykgewogICAgaWYgKCFwb29sLmV4dGVybmFsQ29udHJhY3QpIHsKICAgICAgbWluaW5nUG93ZXJzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ21pbmluZ1Bvd2VyJywgeyBpZDogcG9vbC5pZCwgcG93ZXI6IHsgJGd0OiB7ICRudW1iZXJEZWNpbWFsOiAnMCcgfSB9IH0sCiAgICAgICAgcGFyYW1zLnByb2Nlc3NRdWVyeUxpbWl0LAogICAgICAgIG9mZnNldCwKICAgICAgICBbeyBpbmRleDogJ3Bvd2VyJywgZGVzY2VuZGluZzogdHJ1ZSB9LCB7IGluZGV4OiAnX2lkJywgZGVzY2VuZGluZzogZmFsc2UgfV0pOwogICAgfSBlbHNlIGlmIChwb29sLmV4dGVybmFsQ29udHJhY3QgPT09ICdtYXJrZXRwb29scycpIHsKICAgICAgbWluaW5nUG93ZXJzID0gYXdhaXQgYXBpLmRiLmZpbmRJblRhYmxlKCdtYXJrZXRwb29scycsICdsaXF1aWRpdHlQb3NpdGlvbnMnLCB7IHRva2VuUGFpcjogcG9vbC5leHRlcm5hbE1pbmVycyB9LAogICAgICAgIHBhcmFtcy5wcm9jZXNzUXVlcnlMaW1pdCwKICAgICAgICBvZmZzZXQsCiAgICAgICAgW3sgaW5kZXg6ICdfaWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWluaW5nUG93ZXJzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgbWluaW5nUG93ZXJzW2ldLnBvd2VyID0gewogICAgICAgICAgJG51bWJlckRlY2ltYWw6IGFwaS5CaWdOdW1iZXIobWluaW5nUG93ZXJzW2ldLnNoYXJlcykKICAgICAgICAgICAgLnRvRml4ZWQobWluZWRUb2tlbi5wcmVjaXNpb24sIGFwaS5CaWdOdW1iZXIuUk9VTkRfSEFMRl9VUCksCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaW5pbmdQb3dlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgY29uc3QgbWluaW5nUG93ZXIgPSBtaW5pbmdQb3dlcnNbaV07CiAgICAgIG5leHRDdW11bGF0aXZlUG93ZXIgPSBjdW11bGF0aXZlUG93ZXIucGx1cyhtaW5pbmdQb3dlci5wb3dlci4kbnVtYmVyRGVjaW1hbCk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcG9vbC5sb3R0ZXJ5V2lubmVyczsgaiArPSAxKSB7CiAgICAgICAgY29uc3QgY3VycmVudFdpbm5pbmdOdW1iZXIgPSB3aW5uaW5nTnVtYmVyc1tqXTsKICAgICAgICBpZiAoY3VtdWxhdGl2ZVBvd2VyLmx0ZShjdXJyZW50V2lubmluZ051bWJlcikKICAgICAgICAgICAgJiYgbmV4dEN1bXVsYXRpdmVQb3dlci5ndChjdXJyZW50V2lubmluZ051bWJlcikpIHsKICAgICAgICAgIGNvbXB1dGVkV2lubmVycyArPSAxOwogICAgICAgICAgd2lubmVycy5wdXNoKHsKICAgICAgICAgICAgd2lubmVyOiBtaW5pbmdQb3dlci5hY2NvdW50LAogICAgICAgICAgICB3aW5uaW5nTnVtYmVyOiBjdXJyZW50V2lubmluZ051bWJlciwKICAgICAgICAgICAgd2lubmluZ0Ftb3VudCwKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBjdW11bGF0aXZlUG93ZXIgPSBuZXh0Q3VtdWxhdGl2ZVBvd2VyOwogICAgfQogICAgaWYgKGNvbXB1dGVkV2lubmVycyA9PT0gcG9vbC5sb3R0ZXJ5V2lubmVycyB8fCBtaW5pbmdQb3dlcnMubGVuZ3RoIDwgcGFyYW1zLnByb2Nlc3NRdWVyeUxpbWl0KSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgb2Zmc2V0ICs9IHBhcmFtcy5wcm9jZXNzUXVlcnlMaW1pdDsKICB9CiAgYXBpLmVtaXQoJ21pbmluZ0xvdHRlcnknLCB7IHBvb2xJZDogcG9vbC5pZCwgd2lubmVycyB9KTsKICBmb3IgKGxldCBpID0gMDsgaSA8IHdpbm5lcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGNvbnN0IHdpbm5lciA9IHdpbm5lcnNbaV07CiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICdpc3N1ZScsCiAgICAgIHsgdG86IHdpbm5lci53aW5uZXIsIHN5bWJvbDogbWluZWRUb2tlbi5zeW1ib2wsIHF1YW50aXR5OiB3aW5uaW5nQW1vdW50IH0pOwogIH0KICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24KICBwb29sLm5leHRMb3R0ZXJ5VGltZXN0YW1wID0gYXBpLkJpZ051bWJlcihibG9ja0RhdGUuZ2V0VGltZSgpKQogICAgLnBsdXMocG9vbC5sb3R0ZXJ5SW50ZXJ2YWxIb3VycyAqIDM2MDAgKiAxMDAwKS50b051bWJlcigpOwogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Bvb2xzJywgcG9vbCk7Cn0KCmFjdGlvbnMuY2hlY2tQZW5kaW5nTG90dGVyaWVzID0gYXN5bmMgKCkgPT4gewogIGlmIChhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09ICdudWxsJywgJ25vdCBhdXRob3JpemVkJykpIHsKICAgIGNvbnN0IGJsb2NrRGF0ZSA9IG5ldyBEYXRlKGAke2FwaS5oaXZlQmxvY2tUaW1lc3RhbXB9LjAwMFpgKTsKICAgIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CgogICAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICAgIGNvbnN0IHVwZGF0aW5nTG90dGVyaWVzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Bvb2xzJywKICAgICAgewogICAgICAgICd1cGRhdGluZy5pblByb2dyZXNzJzogdHJ1ZSwKICAgICAgfSwKICAgICAgcGFyYW1zLm1heExvdHRlcmllc1BlckJsb2NrLAogICAgICAwLAogICAgICBbeyBpbmRleDogJ2lkJywgZGVzY2VuZGluZzogZmFsc2UgfV0pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGluZ0xvdHRlcmllcy5sZW5ndGg7IGkgKz0gMSkgewogICAgICBjb25zdCBwb29sID0gdXBkYXRpbmdMb3R0ZXJpZXNbaV07CiAgICAgIGF3YWl0IHJlc3VtZVBvd2VyVXBkYXRlKHBvb2wsIHBhcmFtcyk7CiAgICB9CiAgICBjb25zdCBwZW5kaW5nTG90dGVyaWVzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3Bvb2xzJywKICAgICAgewogICAgICAgIGFjdGl2ZTogdHJ1ZSwKICAgICAgICAndXBkYXRpbmcuaW5Qcm9ncmVzcyc6IGZhbHNlLAogICAgICAgIG5leHRMb3R0ZXJ5VGltZXN0YW1wOiB7CiAgICAgICAgICAkbHRlOiB0aW1lc3RhbXAsCiAgICAgICAgfSwKICAgICAgfSwKICAgICAgcGFyYW1zLm1heExvdHRlcmllc1BlckJsb2NrLAogICAgICAwLAogICAgICBbeyBpbmRleDogJ2lkJywgZGVzY2VuZGluZzogZmFsc2UgfV0pOwoKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZ0xvdHRlcmllcy5sZW5ndGg7IGkgKz0gMSkgewogICAgICBjb25zdCBwb29sID0gcGVuZGluZ0xvdHRlcmllc1tpXTsKICAgICAgYXdhaXQgcnVuTG90dGVyeShwb29sLCBwYXJhbXMpOwogICAgfQogIH0KfTsKCmFjdGlvbnMuaGFuZGxlU3Rha2VDaGFuZ2UgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIGFjY291bnQsIHN5bWJvbCwgcXVhbnRpdHksIGRlbGVnYXRlZCwgY2FsbGluZ0NvbnRyYWN0SW5mbywKICB9ID0gcGF5bG9hZDsKICBpZiAoYXBpLmFzc2VydChjYWxsaW5nQ29udHJhY3RJbmZvICYmIGNhbGxpbmdDb250cmFjdEluZm8ubmFtZSA9PT0gJ3Rva2VucycsCiAgICAnbXVzdCBiZSBjYWxsZWQgZnJvbSB0b2tlbnMgY29udHJhY3QnKSkgewogICAgYXdhaXQgZmluZEFuZFByb2Nlc3NBbGwoJ21pbmluZycsICd0b2tlblBvb2xzJywgeyBzeW1ib2wgfSwgYXN5bmMgKHRva2VuUG9vbCkgPT4gewogICAgICBjb25zdCBwb29sID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Bvb2xzJywgeyBpZDogdG9rZW5Qb29sLmlkIH0pOwogICAgICBsZXQgYWRqdXN0ZWQ7CiAgICAgIGlmIChkZWxlZ2F0ZWQpIHsKICAgICAgICBhZGp1c3RlZCA9IGF3YWl0IHVwZGF0ZU1pbmluZ1Bvd2VyKHBvb2wsIHN5bWJvbCwgYWNjb3VudCwgMCwgcXVhbnRpdHkpOwogICAgICB9IGVsc2UgewogICAgICAgIGFkanVzdGVkID0gYXdhaXQgdXBkYXRlTWluaW5nUG93ZXIocG9vbCwgc3ltYm9sLCBhY2NvdW50LCBxdWFudGl0eSwgMCk7CiAgICAgIH0KICAgICAgcG9vbC50b3RhbFBvd2VyID0gYWRqdXN0ZWQucGx1cyhwb29sLnRvdGFsUG93ZXIpOwogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwb29scycsIHBvb2wpOwogICAgfSk7CiAgfQp9OwoKYWN0aW9ucy5oYW5kbGVOZnRDaGFuZ2UgPSBhc3luYyAoKSA9PiB7fTsKCmFjdGlvbnMuaGFuZGxlTmZ0RGVsZWdhdGlvbkNoYW5nZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgc3ltYm9sLCBuZnQsIGFkZCwgY2FsbGluZ0NvbnRyYWN0SW5mbywKICB9ID0gcGF5bG9hZDsKICBpZiAoYXBpLmFzc2VydChjYWxsaW5nQ29udHJhY3RJbmZvICYmIGNhbGxpbmdDb250cmFjdEluZm8ubmFtZSA9PT0gJ25mdCcsCiAgICAnbXVzdCBiZSBjYWxsZWQgZnJvbSBuZnQgY29udHJhY3QnKSkgewogICAgYXdhaXQgZmluZEFuZFByb2Nlc3NBbGwoJ21pbmluZycsICduZnRUb2tlblBvb2xzJywgeyBzeW1ib2wgfSwgYXN5bmMgKHRva2VuUG9vbCkgPT4gewogICAgICBjb25zdCBwb29sID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Bvb2xzJywgeyBpZDogdG9rZW5Qb29sLmlkIH0pOwogICAgICBpZiAocG9vbC51cGRhdGluZy5pblByb2dyZXNzCiAgICAgICAgICAmJiBwb29sLnVwZGF0aW5nLnRva2VuSW5kZXggPT09IHBvb2wudG9rZW5NaW5lcnMubGVuZ3RoCiAgICAgICAgICAmJiBwb29sLnVwZGF0aW5nLmxhc3RJZCA8IG5mdC5faWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFwb29sLmFjdGl2ZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIXBvb2wubmZ0VG9rZW5NaW5lcikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCB7CiAgICAgICAgZXF1aXBGaWVsZCwgdHlwZUZpZWxkLCB0eXBlTWFwLCBtaW5pbmdQb3dlckZpZWxkLAogICAgICB9ID0gcG9vbC5uZnRUb2tlbk1pbmVyOwogICAgICBpZiAoZXF1aXBGaWVsZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgdHlwZVByb3BlcnRpZXMgPSB0eXBlTWFwWwogICAgICAgIG5mdC5wcm9wZXJ0aWVzW3R5cGVGaWVsZF1dOwogICAgICBpZiAodHlwZVByb3BlcnRpZXMgfHwgbWluaW5nUG93ZXJGaWVsZCkgewogICAgICAgIGNvbnN0IGFkanVzdGVkID0gYXdhaXQgdXBkYXRlTmZ0TWluaW5nUG93ZXIoCiAgICAgICAgICBwb29sLAogICAgICAgICAgbmZ0LAogICAgICAgICAgYWRkLAogICAgICAgICAgcG9vbC51cGRhdGluZy51cGRhdGVQb29sVGltZXN0YW1wLAogICAgICAgICk7CiAgICAgICAgcG9vbC50b3RhbFBvd2VyID0gYWRqdXN0ZWQucGx1cyhwb29sLnRvdGFsUG93ZXIpOwogICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Bvb2xzJywgcG9vbCk7CiAgICAgIH0KICAgIH0pOwogIH0KfTsKCmFjdGlvbnMuaGFuZGxlTmZ0U2V0UHJvcGVydHkgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHN5bWJvbCwgbmZ0LCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBjYWxsaW5nQ29udHJhY3RJbmZvLAogIH0gPSBwYXlsb2FkOwogIGlmIChhcGkuYXNzZXJ0KGNhbGxpbmdDb250cmFjdEluZm8gJiYgY2FsbGluZ0NvbnRyYWN0SW5mby5uYW1lID09PSAnbmZ0JywKICAgICdtdXN0IGJlIGNhbGxlZCBmcm9tIG5mdCBjb250cmFjdCcpKSB7CiAgICBjb25zdCBuZXdWYWx1ZSA9IG5mdC5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07CiAgICBpZiAob2xkVmFsdWUgPT09IG5ld1ZhbHVlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGF3YWl0IGZpbmRBbmRQcm9jZXNzQWxsKCdtaW5pbmcnLCAnbmZ0VG9rZW5Qb29scycsIHsgc3ltYm9sIH0sIGFzeW5jICh0b2tlblBvb2wpID0+IHsKICAgICAgY29uc3QgcG9vbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwb29scycsIHsgaWQ6IHRva2VuUG9vbC5pZCB9KTsKICAgICAgaWYgKHBvb2wudXBkYXRpbmcuaW5Qcm9ncmVzcwogICAgICAgICAgJiYgcG9vbC51cGRhdGluZy50b2tlbkluZGV4ID09PSBwb29sLnRva2VuTWluZXJzLmxlbmd0aAogICAgICAgICAgJiYgcG9vbC51cGRhdGluZy5sYXN0SWQgPCBuZnQuX2lkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghcG9vbC5hY3RpdmUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFwb29sLm5mdFRva2VuTWluZXIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgeyBlcXVpcEZpZWxkLCBtaW5pbmdQb3dlckZpZWxkIH0gPSBwb29sLm5mdFRva2VuTWluZXI7CiAgICAgIGlmIChlcXVpcEZpZWxkICYmIHByb3BlcnR5TmFtZSA9PT0gZXF1aXBGaWVsZCkgewogICAgICAgIGlmIChvbGRWYWx1ZSAmJiBhcGkuaXNWYWxpZEFjY291bnROYW1lKG9sZFZhbHVlKSkgewogICAgICAgICAgLy8gdW5lcXVpcCBmcm9tIHByZXZpb3VzIGFjY291bnQKICAgICAgICAgIGNvbnN0IGFkanVzdGVkID0gYXdhaXQgdXBkYXRlTmZ0TWluaW5nUG93ZXIoCiAgICAgICAgICAgIHBvb2wsCiAgICAgICAgICAgIG5mdCwKICAgICAgICAgICAgLyogYWRkPSAqLyBmYWxzZSwKICAgICAgICAgICAgcG9vbC51cGRhdGluZy51cGRhdGVQb29sVGltZXN0YW1wLAogICAgICAgICAgICAvKiBhY2NvdW50PSAqLyBvbGRWYWx1ZSwKICAgICAgICAgICk7CiAgICAgICAgICBwb29sLnRvdGFsUG93ZXIgPSBhZGp1c3RlZC5wbHVzKHBvb2wudG90YWxQb3dlcik7CiAgICAgICAgfQogICAgICAgIGlmIChuZXdWYWx1ZSAmJiBhcGkuaXNWYWxpZEFjY291bnROYW1lKG5ld1ZhbHVlKSkgewogICAgICAgICAgLy8gZXF1aXAgdG8gYWNjb3VudAogICAgICAgICAgY29uc3QgYWRqdXN0ZWQgPSBhd2FpdCB1cGRhdGVOZnRNaW5pbmdQb3dlcigKICAgICAgICAgICAgcG9vbCwKICAgICAgICAgICAgbmZ0LAogICAgICAgICAgICAvKiBhZGQ9ICovIHRydWUsCiAgICAgICAgICAgIHBvb2wudXBkYXRpbmcudXBkYXRlUG9vbFRpbWVzdGFtcCwKICAgICAgICAgICAgLyogYWNjb3VudD0gKi8gbmV3VmFsdWUsCiAgICAgICAgICApOwogICAgICAgICAgcG9vbC50b3RhbFBvd2VyID0gYWRqdXN0ZWQucGx1cyhwb29sLnRvdGFsUG93ZXIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChtaW5pbmdQb3dlckZpZWxkICYmIHByb3BlcnR5TmFtZSA9PT0gbWluaW5nUG93ZXJGaWVsZCkgewogICAgICAgIGlmICghZXF1aXBGaWVsZCB8fCBhcGkuaXNWYWxpZEFjY291bnROYW1lKG5mdC5wcm9wZXJ0aWVzW2VxdWlwRmllbGRdKSkgewogICAgICAgICAgY29uc3QgYWRqdXN0ZWQgPSBhd2FpdCB1cGRhdGVOZnRNaW5pbmdQb3dlckZyb21Qcm9wZXJ0eVVwZGF0ZSgKICAgICAgICAgICAgcG9vbCwKICAgICAgICAgICAgbmZ0LAogICAgICAgICAgICAvKiBhY2NvdW50PSAqLyBlcXVpcEZpZWxkID8gbmZ0LnByb3BlcnRpZXNbZXF1aXBGaWVsZF0gOiBudWxsLAogICAgICAgICAgKTsKICAgICAgICAgIHBvb2wudG90YWxQb3dlciA9IGFkanVzdGVkLnBsdXMocG9vbC50b3RhbFBvd2VyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncG9vbHMnLCBwb29sKTsKICAgIH0pOwogIH0KfTsK"}}}

{ "id": "ssc-testnet-hive", "json": { "contractName":"contract", "contractAction":"update", "contractPayload":{ "name": "nft", "params": "", "code": "Y29uc3QgQ09OVFJBQ1RfTkFNRT0ibmZ0IixVVElMSVRZX1RPS0VOX1NZTUJPTD0iQkVFIixNQVhfTlVNX0FVVEhPUklaRURfSVNTVUVSUz0xMCxNQVhfTlVNX0xPQ0tFRF9UT0tFTl9UWVBFUz0xMCxNQVhfU1lNQk9MX0xFTkdUSD0xMCxNQVhfREFUQV9QUk9QRVJUWV9MRU5HVEg9MTAwLE1BWF9OVU1fTkZUU19JU1NVQUJMRT0xMCxNQVhfTlVNX05GVFNfRURJVEFCTEU9NTAsTUFYX05VTV9ORlRTX09QRVJBQkxFPTUwLE1BWF9OVU1fQ09OVEFJTkVSX05GVFNfT1BFUkFCTEU9MSxSRVNFUlZFRF9TWU1CT0xTPXtDRUxMOiJiZWdnYXJzIixRVVNUOiJzaW1wbGVnYW1lIixURVNURVJBOiJhZ2dyb2VkIixTUVJMOiJzdHVmZmJ5c3BlbmNlciIsQ1JBRlQ6ImltbWFudWVsOTQiLE1VU0lDOiJhdG9tY29sbGVjdG9yIixDR1VMTDoiY2d1bGwiLE5GVDoiY2FkYXdnIixSQVJFOiJiZWdnYXJzIixMSUM6ImxpY3Rva2VuIixNRU1CRVI6Im1lbWJlcnRva2VuIixDT0ZGRUU6ImMwZmYzM2EiLEFSVDoiYnlvIixST0NLOiJiZWdnYXJzIixDUklUVEVSOiJjcnlwdG9tYW5jZXIiLENJVFk6ImdlcmJlciIsTU9OU1RFUlM6InNpbXBsZWdhbWUiLFNFVFM6Imxvb3RraXQuZ2FtZXMiLEFOSU1FOiJhbmltZXRva2VuIixQSE9UT0ZUOiJ3d3dpZWJlIixCRUVSOiJkZXRsZXYiLFNQSVI6InNwaW52ZXN0IixJRkc6Imxpb24yMDAiLEdVSUxEUzoic2ltcGxlZ2FtZSIsRkNBUkQ6Imxpb24yMDAiLFBYTDoicGl4ZWxuZnQiLENPVzoic3R1ZmZieXNwZW5jZXIiLExPT09UOiJzdHVmZmJ5c3BlbmNlciIsQVBJOiJzdGVlbWNpdHlhcGkiLFNQT1JUU01PTToic3BvcnRzdGVzdGVyIixTV1Q6InNhdHJlbiIsU1RBUjoiYXRvbWNvbGxlY3RvciJ9O2FjdGlvbnMuY3JlYXRlU1NDPWFzeW5jKCk9PntpZighMT09PWF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cygibmZ0cyIpKXthd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoIm5mdHMiLFsic3ltYm9sIl0pLGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgicGFyYW1zIiksYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIsWyJzeW1ib2wiLCJjb21wbGV0ZVRpbWVzdGFtcCJdKTtjb25zdCBwYXJhbXM9e25mdENyZWF0aW9uRmVlOiIxMDAiLG5mdElzc3VhbmNlRmVlOnsiQkVFIjoiMC4wMDEiLFBBTDoiMC4wMDEifSxkYXRhUHJvcGVydHlDcmVhdGlvbkZlZToiMTAwIixlbmFibGVEZWxlZ2F0aW9uRmVlOiIxMDAwIn07YXdhaXQgYXBpLmRiLmluc2VydCgicGFyYW1zIixwYXJhbXMpfX0sYWN0aW9ucy51cGRhdGVQYXJhbXM9YXN5bmMgZW5hYmxlRGVsZWdhdGlvbkZlZT0+e2lmKGFwaS5zZW5kZXI9PT1hcGkub3duZXIpe3ZhcntuZnRDcmVhdGlvbkZlZSxuZnRJc3N1YW5jZUZlZSxkYXRhUHJvcGVydHlDcmVhdGlvbkZlZSxlbmFibGVEZWxlZ2F0aW9uRmVlfT1lbmFibGVEZWxlZ2F0aW9uRmVlO2NvbnN0IHBhcmFtcz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSk7bmZ0Q3JlYXRpb25GZWUmJiJzdHJpbmciPT10eXBlb2YgbmZ0Q3JlYXRpb25GZWUmJiFhcGkuQmlnTnVtYmVyKG5mdENyZWF0aW9uRmVlKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKG5mdENyZWF0aW9uRmVlKS5ndGUoMCkmJihwYXJhbXMubmZ0Q3JlYXRpb25GZWU9bmZ0Q3JlYXRpb25GZWUpLG5mdElzc3VhbmNlRmVlJiYib2JqZWN0Ij09dHlwZW9mIG5mdElzc3VhbmNlRmVlJiYocGFyYW1zLm5mdElzc3VhbmNlRmVlPW5mdElzc3VhbmNlRmVlKSxkYXRhUHJvcGVydHlDcmVhdGlvbkZlZSYmInN0cmluZyI9PXR5cGVvZiBkYXRhUHJvcGVydHlDcmVhdGlvbkZlZSYmIWFwaS5CaWdOdW1iZXIoZGF0YVByb3BlcnR5Q3JlYXRpb25GZWUpLmlzTmFOKCkmJmFwaS5CaWdOdW1iZXIoZGF0YVByb3BlcnR5Q3JlYXRpb25GZWUpLmd0ZSgwKSYmKHBhcmFtcy5kYXRhUHJvcGVydHlDcmVhdGlvbkZlZT1kYXRhUHJvcGVydHlDcmVhdGlvbkZlZSksZW5hYmxlRGVsZWdhdGlvbkZlZSYmInN0cmluZyI9PXR5cGVvZiBlbmFibGVEZWxlZ2F0aW9uRmVlJiYhYXBpLkJpZ051bWJlcihlbmFibGVEZWxlZ2F0aW9uRmVlKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKGVuYWJsZURlbGVnYXRpb25GZWUpLmd0ZSgwKSYmKHBhcmFtcy5lbmFibGVEZWxlZ2F0aW9uRmVlPWVuYWJsZURlbGVnYXRpb25GZWUpLGF3YWl0IGFwaS5kYi51cGRhdGUoInBhcmFtcyIscGFyYW1zKX19O2NvbnN0IGlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkPShyZXN1bHQsZnJvbSx0byxzeW1ib2wscXVhbnRpdHksZXZlbnRTdHIpPT4hKHZvaWQgMCE9PXJlc3VsdC5lcnJvcnN8fCFyZXN1bHQuZXZlbnRzfHx2b2lkIDA9PT1yZXN1bHQuZXZlbnRzLmZpbmQoZWw9PiJ0b2tlbnMiPT09ZWwuY29udHJhY3QmJmVsLmV2ZW50PT09ZXZlbnRTdHImJmVsLmRhdGEuZnJvbT09PWZyb20mJmVsLmRhdGEudG89PT10byYmZWwuZGF0YS5xdWFudGl0eT09PXF1YW50aXR5JiZlbC5kYXRhLnN5bWJvbD09PXN5bWJvbCkpLGNhbGN1bGF0ZUJhbGFuY2U9KGJhbGFuY2UscXVhbnRpdHkscHJlY2lzaW9uLGFkZCk9PihhZGQ/YXBpLkJpZ051bWJlcihiYWxhbmNlKS5wbHVzKHF1YW50aXR5KTphcGkuQmlnTnVtYmVyKGJhbGFuY2UpLm1pbnVzKHF1YW50aXR5KSkudG9GaXhlZChwcmVjaXNpb24pLGNvdW50RGVjaW1hbHM9dmFsdWU9PmFwaS5CaWdOdW1iZXIodmFsdWUpLmRwKCksY29udGFpbnNEdXBsaWNhdGVzPWFycj0+bmV3IFNldChhcnIpLnNpemUhPT1hcnIubGVuZ3RoLGlzVmFsaWRIaXZlQWNjb3VudExlbmd0aD1hY2NvdW50PT4zPD1hY2NvdW50Lmxlbmd0aCYmYWNjb3VudC5sZW5ndGg8PTE2LGlzVmFsaWRDb250cmFjdExlbmd0aD1jb250cmFjdD0+Mzw9Y29udHJhY3QubGVuZ3RoJiZjb250cmFjdC5sZW5ndGg8PTUwLGlzVmFsaWRBY2NvdW50c0FycmF5PWFycj0+e2xldCB2YWxpZENvbnRlbnRzPSEwO3JldHVybiBhcnIuZm9yRWFjaChhY2NvdW50PT57InN0cmluZyI9PXR5cGVvZiBhY2NvdW50JiZpc1ZhbGlkSGl2ZUFjY291bnRMZW5ndGgoYWNjb3VudCl8fCh2YWxpZENvbnRlbnRzPSExKX0pLHZhbGlkQ29udGVudHN9LGlzVmFsaWRDb250cmFjdHNBcnJheT1hcnI9PntsZXQgdmFsaWRDb250ZW50cz0hMDtyZXR1cm4gYXJyLmZvckVhY2goY29udHJhY3Q9Pnsic3RyaW5nIj09dHlwZW9mIGNvbnRyYWN0JiZpc1ZhbGlkQ29udHJhY3RMZW5ndGgoY29udHJhY3QpfHwodmFsaWRDb250ZW50cz0hMSl9KSx2YWxpZENvbnRlbnRzfSxpc1ZhbGlkRGF0YVByb3BlcnRpZXM9KGZyb20sZnJvbVR5cGUsbmZ0LHByb3BlcnRpZXMpPT57dmFyIG5hbWUsZGF0YSxwcm9wZXJ0eUNvdW50PU9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmxlbmd0aCxuZnRQcm9wZXJ0eUNvdW50PU9iamVjdC5rZXlzKG5mdC5wcm9wZXJ0aWVzKS5sZW5ndGg7aWYoIWFwaS5hc3NlcnQocHJvcGVydHlDb3VudDw9bmZ0UHJvcGVydHlDb3VudCwiY2Fubm90IHNldCBtb3JlIGRhdGEgcHJvcGVydGllcyB0aGFuIE5GVCBoYXMiKSlyZXR1cm4hMTtmb3IoW25hbWUsZGF0YV1vZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSl7bGV0IHZhbGlkQ29udGVudHM9ITE7aWYoYXBpLmFzc2VydChuYW1lJiYic3RyaW5nIj09dHlwZW9mIG5hbWUmJmFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMobmFtZSkmJjA8bmFtZS5sZW5ndGgmJm5hbWUubGVuZ3RoPD0yNSwiaW52YWxpZCBkYXRhIHByb3BlcnR5IG5hbWU6IGxldHRlcnMgJiBudW1iZXJzIG9ubHksIG1heCBsZW5ndGggb2YgMjUiKSYmYXBpLmFzc2VydChuYW1lIGluIG5mdC5wcm9wZXJ0aWVzLCJkYXRhIHByb3BlcnR5IG11c3QgZXhpc3QiKSl7Y29uc3QgcHJvcGVydHlTY2hlbWE9bmZ0LnByb3BlcnRpZXNbbmFtZV07YXBpLmFzc2VydCh2b2lkIDAhPT1kYXRhJiZudWxsIT09ZGF0YSYmKHR5cGVvZiBkYXRhPT09cHJvcGVydHlTY2hlbWEudHlwZXx8Im51bWJlciI9PT1wcm9wZXJ0eVNjaGVtYS50eXBlJiYic3RyaW5nIj09dHlwZW9mIGRhdGEmJiFhcGkuQmlnTnVtYmVyKGRhdGEpLmlzTmFOKCkpLGBkYXRhIHByb3BlcnR5IHR5cGUgbWlzbWF0Y2g6IGV4cGVjdGVkICR7cHJvcGVydHlTY2hlbWEudHlwZX0gYnV0IGdvdCAke3R5cGVvZiBkYXRhfSBmb3IgcHJvcGVydHkgYCtuYW1lKSYmYXBpLmFzc2VydCgic3RyaW5nIiE9dHlwZW9mIGRhdGF8fGRhdGEubGVuZ3RoPD1NQVhfREFUQV9QUk9QRVJUWV9MRU5HVEgsYHN0cmluZyBwcm9wZXJ0eSBtYXggbGVuZ3RoIGlzICR7TUFYX0RBVEFfUFJPUEVSVFlfTEVOR1RIfSBjaGFyYWN0ZXJzYCkmJmFwaS5hc3NlcnQoImNvbnRyYWN0Ij09PWZyb21UeXBlJiZwcm9wZXJ0eVNjaGVtYS5hdXRob3JpemVkRWRpdGluZ0NvbnRyYWN0cy5pbmNsdWRlcyhmcm9tKXx8InVzZXIiPT09ZnJvbVR5cGUmJnByb3BlcnR5U2NoZW1hLmF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHMuaW5jbHVkZXMoZnJvbSksIm5vdCBhbGxvd2VkIHRvIHNldCBkYXRhIHByb3BlcnRpZXMiKSYmKHZhbGlkQ29udGVudHM9ITAsIm51bWJlciI9PT1wcm9wZXJ0eVNjaGVtYS50eXBlJiYic3RyaW5nIj09dHlwZW9mIGRhdGEmJihwcm9wZXJ0aWVzW25hbWVdPWFwaS5CaWdOdW1iZXIoZGF0YSkudG9OdW1iZXIoKSkpfWlmKCF2YWxpZENvbnRlbnRzKXJldHVybiExfXJldHVybiEwfSxpc1ZhbGlkRGF0YVByb3BlcnRpZXNBcnJheT0oZnJvbSxmcm9tVHlwZSxuZnQsYXJyKT0+e3RyeXtmb3IobGV0IGk9MDtpPGFyci5sZW5ndGg7aSs9MSl7bGV0IHZhbGlkQ29udGVudHM9ITE7dmFye2lkLHByb3BlcnRpZXN9PWFycltpXTtpZihhcGkuYXNzZXJ0KGlkJiYic3RyaW5nIj09dHlwZW9mIGlkJiYhYXBpLkJpZ051bWJlcihpZCkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihpZCkuZ3QoMCkmJnByb3BlcnRpZXMmJiJvYmplY3QiPT10eXBlb2YgcHJvcGVydGllcywiaW52YWxpZCBkYXRhIHByb3BlcnRpZXMiKSYmaXNWYWxpZERhdGFQcm9wZXJ0aWVzKGZyb20sZnJvbVR5cGUsbmZ0LHByb3BlcnRpZXMpJiYodmFsaWRDb250ZW50cz0hMCksIXZhbGlkQ29udGVudHMpcmV0dXJuITF9fWNhdGNoKGUpe3JldHVybiExfXJldHVybiEwfSxpc1ZhbGlkTmZ0SWRBcnJheT1hcnI9Pnt0cnl7bGV0IGluc3RhbmNlQ291bnQ9MDtmb3IobGV0IGk9MDtpPGFyci5sZW5ndGg7aSs9MSl7bGV0IHZhbGlkQ29udGVudHM9ITE7dmFye3N5bWJvbCxpZHN9PWFycltpXTtpZihhcGkuYXNzZXJ0KHN5bWJvbCYmInN0cmluZyI9PXR5cGVvZiBzeW1ib2wmJmFwaS52YWxpZGF0b3IuaXNBbHBoYShzeW1ib2wpJiZhcGkudmFsaWRhdG9yLmlzVXBwZXJjYXNlKHN5bWJvbCkmJjA8c3ltYm9sLmxlbmd0aCYmc3ltYm9sLmxlbmd0aDw9TUFYX1NZTUJPTF9MRU5HVEgmJmlkcyYmIm9iamVjdCI9PXR5cGVvZiBpZHMmJkFycmF5LmlzQXJyYXkoaWRzKSwiaW52YWxpZCBuZnQgbGlzdCIpJiYoaW5zdGFuY2VDb3VudCs9aWRzLmxlbmd0aCxhcGkuYXNzZXJ0KGluc3RhbmNlQ291bnQ8PU1BWF9OVU1fTkZUU19PUEVSQUJMRSxgY2Fubm90IG9wZXJhdGUgb24gbW9yZSB0aGFuICR7TUFYX05VTV9ORlRTX09QRVJBQkxFfSBORlQgaW5zdGFuY2VzIGF0IG9uY2VgKSkpe2ZvcihsZXQgaj0wO2o8aWRzLmxlbmd0aDtqKz0xKXt2YXIgaWQ9aWRzW2pdO2lmKCFhcGkuYXNzZXJ0KGlkJiYic3RyaW5nIj09dHlwZW9mIGlkJiYhYXBpLkJpZ051bWJlcihpZCkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihpZCkuZ3QoMCksImludmFsaWQgbmZ0IGxpc3QiKSlyZXR1cm4hMX12YWxpZENvbnRlbnRzPSEwfWlmKCF2YWxpZENvbnRlbnRzKXJldHVybiExfX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4hMH0saXNWYWxpZFRva2VuQmFza2V0PWFzeW5jKGJhc2tldCxiYWxhbmNlVGFibGVOYW1lLGFjY291bnROYW1lLGZlZVN5bWJvbCxmZWVRdWFudGl0eSk9Pnt0cnl7dmFyIHN5bWJvbCxxdWFudGl0eSx0b2tlbixmaW5hbFF1YW50aXR5LGJhc2tldFRva2VuQmFsYW5jZTtpZihPYmplY3Qua2V5cyhiYXNrZXQpLmxlbmd0aD5NQVhfTlVNX0xPQ0tFRF9UT0tFTl9UWVBFUylyZXR1cm4hMTtmb3IoW3N5bWJvbCxxdWFudGl0eV1vZiBPYmplY3QuZW50cmllcyhiYXNrZXQpKXtsZXQgdmFsaWRDb250ZW50cz0hMTtpZigic3RyaW5nIj09dHlwZW9mIHN5bWJvbCYmYXBpLnZhbGlkYXRvci5pc0FscGhhKHN5bWJvbCkmJmFwaS52YWxpZGF0b3IuaXNVcHBlcmNhc2Uoc3ltYm9sKSYmMDxzeW1ib2wubGVuZ3RoJiZzeW1ib2wubGVuZ3RoPD1NQVhfU1lNQk9MX0xFTkdUSCYmKCh0b2tlbj1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsInRva2VucyIse3N5bWJvbDpzeW1ib2x9KSkmJnF1YW50aXR5JiYic3RyaW5nIj09dHlwZW9mIHF1YW50aXR5JiYhYXBpLkJpZ051bWJlcihxdWFudGl0eSkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihxdWFudGl0eSkuZ3QoMCkmJmNvdW50RGVjaW1hbHMocXVhbnRpdHkpPD10b2tlbi5wcmVjaXNpb24mJihmaW5hbFF1YW50aXR5PXN5bWJvbD09PWZlZVN5bWJvbD9jYWxjdWxhdGVCYWxhbmNlKHF1YW50aXR5LGZlZVF1YW50aXR5LHRva2VuLnByZWNpc2lvbiwhMCk6cXVhbnRpdHksKGJhc2tldFRva2VuQmFsYW5jZT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsYmFsYW5jZVRhYmxlTmFtZSx7YWNjb3VudDphY2NvdW50TmFtZSxzeW1ib2w6c3ltYm9sfSkpJiZhcGkuQmlnTnVtYmVyKGJhc2tldFRva2VuQmFsYW5jZS5iYWxhbmNlKS5ndGUoZmluYWxRdWFudGl0eSkmJih2YWxpZENvbnRlbnRzPSEwKSkpLCF2YWxpZENvbnRlbnRzKXJldHVybiExfX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4hMH0sdHJhbnNmZXJBbmRWZXJpZnlOZnRzPWFzeW5jKGZyb20sZnJvbVR5cGUsdG8sdG9UeXBlLG5mdHMsaXNTaWduZWRXaXRoQWN0aXZlS2V5LGNhbGxpbmdDb250cmFjdEluZm8pPT57Y29uc3QgcmVzdWx0cz17c3VjY2VzczpbXSxmYWlsOltdfTt2YXIgZmluYWxGcm9tVHlwZT0idXNlciI9PT1mcm9tVHlwZT8idSI6ImMiLGZpbmFsVG9UeXBlPSJ1c2VyIj09PXRvVHlwZT8idSI6ImMiO2F3YWl0IGFjdGlvbnMudHJhbnNmZXIoe2Zyb21UeXBlOmZyb21UeXBlLHRvOnRvLHRvVHlwZTp0b1R5cGUsbmZ0czpuZnRzLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppc1NpZ25lZFdpdGhBY3RpdmVLZXksY2FsbGluZ0NvbnRyYWN0SW5mbzpjYWxsaW5nQ29udHJhY3RJbmZvfSk7dmFyIGxvZ3M9YXBpLmxvZ3MoKTtjb25zdCB0b2tlbk1hcD17fSxjb3VudGVkTWFwPXt9O2lmKGxvZ3MuZXZlbnRzKWZvcihsZXQgaT0wO2k8bG9ncy5ldmVudHMubGVuZ3RoO2krPTEpe3ZhciBrZXk9bG9ncy5ldmVudHNbaV07a2V5LmNvbnRyYWN0JiZrZXkuZXZlbnQmJmtleS5kYXRhJiYibmZ0Ij09PWtleS5jb250cmFjdCYmInRyYW5zZmVyIj09PWtleS5ldmVudCYma2V5LmRhdGEuZnJvbT09PWZyb20mJmtleS5kYXRhLmZyb21UeXBlPT09ZmluYWxGcm9tVHlwZSYma2V5LmRhdGEudG89PT10byYma2V5LmRhdGEudG9UeXBlPT09ZmluYWxUb1R5cGUmJihrZXk9a2V5LmRhdGEuc3ltYm9sKyItIitrZXkuZGF0YS5pZCx0b2tlbk1hcFtrZXldPTEpfWZvcihsZXQgaW5kZXg9MDtpbmRleDxuZnRzLmxlbmd0aDtpbmRleCs9MSl7Y29uc3R7c3ltYm9sLGlkc309bmZ0c1tpbmRleF0sc3VjY2Vzcz1bXSxmYWlsPVtdO2ZvcihsZXQgaj0wO2o8aWRzLmxlbmd0aDtqKz0xKXt2YXIgaW5wdXRLZXk9c3ltYm9sKyItIitpZHNbal07aW5wdXRLZXkgaW4gY291bnRlZE1hcHx8KChpbnB1dEtleSBpbiB0b2tlbk1hcD9zdWNjZXNzOmZhaWwpLnB1c2goaWRzW2pdLnRvU3RyaW5nKCkpLGNvdW50ZWRNYXBbaW5wdXRLZXldPTEpfTA8c3VjY2Vzcy5sZW5ndGgmJnJlc3VsdHMuc3VjY2Vzcy5wdXNoKHtzeW1ib2w6c3ltYm9sLGlkczpzdWNjZXNzfSksMDxmYWlsLmxlbmd0aCYmcmVzdWx0cy5mYWlsLnB1c2goe3N5bWJvbDpzeW1ib2wsaWRzOmZhaWx9KX1yZXR1cm4gcmVzdWx0c307YWN0aW9ucy51cGRhdGVVcmw9YXN5bmMgc3ltYm9sPT57dmFye3VybCxzeW1ib2x9PXN5bWJvbDtpZihhcGkuYXNzZXJ0KHN5bWJvbCYmInN0cmluZyI9PXR5cGVvZiBzeW1ib2wmJnVybCYmInN0cmluZyI9PXR5cGVvZiB1cmwsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQodXJsLmxlbmd0aDw9MjU1LCJpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUiKSl7Y29uc3QgbmZ0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnN5bWJvbH0pO2lmKG5mdCYmYXBpLmFzc2VydChuZnQuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikpdHJ5e2NvbnN0IG1ldGFkYXRhPUpTT04ucGFyc2UobmZ0Lm1ldGFkYXRhKTthcGkuYXNzZXJ0KG1ldGFkYXRhJiZtZXRhZGF0YS51cmwsImFuIGVycm9yIG9jY3VyZWQgd2hlbiB0cnlpbmcgdG8gdXBkYXRlIHRoZSB1cmwiKSYmKG1ldGFkYXRhLnVybD11cmwsbmZ0Lm1ldGFkYXRhPUpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixuZnQpKX1jYXRjaChlKXt9fX0sYWN0aW9ucy51cGRhdGVNZXRhZGF0YT1hc3luYyBzeW1ib2w9Pnt2YXJ7bWV0YWRhdGEsc3ltYm9sfT1zeW1ib2w7aWYoYXBpLmFzc2VydChzeW1ib2wmJiJzdHJpbmciPT10eXBlb2Ygc3ltYm9sJiZtZXRhZGF0YSYmIm9iamVjdCI9PXR5cGVvZiBtZXRhZGF0YSwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgbmZ0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnN5bWJvbH0pO2lmKG5mdCYmYXBpLmFzc2VydChuZnQuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikpdHJ5e3ZhciBmaW5hbE1ldGFkYXRhPUpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKTthcGkuYXNzZXJ0KGZpbmFsTWV0YWRhdGEubGVuZ3RoPD0xZTMsImludmFsaWQgbWV0YWRhdGE6IG1heCBsZW5ndGggb2YgMTAwMCIpJiYobmZ0Lm1ldGFkYXRhPWZpbmFsTWV0YWRhdGEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsbmZ0KSl9Y2F0Y2goZSl7fX19LGFjdGlvbnMudXBkYXRlTmFtZT1hc3luYyBzeW1ib2w9Pnt2YXJ7bmFtZSxzeW1ib2x9PXN5bWJvbDtpZihhcGkuYXNzZXJ0KHN5bWJvbCYmInN0cmluZyI9PXR5cGVvZiBzeW1ib2wmJm5hbWUmJiJzdHJpbmciPT10eXBlb2YgbmFtZSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGFwaS52YWxpZGF0b3IuYmxhY2tsaXN0KG5hbWUsIiAiKSkmJjA8bmFtZS5sZW5ndGgmJm5hbWUubGVuZ3RoPD01MCwiaW52YWxpZCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikpe2NvbnN0IG5mdD1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzeW1ib2x9KTtuZnQmJmFwaS5hc3NlcnQobmZ0Lmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiYobmZ0Lm5hbWU9bmFtZSxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixuZnQpKX19LGFjdGlvbnMudXBkYXRlT3JnTmFtZT1hc3luYyBzeW1ib2w9Pnt2YXJ7b3JnTmFtZSxzeW1ib2x9PXN5bWJvbDtpZihhcGkuYXNzZXJ0KHN5bWJvbCYmInN0cmluZyI9PXR5cGVvZiBzeW1ib2wmJm9yZ05hbWUmJiJzdHJpbmciPT10eXBlb2Ygb3JnTmFtZSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGFwaS52YWxpZGF0b3IuYmxhY2tsaXN0KG9yZ05hbWUsIiAiKSkmJjA8b3JnTmFtZS5sZW5ndGgmJm9yZ05hbWUubGVuZ3RoPD01MCwiaW52YWxpZCBvcmcgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCIpKXtjb25zdCBuZnQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6c3ltYm9sfSk7bmZ0JiZhcGkuYXNzZXJ0KG5mdC5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmKG5mdC5vcmdOYW1lPW9yZ05hbWUsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsbmZ0KSl9fSxhY3Rpb25zLnVwZGF0ZVByb2R1Y3ROYW1lPWFzeW5jIHN5bWJvbD0+e3Zhcntwcm9kdWN0TmFtZSxzeW1ib2x9PXN5bWJvbDtpZihhcGkuYXNzZXJ0KHN5bWJvbCYmInN0cmluZyI9PXR5cGVvZiBzeW1ib2wmJnByb2R1Y3ROYW1lJiYic3RyaW5nIj09dHlwZW9mIHByb2R1Y3ROYW1lLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYXBpLnZhbGlkYXRvci5ibGFja2xpc3QocHJvZHVjdE5hbWUsIiAiKSkmJjA8cHJvZHVjdE5hbWUubGVuZ3RoJiZwcm9kdWN0TmFtZS5sZW5ndGg8PTUwLCJpbnZhbGlkIHByb2R1Y3QgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCIpKXtjb25zdCBuZnQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6c3ltYm9sfSk7bmZ0JiZhcGkuYXNzZXJ0KG5mdC5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmKG5mdC5wcm9kdWN0TmFtZT1wcm9kdWN0TmFtZSxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixuZnQpKX19LGFjdGlvbnMuYWRkQXV0aG9yaXplZElzc3VpbmdBY2NvdW50cz1hc3luYyBmaW5hbEFjY291bnRMaXN0PT57Y29uc3R7YWNjb3VudHMsc3ltYm9sLGlzU2lnbmVkV2l0aEFjdGl2ZUtleX09ZmluYWxBY2NvdW50TGlzdDtpZihhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChzeW1ib2wmJiJzdHJpbmciPT10eXBlb2Ygc3ltYm9sJiZhY2NvdW50cyYmIm9iamVjdCI9PXR5cGVvZiBhY2NvdW50cyYmQXJyYXkuaXNBcnJheShhY2NvdW50cyksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYWNjb3VudHMubGVuZ3RoPD1NQVhfTlVNX0FVVEhPUklaRURfSVNTVUVSUyxgY2Fubm90IGhhdmUgbW9yZSB0aGFuICR7TUFYX05VTV9BVVRIT1JJWkVEX0lTU1VFUlN9IGF1dGhvcml6ZWQgaXNzdWluZyBhY2NvdW50c2ApKXt2YXIgZmluYWxBY2NvdW50TGlzdD1pc1ZhbGlkQWNjb3VudHNBcnJheShhY2NvdW50cyk7aWYoYXBpLmFzc2VydChmaW5hbEFjY291bnRMaXN0LCJpbnZhbGlkIGFjY291bnQgbGlzdCIpKXtjb25zdCBuZnQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6c3ltYm9sfSk7aWYobmZ0KXtjb25zdCBzYW5pdGl6ZWRMaXN0PVtdO2FjY291bnRzLmZvckVhY2goYWNjb3VudD0+e3ZhciBmaW5hbEFjY291bnQ9YWNjb3VudC50cmltKCkudG9Mb3dlckNhc2UoKTtsZXQgaXNEdXBsaWNhdGU9ITE7Zm9yKGxldCBpPTA7aTxuZnQuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cy5sZW5ndGg7aSs9MSlpZihmaW5hbEFjY291bnQ9PT1uZnQuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50c1tpXSl7aXNEdXBsaWNhdGU9ITA7YnJlYWt9aXNEdXBsaWNhdGV8fHNhbml0aXplZExpc3QucHVzaChmaW5hbEFjY291bnQpfSksYXBpLmFzc2VydChuZnQuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikmJmFwaS5hc3NlcnQoIWNvbnRhaW5zRHVwbGljYXRlcyhzYW5pdGl6ZWRMaXN0KSwiY2Fubm90IGFkZCB0aGUgc2FtZSBhY2NvdW50IHR3aWNlIikmJmFwaS5hc3NlcnQobmZ0LmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMubGVuZ3RoK3Nhbml0aXplZExpc3QubGVuZ3RoPD1NQVhfTlVNX0FVVEhPUklaRURfSVNTVUVSUyxgY2Fubm90IGhhdmUgbW9yZSB0aGFuICR7TUFYX05VTV9BVVRIT1JJWkVEX0lTU1VFUlN9IGF1dGhvcml6ZWQgaXNzdWluZyBhY2NvdW50c2ApJiYoZmluYWxBY2NvdW50TGlzdD1uZnQuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cy5jb25jYXQoc2FuaXRpemVkTGlzdCksbmZ0LmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9ZmluYWxBY2NvdW50TGlzdCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixuZnQpKX19fX0sYWN0aW9ucy5hZGRBdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0cz1hc3luYyBmaW5hbENvbnRyYWN0TGlzdD0+e2NvbnN0e2NvbnRyYWN0cyxzeW1ib2wsaXNTaWduZWRXaXRoQWN0aXZlS2V5fT1maW5hbENvbnRyYWN0TGlzdDtpZihhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChzeW1ib2wmJiJzdHJpbmciPT10eXBlb2Ygc3ltYm9sJiZjb250cmFjdHMmJiJvYmplY3QiPT10eXBlb2YgY29udHJhY3RzJiZBcnJheS5pc0FycmF5KGNvbnRyYWN0cyksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoY29udHJhY3RzLmxlbmd0aDw9TUFYX05VTV9BVVRIT1JJWkVEX0lTU1VFUlMsYGNhbm5vdCBoYXZlIG1vcmUgdGhhbiAke01BWF9OVU1fQVVUSE9SSVpFRF9JU1NVRVJTfSBhdXRob3JpemVkIGlzc3VpbmcgY29udHJhY3RzYCkpe3ZhciBmaW5hbENvbnRyYWN0TGlzdD1pc1ZhbGlkQ29udHJhY3RzQXJyYXkoY29udHJhY3RzKTtpZihhcGkuYXNzZXJ0KGZpbmFsQ29udHJhY3RMaXN0LCJpbnZhbGlkIGNvbnRyYWN0IGxpc3QiKSl7Y29uc3QgbmZ0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnN5bWJvbH0pO2lmKG5mdCl7Y29uc3Qgc2FuaXRpemVkTGlzdD1bXTtjb250cmFjdHMuZm9yRWFjaChjb250cmFjdD0+e3ZhciBmaW5hbENvbnRyYWN0PWNvbnRyYWN0LnRyaW0oKTtsZXQgaXNEdXBsaWNhdGU9ITE7Zm9yKGxldCBpPTA7aTxuZnQuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMubGVuZ3RoO2krPTEpaWYoZmluYWxDb250cmFjdD09PW5mdC5hdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0c1tpXSl7aXNEdXBsaWNhdGU9ITA7YnJlYWt9aXNEdXBsaWNhdGV8fHNhbml0aXplZExpc3QucHVzaChmaW5hbENvbnRyYWN0KX0pLGFwaS5hc3NlcnQobmZ0Lmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KCFjb250YWluc0R1cGxpY2F0ZXMoc2FuaXRpemVkTGlzdCksImNhbm5vdCBhZGQgdGhlIHNhbWUgY29udHJhY3QgdHdpY2UiKSYmYXBpLmFzc2VydChuZnQuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMubGVuZ3RoK3Nhbml0aXplZExpc3QubGVuZ3RoPD1NQVhfTlVNX0FVVEhPUklaRURfSVNTVUVSUyxgY2Fubm90IGhhdmUgbW9yZSB0aGFuICR7TUFYX05VTV9BVVRIT1JJWkVEX0lTU1VFUlN9IGF1dGhvcml6ZWQgaXNzdWluZyBjb250cmFjdHNgKSYmKGZpbmFsQ29udHJhY3RMaXN0PW5mdC5hdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0cy5jb25jYXQoc2FuaXRpemVkTGlzdCksbmZ0LmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzPWZpbmFsQ29udHJhY3RMaXN0LGF3YWl0IGFwaS5kYi51cGRhdGUoIm5mdHMiLG5mdCkpfX19fSxhY3Rpb25zLnJlbW92ZUF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9YXN5bmMgZmluYWxBY2NvdW50TGlzdD0+e2NvbnN0e2FjY291bnRzLHN5bWJvbCxpc1NpZ25lZFdpdGhBY3RpdmVLZXl9PWZpbmFsQWNjb3VudExpc3Q7aWYoYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoc3ltYm9sJiYic3RyaW5nIj09dHlwZW9mIHN5bWJvbCYmYWNjb3VudHMmJiJvYmplY3QiPT10eXBlb2YgYWNjb3VudHMmJkFycmF5LmlzQXJyYXkoYWNjb3VudHMpLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KGFjY291bnRzLmxlbmd0aDw9TUFYX05VTV9BVVRIT1JJWkVEX0lTU1VFUlMsYGNhbm5vdCByZW1vdmUgbW9yZSB0aGFuICR7TUFYX05VTV9BVVRIT1JJWkVEX0lTU1VFUlN9IGF1dGhvcml6ZWQgaXNzdWluZyBhY2NvdW50c2ApKXt2YXIgZmluYWxBY2NvdW50TGlzdD1pc1ZhbGlkQWNjb3VudHNBcnJheShhY2NvdW50cyk7aWYoYXBpLmFzc2VydChmaW5hbEFjY291bnRMaXN0LCJpbnZhbGlkIGFjY291bnQgbGlzdCIpKXtjb25zdCBuZnQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6c3ltYm9sfSk7bmZ0JiZhcGkuYXNzZXJ0KG5mdC5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmKGZpbmFsQWNjb3VudExpc3Q9bmZ0LmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMuZmlsdGVyKGN1cnJlbnRWYWx1ZT0+e2ZvcihsZXQgaT0wO2k8YWNjb3VudHMubGVuZ3RoO2krPTEpaWYoY3VycmVudFZhbHVlPT09YWNjb3VudHNbaV0udHJpbSgpLnRvTG93ZXJDYXNlKCkpcmV0dXJuITE7cmV0dXJuITB9KSxuZnQuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cz1maW5hbEFjY291bnRMaXN0LGF3YWl0IGFwaS5kYi51cGRhdGUoIm5mdHMiLG5mdCkpfX19LGFjdGlvbnMucmVtb3ZlQXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM9YXN5bmMgZmluYWxDb250cmFjdExpc3Q9Pntjb25zdHtjb250cmFjdHMsc3ltYm9sLGlzU2lnbmVkV2l0aEFjdGl2ZUtleX09ZmluYWxDb250cmFjdExpc3Q7aWYoYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoc3ltYm9sJiYic3RyaW5nIj09dHlwZW9mIHN5bWJvbCYmY29udHJhY3RzJiYib2JqZWN0Ij09dHlwZW9mIGNvbnRyYWN0cyYmQXJyYXkuaXNBcnJheShjb250cmFjdHMpLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KGNvbnRyYWN0cy5sZW5ndGg8PU1BWF9OVU1fQVVUSE9SSVpFRF9JU1NVRVJTLGBjYW5ub3QgcmVtb3ZlIG1vcmUgdGhhbiAke01BWF9OVU1fQVVUSE9SSVpFRF9JU1NVRVJTfSBhdXRob3JpemVkIGlzc3VpbmcgY29udHJhY3RzYCkpe3ZhciBmaW5hbENvbnRyYWN0TGlzdD1pc1ZhbGlkQ29udHJhY3RzQXJyYXkoY29udHJhY3RzKTtpZihhcGkuYXNzZXJ0KGZpbmFsQ29udHJhY3RMaXN0LCJpbnZhbGlkIGNvbnRyYWN0IGxpc3QiKSl7Y29uc3QgbmZ0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnN5bWJvbH0pO25mdCYmYXBpLmFzc2VydChuZnQuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikmJihmaW5hbENvbnRyYWN0TGlzdD1uZnQuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMuZmlsdGVyKGN1cnJlbnRWYWx1ZT0+e2ZvcihsZXQgaT0wO2k8Y29udHJhY3RzLmxlbmd0aDtpKz0xKWlmKGN1cnJlbnRWYWx1ZT09PWNvbnRyYWN0c1tpXS50cmltKCkpcmV0dXJuITE7cmV0dXJuITB9KSxuZnQuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM9ZmluYWxDb250cmFjdExpc3QsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsbmZ0KSl9fX0sYWN0aW9ucy50cmFuc2Zlck93bmVyc2hpcD1hc3luYyBmaW5hbFRvPT57Y29uc3R7c3ltYm9sLHRvLGlzU2lnbmVkV2l0aEFjdGl2ZUtleX09ZmluYWxUbztpZihhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChzeW1ib2wmJiJzdHJpbmciPT10eXBlb2Ygc3ltYm9sJiZ0byYmInN0cmluZyI9PXR5cGVvZiB0bywiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgbmZ0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnN5bWJvbH0pO25mdCYmYXBpLmFzc2VydChuZnQuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikmJihmaW5hbFRvPXRvLnRyaW0oKS50b0xvd2VyQ2FzZSgpLGFwaS5hc3NlcnQoaXNWYWxpZEhpdmVBY2NvdW50TGVuZ3RoKGZpbmFsVG8pLCJpbnZhbGlkIHRvIikmJihuZnQuaXNzdWVyPWZpbmFsVG8sYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsbmZ0KSkpfX0sYWN0aW9ucy5lbmFibGVEZWxlZ2F0aW9uPWFzeW5jIGF1dGhvcml6ZWQ9Pnt2YXJ7c3ltYm9sLHVuZGVsZWdhdGlvbkNvb2xkb3duLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpyZXN9PWF1dGhvcml6ZWQsZW5hYmxlRGVsZWdhdGlvbkZlZT0oYXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pKVsiZW5hYmxlRGVsZWdhdGlvbkZlZSJdLGF1dGhvcml6ZWQ9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJiYWxhbmNlcyIse2FjY291bnQ6YXBpLnNlbmRlcixzeW1ib2w6VVRJTElUWV9UT0tFTl9TWU1CT0x9KSxhdXRob3JpemVkPSEhYXBpLkJpZ051bWJlcihlbmFibGVEZWxlZ2F0aW9uRmVlKS5sdGUoMCl8fGF1dGhvcml6ZWQmJmFwaS5CaWdOdW1iZXIoYXV0aG9yaXplZC5iYWxhbmNlKS5ndGUoZW5hYmxlRGVsZWdhdGlvbkZlZSk7aWYoYXBpLmFzc2VydChhdXRob3JpemVkLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgZmVlcyIpJiZhcGkuYXNzZXJ0KCEwPT09cmVzLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChzeW1ib2wmJiJzdHJpbmciPT10eXBlb2Ygc3ltYm9sLCJpbnZhbGlkIHN5bWJvbCIpJiZhcGkuYXNzZXJ0KHVuZGVsZWdhdGlvbkNvb2xkb3duJiZOdW1iZXIuaXNJbnRlZ2VyKHVuZGVsZWdhdGlvbkNvb2xkb3duKSYmMDx1bmRlbGVnYXRpb25Db29sZG93biYmdW5kZWxlZ2F0aW9uQ29vbGRvd248PTE4MjUwLCJ1bmRlbGVnYXRpb25Db29sZG93biBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxODI1MCIpKXtjb25zdCBuZnQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6c3ltYm9sfSk7aWYoYXBpLmFzc2VydChudWxsIT09bmZ0LCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChuZnQuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikmJmFwaS5hc3NlcnQodm9pZCAwPT09bmZ0LmRlbGVnYXRpb25FbmFibGVkfHwhMT09PW5mdC5kZWxlZ2F0aW9uRW5hYmxlZCwiZGVsZWdhdGlvbiBhbHJlYWR5IGVuYWJsZWQiKSl7aWYoYXBpLkJpZ051bWJlcihlbmFibGVEZWxlZ2F0aW9uRmVlKS5ndCgwKSl7cmVzPWF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgidG9rZW5zIiwidHJhbnNmZXIiLHt0bzoibnVsbCIsc3ltYm9sOlVUSUxJVFlfVE9LRU5fU1lNQk9MLHF1YW50aXR5OmVuYWJsZURlbGVnYXRpb25GZWUsaXNTaWduZWRXaXRoQWN0aXZlS2V5OnJlc30pO2lmKCFpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChyZXMsYXBpLnNlbmRlciwibnVsbCIsVVRJTElUWV9UT0tFTl9TWU1CT0wsZW5hYmxlRGVsZWdhdGlvbkZlZSwidHJhbnNmZXIiKSlyZXR1cm4hMX1yZXR1cm4gbmZ0LmRlbGVnYXRpb25FbmFibGVkPSEwLG5mdC51bmRlbGVnYXRpb25Db29sZG93bj11bmRlbGVnYXRpb25Db29sZG93bixhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixuZnQpLCEwfX1yZXR1cm4hMX0sYWN0aW9ucy51cGRhdGVQcm9wZXJ0eURlZmluaXRpb249YXN5bmMgb3JpZ2luYWxUeXBlPT57dmFye3N5bWJvbCxuYW1lLG5ld05hbWUsdHlwZSxpc1JlYWRPbmx5LGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpvcmlnaW5hbElzUmVhZE9ubHl9PW9yaWdpbmFsVHlwZTtpZihhcGkuYXNzZXJ0KCEwPT09b3JpZ2luYWxJc1JlYWRPbmx5LCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChzeW1ib2wmJiJzdHJpbmciPT10eXBlb2Ygc3ltYm9sJiZuYW1lJiYic3RyaW5nIj09dHlwZW9mIG5hbWUsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhuYW1lKSYmMDxuYW1lLmxlbmd0aCYmbmFtZS5sZW5ndGg8PTI1LCJpbnZhbGlkIG5hbWU6IGxldHRlcnMgJiBudW1iZXJzIG9ubHksIG1heCBsZW5ndGggb2YgMjUiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1uZXdOYW1lfHwic3RyaW5nIj09dHlwZW9mIG5ld05hbWUmJmFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMobmV3TmFtZSkmJjA8bmV3TmFtZS5sZW5ndGgmJm5ld05hbWUubGVuZ3RoPD0yNSwiaW52YWxpZCBuZXcgbmFtZTogbGV0dGVycyAmIG51bWJlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAyNSIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PXR5cGV8fCJzdHJpbmciPT10eXBlb2YgdHlwZSYmKCJudW1iZXIiPT09dHlwZXx8InN0cmluZyI9PT10eXBlfHwiYm9vbGVhbiI9PT10eXBlKSwiaW52YWxpZCB0eXBlOiBtdXN0IGJlIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuIikmJmFwaS5hc3NlcnQodm9pZCAwPT09aXNSZWFkT25seXx8ImJvb2xlYW4iPT10eXBlb2YgaXNSZWFkT25seSwiaW52YWxpZCBpc1JlYWRPbmx5OiBtdXN0IGJlIHRydWUgb3IgZmFsc2UiKSl7Y29uc3QgbmZ0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnN5bWJvbH0pO2lmKG5mdCYmYXBpLmFzc2VydCgwPT09bmZ0LnN1cHBseSwiY2Fubm90IGNoYW5nZSBkYXRhIHByb3BlcnR5IGRlZmluaXRpb247IHRva2VucyBhbHJlYWR5IGlzc3VlZCIpJiZhcGkuYXNzZXJ0KG5hbWUgaW4gbmZ0LnByb3BlcnRpZXMsInByb3BlcnR5IG11c3QgZXhpc3QiKSYmYXBpLmFzc2VydChuZnQuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikpe2lmKHZvaWQgMCE9PW5ld05hbWUpe2lmKHZvaWQgMCE9PW5mdC5ncm91cEJ5JiYwPG5mdC5ncm91cEJ5Lmxlbmd0aCYmIWFwaS5hc3NlcnQoIW5mdC5ncm91cEJ5LmluY2x1ZGVzKG5hbWUpLCJjYW5ub3QgY2hhbmdlIGRhdGEgcHJvcGVydHkgbmFtZTsgcHJvcGVydHkgaXMgcGFydCBvZiBncm91cEJ5IikpcmV0dXJuITE7aWYoIWFwaS5hc3NlcnQobmV3TmFtZSE9PW5hbWUsIm5ldyBuYW1lIG11c3QgYmUgZGlmZmVyZW50IGZyb20gb2xkIG5hbWUiKXx8IWFwaS5hc3NlcnQoIShuZXdOYW1lIGluIG5mdC5wcm9wZXJ0aWVzKSwidGhlcmUgaXMgYWxyZWFkeSBhIGRhdGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmV3IG5hbWUiKSlyZXR1cm4hMX1sZXQgc2hvdWxkVXBkYXRlPSExO29yaWdpbmFsVHlwZT1uZnQucHJvcGVydGllc1tuYW1lXS50eXBlLG9yaWdpbmFsSXNSZWFkT25seT1uZnQucHJvcGVydGllc1tuYW1lXS5pc1JlYWRPbmx5O3JldHVybiB2b2lkIDAhPT10eXBlJiZ0eXBlIT09b3JpZ2luYWxUeXBlJiYobmZ0LnByb3BlcnRpZXNbbmFtZV0udHlwZT10eXBlLHNob3VsZFVwZGF0ZT0hMCksdm9pZCAwIT09aXNSZWFkT25seSYmaXNSZWFkT25seSE9PW9yaWdpbmFsSXNSZWFkT25seSYmKG5mdC5wcm9wZXJ0aWVzW25hbWVdLmlzUmVhZE9ubHk9aXNSZWFkT25seSxzaG91bGRVcGRhdGU9ITApLHZvaWQgMCE9PW5ld05hbWUmJm5ld05hbWUhPT1uYW1lJiYobmZ0LnByb3BlcnRpZXNbbmV3TmFtZV09bmZ0LnByb3BlcnRpZXNbbmFtZV0sZGVsZXRlIG5mdC5wcm9wZXJ0aWVzW25hbWVdLHNob3VsZFVwZGF0ZT0hMCksc2hvdWxkVXBkYXRlJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsbmZ0KSxhcGkuZW1pdCgidXBkYXRlUHJvcGVydHlEZWZpbml0aW9uIix7c3ltYm9sOnN5bWJvbCxvcmlnaW5hbE5hbWU6bmFtZSxvcmlnaW5hbFR5cGU6b3JpZ2luYWxUeXBlLG9yaWdpbmFsSXNSZWFkT25seTpvcmlnaW5hbElzUmVhZE9ubHksbmV3TmFtZTpuZXdOYW1lLG5ld1R5cGU6dHlwZSxuZXdJc1JlYWRPbmx5OmlzUmVhZE9ubHl9KSksITB9fXJldHVybiExfSxhY3Rpb25zLmFkZFByb3BlcnR5PWFzeW5jIHJlcz0+e3ZhcntzeW1ib2wsbmFtZSx0eXBlLGlzUmVhZE9ubHksYXV0aG9yaXplZEVkaXRpbmdBY2NvdW50cyxhdXRob3JpemVkRWRpdGluZ0NvbnRyYWN0cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXl9PXJlcyxpbml0aWFsQWNjb3VudExpc3Q9KGF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KSlbImRhdGFQcm9wZXJ0eUNyZWF0aW9uRmVlIl07aWYoYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoc3ltYm9sJiYic3RyaW5nIj09dHlwZW9mIHN5bWJvbCYmbmFtZSYmInN0cmluZyI9PXR5cGVvZiBuYW1lJiYodm9pZCAwPT09aXNSZWFkT25seXx8ImJvb2xlYW4iPT10eXBlb2YgaXNSZWFkT25seSkmJih2b2lkIDA9PT1hdXRob3JpemVkRWRpdGluZ0FjY291bnRzfHxhdXRob3JpemVkRWRpdGluZ0FjY291bnRzJiYib2JqZWN0Ij09dHlwZW9mIGF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHMmJkFycmF5LmlzQXJyYXkoYXV0aG9yaXplZEVkaXRpbmdBY2NvdW50cykpJiYodm9pZCAwPT09YXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHN8fGF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzJiYib2JqZWN0Ij09dHlwZW9mIGF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzJiZBcnJheS5pc0FycmF5KGF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzKSkmJnR5cGUmJiJzdHJpbmciPT10eXBlb2YgdHlwZSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKG5hbWUpJiYwPG5hbWUubGVuZ3RoJiZuYW1lLmxlbmd0aDw9MjUsImludmFsaWQgbmFtZTogbGV0dGVycyAmIG51bWJlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAyNSIpJiZhcGkuYXNzZXJ0KCJudW1iZXIiPT09dHlwZXx8InN0cmluZyI9PT10eXBlfHwiYm9vbGVhbiI9PT10eXBlLCJpbnZhbGlkIHR5cGU6IG11c3QgYmUgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW4iKSl7Y29uc3QgbmZ0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnN5bWJvbH0pO2lmKG5mdCYmYXBpLmFzc2VydCghKG5hbWUgaW4gbmZ0LnByb3BlcnRpZXMpLCJjYW5ub3QgYWRkIHRoZSBzYW1lIHByb3BlcnR5IHR3aWNlIikmJmFwaS5hc3NlcnQobmZ0Lmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtpZigzPD1PYmplY3Qua2V5cyhuZnQucHJvcGVydGllcykubGVuZ3RoKXtyZXM9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJiYWxhbmNlcyIse2FjY291bnQ6YXBpLnNlbmRlcixzeW1ib2w6VVRJTElUWV9UT0tFTl9TWU1CT0x9KSxyZXM9ISFhcGkuQmlnTnVtYmVyKGluaXRpYWxBY2NvdW50TGlzdCkubHRlKDApfHxyZXMmJmFwaS5CaWdOdW1iZXIocmVzLmJhbGFuY2UpLmd0ZShpbml0aWFsQWNjb3VudExpc3QpO2lmKCFhcGkuYXNzZXJ0KHJlcywieW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSBjcmVhdGlvbiBmZWVzIikpcmV0dXJuITE7aWYoYXBpLkJpZ051bWJlcihpbml0aWFsQWNjb3VudExpc3QpLmd0KDApKXtyZXM9YXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ0b2tlbnMiLCJ0cmFuc2ZlciIse3RvOiJudWxsIixzeW1ib2w6VVRJTElUWV9UT0tFTl9TWU1CT0wscXVhbnRpdHk6aW5pdGlhbEFjY291bnRMaXN0LGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppc1NpZ25lZFdpdGhBY3RpdmVLZXl9KTtpZighaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQocmVzLGFwaS5zZW5kZXIsIm51bGwiLFVUSUxJVFlfVE9LRU5fU1lNQk9MLGluaXRpYWxBY2NvdW50TGlzdCwidHJhbnNmZXIiKSlyZXR1cm4hMX19aW5pdGlhbEFjY291bnRMaXN0PXZvaWQgMD09PWF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM/W2FwaS5zZW5kZXJdOltdO3JldHVybiBuZnQucHJvcGVydGllc1tuYW1lXT17dHlwZTp0eXBlLGlzUmVhZE9ubHk6dm9pZCAwIT09aXNSZWFkT25seSYmaXNSZWFkT25seSxhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOmluaXRpYWxBY2NvdW50TGlzdCxhdXRob3JpemVkRWRpdGluZ0NvbnRyYWN0czpbXX0sYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsbmZ0KSwoYXV0aG9yaXplZEVkaXRpbmdBY2NvdW50c3x8YXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHMpJiZhd2FpdCBhY3Rpb25zLnNldFByb3BlcnR5UGVybWlzc2lvbnMoe3N5bWJvbDpzeW1ib2wsbmFtZTpuYW1lLGFjY291bnRzOmF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHMsY29udHJhY3RzOmF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppc1NpZ25lZFdpdGhBY3RpdmVLZXl9KSwhMH19cmV0dXJuITF9LGFjdGlvbnMuc2V0UHJvcGVydHlQZXJtaXNzaW9ucz1hc3luYyBwYXlsb2FkPT57Y29uc3R7c3ltYm9sLG5hbWUsYWNjb3VudHMsY29udHJhY3RzLGlzU2lnbmVkV2l0aEFjdGl2ZUtleX09cGF5bG9hZDtpZihhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChzeW1ib2wmJiJzdHJpbmciPT10eXBlb2Ygc3ltYm9sJiZuYW1lJiYic3RyaW5nIj09dHlwZW9mIG5hbWUmJih2b2lkIDA9PT1hY2NvdW50c3x8YWNjb3VudHMmJiJvYmplY3QiPT10eXBlb2YgYWNjb3VudHMmJkFycmF5LmlzQXJyYXkoYWNjb3VudHMpKSYmKHZvaWQgMD09PWNvbnRyYWN0c3x8Y29udHJhY3RzJiYib2JqZWN0Ij09dHlwZW9mIGNvbnRyYWN0cyYmQXJyYXkuaXNBcnJheShjb250cmFjdHMpKSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKG5hbWUpJiYwPG5hbWUubGVuZ3RoJiZuYW1lLmxlbmd0aDw9MjUsImludmFsaWQgbmFtZTogbGV0dGVycyAmIG51bWJlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAyNSIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWFjY291bnRzfHxhY2NvdW50cy5sZW5ndGg8PU1BWF9OVU1fQVVUSE9SSVpFRF9JU1NVRVJTLGBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gJHtNQVhfTlVNX0FVVEhPUklaRURfSVNTVUVSU30gYXV0aG9yaXplZCBhY2NvdW50c2ApJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWNvbnRyYWN0c3x8Y29udHJhY3RzLmxlbmd0aDw9TUFYX05VTV9BVVRIT1JJWkVEX0lTU1VFUlMsYGNhbm5vdCBoYXZlIG1vcmUgdGhhbiAke01BWF9OVU1fQVVUSE9SSVpFRF9JU1NVRVJTfSBhdXRob3JpemVkIGNvbnRyYWN0c2ApJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWFjY291bnRzfHxpc1ZhbGlkQWNjb3VudHNBcnJheShhY2NvdW50cyksImludmFsaWQgYWNjb3VudCBsaXN0IikmJmFwaS5hc3NlcnQodm9pZCAwPT09Y29udHJhY3RzfHxpc1ZhbGlkQ29udHJhY3RzQXJyYXkoY29udHJhY3RzKSwiaW52YWxpZCBjb250cmFjdCBsaXN0Iikpe2NvbnN0IG5mdD1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzeW1ib2x9KTtpZihuZnQmJmFwaS5hc3NlcnQobmFtZSBpbiBuZnQucHJvcGVydGllcywicHJvcGVydHkgbXVzdCBleGlzdCIpJiZhcGkuYXNzZXJ0KG5mdC5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl7bGV0IHNhbml0aXplZEFjY291bnRMaXN0PVtdLHNhbml0aXplZENvbnRyYWN0TGlzdD1bXTtpZihhY2NvdW50cyYmKHNhbml0aXplZEFjY291bnRMaXN0PWFjY291bnRzLm1hcChhY2NvdW50PT5hY2NvdW50LnRyaW0oKS50b0xvd2VyQ2FzZSgpKSksY29udHJhY3RzJiYoc2FuaXRpemVkQ29udHJhY3RMaXN0PWNvbnRyYWN0cy5tYXAoY29udHJhY3Q9PmNvbnRyYWN0LnRyaW0oKSkpLGFwaS5hc3NlcnQodm9pZCAwPT09YWNjb3VudHN8fCFjb250YWluc0R1cGxpY2F0ZXMoc2FuaXRpemVkQWNjb3VudExpc3QpLCJjYW5ub3QgYWRkIHRoZSBzYW1lIGFjY291bnQgdHdpY2UiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1jb250cmFjdHN8fCFjb250YWluc0R1cGxpY2F0ZXMoc2FuaXRpemVkQ29udHJhY3RMaXN0KSwiY2Fubm90IGFkZCB0aGUgc2FtZSBjb250cmFjdCB0d2ljZSIpKXtsZXQgc2hvdWxkVXBkYXRlPSExO2FjY291bnRzJiYobmZ0LnByb3BlcnRpZXNbbmFtZV0uYXV0aG9yaXplZEVkaXRpbmdBY2NvdW50cz1zYW5pdGl6ZWRBY2NvdW50TGlzdCxzaG91bGRVcGRhdGU9ITApLGNvbnRyYWN0cyYmKG5mdC5wcm9wZXJ0aWVzW25hbWVdLmF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzPXNhbml0aXplZENvbnRyYWN0TGlzdCxzaG91bGRVcGRhdGU9ITApLHNob3VsZFVwZGF0ZSYmYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsbmZ0KX19fX0sYWN0aW9ucy5zZXRHcm91cEJ5PWFzeW5jIGlzU2lnbmVkV2l0aEFjdGl2ZUtleT0+e3ZhcntzeW1ib2w6bmZ0UHJvcGVydHlDb3VudCxwcm9wZXJ0aWVzLGlzU2lnbmVkV2l0aEFjdGl2ZUtleX09aXNTaWduZWRXaXRoQWN0aXZlS2V5O2lmKGFwaS5hc3NlcnQoITA9PT1pc1NpZ25lZFdpdGhBY3RpdmVLZXksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KG5mdFByb3BlcnR5Q291bnQmJiJzdHJpbmciPT10eXBlb2YgbmZ0UHJvcGVydHlDb3VudCYmcHJvcGVydGllcyYmIm9iamVjdCI9PXR5cGVvZiBwcm9wZXJ0aWVzJiZBcnJheS5pc0FycmF5KHByb3BlcnRpZXMpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBuZnQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6bmZ0UHJvcGVydHlDb3VudH0pO2lmKG5mdCl7bmZ0UHJvcGVydHlDb3VudD1PYmplY3Qua2V5cyhuZnQucHJvcGVydGllcykubGVuZ3RoO2lmKGFwaS5hc3NlcnQobmZ0Lmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PW5mdC5ncm91cEJ5fHwwPT09bmZ0Lmdyb3VwQnkubGVuZ3RoLCJsaXN0IGlzIGFscmVhZHkgc2V0IikmJmFwaS5hc3NlcnQocHJvcGVydGllcy5sZW5ndGg8PW5mdFByb3BlcnR5Q291bnQsImNhbm5vdCBzZXQgbW9yZSBkYXRhIHByb3BlcnRpZXMgdGhhbiBORlQgaGFzIikmJmFwaS5hc3NlcnQoIWNvbnRhaW5zRHVwbGljYXRlcyhwcm9wZXJ0aWVzKSwibGlzdCBjYW5ub3QgY29udGFpbiBkdXBsaWNhdGVzIikpe2ZvcihsZXQgaT0wO2k8cHJvcGVydGllcy5sZW5ndGg7aSs9MSl7dmFyIG5hbWU9cHJvcGVydGllc1tpXTtpZighYXBpLmFzc2VydChuYW1lJiYic3RyaW5nIj09dHlwZW9mIG5hbWUmJm5hbWUgaW4gbmZ0LnByb3BlcnRpZXMsImRhdGEgcHJvcGVydHkgbXVzdCBleGlzdCIpKXJldHVybiExfXJldHVybiBuZnQuZ3JvdXBCeT1wcm9wZXJ0aWVzLGF3YWl0IGFwaS5kYi51cGRhdGUoIm5mdHMiLG5mdCksITB9fX1yZXR1cm4hMX0sYWN0aW9ucy5zZXRQcm9wZXJ0aWVzPWFzeW5jIGZpbmFsRnJvbT0+e3ZhcntzeW1ib2wsZnJvbVR5cGU6ZmluYWxGcm9tVHlwZSxuZnRzLGNhbGxpbmdDb250cmFjdEluZm86ZmluYWxGcm9tfT1maW5hbEZyb20sZmluYWxGcm9tVHlwZT12b2lkIDA9PT1maW5hbEZyb21UeXBlPyJ1c2VyIjpmaW5hbEZyb21UeXBlO2lmKGFwaS5hc3NlcnQobmZ0cyYmIm9iamVjdCI9PXR5cGVvZiBuZnRzJiZBcnJheS5pc0FycmF5KG5mdHMpJiZmaW5hbEZyb21UeXBlJiYic3RyaW5nIj09dHlwZW9mIGZpbmFsRnJvbVR5cGUmJlsidXNlciIsImNvbnRyYWN0Il0uaW5jbHVkZXMoZmluYWxGcm9tVHlwZSkmJnN5bWJvbCYmInN0cmluZyI9PXR5cGVvZiBzeW1ib2wmJihmaW5hbEZyb218fHZvaWQgMD09PWZpbmFsRnJvbSYmInVzZXIiPT09ZmluYWxGcm9tVHlwZSksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQobmZ0cy5sZW5ndGg8PU1BWF9OVU1fTkZUU19FRElUQUJMRSxgY2Fubm90IHNldCBwcm9wZXJ0aWVzIG9uIG1vcmUgdGhhbiAke01BWF9OVU1fTkZUU19FRElUQUJMRX0gTkZUIGluc3RhbmNlcyBhdCBvbmNlYCkpe3ZhciBmaW5hbEZyb209InVzZXIiPT09ZmluYWxGcm9tVHlwZT9hcGkuc2VuZGVyOmZpbmFsRnJvbS5uYW1lLG5mdD1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzeW1ib2x9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1uZnQsInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpKXtpZighaXNWYWxpZERhdGFQcm9wZXJ0aWVzQXJyYXkoZmluYWxGcm9tLGZpbmFsRnJvbVR5cGUsbmZ0LG5mdHMpKXJldHVybiExO3ZhciBpbnN0YW5jZVRhYmxlTmFtZT1zeW1ib2wrImluc3RhbmNlcyI7Zm9yKGxldCBpPTA7aTxuZnRzLmxlbmd0aDtpKz0xKXt2YXJ7aWQscHJvcGVydGllc309bmZ0c1tpXTtpZigwIT09T2JqZWN0LmtleXMocHJvcGVydGllcykubGVuZ3RoKXtjb25zdCBuZnRJbnN0YW5jZT1hd2FpdCBhcGkuZGIuZmluZE9uZShpbnN0YW5jZVRhYmxlTmFtZSx7X2lkOmFwaS5CaWdOdW1iZXIoaWQpLnRvTnVtYmVyKCl9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1uZnRJbnN0YW5jZSwibmZ0IGluc3RhbmNlIGRvZXMgbm90IGV4aXN0Iikpe2xldCBzaG91bGRVcGRhdGU9ITE7Zm9yKHZhcltuYW1lLGRhdGFdb2YgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykpe2xldCBvbGRQcm9wZXJ0eT1udWxsO25mdC5wcm9wZXJ0aWVzW25hbWVdLmlzUmVhZE9ubHk/YXBpLmFzc2VydCghKG5hbWUgaW4gbmZ0SW5zdGFuY2UucHJvcGVydGllcyksImNhbm5vdCBlZGl0IHJlYWQtb25seSBwcm9wZXJ0aWVzIikmJihuZnRJbnN0YW5jZS5wcm9wZXJ0aWVzW25hbWVdPWRhdGEsc2hvdWxkVXBkYXRlPSEwKToob2xkUHJvcGVydHk9bmZ0SW5zdGFuY2UucHJvcGVydGllc1tuYW1lXSxuZnRJbnN0YW5jZS5wcm9wZXJ0aWVzW25hbWVdPWRhdGEsc2hvdWxkVXBkYXRlPSEwKSxzaG91bGRVcGRhdGUmJm9sZFByb3BlcnR5IT09ZGF0YSYmYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJtaW5pbmciLCJoYW5kbGVOZnRTZXRQcm9wZXJ0eSIse3N5bWJvbDpzeW1ib2wsbmZ0Om5mdEluc3RhbmNlLHByb3BlcnR5TmFtZTpuYW1lLG9sZFZhbHVlOm9sZFByb3BlcnR5fSl9c2hvdWxkVXBkYXRlJiZhd2FpdCBhcGkuZGIudXBkYXRlKGluc3RhbmNlVGFibGVOYW1lLG5mdEluc3RhbmNlKX19fXJldHVybiEwfX1yZXR1cm4hMX0sYWN0aW9ucy5idXJuPWFzeW5jIGNhbGxpbmdDb250cmFjdEluZm89Pnt2YXJ7ZnJvbVR5cGUsbmZ0cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXksY2FsbGluZ0NvbnRyYWN0SW5mb309Y2FsbGluZ0NvbnRyYWN0SW5mbyxmaW5hbEZyb21UeXBlPXZvaWQgMD09PWZyb21UeXBlPyJ1c2VyIjpmcm9tVHlwZTtpZihhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChmaW5hbEZyb21UeXBlJiYic3RyaW5nIj09dHlwZW9mIGZpbmFsRnJvbVR5cGUmJlsidXNlciIsImNvbnRyYWN0Il0uaW5jbHVkZXMoZmluYWxGcm9tVHlwZSkmJihjYWxsaW5nQ29udHJhY3RJbmZvfHx2b2lkIDA9PT1jYWxsaW5nQ29udHJhY3RJbmZvJiYidXNlciI9PT1maW5hbEZyb21UeXBlKSYmbmZ0cyYmIm9iamVjdCI9PXR5cGVvZiBuZnRzJiZBcnJheS5pc0FycmF5KG5mdHMpLCJpbnZhbGlkIHBhcmFtcyIpJiZpc1ZhbGlkTmZ0SWRBcnJheShuZnRzKSl7dmFyIGZpbmFsRnJvbT0idXNlciI9PT1maW5hbEZyb21UeXBlP2FwaS5zZW5kZXI6Y2FsbGluZ0NvbnRyYWN0SW5mby5uYW1lO2xldCBjb250YWluZXJDb3VudD0wLHRva2VuQ291bnQ9MCxpc0ZpcnN0SW5zdGFuY2VDb250YWluZXI9ITE7Zm9yKGxldCBpPTA7aTxuZnRzLmxlbmd0aDtpKz0xKXt2YXJ7c3ltYm9sLGlkc309bmZ0c1tpXTtjb25zdCBuZnQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6c3ltYm9sfSk7aWYobmZ0KXt2YXIgaW5zdGFuY2VUYWJsZU5hbWU9c3ltYm9sKyJpbnN0YW5jZXMiO2ZvcihsZXQgaj0wO2o8aWRzLmxlbmd0aDtqKz0xKXt2YXIgaWQ9aWRzW2pdO2NvbnN0IG5mdEluc3RhbmNlPWF3YWl0IGFwaS5kYi5maW5kT25lKGluc3RhbmNlVGFibGVOYW1lLHtfaWQ6YXBpLkJpZ051bWJlcihpZCkudG9OdW1iZXIoKX0pO2lmKG5mdEluc3RhbmNlKXtsZXQgaXNCdXJuQXV0aG9yaXplZD0hMDtpZihuZnRJbnN0YW5jZS5sb2NrZWROZnRzJiYwPG5mdEluc3RhbmNlLmxvY2tlZE5mdHMubGVuZ3RoPygwPT09dG9rZW5Db3VudCYmKGlzRmlyc3RJbnN0YW5jZUNvbnRhaW5lcj0hMCksY29udGFpbmVyQ291bnQrPTEsKGNvbnRhaW5lckNvdW50Pk1BWF9OVU1fQ09OVEFJTkVSX05GVFNfT1BFUkFCTEV8fCFpc0ZpcnN0SW5zdGFuY2VDb250YWluZXIpJiYoaXNCdXJuQXV0aG9yaXplZD0hMSkpOmlzRmlyc3RJbnN0YW5jZUNvbnRhaW5lciYmKGlzQnVybkF1dGhvcml6ZWQ9ITEpLHRva2VuQ291bnQrPTEsbmZ0SW5zdGFuY2UuYWNjb3VudD09PWZpbmFsRnJvbSYmKCJ1Ij09PW5mdEluc3RhbmNlLm93bmVkQnkmJiJ1c2VyIj09PWZpbmFsRnJvbVR5cGV8fCJjIj09PW5mdEluc3RhbmNlLm93bmVkQnkmJiJjb250cmFjdCI9PT1maW5hbEZyb21UeXBlKSYmdm9pZCAwPT09bmZ0SW5zdGFuY2UuZGVsZWdhdGVkVG8mJmlzQnVybkF1dGhvcml6ZWQpe2NvbnN0IGZpbmFsTG9ja1Rva2Vucz17fTtsZXQgaXNUcmFuc2ZlclN1Y2Nlc3M9ITA7Zm9yKHZhcltsb2Nrc3ltYm9sLHF1YW50aXR5XW9mIE9iamVjdC5lbnRyaWVzKG5mdEluc3RhbmNlLmxvY2tlZFRva2Vucykpe3ZhciByZXM9YXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGZpbmFsRnJvbSxsb2Nrc3ltYm9sLHF1YW50aXR5LGZpbmFsRnJvbVR5cGUpO2lzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKHJlcywibmZ0IixmaW5hbEZyb20sbG9ja3N5bWJvbCxxdWFudGl0eSwidHJhbnNmZXJGcm9tQ29udHJhY3QiKXx8KGZpbmFsTG9ja1Rva2Vuc1tsb2Nrc3ltYm9sXT1xdWFudGl0eSxpc1RyYW5zZmVyU3VjY2Vzcz0hMSl9YXBpLmFzc2VydChpc1RyYW5zZmVyU3VjY2VzcyxgdW5hYmxlIHRvIHJlbGVhc2UgbG9ja2VkIHRva2VucyBpbjogJHtzeW1ib2x9LCBpZCBgK2lkKTt2YXIgb3JpZ0xvY2tOZnRzPW5mdEluc3RhbmNlLmxvY2tlZE5mdHMmJjA8bmZ0SW5zdGFuY2UubG9ja2VkTmZ0cy5sZW5ndGg/bmZ0SW5zdGFuY2UubG9ja2VkTmZ0czpbXTtpZihpc1RyYW5zZmVyU3VjY2VzcyYmbmZ0SW5zdGFuY2UubG9ja2VkTmZ0cyYmMDxuZnRJbnN0YW5jZS5sb2NrZWROZnRzLmxlbmd0aCl7Y29uc3QgcmVzPWF3YWl0IHRyYW5zZmVyQW5kVmVyaWZ5TmZ0cyhDT05UUkFDVF9OQU1FLCJjb250cmFjdCIsZmluYWxGcm9tLGZpbmFsRnJvbVR5cGUsbmZ0SW5zdGFuY2UubG9ja2VkTmZ0cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXkse25hbWU6Q09OVFJBQ1RfTkFNRX0pO25mdEluc3RhbmNlLmxvY2tlZE5mdHM9cmVzLmZhaWwsMDxuZnRJbnN0YW5jZS5sb2NrZWROZnRzLmxlbmd0aCYmKGlzVHJhbnNmZXJTdWNjZXNzPSExKSxhcGkuYXNzZXJ0KGlzVHJhbnNmZXJTdWNjZXNzLGB1bmFibGUgdG8gcmVsZWFzZSBsb2NrZWQgTkZUIGluc3RhbmNlcyBpbjogJHtzeW1ib2x9LCBpZCBgK2lkKX12YXIgb3JpZ093bmVkQnk9bmZ0SW5zdGFuY2Uub3duZWRCeSxvcmlnTG9ja1Rva2Vucz1uZnRJbnN0YW5jZS5sb2NrZWRUb2tlbnM7bmZ0SW5zdGFuY2UubG9ja2VkVG9rZW5zPWZpbmFsTG9ja1Rva2Vucyxpc1RyYW5zZmVyU3VjY2VzcyYmKG5mdEluc3RhbmNlLnByZXZpb3VzQWNjb3VudD1uZnRJbnN0YW5jZS5hY2NvdW50LG5mdEluc3RhbmNlLnByZXZpb3VzT3duZWRCeT1uZnRJbnN0YW5jZS5vd25lZEJ5LG5mdEluc3RhbmNlLmFjY291bnQ9Im51bGwiLG5mdEluc3RhbmNlLm93bmVkQnk9InUiLC0tbmZ0LmNpcmN1bGF0aW5nU3VwcGx5KSxhd2FpdCBhcGkuZGIudXBkYXRlKGluc3RhbmNlVGFibGVOYW1lLG5mdEluc3RhbmNlKSxpc1RyYW5zZmVyU3VjY2VzcyYmYXBpLmVtaXQoImJ1cm4iLHthY2NvdW50OmZpbmFsRnJvbSxvd25lZEJ5Om9yaWdPd25lZEJ5LHVubG9ja2VkVG9rZW5zOm9yaWdMb2NrVG9rZW5zLHVubG9ja2VkTmZ0czpvcmlnTG9ja05mdHMsc3ltYm9sOnN5bWJvbCxpZDppZH0pfX19YXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsbmZ0KX19fX0sYWN0aW9ucy50cmFuc2Zlcj1hc3luYyB0b1ZhbGlkPT57Y29uc3R7ZnJvbVR5cGUsdG8sdG9UeXBlLG5mdHMsaXNTaWduZWRXaXRoQWN0aXZlS2V5LGNhbGxpbmdDb250cmFjdEluZm99PXRvVmFsaWQsdHlwZXM9WyJ1c2VyIiwiY29udHJhY3QiXTt2YXIgZmluYWxUb1R5cGU9dm9pZCAwPT09dG9UeXBlPyJ1c2VyIjp0b1R5cGUsZmluYWxGcm9tVHlwZT12b2lkIDA9PT1mcm9tVHlwZT8idXNlciI6ZnJvbVR5cGU7aWYoYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZmluYWxGcm9tVHlwZSYmInN0cmluZyI9PXR5cGVvZiBmaW5hbEZyb21UeXBlJiZ0eXBlcy5pbmNsdWRlcyhmaW5hbEZyb21UeXBlKSYmdG8mJiJzdHJpbmciPT10eXBlb2YgdG8mJmZpbmFsVG9UeXBlJiYic3RyaW5nIj09dHlwZW9mIGZpbmFsVG9UeXBlJiZ0eXBlcy5pbmNsdWRlcyhmaW5hbFRvVHlwZSkmJihjYWxsaW5nQ29udHJhY3RJbmZvfHx2b2lkIDA9PT1jYWxsaW5nQ29udHJhY3RJbmZvJiYidXNlciI9PT1maW5hbEZyb21UeXBlKSYmbmZ0cyYmIm9iamVjdCI9PXR5cGVvZiBuZnRzJiZBcnJheS5pc0FycmF5KG5mdHMpLCJpbnZhbGlkIHBhcmFtcyIpJiZpc1ZhbGlkTmZ0SWRBcnJheShuZnRzKSl7dmFyIGZpbmFsVG89InVzZXIiPT09ZmluYWxUb1R5cGU/dG8udHJpbSgpLnRvTG93ZXJDYXNlKCk6dG8udHJpbSgpLHRvVmFsaWQ9KCJ1c2VyIj09PWZpbmFsVG9UeXBlP2lzVmFsaWRIaXZlQWNjb3VudExlbmd0aDppc1ZhbGlkQ29udHJhY3RMZW5ndGgpKGZpbmFsVG8pLGZpbmFsRnJvbT0idXNlciI9PT1maW5hbEZyb21UeXBlP2FwaS5zZW5kZXI6Y2FsbGluZ0NvbnRyYWN0SW5mby5uYW1lO2lmKGFwaS5hc3NlcnQodG9WYWxpZCwiaW52YWxpZCB0byIpJiZhcGkuYXNzZXJ0KCEoZmluYWxUb1R5cGU9PT1maW5hbEZyb21UeXBlJiZmaW5hbFRvPT09ZmluYWxGcm9tKSwiY2Fubm90IHRyYW5zZmVyIHRvIHNlbGYiKSYmYXBpLmFzc2VydCghKCJ1c2VyIj09PWZpbmFsVG9UeXBlJiYibnVsbCI9PT1maW5hbFRvKSwiY2Fubm90IHRyYW5zZmVyIHRvIG51bGw7IHVzZSBidXJuIGFjdGlvbiBpbnN0ZWFkIikpZm9yKGxldCBpPTA7aTxuZnRzLmxlbmd0aDtpKz0xKXt2YXJ7c3ltYm9sLGlkc309bmZ0c1tpXTtpZihhd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzeW1ib2x9KSl7dmFyIGluc3RhbmNlVGFibGVOYW1lPXN5bWJvbCsiaW5zdGFuY2VzIjtmb3IobGV0IGo9MDtqPGlkcy5sZW5ndGg7ais9MSl7dmFyIG9yaWdPd25lZEJ5LG5ld093bmVkQnksaWQ9aWRzW2pdO2NvbnN0IG5mdEluc3RhbmNlPWF3YWl0IGFwaS5kYi5maW5kT25lKGluc3RhbmNlVGFibGVOYW1lLHtfaWQ6YXBpLkJpZ051bWJlcihpZCkudG9OdW1iZXIoKX0pO25mdEluc3RhbmNlJiZuZnRJbnN0YW5jZS5hY2NvdW50PT09ZmluYWxGcm9tJiYoInUiPT09bmZ0SW5zdGFuY2Uub3duZWRCeSYmInVzZXIiPT09ZmluYWxGcm9tVHlwZXx8ImMiPT09bmZ0SW5zdGFuY2Uub3duZWRCeSYmImNvbnRyYWN0Ij09PWZpbmFsRnJvbVR5cGUpJiZ2b2lkIDA9PT1uZnRJbnN0YW5jZS5kZWxlZ2F0ZWRUbyYmKG9yaWdPd25lZEJ5PW5mdEluc3RhbmNlLm93bmVkQnksbmV3T3duZWRCeT0idXNlciI9PT1maW5hbFRvVHlwZT8idSI6ImMiLG5mdEluc3RhbmNlLnByZXZpb3VzQWNjb3VudD1uZnRJbnN0YW5jZS5hY2NvdW50LG5mdEluc3RhbmNlLnByZXZpb3VzT3duZWRCeT1uZnRJbnN0YW5jZS5vd25lZEJ5LG5mdEluc3RhbmNlLmFjY291bnQ9ZmluYWxUbyxuZnRJbnN0YW5jZS5vd25lZEJ5PW5ld093bmVkQnksYXdhaXQgYXBpLmRiLnVwZGF0ZShpbnN0YW5jZVRhYmxlTmFtZSxuZnRJbnN0YW5jZSksYXBpLmVtaXQoInRyYW5zZmVyIix7ZnJvbTpmaW5hbEZyb20sZnJvbVR5cGU6b3JpZ093bmVkQnksdG86ZmluYWxUbyx0b1R5cGU6bmV3T3duZWRCeSxzeW1ib2w6c3ltYm9sLGlkOmlkfSkpfX19fX0sYWN0aW9ucy5kZWxlZ2F0ZT1hc3luYyB0b1ZhbGlkPT57Y29uc3R7ZnJvbVR5cGUsdG8sdG9UeXBlLG5mdHMsaXNTaWduZWRXaXRoQWN0aXZlS2V5LGNhbGxpbmdDb250cmFjdEluZm99PXRvVmFsaWQsdHlwZXM9WyJ1c2VyIiwiY29udHJhY3QiXTt2YXIgZmluYWxUb1R5cGU9dm9pZCAwPT09dG9UeXBlPyJ1c2VyIjp0b1R5cGUsZmluYWxGcm9tVHlwZT12b2lkIDA9PT1mcm9tVHlwZT8idXNlciI6ZnJvbVR5cGU7aWYoYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZmluYWxGcm9tVHlwZSYmInN0cmluZyI9PXR5cGVvZiBmaW5hbEZyb21UeXBlJiZ0eXBlcy5pbmNsdWRlcyhmaW5hbEZyb21UeXBlKSYmdG8mJiJzdHJpbmciPT10eXBlb2YgdG8mJmZpbmFsVG9UeXBlJiYic3RyaW5nIj09dHlwZW9mIGZpbmFsVG9UeXBlJiZ0eXBlcy5pbmNsdWRlcyhmaW5hbFRvVHlwZSkmJihjYWxsaW5nQ29udHJhY3RJbmZvfHx2b2lkIDA9PT1jYWxsaW5nQ29udHJhY3RJbmZvJiYidXNlciI9PT1maW5hbEZyb21UeXBlKSYmbmZ0cyYmIm9iamVjdCI9PXR5cGVvZiBuZnRzJiZBcnJheS5pc0FycmF5KG5mdHMpLCJpbnZhbGlkIHBhcmFtcyIpJiZpc1ZhbGlkTmZ0SWRBcnJheShuZnRzKSl7dmFyIGZpbmFsVG89InVzZXIiPT09ZmluYWxUb1R5cGU/dG8udHJpbSgpLnRvTG93ZXJDYXNlKCk6dG8udHJpbSgpLHRvVmFsaWQ9KCJ1c2VyIj09PWZpbmFsVG9UeXBlP2lzVmFsaWRIaXZlQWNjb3VudExlbmd0aDppc1ZhbGlkQ29udHJhY3RMZW5ndGgpKGZpbmFsVG8pLGZpbmFsRnJvbT0idXNlciI9PT1maW5hbEZyb21UeXBlP2FwaS5zZW5kZXI6Y2FsbGluZ0NvbnRyYWN0SW5mby5uYW1lO2lmKGFwaS5hc3NlcnQodG9WYWxpZCwiaW52YWxpZCB0byIpJiZhcGkuYXNzZXJ0KCEoZmluYWxUb1R5cGU9PT1maW5hbEZyb21UeXBlJiZmaW5hbFRvPT09ZmluYWxGcm9tKSwiY2Fubm90IGRlbGVnYXRlIHRvIHNlbGYiKSYmYXBpLmFzc2VydCghKCJ1c2VyIj09PWZpbmFsVG9UeXBlJiYibnVsbCI9PT1maW5hbFRvKSwiY2Fubm90IGRlbGVnYXRlIHRvIG51bGwiKSlmb3IobGV0IGk9MDtpPG5mdHMubGVuZ3RoO2krPTEpe3ZhcntzeW1ib2wsaWRzfT1uZnRzW2ldLG5mdD1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzeW1ib2x9KTtpZihuZnQmJmFwaS5hc3NlcnQoITA9PT1uZnQuZGVsZWdhdGlvbkVuYWJsZWQsImRlbGVnYXRpb24gbm90IGVuYWJsZWQgZm9yICIrc3ltYm9sKSl7dmFyIGluc3RhbmNlVGFibGVOYW1lPXN5bWJvbCsiaW5zdGFuY2VzIjtmb3IobGV0IGo9MDtqPGlkcy5sZW5ndGg7ais9MSl7dmFyIG5ld093bmVkQnksaWQ9aWRzW2pdO2NvbnN0IG5mdEluc3RhbmNlPWF3YWl0IGFwaS5kYi5maW5kT25lKGluc3RhbmNlVGFibGVOYW1lLHtfaWQ6YXBpLkJpZ051bWJlcihpZCkudG9OdW1iZXIoKX0pO25mdEluc3RhbmNlJiZuZnRJbnN0YW5jZS5hY2NvdW50PT09ZmluYWxGcm9tJiYoInUiPT09bmZ0SW5zdGFuY2Uub3duZWRCeSYmInVzZXIiPT09ZmluYWxGcm9tVHlwZXx8ImMiPT09bmZ0SW5zdGFuY2Uub3duZWRCeSYmImNvbnRyYWN0Ij09PWZpbmFsRnJvbVR5cGUpJiZ2b2lkIDA9PT1uZnRJbnN0YW5jZS5kZWxlZ2F0ZWRUbyYmKG5ld093bmVkQnk9InVzZXIiPT09ZmluYWxUb1R5cGU/InUiOiJjIixuZnRJbnN0YW5jZS5kZWxlZ2F0ZWRUbz17YWNjb3VudDpmaW5hbFRvLG93bmVkQnk6bmV3T3duZWRCeX0sYXdhaXQgYXBpLmRiLnVwZGF0ZShpbnN0YW5jZVRhYmxlTmFtZSxuZnRJbnN0YW5jZSksYXBpLmVtaXQoImRlbGVnYXRlIix7ZnJvbTpmaW5hbEZyb20sZnJvbVR5cGU6bmZ0SW5zdGFuY2Uub3duZWRCeSx0bzpmaW5hbFRvLHRvVHlwZTpuZXdPd25lZEJ5LHN5bWJvbDpzeW1ib2wsaWQ6aWR9KSxhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoIm1pbmluZyIsImhhbmRsZU5mdERlbGVnYXRpb25DaGFuZ2UiLHtzeW1ib2w6c3ltYm9sLG5mdDpuZnRJbnN0YW5jZSxhZGQ6ITB9KSl9fX19fSxhY3Rpb25zLnVuZGVsZWdhdGU9YXN5bmMgY2FsbGluZ0NvbnRyYWN0SW5mbz0+e3Zhcntmcm9tVHlwZSxuZnRzLGlzU2lnbmVkV2l0aEFjdGl2ZUtleSxjYWxsaW5nQ29udHJhY3RJbmZvfT1jYWxsaW5nQ29udHJhY3RJbmZvLGZpbmFsRnJvbVR5cGU9dm9pZCAwPT09ZnJvbVR5cGU/InVzZXIiOmZyb21UeXBlO2lmKGFwaS5hc3NlcnQoITA9PT1pc1NpZ25lZFdpdGhBY3RpdmVLZXksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGZpbmFsRnJvbVR5cGUmJiJzdHJpbmciPT10eXBlb2YgZmluYWxGcm9tVHlwZSYmWyJ1c2VyIiwiY29udHJhY3QiXS5pbmNsdWRlcyhmaW5hbEZyb21UeXBlKSYmKGNhbGxpbmdDb250cmFjdEluZm98fHZvaWQgMD09PWNhbGxpbmdDb250cmFjdEluZm8mJiJ1c2VyIj09PWZpbmFsRnJvbVR5cGUpJiZuZnRzJiYib2JqZWN0Ij09dHlwZW9mIG5mdHMmJkFycmF5LmlzQXJyYXkobmZ0cyksImludmFsaWQgcGFyYW1zIikmJmlzVmFsaWROZnRJZEFycmF5KG5mdHMpKXt2YXIgZmluYWxGcm9tPSJ1c2VyIj09PWZpbmFsRnJvbVR5cGU/YXBpLnNlbmRlcjpjYWxsaW5nQ29udHJhY3RJbmZvLm5hbWU7Y29uc3QgYmxvY2tEYXRlPW5ldyBEYXRlKGFwaS5oaXZlQmxvY2tUaW1lc3RhbXArIi4wMDBaIik7Zm9yKGxldCBpPTA7aTxuZnRzLmxlbmd0aDtpKz0xKXt2YXJ7c3ltYm9sLGlkc309bmZ0c1tpXSxjb29sZG93blBlcmlvZE1pbGxpc2VjPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnN5bWJvbH0pO2lmKGNvb2xkb3duUGVyaW9kTWlsbGlzZWMmJmFwaS5hc3NlcnQoITA9PT1jb29sZG93blBlcmlvZE1pbGxpc2VjLmRlbGVnYXRpb25FbmFibGVkLCJkZWxlZ2F0aW9uIG5vdCBlbmFibGVkIGZvciAiK3N5bWJvbCkpe3ZhciBjb29sZG93blBlcmlvZE1pbGxpc2VjPTI0KmNvb2xkb3duUGVyaW9kTWlsbGlzZWMudW5kZWxlZ2F0aW9uQ29vbGRvd24qMzYwMCoxZTMsY29tcGxldGVUaW1lc3RhbXA9YmxvY2tEYXRlLmdldFRpbWUoKStjb29sZG93blBlcmlvZE1pbGxpc2VjLGluc3RhbmNlVGFibGVOYW1lPXN5bWJvbCsiaW5zdGFuY2VzIjtjb25zdCB1bmRlbGVnYXRpb249e3N5bWJvbDpzeW1ib2wsaWRzOltdLGNvbXBsZXRlVGltZXN0YW1wOmNvbXBsZXRlVGltZXN0YW1wfTtmb3IobGV0IGo9MDtqPGlkcy5sZW5ndGg7ais9MSl7dmFyIGlkPWlkc1tqXTtjb25zdCBuZnRJbnN0YW5jZT1hd2FpdCBhcGkuZGIuZmluZE9uZShpbnN0YW5jZVRhYmxlTmFtZSx7X2lkOmFwaS5CaWdOdW1iZXIoaWQpLnRvTnVtYmVyKCl9KTtuZnRJbnN0YW5jZSYmbmZ0SW5zdGFuY2UuYWNjb3VudD09PWZpbmFsRnJvbSYmKCJ1Ij09PW5mdEluc3RhbmNlLm93bmVkQnkmJiJ1c2VyIj09PWZpbmFsRnJvbVR5cGV8fCJjIj09PW5mdEluc3RhbmNlLm93bmVkQnkmJiJjb250cmFjdCI9PT1maW5hbEZyb21UeXBlKSYmbmZ0SW5zdGFuY2UuZGVsZWdhdGVkVG8mJnZvaWQgMD09PW5mdEluc3RhbmNlLmRlbGVnYXRlZFRvLnVuZGVsZWdhdGVBdCYmKG5mdEluc3RhbmNlLmRlbGVnYXRlZFRvLnVuZGVsZWdhdGVBdD1jb21wbGV0ZVRpbWVzdGFtcCx1bmRlbGVnYXRpb24uaWRzLnB1c2gobmZ0SW5zdGFuY2UuX2lkKSxhd2FpdCBhcGkuZGIudXBkYXRlKGluc3RhbmNlVGFibGVOYW1lLG5mdEluc3RhbmNlKSxhcGkuZW1pdCgidW5kZWxlZ2F0ZVN0YXJ0Iix7ZnJvbTpuZnRJbnN0YW5jZS5kZWxlZ2F0ZWRUby5hY2NvdW50LGZyb21UeXBlOm5mdEluc3RhbmNlLmRlbGVnYXRlZFRvLm93bmVkQnksc3ltYm9sOnN5bWJvbCxpZDppZH0pLGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgibWluaW5nIiwiaGFuZGxlTmZ0RGVsZWdhdGlvbkNoYW5nZSIse3N5bWJvbDpzeW1ib2wsbmZ0Om5mdEluc3RhbmNlLGFkZDohMX0pKX0wPHVuZGVsZWdhdGlvbi5pZHMubGVuZ3RoJiZhd2FpdCBhcGkuZGIuaW5zZXJ0KCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIsdW5kZWxlZ2F0aW9uKX19fX07Y29uc3QgcHJvY2Vzc1VuZGVsZWdhdGlvbj1hc3luYyB1bmRlbGVnYXRpb249Pnt2YXJ7c3ltYm9sLGlkc309dW5kZWxlZ2F0aW9uLGluc3RhbmNlVGFibGVOYW1lPXN5bWJvbCsiaW5zdGFuY2VzIjtjb25zdCBpbnN0YW5jZXM9YXdhaXQgYXBpLmRiLmZpbmQoaW5zdGFuY2VUYWJsZU5hbWUse19pZDp7JGluOmlkc319LE1BWF9OVU1fTkZUU19PUEVSQUJMRSwwLFt7aW5kZXg6Il9pZCIsZGVzY2VuZGluZzohMX1dKTtmb3IobGV0IGk9MDtpPGluc3RhbmNlcy5sZW5ndGg7aSs9MSlkZWxldGUgaW5zdGFuY2VzW2ldLmRlbGVnYXRlZFRvLGF3YWl0IGFwaS5kYi51cGRhdGUoaW5zdGFuY2VUYWJsZU5hbWUsaW5zdGFuY2VzW2ldLHtkZWxlZ2F0ZWRUbzoiIn0pO2F3YWl0IGFwaS5kYi5yZW1vdmUoInBlbmRpbmdVbmRlbGVnYXRpb25zIix1bmRlbGVnYXRpb24pLGFwaS5lbWl0KCJ1bmRlbGVnYXRlRG9uZSIse3N5bWJvbDpzeW1ib2wsaWRzOmlkc30pfTthY3Rpb25zLmNoZWNrUGVuZGluZ1VuZGVsZWdhdGlvbnM9YXN5bmMoKT0+e2lmKGFwaS5hc3NlcnQoIm51bGwiPT09YXBpLnNlbmRlciwibm90IGF1dGhvcml6ZWQiKSl7Y29uc3QgYmxvY2tEYXRlPW5ldyBEYXRlKGFwaS5oaXZlQmxvY2tUaW1lc3RhbXArIi4wMDBaIik7dmFyIHRpbWVzdGFtcD1ibG9ja0RhdGUuZ2V0VGltZSgpO2xldCBwZW5kaW5nVW5kZWxlZ2F0aW9ucz1hd2FpdCBhcGkuZGIuZmluZCgicGVuZGluZ1VuZGVsZWdhdGlvbnMiLHtjb21wbGV0ZVRpbWVzdGFtcDp7JGx0ZTp0aW1lc3RhbXB9fSksbmJQZW5kaW5nVW5kZWxlZ2F0aW9ucz1wZW5kaW5nVW5kZWxlZ2F0aW9ucy5sZW5ndGg7Zm9yKDswPG5iUGVuZGluZ1VuZGVsZWdhdGlvbnM7KXtmb3IobGV0IGluZGV4PTA7aW5kZXg8bmJQZW5kaW5nVW5kZWxlZ2F0aW9ucztpbmRleCs9MSl7dmFyIHBlbmRpbmdVbmRlbGVnYXRpb249cGVuZGluZ1VuZGVsZWdhdGlvbnNbaW5kZXhdO2F3YWl0IHByb2Nlc3NVbmRlbGVnYXRpb24ocGVuZGluZ1VuZGVsZWdhdGlvbil9cGVuZGluZ1VuZGVsZWdhdGlvbnM9YXdhaXQgYXBpLmRiLmZpbmQoInBlbmRpbmdVbmRlbGVnYXRpb25zIix7Y29tcGxldGVUaW1lc3RhbXA6eyRsdGU6dGltZXN0YW1wfX0pLG5iUGVuZGluZ1VuZGVsZWdhdGlvbnM9cGVuZGluZ1VuZGVsZWdhdGlvbnMubGVuZ3RofX19LGFjdGlvbnMuY3JlYXRlPWFzeW5jIHJlcz0+e3ZhcntuYW1lLG9yZ05hbWU6ZmluYWxQcm9kdWN0TmFtZSxwcm9kdWN0TmFtZTptZXRhZGF0YSxzeW1ib2wsdXJsOmluc3RhbmNlVGFibGVOYW1lLG1heFN1cHBseTpmaW5hbE9yZ05hbWUsYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cyxhdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXl9PXJlcyxuZXdOZnQ9KGF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KSlbIm5mdENyZWF0aW9uRmVlIl0scmVzPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOlVUSUxJVFlfVE9LRU5fU1lNQk9MfSkscmVzPSEhYXBpLkJpZ051bWJlcihuZXdOZnQpLmx0ZSgwKXx8cmVzJiZhcGkuQmlnTnVtYmVyKHJlcy5iYWxhbmNlKS5ndGUobmV3TmZ0KTtpZihhcGkuYXNzZXJ0KHJlcywieW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSBjcmVhdGlvbiBmZWVzIikmJmFwaS5hc3NlcnQoITA9PT1pc1NpZ25lZFdpdGhBY3RpdmVLZXksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KG5hbWUmJiJzdHJpbmciPT10eXBlb2YgbmFtZSYmc3ltYm9sJiYic3RyaW5nIj09dHlwZW9mIHN5bWJvbCYmKHZvaWQgMD09PWluc3RhbmNlVGFibGVOYW1lfHxpbnN0YW5jZVRhYmxlTmFtZSYmInN0cmluZyI9PXR5cGVvZiBpbnN0YW5jZVRhYmxlTmFtZSkmJih2b2lkIDA9PT1maW5hbFByb2R1Y3ROYW1lfHxmaW5hbFByb2R1Y3ROYW1lJiYic3RyaW5nIj09dHlwZW9mIGZpbmFsUHJvZHVjdE5hbWUpJiYodm9pZCAwPT09bWV0YWRhdGF8fG1ldGFkYXRhJiYic3RyaW5nIj09dHlwZW9mIG1ldGFkYXRhKSYmKHZvaWQgMD09PWF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHN8fGF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMmJiJvYmplY3QiPT10eXBlb2YgYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cyYmQXJyYXkuaXNBcnJheShhdXRob3JpemVkSXNzdWluZ0FjY291bnRzKSkmJih2b2lkIDA9PT1hdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0c3x8YXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMmJiJvYmplY3QiPT10eXBlb2YgYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMmJkFycmF5LmlzQXJyYXkoYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMpKSYmKHZvaWQgMD09PWZpbmFsT3JnTmFtZXx8ZmluYWxPcmdOYW1lJiYic3RyaW5nIj09dHlwZW9mIGZpbmFsT3JnTmFtZSYmIWFwaS5CaWdOdW1iZXIoZmluYWxPcmdOYW1lKS5pc05hTigpKSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGEoc3ltYm9sKSYmYXBpLnZhbGlkYXRvci5pc1VwcGVyY2FzZShzeW1ib2wpJiYwPHN5bWJvbC5sZW5ndGgmJnN5bWJvbC5sZW5ndGg8PU1BWF9TWU1CT0xfTEVOR1RILCJpbnZhbGlkIHN5bWJvbDogdXBwZXJjYXNlIGxldHRlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAiK01BWF9TWU1CT0xfTEVOR1RIKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1SRVNFUlZFRF9TWU1CT0xTW3N5bWJvbF18fGFwaS5zZW5kZXI9PT1SRVNFUlZFRF9TWU1CT0xTW3N5bWJvbF0sImNhbm5vdCB1c2UgdGhpcyBzeW1ib2wiKSYmYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGFwaS52YWxpZGF0b3IuYmxhY2tsaXN0KG5hbWUsIiAiKSkmJjA8bmFtZS5sZW5ndGgmJm5hbWUubGVuZ3RoPD01MCwiaW52YWxpZCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikmJmFwaS5hc3NlcnQodm9pZCAwPT09ZmluYWxQcm9kdWN0TmFtZXx8YXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdChmaW5hbFByb2R1Y3ROYW1lLCIgIikpJiYwPGZpbmFsUHJvZHVjdE5hbWUubGVuZ3RoJiZmaW5hbFByb2R1Y3ROYW1lLmxlbmd0aDw9NTAsImludmFsaWQgb3JnIG5hbWU6IGxldHRlcnMsIG51bWJlcnMsIHdoaXRlc3BhY2VzIG9ubHksIG1heCBsZW5ndGggb2YgNTAiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1tZXRhZGF0YXx8YXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdChtZXRhZGF0YSwiICIpKSYmMDxtZXRhZGF0YS5sZW5ndGgmJm1ldGFkYXRhLmxlbmd0aDw9NTAsImludmFsaWQgcHJvZHVjdCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikmJmFwaS5hc3NlcnQodm9pZCAwPT09aW5zdGFuY2VUYWJsZU5hbWV8fGluc3RhbmNlVGFibGVOYW1lLmxlbmd0aDw9MjU1LCJpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1maW5hbE9yZ05hbWV8fGFwaS5CaWdOdW1iZXIoZmluYWxPcmdOYW1lKS5ndCgwKSwibWF4U3VwcGx5IG11c3QgYmUgcG9zaXRpdmUiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1maW5hbE9yZ05hbWV8fGFwaS5CaWdOdW1iZXIoZmluYWxPcmdOYW1lKS5sdGUoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLCJtYXhTdXBwbHkgbXVzdCBiZSBsb3dlciB0aGFuICIrTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKXtyZXM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6c3ltYm9sfSk7aWYoYXBpLmFzc2VydChudWxsPT09cmVzLCJzeW1ib2wgYWxyZWFkeSBleGlzdHMiKSl7aWYoYXBpLkJpZ051bWJlcihuZXdOZnQpLmd0KDApKXtyZXM9YXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ0b2tlbnMiLCJ0cmFuc2ZlciIse3RvOiJudWxsIixzeW1ib2w6VVRJTElUWV9UT0tFTl9TWU1CT0wscXVhbnRpdHk6bmV3TmZ0LGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppc1NpZ25lZFdpdGhBY3RpdmVLZXl9KTtpZighaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQocmVzLGFwaS5zZW5kZXIsIm51bGwiLFVUSUxJVFlfVE9LRU5fU1lNQk9MLG5ld05mdCwidHJhbnNmZXIiKSlyZXR1cm4hMX1uZXdOZnQ9dm9pZCAwPT09ZmluYWxPcmdOYW1lPzA6YXBpLkJpZ051bWJlcihmaW5hbE9yZ05hbWUpLmludGVnZXJWYWx1ZShhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pLnRvTnVtYmVyKCksZmluYWxPcmdOYW1lPXZvaWQgMD09PWZpbmFsUHJvZHVjdE5hbWU/IiI6ZmluYWxQcm9kdWN0TmFtZSxmaW5hbFByb2R1Y3ROYW1lPXZvaWQgMD09PW1ldGFkYXRhPyIiOm1ldGFkYXRhLG1ldGFkYXRhPXt1cmw6dm9pZCAwPT09aW5zdGFuY2VUYWJsZU5hbWU/IiI6aW5zdGFuY2VUYWJsZU5hbWV9LG1ldGFkYXRhPUpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSxpbnN0YW5jZVRhYmxlTmFtZT12b2lkIDA9PT1hdXRob3JpemVkSXNzdWluZ0FjY291bnRzP1thcGkuc2VuZGVyXTpbXSxuZXdOZnQ9e2lzc3VlcjphcGkuc2VuZGVyLHN5bWJvbDpzeW1ib2wsbmFtZTpuYW1lLG9yZ05hbWU6ZmluYWxPcmdOYW1lLHByb2R1Y3ROYW1lOmZpbmFsUHJvZHVjdE5hbWUsbWV0YWRhdGE6bWV0YWRhdGEsbWF4U3VwcGx5Om5ld05mdCxzdXBwbHk6MCxjaXJjdWxhdGluZ1N1cHBseTowLGRlbGVnYXRpb25FbmFibGVkOiExLHVuZGVsZWdhdGlvbkNvb2xkb3duOjAsYXV0aG9yaXplZElzc3VpbmdBY2NvdW50czppbnN0YW5jZVRhYmxlTmFtZSxhdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0czpbXSxwcm9wZXJ0aWVzOnt9LGdyb3VwQnk6W119LGluc3RhbmNlVGFibGVOYW1lPXN5bWJvbCsiaW5zdGFuY2VzIjtyZXR1cm4hMT09PWF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhpbnN0YW5jZVRhYmxlTmFtZSkmJmF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZShpbnN0YW5jZVRhYmxlTmFtZSxbImFjY291bnQiLCJvd25lZEJ5Il0pLGF3YWl0IGFwaS5kYi5pbnNlcnQoIm5mdHMiLG5ld05mdCksdm9pZCAwIT09YXV0aG9yaXplZElzc3VpbmdBY2NvdW50cyYmYXdhaXQgYWN0aW9ucy5hZGRBdXRob3JpemVkSXNzdWluZ0FjY291bnRzKHthY2NvdW50czphdXRob3JpemVkSXNzdWluZ0FjY291bnRzLHN5bWJvbDpzeW1ib2wsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmlzU2lnbmVkV2l0aEFjdGl2ZUtleX0pLHZvaWQgMCE9PWF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzJiZhd2FpdCBhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzKHtjb250cmFjdHM6YXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMsc3ltYm9sOnN5bWJvbCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fSksITB9fXJldHVybiExfSxhY3Rpb25zLmlzc3VlPWFzeW5jIHJlc3VsdD0+e2NvbnN0e3N5bWJvbCxmcm9tVHlwZSx0byx0b1R5cGUsZmVlU3ltYm9sLGxvY2tUb2tlbnMsbG9ja05mdHMscHJvcGVydGllcyxpc1NpZ25lZFdpdGhBY3RpdmVLZXksY2FsbGluZ0NvbnRyYWN0SW5mb309cmVzdWx0LHR5cGVzPVsidXNlciIsImNvbnRyYWN0Il07dmFyIGZpbmFsVG9UeXBlPXZvaWQgMD09PXRvVHlwZT8idXNlciI6dG9UeXBlLGZpbmFsRnJvbVR5cGU9dm9pZCAwPT09ZnJvbVR5cGU/InVzZXIiOmZyb21UeXBlLG5mdElzc3VhbmNlRmVlPShhd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkpWyJuZnRJc3N1YW5jZUZlZSJdO2lmKGFwaS5hc3NlcnQoITA9PT1pc1NpZ25lZFdpdGhBY3RpdmVLZXksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHN5bWJvbCYmInN0cmluZyI9PXR5cGVvZiBzeW1ib2wmJmZpbmFsRnJvbVR5cGUmJiJzdHJpbmciPT10eXBlb2YgZmluYWxGcm9tVHlwZSYmdHlwZXMuaW5jbHVkZXMoZmluYWxGcm9tVHlwZSkmJihjYWxsaW5nQ29udHJhY3RJbmZvfHx2b2lkIDA9PT1jYWxsaW5nQ29udHJhY3RJbmZvJiYidXNlciI9PT1maW5hbEZyb21UeXBlKSYmdG8mJiJzdHJpbmciPT10eXBlb2YgdG8mJmZpbmFsVG9UeXBlJiYic3RyaW5nIj09dHlwZW9mIGZpbmFsVG9UeXBlJiZ0eXBlcy5pbmNsdWRlcyhmaW5hbFRvVHlwZSkmJmZlZVN5bWJvbCYmInN0cmluZyI9PXR5cGVvZiBmZWVTeW1ib2wmJmZlZVN5bWJvbCBpbiBuZnRJc3N1YW5jZUZlZSYmKHZvaWQgMD09PXByb3BlcnRpZXN8fHByb3BlcnRpZXMmJiJvYmplY3QiPT10eXBlb2YgcHJvcGVydGllcykmJih2b2lkIDA9PT1sb2NrVG9rZW5zfHxsb2NrVG9rZW5zJiYib2JqZWN0Ij09dHlwZW9mIGxvY2tUb2tlbnMpJiYodm9pZCAwPT09bG9ja05mdHN8fGxvY2tOZnRzJiYib2JqZWN0Ij09dHlwZW9mIGxvY2tOZnRzJiZBcnJheS5pc0FycmF5KGxvY2tOZnRzKSksImludmFsaWQgcGFyYW1zIikmJih2b2lkIDA9PT1sb2NrTmZ0c3x8aXNWYWxpZE5mdElkQXJyYXkobG9ja05mdHMpKSl7dmFyIGZpbmFsVG89InVzZXIiPT09ZmluYWxUb1R5cGU/dG8udHJpbSgpLnRvTG93ZXJDYXNlKCk6dG8udHJpbSgpLG93bmVkQnk9KCJ1c2VyIj09PWZpbmFsVG9UeXBlP2lzVmFsaWRIaXZlQWNjb3VudExlbmd0aDppc1ZhbGlkQ29udHJhY3RMZW5ndGgpKGZpbmFsVG8pLGZpbmFsRnJvbT0idXNlciI9PT1maW5hbEZyb21UeXBlP2FwaS5zZW5kZXI6Y2FsbGluZ0NvbnRyYWN0SW5mby5uYW1lLGlzTG9ja1ZhbGlkPSJ1c2VyIj09PWZpbmFsRnJvbVR5cGU/ImJhbGFuY2VzIjoiY29udHJhY3RzQmFsYW5jZXMiO2lmKGFwaS5hc3NlcnQob3duZWRCeSwiaW52YWxpZCB0byIpKXtjb25zdCBuZnQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6c3ltYm9sfSk7dmFyIHJlcz1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsInRva2VucyIse3N5bWJvbDpmZWVTeW1ib2x9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1uZnQsInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KG51bGwhPT1yZXMsImZlZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSl7cmVzdWx0PXN5bWJvbCsiaW5zdGFuY2VzIjtpZihhcGkuYXNzZXJ0KCJjb250cmFjdCI9PT1maW5hbEZyb21UeXBlJiZuZnQuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMuaW5jbHVkZXMoZmluYWxGcm9tKXx8InVzZXIiPT09ZmluYWxGcm9tVHlwZSYmbmZ0LmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMuaW5jbHVkZXMoZmluYWxGcm9tKSwibm90IGFsbG93ZWQgdG8gaXNzdWUgdG9rZW5zIikmJmFwaS5hc3NlcnQoMD09PW5mdC5tYXhTdXBwbHl8fG5mdC5zdXBwbHk8bmZ0Lm1heFN1cHBseSwibWF4IHN1cHBseSBsaW1pdCByZWFjaGVkIikpe293bmVkQnk9T2JqZWN0LmtleXMobmZ0LnByb3BlcnRpZXMpLmxlbmd0aCxvd25lZEJ5PWFwaS5CaWdOdW1iZXIobmZ0SXNzdWFuY2VGZWVbZmVlU3ltYm9sXSkubXVsdGlwbGllZEJ5KG93bmVkQnkpLG93bmVkQnk9Y2FsY3VsYXRlQmFsYW5jZShuZnRJc3N1YW5jZUZlZVtmZWVTeW1ib2xdLG93bmVkQnkscmVzLnByZWNpc2lvbiwhMCkscmVzPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIixpc0xvY2tWYWxpZCx7YWNjb3VudDpmaW5hbEZyb20sc3ltYm9sOmZlZVN5bWJvbH0pLHJlcz0hIWFwaS5CaWdOdW1iZXIob3duZWRCeSkubHRlKDApfHxyZXMmJmFwaS5CaWdOdW1iZXIocmVzLmJhbGFuY2UpLmd0ZShvd25lZEJ5KTtpZihsb2NrVG9rZW5zKXtpc0xvY2tWYWxpZD1hd2FpdCBpc1ZhbGlkVG9rZW5CYXNrZXQobG9ja1Rva2Vucyxpc0xvY2tWYWxpZCxmaW5hbEZyb20sZmVlU3ltYm9sLG93bmVkQnkpO2lmKCFhcGkuYXNzZXJ0KGlzTG9ja1ZhbGlkLGBpbnZhbGlkIGJhc2tldCBvZiB0b2tlbnMgdG8gbG9jayAoY2Fubm90IGxvY2sgbW9yZSB0aGFuICR7TUFYX05VTV9MT0NLRURfVE9LRU5fVFlQRVN9IHRva2VuIHR5cGVzOyBpc3N1aW5nIGFjY291bnQgbXVzdCBoYXZlIGVub3VnaCBiYWxhbmNlKWApKXJldHVybiExfWxldCBmaW5hbFByb3BlcnRpZXM9e307aWYodm9pZCAwIT09cHJvcGVydGllcyl7dHJ5e2lmKCFpc1ZhbGlkRGF0YVByb3BlcnRpZXMoZmluYWxGcm9tLGZpbmFsRnJvbVR5cGUsbmZ0LHByb3BlcnRpZXMpKXJldHVybiExfWNhdGNoKGUpe3JldHVybiExfWZpbmFsUHJvcGVydGllcz1wcm9wZXJ0aWVzfWlmKGFwaS5hc3NlcnQocmVzLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGlzc3VhbmNlIGZlZXMiKSl7aWYoYXBpLkJpZ051bWJlcihvd25lZEJ5KS5ndCgwKSlpZigiY29udHJhY3QiPT09ZmluYWxGcm9tVHlwZSl7cmVzPWF3YWl0IGFwaS50cmFuc2ZlclRva2Vuc0Zyb21DYWxsaW5nQ29udHJhY3QoIm51bGwiLGZlZVN5bWJvbCxvd25lZEJ5LCJ1c2VyIik7aWYoIWFwaS5hc3NlcnQoaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQocmVzLGZpbmFsRnJvbSwibnVsbCIsZmVlU3ltYm9sLG93bmVkQnksInRyYW5zZmVyRnJvbUNvbnRyYWN0IiksInVuYWJsZSB0byB0cmFuc2ZlciBpc3N1YW5jZSBmZWUiKSlyZXR1cm4hMX1lbHNle2NvbnN0IHJlcz1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDpmZWVTeW1ib2wscXVhbnRpdHk6b3duZWRCeSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fSk7aWYoIWFwaS5hc3NlcnQoaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQocmVzLGZpbmFsRnJvbSwibnVsbCIsZmVlU3ltYm9sLG93bmVkQnksInRyYW5zZmVyIiksInVuYWJsZSB0byB0cmFuc2ZlciBpc3N1YW5jZSBmZWUiKSlyZXR1cm4hMX1jb25zdCBmaW5hbExvY2tUb2tlbnM9e307aWYobG9ja1Rva2Vucylmb3IodmFyW2xvY2tzeW1ib2wscXVhbnRpdHldb2YgT2JqZWN0LmVudHJpZXMobG9ja1Rva2VucykpaWYoImNvbnRyYWN0Ij09PWZpbmFsRnJvbVR5cGUpe2NvbnN0IHJlcz1hd2FpdCBhcGkudHJhbnNmZXJUb2tlbnNGcm9tQ2FsbGluZ0NvbnRyYWN0KENPTlRSQUNUX05BTUUsbG9ja3N5bWJvbCxxdWFudGl0eSwiY29udHJhY3QiKTtpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChyZXMsZmluYWxGcm9tLENPTlRSQUNUX05BTUUsbG9ja3N5bWJvbCxxdWFudGl0eSwidHJhbnNmZXJGcm9tQ29udHJhY3QiKSYmKGZpbmFsTG9ja1Rva2Vuc1tsb2Nrc3ltYm9sXT1xdWFudGl0eSl9ZWxzZXtjb25zdCByZXM9YXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ0b2tlbnMiLCJ0cmFuc2ZlclRvQ29udHJhY3QiLHt0bzpDT05UUkFDVF9OQU1FLHN5bWJvbDpsb2Nrc3ltYm9sLHF1YW50aXR5OnF1YW50aXR5LGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppc1NpZ25lZFdpdGhBY3RpdmVLZXl9KTtpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChyZXMsZmluYWxGcm9tLENPTlRSQUNUX05BTUUsbG9ja3N5bWJvbCxxdWFudGl0eSwidHJhbnNmZXJUb0NvbnRyYWN0IikmJihmaW5hbExvY2tUb2tlbnNbbG9ja3N5bWJvbF09cXVhbnRpdHkpfWxldCBmaW5hbExvY2tOZnRzPVtdO2lmKGxvY2tOZnRzJiYwPGxvY2tOZnRzLmxlbmd0aCl7Y29uc3QgcmVzPWF3YWl0IHRyYW5zZmVyQW5kVmVyaWZ5TmZ0cyhmaW5hbEZyb20sZmluYWxGcm9tVHlwZSxDT05UUkFDVF9OQU1FLCJjb250cmFjdCIsbG9ja05mdHMsaXNTaWduZWRXaXRoQWN0aXZlS2V5LGNhbGxpbmdDb250cmFjdEluZm8pO2ZpbmFsTG9ja05mdHM9cmVzLnN1Y2Nlc3N9b3duZWRCeT0idXNlciI9PT1maW5hbFRvVHlwZT8idSI6ImMiO2xldCBuZXdJbnN0YW5jZT17fTtuZXdJbnN0YW5jZT0wPGZpbmFsTG9ja05mdHMubGVuZ3RoP3thY2NvdW50OmZpbmFsVG8sb3duZWRCeTpvd25lZEJ5LGxvY2tlZFRva2VuczpmaW5hbExvY2tUb2tlbnMsbG9ja2VkTmZ0czpmaW5hbExvY2tOZnRzLHByb3BlcnRpZXM6ZmluYWxQcm9wZXJ0aWVzfTp7YWNjb3VudDpmaW5hbFRvLG93bmVkQnk6b3duZWRCeSxsb2NrZWRUb2tlbnM6ZmluYWxMb2NrVG9rZW5zLHByb3BlcnRpZXM6ZmluYWxQcm9wZXJ0aWVzfTtyZXN1bHQ9YXdhaXQgYXBpLmRiLmluc2VydChyZXN1bHQsbmV3SW5zdGFuY2UpO3JldHVybiBuZnQuc3VwcGx5Kz0xLCJudWxsIj09PWZpbmFsVG8mJiJjb250cmFjdCIhPT1maW5hbFRvVHlwZXx8KG5mdC5jaXJjdWxhdGluZ1N1cHBseSs9MSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsbmZ0KSxhcGkuZW1pdCgiaXNzdWUiLHtmcm9tOmZpbmFsRnJvbSxmcm9tVHlwZTpmaW5hbEZyb21UeXBlLHRvOmZpbmFsVG8sdG9UeXBlOmZpbmFsVG9UeXBlLHN5bWJvbDpzeW1ib2wsbG9ja2VkVG9rZW5zOmZpbmFsTG9ja1Rva2Vucyxsb2NrZWROZnRzOmZpbmFsTG9ja05mdHMscHJvcGVydGllczpmaW5hbFByb3BlcnRpZXMsaWQ6cmVzdWx0Ll9pZH0pLCEwfX19fX1yZXR1cm4hMX0sYWN0aW9ucy5pc3N1ZU11bHRpcGxlPWFzeW5jIHBheWxvYWQ9Pntjb25zdHtpbnN0YW5jZXMsaXNTaWduZWRXaXRoQWN0aXZlS2V5LGNhbGxpbmdDb250cmFjdEluZm99PXBheWxvYWQ7aWYoYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoaW5zdGFuY2VzJiYib2JqZWN0Ij09dHlwZW9mIGluc3RhbmNlcyYmQXJyYXkuaXNBcnJheShpbnN0YW5jZXMpLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KGluc3RhbmNlcy5sZW5ndGg8PU1BWF9OVU1fTkZUU19JU1NVQUJMRSxgY2Fubm90IGlzc3VlIG1vcmUgdGhhbiAke01BWF9OVU1fTkZUU19JU1NVQUJMRX0gTkZUIGluc3RhbmNlcyBhdCBvbmNlYCkpe2xldCBjb250YWluZXJDb3VudD0wO2lmKGluc3RhbmNlcy5mb3JFYWNoKGluc3RhbmNlPT57aW5zdGFuY2UubG9ja05mdHMmJihjb250YWluZXJDb3VudCs9MSl9KSxhcGkuYXNzZXJ0KGNvbnRhaW5lckNvdW50PD1NQVhfTlVNX0NPTlRBSU5FUl9ORlRTX09QRVJBQkxFLGBjYW5ub3QgaXNzdWUgbW9yZSB0aGFuICR7TUFYX05VTV9DT05UQUlORVJfTkZUU19PUEVSQUJMRX0gY29udGFpbmVyIE5GVCBpbnN0YW5jZXMgYXQgb25jZWApJiZhcGkuYXNzZXJ0KDA9PT1jb250YWluZXJDb3VudHx8Y29udGFpbmVyQ291bnQ9PT1pbnN0YW5jZXMubGVuZ3RoLCJjYW5ub3QgaXNzdWUgYSBtaXggb2YgY29udGFpbmVyIGFuZCBub24tY29udGFpbmVyIE5GVCBpbnN0YW5jZXMgc2ltdWx0YW5lb3VzbHkiKSlmb3IobGV0IGk9MDtpPGluc3RhbmNlcy5sZW5ndGg7aSs9MSl7dmFye3N5bWJvbCxmcm9tVHlwZSx0byx0b1R5cGUsZmVlU3ltYm9sLGxvY2tUb2tlbnMsbG9ja05mdHMscHJvcGVydGllc309aW5zdGFuY2VzW2ldO2F3YWl0IGFjdGlvbnMuaXNzdWUoe3N5bWJvbDpzeW1ib2wsZnJvbVR5cGU6ZnJvbVR5cGUsdG86dG8sdG9UeXBlOnRvVHlwZSxmZWVTeW1ib2w6ZmVlU3ltYm9sLGxvY2tUb2tlbnM6bG9ja1Rva2Vucyxsb2NrTmZ0czpsb2NrTmZ0cyxwcm9wZXJ0aWVzOnByb3BlcnRpZXMsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmlzU2lnbmVkV2l0aEFjdGl2ZUtleSxjYWxsaW5nQ29udHJhY3RJbmZvOmNhbGxpbmdDb250cmFjdEluZm99KX19fTsK" }}}

{ "id": "ssc-testnet-hive", "json": { "contractName":"contract", "contractAction":"update", "contractPayload": { "name": "comments", "params": "", "code": "Y29uc3QgU01UX1BSRUNJU0lPTj0xMCxNQVhfVk9USU5HX1BPV0VSPTFlNCxNQVhfV0VJR0hUPTFlNCxQT1NUX1FVRVJZX0xJTUlUPTFlMztmdW5jdGlvbiBjYWxjdWxhdGVXZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsdm90ZVJzaGFyZVN1bSl7aWYoYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5sdGUoMCkpcmV0dXJuIGFwaS5CaWdOdW1iZXIoMCk7aWYoInBvd2VyIj09PXJld2FyZFBvb2wuY29uZmlnLnBvc3RSZXdhcmRDdXJ2ZSl7Y29uc3QgcG9zdFJld2FyZEV4cG9uZW50PWFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5jb25maWcucG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyKTtyZXR1cm4gcG9zdFJld2FyZEV4cG9uZW50LmVxKCIxIil8fHBvc3RSZXdhcmRFeHBvbmVudC5lcSgiMiIpP2FwaS5CaWdOdW1iZXIodm90ZVJzaGFyZVN1bSkucG93KHJld2FyZFBvb2wuY29uZmlnLnBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcikudG9GaXhlZCgxMCxhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOmFwaS5CaWdOdW1iZXIocGFyc2VGbG9hdCh2b3RlUnNoYXJlU3VtKSoqcGFyc2VGbG9hdChyZXdhcmRQb29sLmNvbmZpZy5wb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIpKS50b0ZpeGVkKDEwLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTil9cmV0dXJuIGFwaS5CaWdOdW1iZXIodm90ZVJzaGFyZVN1bSl9ZnVuY3Rpb24gY2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wsdm90ZVJzaGFyZVN1bSl7aWYoYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5sdGUoMCkpcmV0dXJuIGFwaS5CaWdOdW1iZXIoMCk7aWYoInBvd2VyIj09PXJld2FyZFBvb2wuY29uZmlnLmN1cmF0aW9uUmV3YXJkQ3VydmUpe2NvbnN0IGN1cmF0aW9uUmV3YXJkRXhwb25lbnQ9YXBpLkJpZ051bWJlcihyZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyKTtyZXR1cm4gY3VyYXRpb25SZXdhcmRFeHBvbmVudC5lcSgiMC41Iik/YXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKS5zcXJ0KCkudG9GaXhlZCgxMCxhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pOmN1cmF0aW9uUmV3YXJkRXhwb25lbnQuZXEoIjEiKT9hcGkuQmlnTnVtYmVyKHZvdGVSc2hhcmVTdW0pLnRvRml4ZWQoMTAsYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTphcGkuQmlnTnVtYmVyKHBhcnNlRmxvYXQodm90ZVJzaGFyZVN1bSkqKnBhcnNlRmxvYXQocmV3YXJkUG9vbC5jb25maWcuY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcikpLnRvRml4ZWQoMTAsYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKX1yZXR1cm4gYXBpLkJpZ051bWJlcih2b3RlUnNoYXJlU3VtKX1hc3luYyBmdW5jdGlvbiBwYXlVc2VyKHN5bWJvbCxxdWFudGl0eSx1c2VyLHN0YWtlZFJld2FyZFBlcmNlbnRhZ2UsbXV0ZSl7aWYobXV0ZSlyZXR1cm47Y29uc3QgcXVhbnRpdHlCaWdudW09YXBpLkJpZ051bWJlcihxdWFudGl0eSksc3Rha2VkUXVhbnRpdHk9cXVhbnRpdHlCaWdudW0ubXVsdGlwbGllZEJ5KHN0YWtlZFJld2FyZFBlcmNlbnRhZ2UpLmRpdmlkZWRCeSgxMDApLnRvRml4ZWQocXVhbnRpdHlCaWdudW0uZHAoKSxhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pLGxpcXVpZFF1YW50aXR5PXF1YW50aXR5QmlnbnVtLm1pbnVzKHN0YWtlZFF1YW50aXR5KS50b0ZpeGVkKHF1YW50aXR5QmlnbnVtLmRwKCksYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTtsZXQgcmVzO2FwaS5CaWdOdW1iZXIobGlxdWlkUXVhbnRpdHkpLmd0KDApJiYocmVzPWF3YWl0IGFwaS50cmFuc2ZlclRva2Vucyh1c2VyLHN5bWJvbCxsaXF1aWRRdWFudGl0eSwidXNlciIpLHJlcy5lcnJvcnMmJmFwaS5kZWJ1ZyhgRXJyb3IgcGF5aW5nIG91dCBsaXF1aWQgJHtsaXF1aWRRdWFudGl0eX0gJHtzeW1ib2x9IHRvICR7dXNlcn0gKFRYSUQgJHthcGkudHJhbnNhY3Rpb25JZH0pOiBcbiR7cmVzLmVycm9yc31gKSksYXBpLkJpZ051bWJlcihzdGFrZWRRdWFudGl0eSkuZ3QoMCkmJihyZXM9YXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ0b2tlbnMiLCJzdGFrZUZyb21Db250cmFjdCIse3RvOnVzZXIsc3ltYm9sOnN5bWJvbCxxdWFudGl0eTpzdGFrZWRRdWFudGl0eX0pLHJlcy5lcnJvcnMmJmFwaS5kZWJ1ZyhgRXJyb3IgcGF5aW5nIG91dCBzdGFrZWQgJHtzdGFrZWRRdWFudGl0eX0gJHtzeW1ib2x9IHRvICR7dXNlcn0gKFRYSUQgJHthcGkudHJhbnNhY3Rpb25JZH0pOiBcbiR7cmVzLmVycm9yc31gKSl9YXN5bmMgZnVuY3Rpb24gZ2V0TXV0ZShyZXdhcmRQb29sSWQsYWNjb3VudCl7Y29uc3Qgdm90aW5nUG93ZXI9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInZvdGluZ1Bvd2VyIix7cmV3YXJkUG9vbElkOnJld2FyZFBvb2xJZCxhY2NvdW50OmFjY291bnR9KTtyZXR1cm4hIXZvdGluZ1Bvd2VyJiZ2b3RpbmdQb3dlci5tdXRlfWFzeW5jIGZ1bmN0aW9uIHBheU91dEJlbmVmaWNpYXJpZXMocmV3YXJkUG9vbCx0b2tlbixwb3N0LGF1dGhvckJlbmVQb3J0aW9uKXtjb25zdHthdXRob3JwZXJtOmF1dGhvcnBlcm0sc3ltYm9sOnN5bWJvbCxyZXdhcmRQb29sSWQ6cmV3YXJkUG9vbElkLGJlbmVmaWNpYXJpZXM6YmVuZWZpY2lhcmllc309cG9zdDtsZXQgdG90YWxCZW5lUGF5PWFwaS5CaWdOdW1iZXIoMCkscG9zdFRheEF1dGhvckJlbmVQb3J0aW9uPWF1dGhvckJlbmVQb3J0aW9uO2lmKHJld2FyZFBvb2wuY29uZmlnLmFwcFRheENvbmZpZyl7Y29uc3R7YXBwOmFwcCxwZXJjZW50OnBlcmNlbnQsYmVuZWZpY2lhcnk6YmVuZWZpY2lhcnl9PXJld2FyZFBvb2wuY29uZmlnLmFwcFRheENvbmZpZztpZihhcHAhPT1wb3N0LmFwcCl7Y29uc3QgYXBwVGF4UG9ydGlvbj1hcGkuQmlnTnVtYmVyKGF1dGhvckJlbmVQb3J0aW9uKS5tdWx0aXBsaWVkQnkocGVyY2VudCkuZGl2aWRlZEJ5KDEwMCkudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTtwb3N0VGF4QXV0aG9yQmVuZVBvcnRpb249YXBpLkJpZ051bWJlcihwb3N0VGF4QXV0aG9yQmVuZVBvcnRpb24pLm1pbnVzKGFwcFRheFBvcnRpb24pO2NvbnN0IHJld2FyZExvZz17cmV3YXJkUG9vbElkOnJld2FyZFBvb2xJZCxhdXRob3JwZXJtOmF1dGhvcnBlcm0sc3ltYm9sOnN5bWJvbCxhY2NvdW50OmJlbmVmaWNpYXJ5LHF1YW50aXR5OmFwcFRheFBvcnRpb259O2FwaS5lbWl0KCJhcHBUYXgiLHJld2FyZExvZyksYXdhaXQgcGF5VXNlcihzeW1ib2wsYXBwVGF4UG9ydGlvbixiZW5lZmljaWFyeSwwKSx0b3RhbEJlbmVQYXk9YXBpLkJpZ051bWJlcih0b3RhbEJlbmVQYXkpLnBsdXMoYXBwVGF4UG9ydGlvbil9fWlmKCFiZW5lZmljaWFyaWVzfHwwPT09YmVuZWZpY2lhcmllcy5sZW5ndGgpcmV0dXJuIGFwaS5CaWdOdW1iZXIoMCk7Zm9yKGxldCBpPTA7aTxiZW5lZmljaWFyaWVzLmxlbmd0aDtpKz0xKXtjb25zdCBiZW5lZmljaWFyeT1iZW5lZmljaWFyaWVzW2ldLGJlbmVQYXk9YXBpLkJpZ051bWJlcihwb3N0VGF4QXV0aG9yQmVuZVBvcnRpb24pLm11bHRpcGxpZWRCeShiZW5lZmljaWFyeS53ZWlnaHQpLmRpdmlkZWRCeSgxZTQpLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTiksbXV0ZT1hd2FpdCBnZXRNdXRlKHJld2FyZFBvb2xJZCxiZW5lZmljaWFyeS5hY2NvdW50KSxyZXdhcmRMb2c9e3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsYXV0aG9ycGVybTphdXRob3JwZXJtLHN5bWJvbDpzeW1ib2wsYWNjb3VudDpiZW5lZmljaWFyeS5hY2NvdW50LHF1YW50aXR5OmJlbmVQYXl9O211dGUmJihyZXdhcmRMb2cubXV0ZT0hMCksYXBpLmVtaXQoImJlbmVmaWNpYXJ5UmV3YXJkIixyZXdhcmRMb2cpLGF3YWl0IHBheVVzZXIoc3ltYm9sLGJlbmVQYXksYmVuZWZpY2lhcnkuYWNjb3VudCxyZXdhcmRQb29sLmNvbmZpZy5zdGFrZWRSZXdhcmRQZXJjZW50YWdlLG11dGUpLHRvdGFsQmVuZVBheT1hcGkuQmlnTnVtYmVyKHRvdGFsQmVuZVBheSkucGx1cyhiZW5lUGF5KX1yZXR1cm4gdG90YWxCZW5lUGF5fWFzeW5jIGZ1bmN0aW9uIHBheU91dEN1cmF0b3JzKHJld2FyZFBvb2wsdG9rZW4scG9zdCxjdXJhdG9yUG9ydGlvbixwYXJhbXMpe2NvbnN0e2F1dGhvcnBlcm06YXV0aG9ycGVybSxzeW1ib2w6c3ltYm9sLHJld2FyZFBvb2xJZDpyZXdhcmRQb29sSWR9PXBvc3Qse3ZvdGVRdWVyeUxpbWl0OnZvdGVRdWVyeUxpbWl0fT1wYXJhbXMscmVzcG9uc2U9e2RvbmU6ITEsdm90ZXNQcm9jZXNzZWQ6MH0sdm90ZXNUb1BheW91dD1hd2FpdCBhcGkuZGIuZmluZCgidm90ZXMiLHtyZXdhcmRQb29sSWQ6cmV3YXJkUG9vbElkLGF1dGhvcnBlcm06YXV0aG9ycGVybX0sdm90ZVF1ZXJ5TGltaXQsMCxbe2luZGV4OiJieVRpbWVzdGFtcCIsZGVzY2VuZGluZzohMX0se2luZGV4OiJfaWQiLGRlc2NlbmRpbmc6ITF9XSk7aWYoMD09PXZvdGVzVG9QYXlvdXQubGVuZ3RoKXJlc3BvbnNlLmRvbmU9ITA7ZWxzZXtmb3IobGV0IGk9MDtpPHZvdGVzVG9QYXlvdXQubGVuZ3RoO2krPTEpe2NvbnN0IHZvdGU9dm90ZXNUb1BheW91dFtpXTtpZihhcGkuQmlnTnVtYmVyKHZvdGUuY3VyYXRpb25XZWlnaHQpPjApe2NvbnN0IHRvdGFsQ3VyYXRpb25XZWlnaHQ9Y2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wscG9zdC52b3RlUG9zaXRpdmVSc2hhcmVTdW0pLHZvdGVQYXk9YXBpLkJpZ051bWJlcihjdXJhdG9yUG9ydGlvbikubXVsdGlwbGllZEJ5KHZvdGUuY3VyYXRpb25XZWlnaHQpLmRpdmlkZWRCeSh0b3RhbEN1cmF0aW9uV2VpZ2h0KS50b0ZpeGVkKHRva2VuLnByZWNpc2lvbixhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pLG11dGU9YXdhaXQgZ2V0TXV0ZShyZXdhcmRQb29sSWQsdm90ZS52b3RlcikscmV3YXJkTG9nPXtyZXdhcmRQb29sSWQ6cmV3YXJkUG9vbElkLGF1dGhvcnBlcm06YXV0aG9ycGVybSxzeW1ib2w6c3ltYm9sLGFjY291bnQ6dm90ZS52b3RlcixxdWFudGl0eTp2b3RlUGF5fTttdXRlJiYocmV3YXJkTG9nLm11dGU9ITApLGFwaS5lbWl0KCJjdXJhdGlvblJld2FyZCIscmV3YXJkTG9nKSxhd2FpdCBwYXlVc2VyKHN5bWJvbCx2b3RlUGF5LHZvdGUudm90ZXIscmV3YXJkUG9vbC5jb25maWcuc3Rha2VkUmV3YXJkUGVyY2VudGFnZSxtdXRlKX1hd2FpdCBhcGkuZGIucmVtb3ZlKCJ2b3RlcyIsdm90ZSl9cmVzcG9uc2Uudm90ZXNQcm9jZXNzZWQrPXZvdGVzVG9QYXlvdXQubGVuZ3RoLHZvdGVzVG9QYXlvdXQubGVuZ3RoPHZvdGVRdWVyeUxpbWl0JiYocmVzcG9uc2UuZG9uZT0hMCl9cmV0dXJuIHJlc3BvbnNlfWFzeW5jIGZ1bmN0aW9uIHBheU91dFBvc3QocmV3YXJkUG9vbCx0b2tlbixwb3N0LHBhcmFtcyl7Y29uc3QgcmVzcG9uc2U9e3RvdGFsUGF5b3V0VmFsdWU6MCx2b3Rlc1Byb2Nlc3NlZDowLGRvbmU6ITF9O2lmKHBvc3QuZGVjbGluZVBheW91dClyZXR1cm4gYXBpLmVtaXQoImF1dGhvclJld2FyZCIse3Jld2FyZFBvb2xJZDpwb3N0LnJld2FyZFBvb2xJZCxhdXRob3JwZXJtOnBvc3QuYXV0aG9ycGVybSxzeW1ib2w6cG9zdC5zeW1ib2wsYWNjb3VudDpwb3N0LmF1dGhvcixxdWFudGl0eToiMCJ9KSxyZXNwb25zZS5kb25lPSEwLGF3YWl0IGFwaS5kYi5yZW1vdmUoInBvc3RzIixwb3N0KSxyZXNwb25zZTtjb25zdCBwb3N0Q2xhaW1zPWNhbGN1bGF0ZVdlaWdodFJzaGFyZXMocmV3YXJkUG9vbCxwb3N0LnZvdGVSc2hhcmVTdW0pLHBvc3RQZW5kaW5nVG9rZW49YXBpLkJpZ051bWJlcihyZXdhcmRQb29sLmludGVydmFsUGVuZGluZ0NsYWltcykuZ3QoMCk/YXBpLkJpZ051bWJlcihyZXdhcmRQb29sLmludGVydmFsUmV3YXJkUG9vbCkubXVsdGlwbGllZEJ5KHBvc3RDbGFpbXMpLmRpdmlkZWRCeShyZXdhcmRQb29sLmludGVydmFsUGVuZGluZ0NsYWltcykudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKToiMCI7cmVzcG9uc2UudG90YWxQYXlvdXRWYWx1ZT1wb3N0UGVuZGluZ1Rva2VuO2NvbnN0IGN1cmF0b3JQb3J0aW9uPWFwaS5CaWdOdW1iZXIocG9zdFBlbmRpbmdUb2tlbikubXVsdGlwbGllZEJ5KHJld2FyZFBvb2wuY29uZmlnLmN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSkuZGl2aWRlZEJ5KDEwMCkudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKSxhdXRob3JCZW5lUG9ydGlvbj1hcGkuQmlnTnVtYmVyKHBvc3RQZW5kaW5nVG9rZW4pLm1pbnVzKGN1cmF0b3JQb3J0aW9uKS50b0ZpeGVkKHRva2VuLnByZWNpc2lvbixhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pLGJlbmVmaWNpYXJpZXNQYXlvdXRWYWx1ZT1hd2FpdCBwYXlPdXRCZW5lZmljaWFyaWVzKHJld2FyZFBvb2wsdG9rZW4scG9zdCxhdXRob3JCZW5lUG9ydGlvbiksYXV0aG9yUG9ydGlvbj1hcGkuQmlnTnVtYmVyKGF1dGhvckJlbmVQb3J0aW9uKS5taW51cyhiZW5lZmljaWFyaWVzUGF5b3V0VmFsdWUpLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTiksY3VyYXRvclBheVN0YXR1cz1hd2FpdCBwYXlPdXRDdXJhdG9ycyhyZXdhcmRQb29sLHRva2VuLHBvc3QsY3VyYXRvclBvcnRpb24scGFyYW1zKTtpZihyZXNwb25zZS52b3Rlc1Byb2Nlc3NlZCs9Y3VyYXRvclBheVN0YXR1cy52b3Rlc1Byb2Nlc3NlZCxyZXNwb25zZS5kb25lPWN1cmF0b3JQYXlTdGF0dXMuZG9uZSxjdXJhdG9yUGF5U3RhdHVzLmRvbmUpe2NvbnN0IG11dGU9YXdhaXQgZ2V0TXV0ZShwb3N0LnJld2FyZFBvb2xJZCxwb3N0LmF1dGhvcikscmV3YXJkTG9nPXtyZXdhcmRQb29sSWQ6cG9zdC5yZXdhcmRQb29sSWQsYXV0aG9ycGVybTpwb3N0LmF1dGhvcnBlcm0sc3ltYm9sOnBvc3Quc3ltYm9sLGFjY291bnQ6cG9zdC5hdXRob3IscXVhbnRpdHk6YXV0aG9yUG9ydGlvbn07bXV0ZSYmKHJld2FyZExvZy5tdXRlPSEwKSxhcGkuZW1pdCgiYXV0aG9yUmV3YXJkIixyZXdhcmRMb2cpLGF3YWl0IHBheVVzZXIocG9zdC5zeW1ib2wsYXV0aG9yUG9ydGlvbixwb3N0LmF1dGhvcixyZXdhcmRQb29sLmNvbmZpZy5zdGFrZWRSZXdhcmRQZXJjZW50YWdlLG11dGUpLGF3YWl0IGFwaS5kYi5yZW1vdmUoInBvc3RzIixwb3N0KX1yZXR1cm4gcmVzcG9uc2V9YXN5bmMgZnVuY3Rpb24gY29tcHV0ZVBvc3RSZXdhcmRzKHBhcmFtcyxyZXdhcmRQb29sLHRva2VuLGVuZFRpbWVzdGFtcCl7Y29uc3R7bGFzdENsYWltRGVjYXlUaW1lc3RhbXA6bGFzdENsYWltRGVjYXlUaW1lc3RhbXB9PXJld2FyZFBvb2wse21heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQ6bWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCxtYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kOm1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmR9PXBhcmFtcyxwb3N0c1RvUGF5b3V0PWF3YWl0IGFwaS5kYi5maW5kKCJwb3N0cyIse3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sLl9pZCxjYXNob3V0VGltZTp7JGd0ZTpsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcCwkbHRlOmVuZFRpbWVzdGFtcH19LG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQsMCxbe2luZGV4OiJieUNhc2hvdXRUaW1lIixkZXNjZW5kaW5nOiExfSx7aW5kZXg6Il9pZCIsZGVzY2VuZGluZzohMX1dKTtsZXQgZG9uZT0hMSxkZWR1Y3RGcm9tUmV3YXJkUG9vbD1hcGkuQmlnTnVtYmVyKDApLHZvdGVzUHJvY2Vzc2VkPTA7aWYocG9zdHNUb1BheW91dCYmcG9zdHNUb1BheW91dC5sZW5ndGg+MCl7bGV0IGxpbWl0UmVhY2hlZD0hMTtmb3IobGV0IGk9MDtpPHBvc3RzVG9QYXlvdXQubGVuZ3RoO2krPTEpe2NvbnN0IHBvc3Q9cG9zdHNUb1BheW91dFtpXSxwb3N0UGF5b3V0UmVzcG9uc2U9YXdhaXQgcGF5T3V0UG9zdChyZXdhcmRQb29sLHRva2VuLHBvc3QscGFyYW1zKSx7dG90YWxQYXlvdXRWYWx1ZTp0b3RhbFBheW91dFZhbHVlfT1wb3N0UGF5b3V0UmVzcG9uc2U7aWYodm90ZXNQcm9jZXNzZWQrPXBvc3RQYXlvdXRSZXNwb25zZS52b3Rlc1Byb2Nlc3NlZCxwb3N0UGF5b3V0UmVzcG9uc2UuZG9uZSYmKGRlZHVjdEZyb21SZXdhcmRQb29sPWRlZHVjdEZyb21SZXdhcmRQb29sLnBsdXModG90YWxQYXlvdXRWYWx1ZSkpLCFwb3N0UGF5b3V0UmVzcG9uc2UuZG9uZXx8dm90ZXNQcm9jZXNzZWQ+PW1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQpe2xpbWl0UmVhY2hlZD0hMDticmVha319IWxpbWl0UmVhY2hlZCYmcG9zdHNUb1BheW91dC5sZW5ndGg8bWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCYmKGRvbmU9ITApLHJld2FyZFBvb2wucmV3YXJkUG9vbD1hcGkuQmlnTnVtYmVyKHJld2FyZFBvb2wucmV3YXJkUG9vbCkubWludXMoZGVkdWN0RnJvbVJld2FyZFBvb2wpLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTil9ZWxzZSBkb25lPSEwO2RvbmUmJihyZXdhcmRQb29sLmxhc3RDbGFpbURlY2F5VGltZXN0YW1wPWVuZFRpbWVzdGFtcCl9YXN5bmMgZnVuY3Rpb24gcG9zdENsYWltc0luSW50ZXJ2YWwocGFyYW1zLHJld2FyZFBvb2wsc3RhcnQsZW5kKXtsZXQgcG9zdE9mZnNldD0wLG5ld1BlbmRpbmdDbGFpbXM9YXBpLkJpZ051bWJlcigwKSxwb3N0c1RvUGF5b3V0PWF3YWl0IGFwaS5kYi5maW5kKCJwb3N0cyIse3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sLl9pZCxjYXNob3V0VGltZTp7JGd0ZTpzdGFydCwkbHRlOmVuZH19LDFlMyxwb3N0T2Zmc2V0LFt7aW5kZXg6ImJ5Q2FzaG91dFRpbWUiLGRlc2NlbmRpbmc6ITF9LHtpbmRleDoiX2lkIixkZXNjZW5kaW5nOiExfV0pO2Zvcig7cG9zdHNUb1BheW91dCYmcG9zdHNUb1BheW91dC5sZW5ndGg+MCYmKG5ld1BlbmRpbmdDbGFpbXM9bmV3UGVuZGluZ0NsYWltcy5wbHVzKHBvc3RzVG9QYXlvdXQucmVkdWNlKCgoeCx5KT0+eC5wbHVzKGNhbGN1bGF0ZVdlaWdodFJzaGFyZXMocmV3YXJkUG9vbCx5LnZvdGVSc2hhcmVTdW0pKSksYXBpLkJpZ051bWJlcigwKSkpLmRwKDEwLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTiksIShwb3N0c1RvUGF5b3V0Lmxlbmd0aDwxZTMpKTspcG9zdE9mZnNldCs9MWUzLHBvc3RzVG9QYXlvdXQ9YXdhaXQgYXBpLmRiLmZpbmQoInBvc3RzIix7cmV3YXJkUG9vbElkOnJld2FyZFBvb2wuX2lkLGNhc2hvdXRUaW1lOnskZ3RlOnN0YXJ0LCRsdGU6ZW5kfX0sMWUzLHBvc3RPZmZzZXQsW3tpbmRleDoiYnlDYXNob3V0VGltZSIsZGVzY2VuZGluZzohMX0se2luZGV4OiJfaWQiLGRlc2NlbmRpbmc6ITF9XSk7cmV0dXJuIG5ld1BlbmRpbmdDbGFpbXN9YXN5bmMgZnVuY3Rpb24gdG9rZW5NYWludGVuYW5jZSgpe2NvbnN0IHRpbWVzdGFtcD1uZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpLHBhcmFtcz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse2xhc3RNYWludGVuYW5jZUJsb2NrOmxhc3RNYWludGVuYW5jZUJsb2NrLGxhc3RQcm9jZXNzZWRQb29sSWQ6bGFzdFByb2Nlc3NlZFBvb2xJZCxtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrOm1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2t9PXBhcmFtcztpZihsYXN0TWFpbnRlbmFuY2VCbG9jaz49YXBpLmJsb2NrTnVtYmVyKXJldHVybjtwYXJhbXMubGFzdE1haW50ZW5hbmNlQmxvY2s9YXBpLmJsb2NrTnVtYmVyO2NvbnN0IHJld2FyZFBvb2xQcm9jZXNzaW5nRXhwcmVzc2lvbj17JGx0ZTpbIiRsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcCIseyRzdWJ0cmFjdDpbdGltZXN0YW1wLHskbXVsdGlwbHk6WyIkY29uZmlnLnJld2FyZEludGVydmFsU2Vjb25kcyIsMWUzXX1dfV19O2xldCByZXdhcmRQb29scz1hd2FpdCBhcGkuZGIuZmluZCgicmV3YXJkUG9vbHMiLHthY3RpdmU6ITAsJGV4cHI6cmV3YXJkUG9vbFByb2Nlc3NpbmdFeHByZXNzaW9uLF9pZDp7JGd0Omxhc3RQcm9jZXNzZWRQb29sSWR9fSxtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrLDAsW3tpbmRleDoiX2lkIixkZXNjZW5kaW5nOiExfV0pO2lmKCFyZXdhcmRQb29sc3x8cmV3YXJkUG9vbHMubGVuZ3RoPG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2spe3Jld2FyZFBvb2xzfHwocmV3YXJkUG9vbHM9W10pO2NvbnN0IG1vcmVSZXdhcmRQb29scz1hd2FpdCBhcGkuZGIuZmluZCgicmV3YXJkUG9vbHMiLHthY3RpdmU6ITAsJGV4cHI6cmV3YXJkUG9vbFByb2Nlc3NpbmdFeHByZXNzaW9ufSxtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrLXJld2FyZFBvb2xzLmxlbmd0aCwwLFt7aW5kZXg6Il9pZCIsZGVzY2VuZGluZzohMX1dKSxleGlzdGluZ0lkcz1uZXcgU2V0KHJld2FyZFBvb2xzLm1hcCgocD0+cC5faWQpKSk7bW9yZVJld2FyZFBvb2xzLmZvckVhY2goKG1ycD0+e2V4aXN0aW5nSWRzLmhhcyhtcnAuX2lkKXx8cmV3YXJkUG9vbHMucHVzaChtcnApfSkpfWlmKHJld2FyZFBvb2xzKWZvcihsZXQgaT0wO2k8cmV3YXJkUG9vbHMubGVuZ3RoO2krPTEpe2NvbnN0IHJld2FyZFBvb2w9cmV3YXJkUG9vbHNbaV07cGFyYW1zLmxhc3RQcm9jZXNzZWRQb29sSWQ9cmV3YXJkUG9vbC5faWQ7Y29uc3R7c3ltYm9sOnN5bWJvbCxsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcDpsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcCxsYXN0UmV3YXJkVGltZXN0YW1wOmxhc3RSZXdhcmRUaW1lc3RhbXAsY29uZmlnOmNvbmZpZ309cmV3YXJkUG9vbCx7cmV3YXJkSW50ZXJ2YWxTZWNvbmRzOnJld2FyZEludGVydmFsU2Vjb25kcyxyZXdhcmRQZXJJbnRlcnZhbDpyZXdhcmRQZXJJbnRlcnZhbCxjYXNob3V0V2luZG93RGF5czpjYXNob3V0V2luZG93RGF5c309Y29uZmlnLHRva2VuPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOnN5bWJvbH0pLHJld2FyZEludGVydmFsRHVyYXRpb25NaWxsaXM9MWUzKnJld2FyZEludGVydmFsU2Vjb25kcyxuZXh0UmV3YXJkVGltZXN0YW1wPWxhc3RSZXdhcmRUaW1lc3RhbXArcmV3YXJkSW50ZXJ2YWxEdXJhdGlvbk1pbGxpcyxuZXh0Q2xhaW1EZWNheVRpbWVzdGFtcD1sYXN0Q2xhaW1EZWNheVRpbWVzdGFtcCtyZXdhcmRJbnRlcnZhbER1cmF0aW9uTWlsbGlzO2lmKG5leHRDbGFpbURlY2F5VGltZXN0YW1wPj1uZXh0UmV3YXJkVGltZXN0YW1wKXtjb25zdCByZXdhcmRUb0FkZD1hcGkuQmlnTnVtYmVyKHJld2FyZFBlckludGVydmFsKTthcGkuQmlnTnVtYmVyKHJld2FyZFRvQWRkKS5ndCgwKSYmKGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgidG9rZW5zIiwiaXNzdWVUb0NvbnRyYWN0Iix7c3ltYm9sOnJld2FyZFBvb2wuc3ltYm9sLHF1YW50aXR5OnJld2FyZFRvQWRkLHRvOiJjb21tZW50cyIsaXNTaWduZWRXaXRoQWN0aXZlS2V5OiEwfSkscmV3YXJkUG9vbC5yZXdhcmRQb29sPWFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5yZXdhcmRQb29sKS5wbHVzKHJld2FyZFRvQWRkKS50b0ZpeGVkKHRva2VuLnByZWNpc2lvbixhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pKTtjb25zdCBhZGp1c3ROdW1lcj1uZXh0UmV3YXJkVGltZXN0YW1wLWxhc3RSZXdhcmRUaW1lc3RhbXAsYWRqdXN0RGVub209MjQqKDIqY2FzaG91dFdpbmRvd0RheXMrMSkqMzYwMCoxZTM7cmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zPWFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zKS5taW51cyhhcGkuQmlnTnVtYmVyKHJld2FyZFBvb2wucGVuZGluZ0NsYWltcykubXVsdGlwbGllZEJ5KGFkanVzdE51bWVyKS5kaXZpZGVkQnkoYWRqdXN0RGVub20pKS50b0ZpeGVkKDEwLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTikscmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zPWFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zKS5wbHVzKGF3YWl0IHBvc3RDbGFpbXNJbkludGVydmFsKHBhcmFtcyxyZXdhcmRQb29sLGxhc3RSZXdhcmRUaW1lc3RhbXAsbmV4dFJld2FyZFRpbWVzdGFtcCkpLnRvRml4ZWQoMTAsYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKSxyZXdhcmRQb29sLmxhc3RSZXdhcmRUaW1lc3RhbXA9bmV4dFJld2FyZFRpbWVzdGFtcCxyZXdhcmRQb29sLmludGVydmFsUGVuZGluZ0NsYWltcz1yZXdhcmRQb29sLnBlbmRpbmdDbGFpbXMscmV3YXJkUG9vbC5pbnRlcnZhbFJld2FyZFBvb2w9cmV3YXJkUG9vbC5yZXdhcmRQb29sfWF3YWl0IGNvbXB1dGVQb3N0UmV3YXJkcyhwYXJhbXMscmV3YXJkUG9vbCx0b2tlbixuZXh0Q2xhaW1EZWNheVRpbWVzdGFtcCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgicmV3YXJkUG9vbHMiLHJld2FyZFBvb2wpfWF3YWl0IGFwaS5kYi51cGRhdGUoInBhcmFtcyIscGFyYW1zKX1mdW5jdGlvbiBhc3NlcnRBcHBUYXhDb25maWdWYWxpZChhcHBUYXhDb25maWcpe2lmKCFhcGkuYXNzZXJ0KCFhcHBUYXhDb25maWd8fCJvYmplY3QiPT10eXBlb2YgYXBwVGF4Q29uZmlnLCJhcHBUYXhDb25maWcgaW52YWxpZCIpKXJldHVybiExO2lmKGFwcFRheENvbmZpZyl7Y29uc3R7YXBwOmFwcCxwZXJjZW50OnBlcmNlbnQsYmVuZWZpY2lhcnk6YmVuZWZpY2lhcnl9PWFwcFRheENvbmZpZztpZighYXBpLmFzc2VydChhcHAmJiJzdHJpbmciPT10eXBlb2YgYXBwLCJhcHBUYXhDb25maWcgYXBwIGludmFsaWQiKSlyZXR1cm4hMTtpZighYXBpLmFzc2VydChwZXJjZW50JiZOdW1iZXIuaXNJbnRlZ2VyKHBlcmNlbnQpJiZwZXJjZW50Pj0xJiZwZXJjZW50PD0xMDAsImFwcFRheENvbmZpZyBwZXJjZW50IHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwIikpcmV0dXJuITE7aWYoIWFwaS5hc3NlcnQoYmVuZWZpY2lhcnkmJmFwaS5pc1ZhbGlkQWNjb3VudE5hbWUoYmVuZWZpY2lhcnkpLCJhcHBUYXhDb25maWcgYmVuZWZpY2lhcnkgaW52YWxpZCIpKXJldHVybiExfXJldHVybiEwfWFzeW5jIGZ1bmN0aW9uIGdldFJld2FyZFBvb2xJZHMocGF5bG9hZCl7Y29uc3R7cmV3YXJkUG9vbHM6cmV3YXJkUG9vbHMsanNvbk1ldGFkYXRhOmpzb25NZXRhZGF0YSxwYXJlbnRBdXRob3I6cGFyZW50QXV0aG9yLHBhcmVudFBlcm1saW5rOnBhcmVudFBlcm1saW5rfT1wYXlsb2FkLHBhcmFtcz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSk7aWYocGFyZW50QXV0aG9yJiZwYXJlbnRQZXJtbGluayl7Y29uc3QgcGFyZW50QXV0aG9ycGVybT1gQCR7cGFyZW50QXV0aG9yfS8ke3BhcmVudFBlcm1saW5rfWAscGFyZW50UG9zdE1ldGFkYXRhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwb3N0TWV0YWRhdGEiLHthdXRob3JwZXJtOnBhcmVudEF1dGhvcnBlcm19KTtpZihwYXJlbnRQb3N0TWV0YWRhdGEpcmV0dXJuIHBhcmVudFBvc3RNZXRhZGF0YS5yZXdhcmRQb29sSWRzO2NvbnN0IHBhcmVudFBvc3RzPWF3YWl0IGFwaS5kYi5maW5kKCJwb3N0cyIse2F1dGhvcnBlcm06cGFyZW50QXV0aG9ycGVybX0pO3JldHVybiBwYXJlbnRQb3N0cyYmcGFyZW50UG9zdHMubGVuZ3RoPjA/cGFyZW50UG9zdHMubWFwKChwPT5wLnJld2FyZFBvb2xJZCkpOltdfWlmKGpzb25NZXRhZGF0YSYmanNvbk1ldGFkYXRhLnRhZ3MmJkFycmF5LmlzQXJyYXkoanNvbk1ldGFkYXRhLnRhZ3MpJiZqc29uTWV0YWRhdGEudGFncy5ldmVyeSgodD0+InN0cmluZyI9PXR5cGVvZiB0KSkpe2NvbnN0IHNlYXJjaFRhZ3M9cGFyZW50UGVybWxpbms/anNvbk1ldGFkYXRhLnRhZ3MuY29uY2F0KFtwYXJlbnRQZXJtbGlua10pOmpzb25NZXRhZGF0YS50YWdzLHBvb2xRdWVyeT17ImNvbmZpZy50YWdzIjp7JGluOnNlYXJjaFRhZ3N9LCJjb25maWcuZXhjbHVkZVRhZ3MiOnskbm90OnskaW46c2VhcmNoVGFnc319fSx0YWdSZXdhcmRQb29scz1hd2FpdCBhcGkuZGIuZmluZCgicmV3YXJkUG9vbHMiLHBvb2xRdWVyeSxwYXJhbXMubWF4UG9vbHNQZXJQb3N0LDAsW3tpbmRleDoiX2lkIixkZXNjZW5kaW5nOiExfV0pO2lmKHRhZ1Jld2FyZFBvb2xzJiZ0YWdSZXdhcmRQb29scy5sZW5ndGg+MClyZXR1cm4gdGFnUmV3YXJkUG9vbHMubWFwKChyPT5yLl9pZCkpfXJldHVybiByZXdhcmRQb29scyYmQXJyYXkuaXNBcnJheShyZXdhcmRQb29scykmJnJld2FyZFBvb2xzLmxlbmd0aD4wP3Jld2FyZFBvb2xzLnNsaWNlKDAscGFyYW1zLm1heFBvb2xzUGVyUG9zdCk6W119YXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1ZvdGUocG9zdCx2b3Rlcix3ZWlnaHQsdGltZXN0YW1wKXtjb25zdHtyZXdhcmRQb29sSWQ6cmV3YXJkUG9vbElkLHN5bWJvbDpzeW1ib2wsYXV0aG9ycGVybTphdXRob3JwZXJtLGNhc2hvdXRUaW1lOmNhc2hvdXRUaW1lfT1wb3N0O2lmKGNhc2hvdXRUaW1lPHRpbWVzdGFtcClyZXR1cm47Y29uc3QgcmV3YXJkUG9vbD1hd2FpdCBhcGkuZGIuZmluZE9uZSgicmV3YXJkUG9vbHMiLHtfaWQ6cmV3YXJkUG9vbElkfSk7aWYoIXJld2FyZFBvb2x8fCFyZXdhcmRQb29sLmFjdGl2ZSlyZXR1cm47bGV0IHZvdGluZ1Bvd2VyPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ2b3RpbmdQb3dlciIse3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsYWNjb3VudDp2b3Rlcn0pO3ZvdGluZ1Bvd2VyPyh2b3RpbmdQb3dlci52b3RpbmdQb3dlcis9MWU0Kih0aW1lc3RhbXAtdm90aW5nUG93ZXIubGFzdFZvdGVUaW1lc3RhbXApLygyNCpyZXdhcmRQb29sLmNvbmZpZy52b3RlUmVnZW5lcmF0aW9uRGF5cyozNjAwKjFlMyksdm90aW5nUG93ZXIudm90aW5nUG93ZXI9TWF0aC5mbG9vcih2b3RpbmdQb3dlci52b3RpbmdQb3dlciksdm90aW5nUG93ZXIudm90aW5nUG93ZXI9TWF0aC5taW4odm90aW5nUG93ZXIudm90aW5nUG93ZXIsMWU0KSx2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIrPTFlNCoodGltZXN0YW1wLXZvdGluZ1Bvd2VyLmxhc3RWb3RlVGltZXN0YW1wKS8oMjQqcmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzKjM2MDAqMWUzKSx2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXI9TWF0aC5mbG9vcih2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIpLHZvdGluZ1Bvd2VyLmRvd252b3RpbmdQb3dlcj1NYXRoLm1pbih2b3RpbmdQb3dlci5kb3dudm90aW5nUG93ZXIsMWU0KSx2b3RpbmdQb3dlci5sYXN0Vm90ZVRpbWVzdGFtcD10aW1lc3RhbXApOih2b3RpbmdQb3dlcj17cmV3YXJkUG9vbElkOnJld2FyZFBvb2xJZCxhY2NvdW50OnZvdGVyLGxhc3RWb3RlVGltZXN0YW1wOnRpbWVzdGFtcCx2b3RpbmdQb3dlcjoxZTQsZG93bnZvdGluZ1Bvd2VyOjFlNH0sdm90aW5nUG93ZXI9YXdhaXQgYXBpLmRiLmluc2VydCgidm90aW5nUG93ZXIiLHZvdGluZ1Bvd2VyKSk7Y29uc3Qgdm90ZXJUb2tlbkJhbGFuY2U9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJiYWxhbmNlcyIse3N5bWJvbDpzeW1ib2wsYWNjb3VudDp2b3Rlcn0pO2xldCBzdGFrZT12b3RlclRva2VuQmFsYW5jZT92b3RlclRva2VuQmFsYW5jZS5zdGFrZToiMCI7dm90ZXJUb2tlbkJhbGFuY2UmJnZvdGVyVG9rZW5CYWxhbmNlLmRlbGVnYXRpb25zSW4mJmFwaS5CaWdOdW1iZXIodm90ZXJUb2tlbkJhbGFuY2UuZGVsZWdhdGlvbnNJbikuaXNGaW5pdGUoKSYmKHN0YWtlPWFwaS5CaWdOdW1iZXIoc3Rha2UpLnBsdXModm90ZXJUb2tlbkJhbGFuY2UuZGVsZWdhdGlvbnNJbikpO2xldCB2b3RlUnNoYXJlcz0iMCIsdXBkYXRlZFBvc3RSc2hhcmVzPSIwIix1c2VkUG93ZXI9MCx1c2VkRG93bnZvdGVQb3dlcj0wLGN1cmF0aW9uV2VpZ2h0PSIwIjtpZih3ZWlnaHQ+MCl7dm90ZVJzaGFyZXM9YXBpLkJpZ051bWJlcihzdGFrZSkubXVsdGlwbGllZEJ5KHdlaWdodCkubXVsdGlwbGllZEJ5KHZvdGluZ1Bvd2VyLnZvdGluZ1Bvd2VyKS5kaXZpZGVkQnkoMWU0KS5kaXZpZGVkQnkoMWU0KS50b0ZpeGVkKDEwLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTiksdXNlZFBvd2VyPU1hdGguZmxvb3Iodm90aW5nUG93ZXIudm90aW5nUG93ZXIqTWF0aC5hYnMod2VpZ2h0KSo2MCo2MCoyNC8xZTQpO2NvbnN0IHVzZWRQb3dlckRlbm9tPU1hdGguZmxvb3IoODY0ZTYvcmV3YXJkUG9vbC5jb25maWcudm90ZVBvd2VyQ29uc3VtcHRpb24pO3VzZWRQb3dlcj1NYXRoLmZsb29yKCh1c2VkUG93ZXIrdXNlZFBvd2VyRGVub20tMSkvdXNlZFBvd2VyRGVub20pLHZvdGluZ1Bvd2VyLnZvdGluZ1Bvd2VyPU1hdGgubWF4KDAsTWF0aC5mbG9vcih2b3RpbmdQb3dlci52b3RpbmdQb3dlci11c2VkUG93ZXIpKSxjdXJhdGlvbldlaWdodD1hcGkuQmlnTnVtYmVyKGNhbGN1bGF0ZUN1cmF0aW9uV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLGFwaS5CaWdOdW1iZXIodm90ZVJzaGFyZXMpLnBsdXMocG9zdC52b3RlUG9zaXRpdmVSc2hhcmVTdW0pKSkubWludXMoY2FsY3VsYXRlQ3VyYXRpb25XZWlnaHRSc2hhcmVzKHJld2FyZFBvb2wscG9zdC52b3RlUG9zaXRpdmVSc2hhcmVTdW0pKS50b0ZpeGVkKDEwLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTil9ZWxzZSBpZih3ZWlnaHQ8MCYmIXJld2FyZFBvb2wuY29uZmlnLmRpc2FibGVEb3dudm90ZSl7dm90ZVJzaGFyZXM9YXBpLkJpZ051bWJlcihzdGFrZSkubXVsdGlwbGllZEJ5KHdlaWdodCkubXVsdGlwbGllZEJ5KHZvdGluZ1Bvd2VyLmRvd252b3RpbmdQb3dlcikuZGl2aWRlZEJ5KDFlNCkuZGl2aWRlZEJ5KDFlNCkudG9GaXhlZCgxMCxhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pLHVzZWREb3dudm90ZVBvd2VyPU1hdGguZmxvb3Iodm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyKk1hdGguYWJzKHdlaWdodCkqNjAqNjAqMjQvMWU0KTtjb25zdCB1c2VkRG93bnZvdGVQb3dlckRlbm9tPU1hdGguZmxvb3IoODY0ZTYvcmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uKTt1c2VkRG93bnZvdGVQb3dlcj1NYXRoLmZsb29yKCh1c2VkRG93bnZvdGVQb3dlcit1c2VkRG93bnZvdGVQb3dlckRlbm9tLTEpL3VzZWREb3dudm90ZVBvd2VyRGVub20pLHZvdGluZ1Bvd2VyLmRvd252b3RpbmdQb3dlcj1NYXRoLm1heCgwLE1hdGguZmxvb3Iodm90aW5nUG93ZXIuZG93bnZvdGluZ1Bvd2VyLXVzZWREb3dudm90ZVBvd2VyKSl9dm90aW5nUG93ZXIubXV0ZSYmKHZvdGVSc2hhcmVzPSIwIixjdXJhdGlvbldlaWdodD0iMCIpLGF3YWl0IGFwaS5kYi51cGRhdGUoInZvdGluZ1Bvd2VyIix2b3RpbmdQb3dlcik7bGV0IHZvdGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInZvdGVzIix7cmV3YXJkUG9vbElkOnJld2FyZFBvb2xJZCxhdXRob3JwZXJtOmF1dGhvcnBlcm0sdm90ZXI6dm90ZXJ9KTtpZih2b3RlKXt2b3RlLnRpbWVzdGFtcD10aW1lc3RhbXAsdm90ZS53ZWlnaHQ9d2VpZ2h0LHZvdGUuY3VyYXRpb25XZWlnaHQ9IjAiO2NvbnN0IG9sZFZvdGVSc2hhcmVzPXZvdGUucnNoYXJlczt2b3RlLnJzaGFyZXM9dm90ZVJzaGFyZXMsdXBkYXRlZFBvc3RSc2hhcmVzPWFwaS5CaWdOdW1iZXIodm90ZVJzaGFyZXMpLm1pbnVzKG9sZFZvdGVSc2hhcmVzKS50b0ZpeGVkKDEwLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTiksYXdhaXQgYXBpLmRiLnVwZGF0ZSgidm90ZXMiLHZvdGUpO2NvbnN0IHZvdGVMb2c9e3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsc3ltYm9sOnJld2FyZFBvb2wuc3ltYm9sLHJzaGFyZXM6dm90ZVJzaGFyZXN9O3ZvdGluZ1Bvd2VyLm11dGUmJih2b3RlTG9nLm11dGU9ITApLGFwaS5lbWl0KCJ1cGRhdGVWb3RlIix2b3RlTG9nKX1lbHNle3ZvdGU9e3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsc3ltYm9sOnN5bWJvbCxhdXRob3JwZXJtOmF1dGhvcnBlcm0sd2VpZ2h0OndlaWdodCxyc2hhcmVzOnZvdGVSc2hhcmVzLGN1cmF0aW9uV2VpZ2h0OmN1cmF0aW9uV2VpZ2h0LHRpbWVzdGFtcDp0aW1lc3RhbXAsdm90ZXI6dm90ZXJ9LHVwZGF0ZWRQb3N0UnNoYXJlcz12b3RlUnNoYXJlcyxhd2FpdCBhcGkuZGIuaW5zZXJ0KCJ2b3RlcyIsdm90ZSk7Y29uc3Qgdm90ZUxvZz17cmV3YXJkUG9vbElkOnJld2FyZFBvb2xJZCxzeW1ib2w6cmV3YXJkUG9vbC5zeW1ib2wscnNoYXJlczp2b3RlUnNoYXJlc307dm90aW5nUG93ZXIubXV0ZSYmKHZvdGVMb2cubXV0ZT0hMCksYXBpLmVtaXQoIm5ld1ZvdGUiLHZvdGVMb2cpfWNvbnN0IG9sZFBvc3RDbGFpbXM9Y2FsY3VsYXRlV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLHBvc3Qudm90ZVJzaGFyZVN1bSk7aWYocG9zdC52b3RlUnNoYXJlU3VtPWFwaS5CaWdOdW1iZXIocG9zdC52b3RlUnNoYXJlU3VtKS5wbHVzKHVwZGF0ZWRQb3N0UnNoYXJlcykudG9GaXhlZCgxMCxhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pLGFwaS5CaWdOdW1iZXIodXBkYXRlZFBvc3RSc2hhcmVzKS5ndCgwKSYmKHBvc3Qudm90ZVBvc2l0aXZlUnNoYXJlU3VtPWFwaS5CaWdOdW1iZXIocG9zdC52b3RlUG9zaXRpdmVSc2hhcmVTdW0pLnBsdXModXBkYXRlZFBvc3RSc2hhcmVzKS50b0ZpeGVkKDEwLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTiksdGltZXN0YW1wPHJld2FyZFBvb2wuY3JlYXRlZFRpbWVzdGFtcCsyNCooMipyZXdhcmRQb29sLmNvbmZpZy5jYXNob3V0V2luZG93RGF5cysxKSozNjAwKjFlMykpe2NvbnN0IG5ld1Bvc3RDbGFpbXM9Y2FsY3VsYXRlV2VpZ2h0UnNoYXJlcyhyZXdhcmRQb29sLHBvc3Qudm90ZVJzaGFyZVN1bSk7cmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zPWFwaS5CaWdOdW1iZXIocmV3YXJkUG9vbC5wZW5kaW5nQ2xhaW1zKS5wbHVzKG5ld1Bvc3RDbGFpbXMpLm1pbnVzKG9sZFBvc3RDbGFpbXMpLnRvRml4ZWQoMTAsYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKSxhd2FpdCBhcGkuZGIudXBkYXRlKCJyZXdhcmRQb29scyIscmV3YXJkUG9vbCl9YXdhaXQgYXBpLmRiLnVwZGF0ZSgicG9zdHMiLHBvc3QpfWFjdGlvbnMuY3JlYXRlU1NDPWFzeW5jKCk9PntpZighMT09PWF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cygicmV3YXJkUG9vbHMiKSl7YXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJwYXJhbXMiKSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoInJld2FyZFBvb2xzIixbImNvbmZpZy50YWdzIiwibGFzdENsYWltRGVjYXlUaW1lc3RhbXAiXSksYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJwb3N0cyIsWyJhdXRob3JwZXJtIix7bmFtZToiYnlDYXNob3V0VGltZSIsaW5kZXg6e3Jld2FyZFBvb2xJZDoxLGNhc2hvdXRUaW1lOjF9fV0se3ByaW1hcnlLZXk6WyJhdXRob3JwZXJtIiwicmV3YXJkUG9vbElkIl19KSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoInBvc3RNZXRhZGF0YSIsW10se3ByaW1hcnlLZXk6WyJhdXRob3JwZXJtIl19KSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoInZvdGVzIixbe25hbWU6ImJ5VGltZXN0YW1wIixpbmRleDp7cmV3YXJkUG9vbElkOjEsYXV0aG9ycGVybToxLHRpbWVzdGFtcDoxfX1dLHtwcmltYXJ5S2V5OlsicmV3YXJkUG9vbElkIiwiYXV0aG9ycGVybSIsInZvdGVyIl19KSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoInZvdGluZ1Bvd2VyIixbXSx7cHJpbWFyeUtleTpbInJld2FyZFBvb2xJZCIsImFjY291bnQiXX0pO2NvbnN0IHBhcmFtcz17c2V0dXBGZWU6IjEwMDAiLHVwZGF0ZUZlZToiMjAiLG1heFBvb2xzUGVyUG9zdDoyMCxtYXhUYWdzUGVyUG9vbDo1LG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2s6MixsYXN0TWFpbnRlbmFuY2VCbG9jazphcGkuYmxvY2tOdW1iZXIsbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZDoyMCx2b3RlUXVlcnlMaW1pdDoxMDAsbWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZDoxMDAsbGFzdFByb2Nlc3NlZFBvb2xJZDowfTthd2FpdCBhcGkuZGIuaW5zZXJ0KCJwYXJhbXMiLHBhcmFtcyl9fSxhY3Rpb25zLnVwZGF0ZVBhcmFtcz1hc3luYyBwYXlsb2FkPT57aWYoYXBpLnNlbmRlciE9PWFwaS5vd25lcilyZXR1cm47Y29uc3R7c2V0dXBGZWU6c2V0dXBGZWUsdXBkYXRlRmVlOnVwZGF0ZUZlZSxtYWludGVuYW5jZVRva2Vuc1BlckJsb2NrOm1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2ssbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZDptYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kLG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQ6bWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZCx2b3RlUXVlcnlMaW1pdDp2b3RlUXVlcnlMaW1pdH09cGF5bG9hZCxwYXJhbXM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pO2lmKHNldHVwRmVlKXtpZighYXBpLmFzc2VydCgic3RyaW5nIj09dHlwZW9mIHNldHVwRmVlJiYhYXBpLkJpZ051bWJlcihzZXR1cEZlZSkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihzZXR1cEZlZSkuZ3RlKDApLCJpbnZhbGlkIHNldHVwRmVlIikpcmV0dXJuO3BhcmFtcy5zZXR1cEZlZT1zZXR1cEZlZX1pZih1cGRhdGVGZWUpe2lmKCFhcGkuYXNzZXJ0KCJzdHJpbmciPT10eXBlb2YgdXBkYXRlRmVlJiYhYXBpLkJpZ051bWJlcih1cGRhdGVGZWUpLmlzTmFOKCkmJmFwaS5CaWdOdW1iZXIodXBkYXRlRmVlKS5ndGUoMCksImludmFsaWQgdXBkYXRlRmVlIikpcmV0dXJuO3BhcmFtcy51cGRhdGVGZWU9dXBkYXRlRmVlfWlmKG1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2spe2lmKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jaykmJm1haW50ZW5hbmNlVG9rZW5zUGVyQmxvY2s+PTEsImludmFsaWQgbWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jayIpKXJldHVybjtwYXJhbXMubWFpbnRlbmFuY2VUb2tlbnNQZXJCbG9jaz1tYWludGVuYW5jZVRva2Vuc1BlckJsb2NrfWlmKG1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQpe2lmKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCkmJm1heFBvc3RzUHJvY2Vzc2VkUGVyUm91bmQ+PTEsImludmFsaWQgbWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZCIpKXJldHVybjtwYXJhbXMubWF4UG9zdHNQcm9jZXNzZWRQZXJSb3VuZD1tYXhQb3N0c1Byb2Nlc3NlZFBlclJvdW5kfWlmKG1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQpe2lmKCFhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZCkmJm1heFZvdGVzUHJvY2Vzc2VkUGVyUm91bmQ+PTEsImludmFsaWQgbWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZCIpKXJldHVybjtwYXJhbXMubWF4Vm90ZXNQcm9jZXNzZWRQZXJSb3VuZD1tYXhWb3Rlc1Byb2Nlc3NlZFBlclJvdW5kfWlmKHZvdGVRdWVyeUxpbWl0KXtpZighYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKHZvdGVRdWVyeUxpbWl0KSYmdm90ZVF1ZXJ5TGltaXQ+PTEsImludmFsaWQgdm90ZVF1ZXJ5TGltaXQiKSlyZXR1cm47cGFyYW1zLnZvdGVRdWVyeUxpbWl0PXZvdGVRdWVyeUxpbWl0fWF3YWl0IGFwaS5kYi51cGRhdGUoInBhcmFtcyIscGFyYW1zKX0sYWN0aW9ucy5jcmVhdGVSZXdhcmRQb29sPWFzeW5jIHBheWxvYWQ9Pntjb25zdHtzeW1ib2w6c3ltYm9sLGNvbmZpZzpjb25maWcsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmlzU2lnbmVkV2l0aEFjdGl2ZUtleX09cGF5bG9hZDtpZighYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwib3BlcmF0aW9uIG11c3QgYmUgc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikpcmV0dXJuO2NvbnN0IHBhcmFtcz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse3NldHVwRmVlOnNldHVwRmVlLG1heFRhZ3NQZXJQb29sOm1heFRhZ3NQZXJQb29sfT1wYXJhbXMsdXRpbGl0eVRva2VuQmFsYW5jZT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDoiQkVFIn0pLGF1dGhvcml6ZWRDcmVhdGlvbj0hKCFhcGkuQmlnTnVtYmVyKHNldHVwRmVlKS5sdGUoMCkmJmFwaS5zZW5kZXIhPT1hcGkub3duZXIpfHx1dGlsaXR5VG9rZW5CYWxhbmNlJiZhcGkuQmlnTnVtYmVyKHV0aWxpdHlUb2tlbkJhbGFuY2UuYmFsYW5jZSkuZ3RlKHNldHVwRmVlKTtpZighYXBpLmFzc2VydChhdXRob3JpemVkQ3JlYXRpb24sInlvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciB0aGUgY3JlYXRpb24gZmVlIikpcmV0dXJuO2NvbnN0IHRva2VuPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOnN5bWJvbH0pO2lmKCFhcGkuYXNzZXJ0KHRva2VuLCJ0b2tlbiBub3QgZm91bmQiKSlyZXR1cm47aWYoIWFwaS5hc3NlcnQoY29uZmlnJiYib2JqZWN0Ij09dHlwZW9mIGNvbmZpZywiY29uZmlnIGludmFsaWQiKSlyZXR1cm47Y29uc3R7cG9zdFJld2FyZEN1cnZlOnBvc3RSZXdhcmRDdXJ2ZSxwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXI6cG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyLGN1cmF0aW9uUmV3YXJkQ3VydmU6Y3VyYXRpb25SZXdhcmRDdXJ2ZSxjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyOmN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIsY3VyYXRpb25SZXdhcmRQZXJjZW50YWdlOmN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZSxjYXNob3V0V2luZG93RGF5czpjYXNob3V0V2luZG93RGF5cyxyZXdhcmRQZXJJbnRlcnZhbDpyZXdhcmRQZXJJbnRlcnZhbCxyZXdhcmRJbnRlcnZhbFNlY29uZHM6cmV3YXJkSW50ZXJ2YWxTZWNvbmRzLHZvdGVSZWdlbmVyYXRpb25EYXlzOnZvdGVSZWdlbmVyYXRpb25EYXlzLGRvd252b3RlUmVnZW5lcmF0aW9uRGF5czpkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXMsc3Rha2VkUmV3YXJkUGVyY2VudGFnZTpzdGFrZWRSZXdhcmRQZXJjZW50YWdlLHZvdGVQb3dlckNvbnN1bXB0aW9uOnZvdGVQb3dlckNvbnN1bXB0aW9uLGRvd252b3RlUG93ZXJDb25zdW1wdGlvbjpkb3dudm90ZVBvd2VyQ29uc3VtcHRpb24sdGFnczp0YWdzLGRpc2FibGVEb3dudm90ZTpkaXNhYmxlRG93bnZvdGUsaWdub3JlRGVjbGluZVBheW91dDppZ25vcmVEZWNsaW5lUGF5b3V0LGFwcFRheENvbmZpZzphcHBUYXhDb25maWcsZXhjbHVkZVRhZ3M6ZXhjbHVkZVRhZ3N9PWNvbmZpZztpZighYXBpLmFzc2VydChwb3N0UmV3YXJkQ3VydmUmJiJwb3dlciI9PT1wb3N0UmV3YXJkQ3VydmUsInBvc3RSZXdhcmRDdXJ2ZSBzaG91bGQgYmUgb25lIG9mOiBbcG93ZXJdIikpcmV0dXJuO2NvbnN0IHBvc3RFeHBvbmVudD1hcGkuQmlnTnVtYmVyKHBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcik7aWYoIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXImJnBvc3RFeHBvbmVudC5pc0Zpbml0ZSgpJiZwb3N0RXhwb25lbnQuZ3RlKCIxIikmJnBvc3RFeHBvbmVudC5sdGUoIjIiKSYmcG9zdEV4cG9uZW50LmRwKCk8PTIsJ3Bvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlciBzaG91bGQgYmUgYmV0d2VlbiAiMSIgYW5kICIyIiB3aXRoIHByZWNpc2lvbiBhdCBtb3N0IDInKSlyZXR1cm47aWYoIWFwaS5hc3NlcnQoY3VyYXRpb25SZXdhcmRDdXJ2ZSYmInBvd2VyIj09PWN1cmF0aW9uUmV3YXJkQ3VydmUsImN1cmF0aW9uUmV3YXJkQ3VydmUgc2hvdWxkIGJlIG9uZSBvZjogW3Bvd2VyXSIpKXJldHVybjtjb25zdCBjdXJhdGlvbkV4cG9uZW50PWFwaS5CaWdOdW1iZXIoY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcik7aWYoIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyJiZjdXJhdGlvbkV4cG9uZW50LmlzRmluaXRlKCkmJmN1cmF0aW9uRXhwb25lbnQuZ3RlKCIwLjUiKSYmY3VyYXRpb25FeHBvbmVudC5sdGUoIjEiKSYmY3VyYXRpb25FeHBvbmVudC5kcCgpPD0yLCdjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyIGNhbiBvbmx5IGJlIGJldHdlZW4gIjAuNSIgYW5kICIxIiB3aXRoIHByZWNpc2lvbiBhdCBtb3N0IDInKSlyZXR1cm47aWYoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UpJiZjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2U+PTAmJmN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZTw9MTAwLCJjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2Ugc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDAiKSlyZXR1cm47aWYoIWFwaS5hc3NlcnQoY2FzaG91dFdpbmRvd0RheXMmJk51bWJlci5pc0ludGVnZXIoY2FzaG91dFdpbmRvd0RheXMpJiZjYXNob3V0V2luZG93RGF5cz49MSYmY2FzaG91dFdpbmRvd0RheXM8PTMwLCJjYXNob3V0V2luZG93RGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwIikpcmV0dXJuO2NvbnN0IHBhcnNlZFJld2FyZFBlckludGVydmFsPWFwaS5CaWdOdW1iZXIocmV3YXJkUGVySW50ZXJ2YWwpO2lmKCFhcGkuYXNzZXJ0KCJzdHJpbmciPT10eXBlb2YgcmV3YXJkUGVySW50ZXJ2YWwmJnBhcnNlZFJld2FyZFBlckludGVydmFsLmlzRmluaXRlKCkmJnBhcnNlZFJld2FyZFBlckludGVydmFsLmd0KDApLCJyZXdhcmRQZXJJbnRlcnZhbCBpbnZhbGlkIil8fCFhcGkuYXNzZXJ0KHBhcnNlZFJld2FyZFBlckludGVydmFsLmRwKCk8PXRva2VuLnByZWNpc2lvbiwidG9rZW4gcHJlY2lzaW9uIG1pc21hdGNoIGZvciByZXdhcmRQZXJJbnRlcnZhbCIpKXJldHVybjtpZighYXBpLmFzc2VydChyZXdhcmRJbnRlcnZhbFNlY29uZHMmJk51bWJlci5pc0ludGVnZXIocmV3YXJkSW50ZXJ2YWxTZWNvbmRzKSYmcmV3YXJkSW50ZXJ2YWxTZWNvbmRzPj0zJiZyZXdhcmRJbnRlcnZhbFNlY29uZHM8PTg2NDAwJiZyZXdhcmRJbnRlcnZhbFNlY29uZHMlMz09MCwicmV3YXJkSW50ZXJ2YWxTZWNvbmRzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMyBhbmQgODY0MDAsIGFuZCBkaXZpc2libGUgYnkgMyIpKXJldHVybjtpZighYXBpLmFzc2VydCh2b3RlUmVnZW5lcmF0aW9uRGF5cyYmTnVtYmVyLmlzSW50ZWdlcih2b3RlUmVnZW5lcmF0aW9uRGF5cykmJnZvdGVSZWdlbmVyYXRpb25EYXlzPj0xJiZ2b3RlUmVnZW5lcmF0aW9uRGF5czw9MzAsInZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAiKSlyZXR1cm47aWYoIWFwaS5hc3NlcnQoZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzJiZOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cykmJmRvd252b3RlUmVnZW5lcmF0aW9uRGF5cz49MSYmZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzPD0zMCwiZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAiKSlyZXR1cm47aWYoIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihzdGFrZWRSZXdhcmRQZXJjZW50YWdlKSYmc3Rha2VkUmV3YXJkUGVyY2VudGFnZT49MCYmc3Rha2VkUmV3YXJkUGVyY2VudGFnZTw9MTAwLCJzdGFrZWRSZXdhcmRQZXJjZW50YWdlIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwIikpcmV0dXJuO2lmKCFhcGkuYXNzZXJ0KHZvdGVQb3dlckNvbnN1bXB0aW9uJiZOdW1iZXIuaXNJbnRlZ2VyKHZvdGVQb3dlckNvbnN1bXB0aW9uKSYmdm90ZVBvd2VyQ29uc3VtcHRpb24+PTEmJnZvdGVQb3dlckNvbnN1bXB0aW9uPD0xZTQsInZvdGVQb3dlckNvbnN1bXB0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAiKSlyZXR1cm47aWYoIWFwaS5hc3NlcnQoZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uJiZOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUG93ZXJDb25zdW1wdGlvbikmJmRvd252b3RlUG93ZXJDb25zdW1wdGlvbj49MSYmZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uPD0xZTQsImRvd252b3RlUG93ZXJDb25zdW1wdGlvbiBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMDAwIikpcmV0dXJuO2lmKCFhcGkuYXNzZXJ0KEFycmF5LmlzQXJyYXkodGFncykmJnRhZ3MubGVuZ3RoPj0xJiZ0YWdzLmxlbmd0aDw9bWF4VGFnc1BlclBvb2wmJnRhZ3MuZXZlcnkoKHQ9PiJzdHJpbmciPT10eXBlb2YgdCkpLGB0YWdzIHNob3VsZCBiZSBhIG5vbi1lbXB0eSBhcnJheSBvZiBzdHJpbmdzIG9mIGxlbmd0aCBhdCBtb3N0ICR7bWF4VGFnc1BlclBvb2x9YCkpcmV0dXJuO2lmKCFhcGkuYXNzZXJ0KCJib29sZWFuIj09dHlwZW9mIGRpc2FibGVEb3dudm90ZSwiZGlzYWJsZURvd252b3RlIHNob3VsZCBiZSBib29sZWFuIikpcmV0dXJuO2lmKCFhcGkuYXNzZXJ0KCJib29sZWFuIj09dHlwZW9mIGlnbm9yZURlY2xpbmVQYXlvdXQsImlnbm9yZURlY2xpbmVQYXlvdXQgc2hvdWxkIGJlIGJvb2xlYW4iKSlyZXR1cm47aWYoIWFzc2VydEFwcFRheENvbmZpZ1ZhbGlkKGFwcFRheENvbmZpZykpcmV0dXJuO2lmKCFhcGkuYXNzZXJ0KCFleGNsdWRlVGFnc3x8QXJyYXkuaXNBcnJheShleGNsdWRlVGFncykmJmV4Y2x1ZGVUYWdzLmxlbmd0aD49MSYmZXhjbHVkZVRhZ3MubGVuZ3RoPD1tYXhUYWdzUGVyUG9vbCYmZXhjbHVkZVRhZ3MuZXZlcnkoKHQ9PiJzdHJpbmciPT10eXBlb2YgdCkpLGBleGNsdWRlVGFncyBzaG91bGQgYmUgYSBub24tZW1wdHkgYXJyYXkgb2Ygc3RyaW5ncyBvZiBsZW5ndGggYXQgbW9zdCAke21heFRhZ3NQZXJQb29sfWApKXJldHVybjtpZighYXBpLmFzc2VydChhcGkuc2VuZGVyPT09dG9rZW4uaXNzdWVyfHxhcGkuc2VuZGVyPT09YXBpLm93bmVyJiYiQkVFIj09PXRva2VuLnN5bWJvbCwibXVzdCBiZSBpc3N1ZXIgb2YgdG9rZW4iKSlyZXR1cm47aWYoIWFwaS5hc3NlcnQodG9rZW4uc3Rha2luZ0VuYWJsZWQsInRva2VuIG11c3QgaGF2ZSBzdGFraW5nIGVuYWJsZWQiKSlyZXR1cm47Y29uc3QgZXhpc3RpbmdSZXdhcmRQb29sPWF3YWl0IGFwaS5kYi5maW5kT25lKCJyZXdhcmRQb29scyIse3N5bWJvbDpzeW1ib2x9KTtpZighYXBpLmFzc2VydCghZXhpc3RpbmdSZXdhcmRQb29sLCJjYW5ub3QgY3JlYXRlIG11bHRpcGxlIHJld2FyZCBwb29scyBwZXIgdG9rZW4iKSlyZXR1cm47Y29uc3QgdGltZXN0YW1wPW5ldyBEYXRlKGAke2FwaS5oaXZlQmxvY2tUaW1lc3RhbXB9LjAwMFpgKS5nZXRUaW1lKCkscmV3YXJkUG9vbD17c3ltYm9sOnN5bWJvbCxyZXdhcmRQb29sOiIwIixsYXN0UmV3YXJkVGltZXN0YW1wOnRpbWVzdGFtcCxsYXN0Q2xhaW1EZWNheVRpbWVzdGFtcDp0aW1lc3RhbXAsY3JlYXRlZFRpbWVzdGFtcDp0aW1lc3RhbXAsY29uZmlnOntwb3N0UmV3YXJkQ3VydmU6cG9zdFJld2FyZEN1cnZlLHBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcjpwb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIsY3VyYXRpb25SZXdhcmRDdXJ2ZTpjdXJhdGlvblJld2FyZEN1cnZlLGN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXI6Y3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcixjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2U6Y3VyYXRpb25SZXdhcmRQZXJjZW50YWdlLGNhc2hvdXRXaW5kb3dEYXlzOmNhc2hvdXRXaW5kb3dEYXlzLHJld2FyZFBlckludGVydmFsOnJld2FyZFBlckludGVydmFsLHJld2FyZEludGVydmFsU2Vjb25kczpyZXdhcmRJbnRlcnZhbFNlY29uZHMsdm90ZVJlZ2VuZXJhdGlvbkRheXM6dm90ZVJlZ2VuZXJhdGlvbkRheXMsZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzOmRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyxzdGFrZWRSZXdhcmRQZXJjZW50YWdlOnN0YWtlZFJld2FyZFBlcmNlbnRhZ2Usdm90ZVBvd2VyQ29uc3VtcHRpb246dm90ZVBvd2VyQ29uc3VtcHRpb24sZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uOmRvd252b3RlUG93ZXJDb25zdW1wdGlvbix0YWdzOnRhZ3MsZGlzYWJsZURvd252b3RlOmRpc2FibGVEb3dudm90ZSxpZ25vcmVEZWNsaW5lUGF5b3V0Omlnbm9yZURlY2xpbmVQYXlvdXQsYXBwVGF4Q29uZmlnOmFwcFRheENvbmZpZyxleGNsdWRlVGFnczpleGNsdWRlVGFnc30scGVuZGluZ0NsYWltczoiMCIsYWN0aXZlOiEwfSxpbnNlcnRlZFJld2FyZFBvb2w9YXdhaXQgYXBpLmRiLmluc2VydCgicmV3YXJkUG9vbHMiLHJld2FyZFBvb2wpO2FwaS5zZW5kZXIhPT1hcGkub3duZXImJmFwaS5CaWdOdW1iZXIoc2V0dXBGZWUpLmd0KDApJiZhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDoiQkVFIixxdWFudGl0eTpzZXR1cEZlZSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fSksYXBpLmVtaXQoImNyZWF0ZVJld2FyZFBvb2wiLHtfaWQ6aW5zZXJ0ZWRSZXdhcmRQb29sLl9pZH0pfSxhY3Rpb25zLnVwZGF0ZVJld2FyZFBvb2w9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsY29uZmlnOmNvbmZpZyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fT1wYXlsb2FkO2lmKCFhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJvcGVyYXRpb24gbXVzdCBiZSBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSlyZXR1cm47Y29uc3QgcGFyYW1zPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KSx7dXBkYXRlRmVlOnVwZGF0ZUZlZSxtYXhUYWdzUGVyUG9vbDptYXhUYWdzUGVyUG9vbH09cGFyYW1zLHV0aWxpdHlUb2tlbkJhbGFuY2U9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJiYWxhbmNlcyIse2FjY291bnQ6YXBpLnNlbmRlcixzeW1ib2w6IkJFRSJ9KSxhdXRob3JpemVkPSEoIWFwaS5CaWdOdW1iZXIodXBkYXRlRmVlKS5sdGUoMCkmJmFwaS5zZW5kZXIhPT1hcGkub3duZXIpfHx1dGlsaXR5VG9rZW5CYWxhbmNlJiZhcGkuQmlnTnVtYmVyKHV0aWxpdHlUb2tlbkJhbGFuY2UuYmFsYW5jZSkuZ3RlKHVwZGF0ZUZlZSk7aWYoIWFwaS5hc3NlcnQoYXV0aG9yaXplZCwieW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSB1cGRhdGUgZmVlIikpcmV0dXJuO2lmKCFhcGkuYXNzZXJ0KGNvbmZpZyYmIm9iamVjdCI9PXR5cGVvZiBjb25maWcsImNvbmZpZyBpbnZhbGlkIikpcmV0dXJuO2NvbnN0e3Bvc3RSZXdhcmRDdXJ2ZTpwb3N0UmV3YXJkQ3VydmUscG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyOnBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcixjdXJhdGlvblJld2FyZEN1cnZlOmN1cmF0aW9uUmV3YXJkQ3VydmUsY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcjpjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyLGN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZTpjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UsY2FzaG91dFdpbmRvd0RheXM6Y2FzaG91dFdpbmRvd0RheXMscmV3YXJkUGVySW50ZXJ2YWw6cmV3YXJkUGVySW50ZXJ2YWwscmV3YXJkSW50ZXJ2YWxTZWNvbmRzOnJld2FyZEludGVydmFsU2Vjb25kcyx2b3RlUmVnZW5lcmF0aW9uRGF5czp2b3RlUmVnZW5lcmF0aW9uRGF5cyxkb3dudm90ZVJlZ2VuZXJhdGlvbkRheXM6ZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzLHN0YWtlZFJld2FyZFBlcmNlbnRhZ2U6c3Rha2VkUmV3YXJkUGVyY2VudGFnZSx2b3RlUG93ZXJDb25zdW1wdGlvbjp2b3RlUG93ZXJDb25zdW1wdGlvbixkb3dudm90ZVBvd2VyQ29uc3VtcHRpb246ZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uLHRhZ3M6dGFncyxkaXNhYmxlRG93bnZvdGU6ZGlzYWJsZURvd252b3RlLGlnbm9yZURlY2xpbmVQYXlvdXQ6aWdub3JlRGVjbGluZVBheW91dCxhcHBUYXhDb25maWc6YXBwVGF4Q29uZmlnLGV4Y2x1ZGVUYWdzOmV4Y2x1ZGVUYWdzfT1jb25maWcsZXhpc3RpbmdSZXdhcmRQb29sPWF3YWl0IGFwaS5kYi5maW5kT25lKCJyZXdhcmRQb29scyIse19pZDpyZXdhcmRQb29sSWR9KTtpZighYXBpLmFzc2VydChleGlzdGluZ1Jld2FyZFBvb2wsInJld2FyZCBwb29sIG5vdCBmb3VuZCIpKXJldHVybjtjb25zdCB0b2tlbj1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsInRva2VucyIse3N5bWJvbDpleGlzdGluZ1Jld2FyZFBvb2wuc3ltYm9sfSk7aWYoIWFwaS5hc3NlcnQocG9zdFJld2FyZEN1cnZlJiYicG93ZXIiPT09cG9zdFJld2FyZEN1cnZlLCJwb3N0UmV3YXJkQ3VydmUgc2hvdWxkIGJlIG9uZSBvZjogW3Bvd2VyXSIpKXJldHVybjtleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLnBvc3RSZXdhcmRDdXJ2ZT1wb3N0UmV3YXJkQ3VydmU7Y29uc3QgcG9zdEV4cG9uZW50PWFwaS5CaWdOdW1iZXIocG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyKTtpZighYXBpLmFzc2VydCgic3RyaW5nIj09dHlwZW9mIHBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlciYmcG9zdEV4cG9uZW50LmlzRmluaXRlKCkmJnBvc3RFeHBvbmVudC5ndGUoIjEiKSYmcG9zdEV4cG9uZW50Lmx0ZSgiMiIpJiZwb3N0RXhwb25lbnQuZHAoKTw9MiwncG9zdFJld2FyZEN1cnZlUGFyYW1ldGVyIHNob3VsZCBiZSBiZXR3ZWVuICIxIiBhbmQgIjIiIHdpdGggcHJlY2lzaW9uIGF0IG1vc3QgMicpKXJldHVybjtpZihleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLnBvc3RSZXdhcmRDdXJ2ZVBhcmFtZXRlcj1wb3N0UmV3YXJkQ3VydmVQYXJhbWV0ZXIsIWFwaS5hc3NlcnQoY3VyYXRpb25SZXdhcmRDdXJ2ZSYmInBvd2VyIj09PWN1cmF0aW9uUmV3YXJkQ3VydmUsImN1cmF0aW9uUmV3YXJkQ3VydmUgc2hvdWxkIGJlIG9uZSBvZjogW3Bvd2VyXSIpKXJldHVybjtjb25zdCBjdXJhdGlvbkV4cG9uZW50PWFwaS5CaWdOdW1iZXIoY3VyYXRpb25SZXdhcmRDdXJ2ZVBhcmFtZXRlcik7aWYoIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyJiZjdXJhdGlvbkV4cG9uZW50LmlzRmluaXRlKCkmJmN1cmF0aW9uRXhwb25lbnQuZ3RlKCIwLjUiKSYmY3VyYXRpb25FeHBvbmVudC5sdGUoIjEiKSYmY3VyYXRpb25FeHBvbmVudC5kcCgpPD0yLCdjdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyIGNhbiBvbmx5IGJlIGJldHdlZW4gIjAuNSIgYW5kICIxIiB3aXRoIHByZWNpc2lvbiBhdCBtb3N0IDInKSlyZXR1cm47aWYoZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZEN1cnZlUGFyYW1ldGVyPWN1cmF0aW9uUmV3YXJkQ3VydmVQYXJhbWV0ZXIsIWFwaS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2UpJiZjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2U+PTAmJmN1cmF0aW9uUmV3YXJkUGVyY2VudGFnZTw9MTAwLCJjdXJhdGlvblJld2FyZFBlcmNlbnRhZ2Ugc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDAiKSlyZXR1cm47aWYoZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5jdXJhdGlvblJld2FyZFBlcmNlbnRhZ2U9Y3VyYXRpb25SZXdhcmRQZXJjZW50YWdlLCFhcGkuYXNzZXJ0KGNhc2hvdXRXaW5kb3dEYXlzJiZOdW1iZXIuaXNJbnRlZ2VyKGNhc2hvdXRXaW5kb3dEYXlzKSYmY2FzaG91dFdpbmRvd0RheXM+PTEmJmNhc2hvdXRXaW5kb3dEYXlzPD0zMCwiY2FzaG91dFdpbmRvd0RheXMgc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAzMCIpKXJldHVybjtleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLmNhc2hvdXRXaW5kb3dEYXlzPWNhc2hvdXRXaW5kb3dEYXlzO2NvbnN0IHBhcnNlZFJld2FyZFBlckludGVydmFsPWFwaS5CaWdOdW1iZXIocmV3YXJkUGVySW50ZXJ2YWwpO2FwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiByZXdhcmRQZXJJbnRlcnZhbCYmcGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwuaXNGaW5pdGUoKSYmcGFyc2VkUmV3YXJkUGVySW50ZXJ2YWwuZ3QoMCksInJld2FyZFBlckludGVydmFsIGludmFsaWQiKSYmYXBpLmFzc2VydChwYXJzZWRSZXdhcmRQZXJJbnRlcnZhbC5kcCgpPD10b2tlbi5wcmVjaXNpb24sInRva2VuIHByZWNpc2lvbiBtaXNtYXRjaCBmb3IgcmV3YXJkUGVySW50ZXJ2YWwiKSYmKGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcucmV3YXJkUGVySW50ZXJ2YWw9cmV3YXJkUGVySW50ZXJ2YWwsYXBpLmFzc2VydChyZXdhcmRJbnRlcnZhbFNlY29uZHMmJk51bWJlci5pc0ludGVnZXIocmV3YXJkSW50ZXJ2YWxTZWNvbmRzKSYmcmV3YXJkSW50ZXJ2YWxTZWNvbmRzPj0zJiZyZXdhcmRJbnRlcnZhbFNlY29uZHM8PTg2NDAwJiZyZXdhcmRJbnRlcnZhbFNlY29uZHMlMz09MCwicmV3YXJkSW50ZXJ2YWxTZWNvbmRzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMyBhbmQgODY0MDAsIGFuZCBkaXZpc2libGUgYnkgMyIpJiYoZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5yZXdhcmRJbnRlcnZhbFNlY29uZHM9cmV3YXJkSW50ZXJ2YWxTZWNvbmRzLGFwaS5hc3NlcnQodm90ZVJlZ2VuZXJhdGlvbkRheXMmJk51bWJlci5pc0ludGVnZXIodm90ZVJlZ2VuZXJhdGlvbkRheXMpJiZ2b3RlUmVnZW5lcmF0aW9uRGF5cz49MSYmdm90ZVJlZ2VuZXJhdGlvbkRheXM8PTMwLCJ2b3RlUmVnZW5lcmF0aW9uRGF5cyBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDMwIikmJihleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLnZvdGVSZWdlbmVyYXRpb25EYXlzPXZvdGVSZWdlbmVyYXRpb25EYXlzLGFwaS5hc3NlcnQoZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzJiZOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUmVnZW5lcmF0aW9uRGF5cykmJmRvd252b3RlUmVnZW5lcmF0aW9uRGF5cz49MSYmZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzPD0zMCwiZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzAiKSYmKGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcuZG93bnZvdGVSZWdlbmVyYXRpb25EYXlzPWRvd252b3RlUmVnZW5lcmF0aW9uRGF5cyxhcGkuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIoc3Rha2VkUmV3YXJkUGVyY2VudGFnZSkmJnN0YWtlZFJld2FyZFBlcmNlbnRhZ2U+PTAmJnN0YWtlZFJld2FyZFBlcmNlbnRhZ2U8PTEwMCwic3Rha2VkUmV3YXJkUGVyY2VudGFnZSBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMCIpJiYoZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5zdGFrZWRSZXdhcmRQZXJjZW50YWdlPXN0YWtlZFJld2FyZFBlcmNlbnRhZ2UsYXBpLmFzc2VydCh2b3RlUG93ZXJDb25zdW1wdGlvbiYmTnVtYmVyLmlzSW50ZWdlcih2b3RlUG93ZXJDb25zdW1wdGlvbikmJnZvdGVQb3dlckNvbnN1bXB0aW9uPj0xJiZ2b3RlUG93ZXJDb25zdW1wdGlvbjw9MWU0LCJ2b3RlUG93ZXJDb25zdW1wdGlvbiBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMDAwIikmJihleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLnZvdGVQb3dlckNvbnN1bXB0aW9uPXZvdGVQb3dlckNvbnN1bXB0aW9uLGFwaS5hc3NlcnQoZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uJiZOdW1iZXIuaXNJbnRlZ2VyKGRvd252b3RlUG93ZXJDb25zdW1wdGlvbikmJmRvd252b3RlUG93ZXJDb25zdW1wdGlvbj49MSYmZG93bnZvdGVQb3dlckNvbnN1bXB0aW9uPD0xZTQsImRvd252b3RlUG93ZXJDb25zdW1wdGlvbiBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMDAwIikmJihleGlzdGluZ1Jld2FyZFBvb2wuY29uZmlnLmRvd252b3RlUG93ZXJDb25zdW1wdGlvbj1kb3dudm90ZVBvd2VyQ29uc3VtcHRpb24sYXBpLmFzc2VydChBcnJheS5pc0FycmF5KHRhZ3MpJiZ0YWdzLmxlbmd0aD49MSYmdGFncy5sZW5ndGg8PW1heFRhZ3NQZXJQb29sJiZ0YWdzLmV2ZXJ5KCh0PT4ic3RyaW5nIj09dHlwZW9mIHQpKSxgdGFncyBzaG91bGQgYmUgYSBub24tZW1wdHkgYXJyYXkgb2Ygc3RyaW5ncyBvZiBsZW5ndGggYXQgbW9zdCAke21heFRhZ3NQZXJQb29sfWApJiYoZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy50YWdzPXRhZ3MsYXBpLmFzc2VydCgiYm9vbGVhbiI9PXR5cGVvZiBkaXNhYmxlRG93bnZvdGUsImRpc2FibGVEb3dudm90ZSBzaG91bGQgYmUgYm9vbGVhbiIpJiYoZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5kaXNhYmxlRG93bnZvdGU9ZGlzYWJsZURvd252b3RlLGFwaS5hc3NlcnQoImJvb2xlYW4iPT10eXBlb2YgaWdub3JlRGVjbGluZVBheW91dCwiaWdub3JlRGVjbGluZVBheW91dCBzaG91bGQgYmUgYm9vbGVhbiIpJiYoZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5pZ25vcmVEZWNsaW5lUGF5b3V0PWlnbm9yZURlY2xpbmVQYXlvdXQsYXNzZXJ0QXBwVGF4Q29uZmlnVmFsaWQoYXBwVGF4Q29uZmlnKSYmKGV4aXN0aW5nUmV3YXJkUG9vbC5jb25maWcuYXBwVGF4Q29uZmlnPWFwcFRheENvbmZpZyxhcGkuYXNzZXJ0KCFleGNsdWRlVGFnc3x8QXJyYXkuaXNBcnJheShleGNsdWRlVGFncykmJmV4Y2x1ZGVUYWdzLmxlbmd0aD49MSYmZXhjbHVkZVRhZ3MubGVuZ3RoPD1tYXhUYWdzUGVyUG9vbCYmZXhjbHVkZVRhZ3MuZXZlcnkoKHQ9PiJzdHJpbmciPT10eXBlb2YgdCkpLGBleGNsdWRlVGFncyBzaG91bGQgYmUgYSBub24tZW1wdHkgYXJyYXkgb2Ygc3RyaW5ncyBvZiBsZW5ndGggYXQgbW9zdCAke21heFRhZ3NQZXJQb29sfWApJiYoZXhpc3RpbmdSZXdhcmRQb29sLmNvbmZpZy5leGNsdWRlVGFncz1leGNsdWRlVGFncyxhcGkuYXNzZXJ0KGFwaS5zZW5kZXI9PT10b2tlbi5pc3N1ZXJ8fGFwaS5zZW5kZXI9PT1hcGkub3duZXImJiJCRUUiPT09dG9rZW4uc3ltYm9sLCJtdXN0IGJlIGlzc3VlciBvZiB0b2tlbiIpJiYoYXBpLnNlbmRlciE9PWFwaS5vd25lciYmYXBpLkJpZ051bWJlcih1cGRhdGVGZWUpLmd0KDApJiZhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDoiQkVFIixxdWFudGl0eTp1cGRhdGVGZWUsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmlzU2lnbmVkV2l0aEFjdGl2ZUtleX0pLGF3YWl0IGFwaS5kYi51cGRhdGUoInJld2FyZFBvb2xzIixleGlzdGluZ1Jld2FyZFBvb2wpKSkpKSkpKSkpKSkpKX0sYWN0aW9ucy5zZXRBY3RpdmU9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsYWN0aXZlOmFjdGl2ZSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fT1wYXlsb2FkO2lmKCFhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJvcGVyYXRpb24gbXVzdCBiZSBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSlyZXR1cm47Y29uc3QgZXhpc3RpbmdSZXdhcmRQb29sPWF3YWl0IGFwaS5kYi5maW5kT25lKCJyZXdhcmRQb29scyIse19pZDpyZXdhcmRQb29sSWR9KTtpZighYXBpLmFzc2VydChleGlzdGluZ1Jld2FyZFBvb2wsInJld2FyZCBwb29sIG5vdCBmb3VuZCIpKXJldHVybjtjb25zdCB0b2tlbj1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsInRva2VucyIse3N5bWJvbDpleGlzdGluZ1Jld2FyZFBvb2wuc3ltYm9sfSk7YXBpLmFzc2VydChhcGkuc2VuZGVyPT09dG9rZW4uaXNzdWVyfHxhcGkuc2VuZGVyPT09YXBpLm93bmVyLCJtdXN0IGJlIGlzc3VlciBvZiB0b2tlbiIpJiYoZXhpc3RpbmdSZXdhcmRQb29sLmFjdGl2ZT1hY3RpdmUsYXdhaXQgYXBpLmRiLnVwZGF0ZSgicmV3YXJkUG9vbHMiLGV4aXN0aW5nUmV3YXJkUG9vbCkpfSxhY3Rpb25zLnNldE11dGU9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsYWNjb3VudDphY2NvdW50LG11dGU6bXV0ZX09cGF5bG9hZCxleGlzdGluZ1Jld2FyZFBvb2w9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInJld2FyZFBvb2xzIix7X2lkOnJld2FyZFBvb2xJZH0pO2lmKCFhcGkuYXNzZXJ0KGV4aXN0aW5nUmV3YXJkUG9vbCwicmV3YXJkIHBvb2wgbm90IGZvdW5kIikpcmV0dXJuO2NvbnN0IHRva2VuPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOmV4aXN0aW5nUmV3YXJkUG9vbC5zeW1ib2x9KTtpZighYXBpLmFzc2VydChhcGkuc2VuZGVyPT09dG9rZW4uaXNzdWVyfHxhcGkuc2VuZGVyPT09YXBpLm93bmVyLCJtdXN0IGJlIGlzc3VlciBvZiB0b2tlbiIpKXJldHVybjtpZighYXBpLmFzc2VydChhcGkuaXNWYWxpZEFjY291bnROYW1lKGFjY291bnQpLCJpbnZhbGlkIGFjY291bnQiKSlyZXR1cm47aWYoIWFwaS5hc3NlcnQoImJvb2xlYW4iPT10eXBlb2YgbXV0ZSwibXV0ZSBtdXN0IGJlIGEgYm9vbGVhbiIpKXJldHVybjtjb25zdCB2b3RpbmdQb3dlcj1hd2FpdCBhcGkuZGIuZmluZE9uZSgidm90aW5nUG93ZXIiLHtyZXdhcmRQb29sSWQ6cmV3YXJkUG9vbElkLGFjY291bnQ6YWNjb3VudH0pO2lmKHZvdGluZ1Bvd2VyKXZvdGluZ1Bvd2VyLm11dGU9bXV0ZSxhd2FpdCBhcGkuZGIudXBkYXRlKCJ2b3RpbmdQb3dlciIsdm90aW5nUG93ZXIpO2Vsc2V7Y29uc3QgbmV3Vm90aW5nUG93ZXI9e3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsYWNjb3VudDphY2NvdW50LGxhc3RWb3RlVGltZXN0YW1wOm5ldyBEYXRlKGAke2FwaS5oaXZlQmxvY2tUaW1lc3RhbXB9LjAwMFpgKS5nZXRUaW1lKCksdm90aW5nUG93ZXI6MWU0LGRvd252b3RpbmdQb3dlcjoxZTQsbXV0ZTptdXRlfTthd2FpdCBhcGkuZGIuaW5zZXJ0KCJ2b3RpbmdQb3dlciIsbmV3Vm90aW5nUG93ZXIpfX0sYWN0aW9ucy5yZXNldFBvb2w9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmlzU2lnbmVkV2l0aEFjdGl2ZUtleX09cGF5bG9hZDtpZighYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwib3BlcmF0aW9uIG11c3QgYmUgc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikpcmV0dXJuO2NvbnN0IGV4aXN0aW5nUmV3YXJkUG9vbD1hd2FpdCBhcGkuZGIuZmluZE9uZSgicmV3YXJkUG9vbHMiLHtfaWQ6cmV3YXJkUG9vbElkfSk7aWYoIWFwaS5hc3NlcnQoZXhpc3RpbmdSZXdhcmRQb29sLCJyZXdhcmQgcG9vbCBub3QgZm91bmQiKSlyZXR1cm47Y29uc3QgdG9rZW49YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJ0b2tlbnMiLHtzeW1ib2w6ZXhpc3RpbmdSZXdhcmRQb29sLnN5bWJvbH0pO2lmKCFhcGkuYXNzZXJ0KGFwaS5zZW5kZXI9PT10b2tlbi5pc3N1ZXJ8fGFwaS5zZW5kZXI9PT1hcGkub3duZXIsIm11c3QgYmUgaXNzdWVyIG9mIHRva2VuIikpcmV0dXJuO2NvbnN0IHRpbWVzdGFtcD1uZXcgRGF0ZShgJHthcGkuaGl2ZUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpO2V4aXN0aW5nUmV3YXJkUG9vbC5yZXdhcmRQb29sPSIwIixleGlzdGluZ1Jld2FyZFBvb2wubGFzdFJld2FyZFRpbWVzdGFtcD10aW1lc3RhbXAsZXhpc3RpbmdSZXdhcmRQb29sLmxhc3RDbGFpbURlY2F5VGltZXN0YW1wPXRpbWVzdGFtcCxleGlzdGluZ1Jld2FyZFBvb2wuY3JlYXRlZFRpbWVzdGFtcD10aW1lc3RhbXAsZXhpc3RpbmdSZXdhcmRQb29sLnBlbmRpbmdDbGFpbXM9IjAiLGF3YWl0IGFwaS5kYi51cGRhdGUoInJld2FyZFBvb2xzIixleGlzdGluZ1Jld2FyZFBvb2wpfSxhY3Rpb25zLmNvbW1lbnQ9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e2F1dGhvcjphdXRob3IscGVybWxpbms6cGVybWxpbmsscmV3YXJkUG9vbHM6cmV3YXJkUG9vbHN9PXBheWxvYWQ7aWYoIWFwaS5hc3NlcnQoIm51bGwiPT09YXBpLnNlbmRlciwiYWN0aW9uIG11c3QgdXNlIGNvbW1lbnQgb3BlcmF0aW9uIikpcmV0dXJuO2lmKGF3YWl0IHRva2VuTWFpbnRlbmFuY2UoKSwhYXBpLmFzc2VydCghcmV3YXJkUG9vbHN8fEFycmF5LmlzQXJyYXkocmV3YXJkUG9vbHMpJiZyZXdhcmRQb29scy5ldmVyeSgocnA9Pk51bWJlci5pc0ludGVnZXIocnApKSksInJld2FyZFBvb2xzIG11c3QgYmUgYW4gYXJyYXkgb2YgaW50ZWdlcnMiKSlyZXR1cm47Y29uc3QgcmV3YXJkUG9vbElkcz1hd2FpdCBnZXRSZXdhcmRQb29sSWRzKHBheWxvYWQpLGF1dGhvcnBlcm09YEAke2F1dGhvcn0vJHtwZXJtbGlua31gO2lmKGF3YWl0IGFwaS5kYi5maW5kT25lKCJwb3N0TWV0YWRhdGEiLHthdXRob3JwZXJtOmF1dGhvcnBlcm19KSlyZXR1cm47aWYoYXdhaXQgYXBpLmRiLmZpbmRPbmUoInBvc3RzIix7YXV0aG9ycGVybTphdXRob3JwZXJtfSkpcmV0dXJuO2F3YWl0IGFwaS5kYi5pbnNlcnQoInBvc3RNZXRhZGF0YSIse2F1dGhvcnBlcm06YXV0aG9ycGVybSxyZXdhcmRQb29sSWRzOnJld2FyZFBvb2xJZHN9KTtjb25zdCB0aW1lc3RhbXA9bmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApLmdldFRpbWUoKTtmb3IobGV0IGk9MDtpPHJld2FyZFBvb2xJZHMubGVuZ3RoO2krPTEpe2NvbnN0IHJld2FyZFBvb2xJZD1yZXdhcmRQb29sSWRzW2ldLHJld2FyZFBvb2w9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInJld2FyZFBvb2xzIix7X2lkOnJld2FyZFBvb2xJZH0pO2lmKHJld2FyZFBvb2wmJnJld2FyZFBvb2wuYWN0aXZlKXtjb25zdCBjYXNob3V0VGltZT10aW1lc3RhbXArMjQqcmV3YXJkUG9vbC5jb25maWcuY2FzaG91dFdpbmRvd0RheXMqMzYwMCoxZTMscG9zdD17cmV3YXJkUG9vbElkOnJld2FyZFBvb2xJZCxzeW1ib2w6cmV3YXJkUG9vbC5zeW1ib2wsYXV0aG9ycGVybTphdXRob3JwZXJtLGF1dGhvcjphdXRob3IsY3JlYXRlZDp0aW1lc3RhbXAsY2FzaG91dFRpbWU6Y2FzaG91dFRpbWUsdm90ZVBvc2l0aXZlUnNoYXJlU3VtOiIwIix2b3RlUnNoYXJlU3VtOiIwIn07aWYocGF5bG9hZC5qc29uTWV0YWRhdGEmJnBheWxvYWQuanNvbk1ldGFkYXRhLmFwcCl7Y29uc3QgYXBwU3RyaW5nPXBheWxvYWQuanNvbk1ldGFkYXRhLmFwcDsic3RyaW5nIj09dHlwZW9mIGFwcFN0cmluZyYmKHBvc3QuYXBwPWFwcFN0cmluZy5zcGxpdCgiLyIpWzBdLnRvTG93ZXJDYXNlKCkpfWF3YWl0IGFwaS5kYi5pbnNlcnQoInBvc3RzIixwb3N0KSxhcGkuZW1pdCgibmV3Q29tbWVudCIse3Jld2FyZFBvb2xJZDpyZXdhcmRQb29sSWQsc3ltYm9sOnJld2FyZFBvb2wuc3ltYm9sfSl9fX0sYWN0aW9ucy5jb21tZW50T3B0aW9ucz1hc3luYyBwYXlsb2FkPT57Y29uc3R7YXV0aG9yOmF1dGhvcixwZXJtbGluazpwZXJtbGluayxtYXhBY2NlcHRlZFBheW91dDptYXhBY2NlcHRlZFBheW91dCxiZW5lZmljaWFyaWVzOmJlbmVmaWNpYXJpZXN9PXBheWxvYWQ7aWYoIWFwaS5hc3NlcnQoIm51bGwiPT09YXBpLnNlbmRlciwiYWN0aW9uIG11c3QgdXNlIGNvbW1lbnRPcHRpb25zIG9wZXJhdGlvbiIpKXJldHVybjtjb25zdCBhdXRob3JwZXJtPWBAJHthdXRob3J9LyR7cGVybWxpbmt9YCxleGlzdGluZ1Bvc3RzPWF3YWl0IGFwaS5kYi5maW5kKCJwb3N0cyIse2F1dGhvcnBlcm06YXV0aG9ycGVybX0pO2lmKCFleGlzdGluZ1Bvc3RzKXJldHVybjtjb25zdCBkZWNsaW5lUGF5b3V0PW1heEFjY2VwdGVkUGF5b3V0LnN0YXJ0c1dpdGgoIjAuMDAwIik7Zm9yKGxldCBpPTA7aTxleGlzdGluZ1Bvc3RzLmxlbmd0aDtpKz0xKXtjb25zdCBwb3N0PWV4aXN0aW5nUG9zdHNbaV07KGF3YWl0IGFwaS5kYi5maW5kT25lKCJyZXdhcmRQb29scyIse19pZDpwb3N0LnJld2FyZFBvb2xJZH0pKS5jb25maWcuaWdub3JlRGVjbGluZVBheW91dHx8KHBvc3QuZGVjbGluZVBheW91dD1kZWNsaW5lUGF5b3V0KSxwb3N0LmJlbmVmaWNpYXJpZXM9YmVuZWZpY2lhcmllcyxhd2FpdCBhcGkuZGIudXBkYXRlKCJwb3N0cyIscG9zdCl9fSxhY3Rpb25zLnZvdGU9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e3ZvdGVyOnZvdGVyLGF1dGhvcjphdXRob3IscGVybWxpbms6cGVybWxpbmssd2VpZ2h0OndlaWdodH09cGF5bG9hZDtpZighYXBpLmFzc2VydCgibnVsbCI9PT1hcGkuc2VuZGVyLCJjYW4gb25seSB2b3RlIHdpdGggdm90aW5nIG9wIikpcmV0dXJuO2lmKGF3YWl0IHRva2VuTWFpbnRlbmFuY2UoKSwhYXBpLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKHdlaWdodCkmJndlaWdodD49LTFlNCYmd2VpZ2h0PD0xZTQsIndlaWdodCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAtMTAwMDAgdG8gMTAwMDAiKSlyZXR1cm47Y29uc3QgdGltZXN0YW1wPW5ldyBEYXRlKGAke2FwaS5oaXZlQmxvY2tUaW1lc3RhbXB9LjAwMFpgKS5nZXRUaW1lKCksYXV0aG9ycGVybT1gQCR7YXV0aG9yfS8ke3Blcm1saW5rfWAscG9zdHM9YXdhaXQgYXBpLmRiLmZpbmQoInBvc3RzIix7YXV0aG9ycGVybTphdXRob3JwZXJtfSwxZTMsMCxbe2luZGV4OiJfaWQiLGRlc2NlbmRpbmc6ITF9XSk7aWYocG9zdHMpZm9yKGxldCBpPTA7aTxwb3N0cy5sZW5ndGg7aSs9MSl7Y29uc3QgcG9zdD1wb3N0c1tpXTthd2FpdCBwcm9jZXNzVm90ZShwb3N0LHZvdGVyLHdlaWdodCx0aW1lc3RhbXApfX07" } }}

{ "id": "ssc-testnet-hive", "json": { "contractName":"contract", "contractAction":"update", "contractPayload": { "name": "roles", "params": "", "code": "Y29uc3QgQ29udHJhY3ROYW1lPSJyb2xlcyIsRmVlTWV0aG9kPVsiYnVybiIsImlzc3VlciJdO2FzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNhbmRpZGF0ZVdlaWdodChpZCxkZWx0YUFwcHJvdmFsV2VpZ2h0LGRlbHRhVG9rZW49bnVsbCl7Y29uc3QgY2FuZGlkYXRlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJjYW5kaWRhdGVzIix7X2lkOmlkfSk7aWYoY2FuZGlkYXRlKXtpZihkZWx0YVRva2VuKXtjb25zdCByb2xlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJyb2xlcyIse19pZDpjYW5kaWRhdGUucm9sZUlkfSk7aWYoKGF3YWl0IGFwaS5kYi5maW5kT25lKCJpbnN0YW5jZXMiLHtfaWQ6cm9sZS5pbnN0YW5jZUlkfSkpLnZvdGVUb2tlbiE9PWRlbHRhVG9rZW4uc3ltYm9sKXJldHVybiEwfWNhbmRpZGF0ZS5hcHByb3ZhbFdlaWdodD17JG51bWJlckRlY2ltYWw6YXBpLkJpZ051bWJlcihjYW5kaWRhdGUuYXBwcm92YWxXZWlnaHQuJG51bWJlckRlY2ltYWwpLnBsdXMoZGVsdGFBcHByb3ZhbFdlaWdodCl9LGF3YWl0IGFwaS5kYi51cGRhdGUoImNhbmRpZGF0ZXMiLGNhbmRpZGF0ZSk7Y29uc3Qgcm9sZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgicm9sZXMiLHtfaWQ6Y2FuZGlkYXRlLnJvbGVJZH0pO3JldHVybiByb2xlLnRvdGFsQXBwcm92YWxXZWlnaHQ9eyRudW1iZXJEZWNpbWFsOmFwaS5CaWdOdW1iZXIocm9sZS50b3RhbEFwcHJvdmFsV2VpZ2h0LiRudW1iZXJEZWNpbWFsKS5wbHVzKGRlbHRhQXBwcm92YWxXZWlnaHQpfSxhd2FpdCBhcGkuZGIudXBkYXRlKCJyb2xlcyIscm9sZSksITB9cmV0dXJuITF9YXN5bmMgZnVuY3Rpb24gdXBkYXRlVG9rZW5CYWxhbmNlcyhyb2xlLHRva2VuLHF1YW50aXR5KXtjb25zdCB1cFJvbGU9cm9sZTtpZih1cFJvbGUudG9rZW5CYWxhbmNlcyl7Y29uc3QgdEluZGV4PXVwUm9sZS50b2tlbkJhbGFuY2VzLmZpbmRJbmRleCgodD0+dC5zeW1ib2w9PT10b2tlbi5zeW1ib2wpKTstMT09PXRJbmRleD91cFJvbGUudG9rZW5CYWxhbmNlcy5wdXNoKHtzeW1ib2w6dG9rZW4uc3ltYm9sLHF1YW50aXR5OnF1YW50aXR5fSk6dXBSb2xlLnRva2VuQmFsYW5jZXNbdEluZGV4XS5xdWFudGl0eT1hcGkuQmlnTnVtYmVyKHVwUm9sZS50b2tlbkJhbGFuY2VzW3RJbmRleF0ucXVhbnRpdHkpLnBsdXMocXVhbnRpdHkpLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTil9ZWxzZSB1cFJvbGUudG9rZW5CYWxhbmNlcz1be3N5bWJvbDp0b2tlbi5zeW1ib2wscXVhbnRpdHk6cXVhbnRpdHl9XTthd2FpdCBhcGkuZGIudXBkYXRlKCJyb2xlcyIsdXBSb2xlKX1hc3luYyBmdW5jdGlvbiBwYXlSZWNpcGllbnQoYWNjb3VudCxzeW1ib2wscXVhbnRpdHksdHlwZT0idXNlciIsY29udHJhY3RQYXlsb2FkPW51bGwpe2lmKGFwaS5CaWdOdW1iZXIocXVhbnRpdHkpLmd0KDApKXtjb25zdCByZXM9YXdhaXQgYXBpLnRyYW5zZmVyVG9rZW5zKGFjY291bnQsc3ltYm9sLHF1YW50aXR5LHR5cGUpO3JldHVybiJjb250cmFjdCI9PT10eXBlJiZjb250cmFjdFBheWxvYWQmJmF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdChhY2NvdW50LCJyZWNlaXZlUm9sZXNUb2tlbnMiLHtkYXRhOmNvbnRyYWN0UGF5bG9hZCxzeW1ib2w6c3ltYm9sLHF1YW50aXR5OnF1YW50aXR5fSksIXJlcy5lcnJvcnN8fChhcGkuZGVidWcoYEVycm9yIHBheWluZyBvdXQgcm9sZXMgb2YgJHtxdWFudGl0eX0gJHtzeW1ib2x9IHRvICR7YWNjb3VudH0gKFRYSUQgJHthcGkudHJhbnNhY3Rpb25JZH0pOiBcbiR7cmVzLmVycm9yc31gKSwhMSl9cmV0dXJuITF9YXN5bmMgZnVuY3Rpb24gY2hlY2tQZW5kaW5nQ2FuZGlkYXRlcyhpbnN0LHBhcmFtcyl7Y29uc3QgcmFuZG9tPWFwaS5yYW5kb20oKSxibG9ja0RhdGU9bmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApLHVwSW5zdD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGluc3QpKSx2b3RlVG9rZW5PYmo9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJ0b2tlbnMiLHtzeW1ib2w6aW5zdC52b3RlVG9rZW59KSx2b3RlVG9rZW5NaW5WYWx1ZT1hcGkuQmlnTnVtYmVyKDEpLmRpdmlkZWRCeShhcGkuQmlnTnVtYmVyKDEwKS5wb3codm90ZVRva2VuT2JqLnByZWNpc2lvbikpLGluc3RUaWNrVGltZT1hcGkuQmlnTnVtYmVyKGJsb2NrRGF0ZS5nZXRUaW1lKCkpLm1pbnVzKDM2MDAqcGFyYW1zLmluc3RhbmNlVGlja0hvdXJzKjFlMykudG9OdW1iZXIoKTtsZXQgcm9sZXNQcm9jZXNzZWQ9MDtjb25zdCBwZW5kaW5nUm9sZXM9YXdhaXQgYXBpLmRiLmZpbmQoInJvbGVzIix7aW5zdGFuY2VJZDppbnN0LmlkLGFjdGl2ZTohMCwidG9rZW5CYWxhbmNlcy4wIjp7JGV4aXN0czohMH0sbGFzdFRpY2tUaW1lOnskbHRlOmluc3RUaWNrVGltZX19LHBhcmFtcy5tYXhSb2xlc1BlckJsb2NrLDAsW3tpbmRleDoiYnlMYXN0VGlja1RpbWUiLGRlc2NlbmRpbmc6ITF9LHtpbmRleDoiX2lkIixkZXNjZW5kaW5nOiExfV0pO2ZvcihsZXQgaT0wO2k8cGVuZGluZ1JvbGVzLmxlbmd0aDtpKz0xKXtjb25zdCByb2xlPXBlbmRpbmdSb2xlc1tpXSxmdW5kZWQ9W10scGF5VG9rZW5zPXJvbGUudG9rZW5CYWxhbmNlcy5maWx0ZXIoKHQ9PmFwaS5CaWdOdW1iZXIodC5xdWFudGl0eSkuZ3QoMCkpKSx0b3RhbFNsb3RzPWFwaS5CaWdOdW1iZXIocm9sZS5tYWluU2xvdHMpLnBsdXMocm9sZS5iYWNrdXBTbG90cykudG9OdW1iZXIoKSxyb2xlVGlja1RpbWU9YXBpLkJpZ051bWJlcihibG9ja0RhdGUuZ2V0VGltZSgpKS5taW51cygzNjAwKnJvbGUudGlja0hvdXJzKjFlMykudG9OdW1iZXIoKTtpZihyb2xlLmxhc3RUaWNrVGltZTw9cm9sZVRpY2tUaW1lKXtpZihwYXlUb2tlbnMubGVuZ3RoPjApe2xldCBvZmZzZXQ9MCxjYW5kaWRhdGVzPWF3YWl0IGFwaS5kYi5maW5kKCJjYW5kaWRhdGVzIix7cm9sZUlkOnJvbGUuX2lkLGFjdGl2ZTohMCxhcHByb3ZhbFdlaWdodDp7JGd0OnskbnVtYmVyRGVjaW1hbDphcGkuQmlnTnVtYmVyKHJvbGUudm90ZVRocmVzaG9sZCl9fX0scGFyYW1zLnByb2Nlc3NRdWVyeUxpbWl0LG9mZnNldCxbe2luZGV4OiJieUFwcHJvdmFsV2VpZ2h0IixkZXNjZW5kaW5nOiEwfSx7aW5kZXg6Il9pZCIsZGVzY2VuZGluZzohMX1dKSxhY2NXZWlnaHQ9MCxiYWNrdXBXZWlnaHQ9bnVsbDtkb3tmb3IobGV0IGo9MDtqPGNhbmRpZGF0ZXMubGVuZ3RoO2orPTEpe2NvbnN0IGNhbmRpZGF0ZT1jYW5kaWRhdGVzW2pdO2lmKGZ1bmRlZC5sZW5ndGg+PXJvbGUubWFpblNsb3RzJiZudWxsPT09YmFja3VwV2VpZ2h0JiYoYmFja3VwV2VpZ2h0PWFwaS5CaWdOdW1iZXIoYWNjV2VpZ2h0KS5wbHVzKHZvdGVUb2tlbk1pblZhbHVlKS5wbHVzKGFwaS5CaWdOdW1iZXIocm9sZS50b3RhbEFwcHJvdmFsV2VpZ2h0LiRudW1iZXJEZWNpbWFsKS5taW51cyhhY2NXZWlnaHQpLnRpbWVzKHJhbmRvbSkpLnRvRml4ZWQodm90ZVRva2VuT2JqLnByZWNpc2lvbixhcGkuQmlnTnVtYmVyLlJPVU5EX0hBTEZfVVApKSxhY2NXZWlnaHQ9YXBpLkJpZ051bWJlcihhY2NXZWlnaHQpLnBsdXMoY2FuZGlkYXRlLmFwcHJvdmFsV2VpZ2h0LiRudW1iZXJEZWNpbWFsKS50b0ZpeGVkKHZvdGVUb2tlbk9iai5wcmVjaXNpb24sYXBpLkJpZ051bWJlci5ST1VORF9IQUxGX1VQKSwhMD09PWNhbmRpZGF0ZS5hY3RpdmUmJihmdW5kZWQubGVuZ3RoPHJvbGUubWFpblNsb3RzfHxhcGkuQmlnTnVtYmVyKGJhY2t1cFdlaWdodCkubHRlKGFjY1dlaWdodCkpJiZmdW5kZWQucHVzaCh7Y2FuZGlkYXRlOmNhbmRpZGF0ZS5faWQsYWNjb3VudDpjYW5kaWRhdGUuYWNjb3VudH0pLGZ1bmRlZC5sZW5ndGg+PXRvdGFsU2xvdHMpYnJlYWt9ZnVuZGVkLmxlbmd0aDx0b3RhbFNsb3RzJiYob2Zmc2V0Kz1wYXJhbXMucHJvY2Vzc1F1ZXJ5TGltaXQsY2FuZGlkYXRlcz1hd2FpdCBhcGkuZGIuZmluZCgiY2FuZGlkYXRlcyIse3JvbGVJZDpyb2xlLl9pZCxhY3RpdmU6ITAsYXBwcm92YWxXZWlnaHQ6eyRndDp7JG51bWJlckRlY2ltYWw6YXBpLkJpZ051bWJlcihyb2xlLnZvdGVUaHJlc2hvbGQpfX19LHBhcmFtcy5wcm9jZXNzUXVlcnlMaW1pdCxvZmZzZXQsW3tpbmRleDoiYnlBcHByb3ZhbFdlaWdodCIsZGVzY2VuZGluZzohMH0se2luZGV4OiJfaWQiLGRlc2NlbmRpbmc6ITF9XSkpfXdoaWxlKGNhbmRpZGF0ZXMubGVuZ3RoPjAmJmZ1bmRlZC5sZW5ndGg8dG90YWxTbG90cyk7Zm9yKGxldCBsPTA7bDxwYXlUb2tlbnMubGVuZ3RoO2wrPTEpe2NvbnN0IHBheVRva2VuPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOnBheVRva2Vuc1tsXS5zeW1ib2x9KSxwYXlvdXRRdHk9YXBpLkJpZ051bWJlcihwYXlUb2tlbnNbbF0ucXVhbnRpdHkpLmRpdmlkZWRCeSh0b3RhbFNsb3RzKS50b0ZpeGVkKHBheVRva2VuLnByZWNpc2lvbixhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pO2lmKGFwaS5CaWdOdW1iZXIocGF5b3V0UXR5KS5ndCgwKSlmb3IobGV0IGs9MDtrPGZ1bmRlZC5sZW5ndGg7ays9MSl7Y29uc3QgZnVuZD1mdW5kZWRba107aWYoYXdhaXQgcGF5UmVjaXBpZW50KGZ1bmQuYWNjb3VudCxwYXlUb2tlbnNbbF0uc3ltYm9sLHBheW91dFF0eSkpe2NvbnN0IHRiSW5kZXg9cm9sZS50b2tlbkJhbGFuY2VzLmZpbmRJbmRleCgoYj0+Yi5zeW1ib2w9PT1wYXlUb2tlbnNbbF0uc3ltYm9sKSk7cm9sZS50b2tlbkJhbGFuY2VzW3RiSW5kZXhdLnF1YW50aXR5PWFwaS5CaWdOdW1iZXIocm9sZS50b2tlbkJhbGFuY2VzW3RiSW5kZXhdLnF1YW50aXR5KS5taW51cyhwYXlvdXRRdHkpLnRvRml4ZWQocGF5VG9rZW4ucHJlY2lzaW9uLGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTiksYXBpLmVtaXQoInJvbGVQYXltZW50Iix7aW5zdGFuY2VJZDppbnN0LmlkLHJvbGVJZDpyb2xlLl9pZCxhY2NvdW50OmZ1bmQuYWNjb3VudCxzeW1ib2w6cGF5VG9rZW5zW2xdLnN5bWJvbCxxdWFudGl0eTpwYXlvdXRRdHl9KX19fX1yb2xlc1Byb2Nlc3NlZCs9MTtjb25zdCB1cFJvbGU9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyb2xlKSk7dXBSb2xlLmxhc3RUaWNrVGltZT1ibG9ja0RhdGUuZ2V0VGltZSgpLGF3YWl0IGFwaS5kYi51cGRhdGUoInJvbGVzIix1cFJvbGUpfX0wPT09cm9sZXNQcm9jZXNzZWQmJih1cEluc3QubGFzdFRpY2tUaW1lPWJsb2NrRGF0ZS5nZXRUaW1lKCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgiaW5zdGFuY2VzIix1cEluc3QpKX1hY3Rpb25zLmNyZWF0ZVNTQz1hc3luYygpPT57aWYoITE9PT1hd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoImluc3RhbmNlcyIpKXthd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoImluc3RhbmNlcyIsWyJpZCIsImxhc3RUaWNrVGltZSJdKSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoInJvbGVzIixbImluc3RhbmNlSWQiLHtuYW1lOiJieUxhc3RUaWNrVGltZSIsaW5kZXg6e2luc3RhbmNlSWQ6MSxhY3RpdmU6MSxsYXN0VGlja1RpbWU6MX19XSksYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJjYW5kaWRhdGVzIixbImFjY291bnQiLHtuYW1lOiJieUFjY291bnRSb2xlIixpbmRleDp7cm9sZUlkOjEsYWNjb3VudDoxfX0se25hbWU6ImJ5QXBwcm92YWxXZWlnaHQiLGluZGV4Ontyb2xlSWQ6MSxhcHByb3ZhbFdlaWdodDoxLGFjdGl2ZToxfX1dKSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoImFwcHJvdmFscyIsWyJmcm9tIiwidG8iXSksYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJhY2NvdW50cyIsW10se3ByaW1hcnlLZXk6WyJhY2NvdW50Il19KSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoInBhcmFtcyIpO2NvbnN0IHBhcmFtcz17aW5zdGFuY2VDcmVhdGlvbkZlZToiNTAwIixpbnN0YW5jZVVwZGF0ZUZlZToiMTAwIixpbnN0YW5jZVRpY2tIb3VyczoiMjQiLHJvbGVDcmVhdGlvbkZlZToiNTAiLHJvbGVVcGRhdGVGZWU6IjI1IixtYXhTbG90czoxMCxtYXhJbnN0YW5jZXNQZXJCbG9jazoxLG1heFJvbGVzUGVyQmxvY2s6NCxtYXhBY2NvdW50QXBwcm92YWxzOjUwLHByb2Nlc3NRdWVyeUxpbWl0OjFlM307YXdhaXQgYXBpLmRiLmluc2VydCgicGFyYW1zIixwYXJhbXMpfX0sYWN0aW9ucy51cGRhdGVQYXJhbXM9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e2luc3RhbmNlQ3JlYXRpb25GZWU6aW5zdGFuY2VDcmVhdGlvbkZlZSxpbnN0YW5jZVVwZGF0ZUZlZTppbnN0YW5jZVVwZGF0ZUZlZSxpbnN0YW5jZVRpY2tIb3VyczppbnN0YW5jZVRpY2tIb3Vycyxyb2xlQ3JlYXRpb25GZWU6cm9sZUNyZWF0aW9uRmVlLHJvbGVVcGRhdGVGZWU6cm9sZVVwZGF0ZUZlZSxtYXhTbG90czptYXhTbG90cyxtYXhJbnN0YW5jZXNQZXJCbG9jazptYXhJbnN0YW5jZXNQZXJCbG9jayxtYXhSb2xlc1BlckJsb2NrOm1heFJvbGVzUGVyQmxvY2ssbWF4QWNjb3VudEFwcHJvdmFsczptYXhBY2NvdW50QXBwcm92YWxzLHByb2Nlc3NRdWVyeUxpbWl0OnByb2Nlc3NRdWVyeUxpbWl0fT1wYXlsb2FkO2lmKGFwaS5zZW5kZXIhPT1hcGkub3duZXIpcmV0dXJuO2NvbnN0IHBhcmFtcz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSk7aWYoaW5zdGFuY2VDcmVhdGlvbkZlZSl7aWYoIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBpbnN0YW5jZUNyZWF0aW9uRmVlJiYhYXBpLkJpZ051bWJlcihpbnN0YW5jZUNyZWF0aW9uRmVlKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKGluc3RhbmNlQ3JlYXRpb25GZWUpLmd0ZSgwKSwiaW52YWxpZCBpbnN0YW5jZUNyZWF0aW9uRmVlIikpcmV0dXJuO3BhcmFtcy5pbnN0YW5jZUNyZWF0aW9uRmVlPWluc3RhbmNlQ3JlYXRpb25GZWV9aWYoaW5zdGFuY2VVcGRhdGVGZWUpe2lmKCFhcGkuYXNzZXJ0KCJzdHJpbmciPT10eXBlb2YgaW5zdGFuY2VVcGRhdGVGZWUmJiFhcGkuQmlnTnVtYmVyKGluc3RhbmNlVXBkYXRlRmVlKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKGluc3RhbmNlVXBkYXRlRmVlKS5ndGUoMCksImludmFsaWQgaW5zdGFuY2VVcGRhdGVGZWUiKSlyZXR1cm47cGFyYW1zLmluc3RhbmNlVXBkYXRlRmVlPWluc3RhbmNlVXBkYXRlRmVlfWlmKGluc3RhbmNlVGlja0hvdXJzKXtpZighYXBpLmFzc2VydCgic3RyaW5nIj09dHlwZW9mIGluc3RhbmNlVGlja0hvdXJzJiZhcGkuQmlnTnVtYmVyKGluc3RhbmNlVGlja0hvdXJzKS5pc0ludGVnZXIoKSYmYXBpLkJpZ051bWJlcihpbnN0YW5jZVRpY2tIb3VycykuZ3RlKDEpLCJpbnZhbGlkIGluc3RhbmNlVGlja0hvdXJzIikpcmV0dXJuO3BhcmFtcy5pbnN0YW5jZVRpY2tIb3Vycz1pbnN0YW5jZVRpY2tIb3Vyc31pZihyb2xlQ3JlYXRpb25GZWUpe2lmKCFhcGkuYXNzZXJ0KCJzdHJpbmciPT10eXBlb2Ygcm9sZUNyZWF0aW9uRmVlJiYhYXBpLkJpZ051bWJlcihyb2xlQ3JlYXRpb25GZWUpLmlzTmFOKCkmJmFwaS5CaWdOdW1iZXIocm9sZUNyZWF0aW9uRmVlKS5ndGUoMCksImludmFsaWQgcm9sZUNyZWF0aW9uRmVlIikpcmV0dXJuO3BhcmFtcy5yb2xlQ3JlYXRpb25GZWU9cm9sZUNyZWF0aW9uRmVlfWlmKHJvbGVVcGRhdGVGZWUpe2lmKCFhcGkuYXNzZXJ0KCJzdHJpbmciPT10eXBlb2Ygcm9sZVVwZGF0ZUZlZSYmIWFwaS5CaWdOdW1iZXIocm9sZVVwZGF0ZUZlZSkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihyb2xlVXBkYXRlRmVlKS5ndGUoMCksImludmFsaWQgcm9sZVVwZGF0ZUZlZSIpKXJldHVybjtwYXJhbXMucm9sZVVwZGF0ZUZlZT1yb2xlVXBkYXRlRmVlfWlmKG1heFNsb3RzKXtpZighYXBpLmFzc2VydCgic3RyaW5nIj09dHlwZW9mIG1heFNsb3RzJiZhcGkuQmlnTnVtYmVyKG1heFNsb3RzKS5pc0ludGVnZXIoKSYmYXBpLkJpZ051bWJlcihtYXhTbG90cykuZ3RlKDEpLCJpbnZhbGlkIG1heFNsb3RzIikpcmV0dXJuO3BhcmFtcy5tYXhTbG90cz1hcGkuQmlnTnVtYmVyKG1heFNsb3RzKS50b051bWJlcigpfWlmKG1heEluc3RhbmNlc1BlckJsb2NrKXtpZighYXBpLmFzc2VydCgic3RyaW5nIj09dHlwZW9mIG1heEluc3RhbmNlc1BlckJsb2NrJiZhcGkuQmlnTnVtYmVyKG1heEluc3RhbmNlc1BlckJsb2NrKS5pc0ludGVnZXIoKSYmYXBpLkJpZ051bWJlcihtYXhJbnN0YW5jZXNQZXJCbG9jaykuZ3RlKDEpLCJpbnZhbGlkIG1heEluc3RhbmNlc1BlckJsb2NrIikpcmV0dXJuO3BhcmFtcy5tYXhJbnN0YW5jZXNQZXJCbG9jaz1hcGkuQmlnTnVtYmVyKG1heEluc3RhbmNlc1BlckJsb2NrKS50b051bWJlcigpfWlmKG1heFJvbGVzUGVyQmxvY2spe2lmKCFhcGkuYXNzZXJ0KCJzdHJpbmciPT10eXBlb2YgbWF4Um9sZXNQZXJCbG9jayYmYXBpLkJpZ051bWJlcihtYXhSb2xlc1BlckJsb2NrKS5pc0ludGVnZXIoKSYmYXBpLkJpZ051bWJlcihtYXhSb2xlc1BlckJsb2NrKS5ndGUoMSksImludmFsaWQgbWF4Um9sZXNQZXJCbG9jayIpKXJldHVybjtwYXJhbXMubWF4Um9sZXNQZXJCbG9jaz1hcGkuQmlnTnVtYmVyKG1heFJvbGVzUGVyQmxvY2spLnRvTnVtYmVyKCl9aWYobWF4QWNjb3VudEFwcHJvdmFscyl7aWYoIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBtYXhBY2NvdW50QXBwcm92YWxzJiZhcGkuQmlnTnVtYmVyKG1heEFjY291bnRBcHByb3ZhbHMpLmlzSW50ZWdlcigpJiZhcGkuQmlnTnVtYmVyKG1heEFjY291bnRBcHByb3ZhbHMpLmd0ZSgxKSwiaW52YWxpZCBtYXhBY2NvdW50QXBwcm92YWxzIikpcmV0dXJuO3BhcmFtcy5tYXhBY2NvdW50QXBwcm92YWxzPWFwaS5CaWdOdW1iZXIobWF4QWNjb3VudEFwcHJvdmFscykudG9OdW1iZXIoKX1pZihwcm9jZXNzUXVlcnlMaW1pdCl7aWYoIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBwcm9jZXNzUXVlcnlMaW1pdCYmYXBpLkJpZ051bWJlcihwcm9jZXNzUXVlcnlMaW1pdCkuaXNJbnRlZ2VyKCkmJmFwaS5CaWdOdW1iZXIocHJvY2Vzc1F1ZXJ5TGltaXQpLmd0ZSgxKSwiaW52YWxpZCBwcm9jZXNzUXVlcnlMaW1pdCIpKXJldHVybjtwYXJhbXMucHJvY2Vzc1F1ZXJ5TGltaXQ9YXBpLkJpZ051bWJlcihwcm9jZXNzUXVlcnlMaW1pdCkudG9OdW1iZXIoKX1hd2FpdCBhcGkuZGIudXBkYXRlKCJwYXJhbXMiLHBhcmFtcyl9LGFjdGlvbnMuY3JlYXRlSW5zdGFuY2U9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e3ZvdGVUb2tlbjp2b3RlVG9rZW4sY2FuZGlkYXRlRmVlOmNhbmRpZGF0ZUZlZSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fT1wYXlsb2FkLHBhcmFtcz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse2luc3RhbmNlQ3JlYXRpb25GZWU6aW5zdGFuY2VDcmVhdGlvbkZlZX09cGFyYW1zLHV0aWxpdHlUb2tlbkJhbGFuY2U9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJiYWxhbmNlcyIse2FjY291bnQ6YXBpLnNlbmRlcixzeW1ib2w6IkJFRSJ9KSxhdXRob3JpemVkQ3JlYXRpb249ISghYXBpLkJpZ051bWJlcihpbnN0YW5jZUNyZWF0aW9uRmVlKS5sdGUoMCkmJmFwaS5zZW5kZXIhPT1hcGkub3duZXIpfHx1dGlsaXR5VG9rZW5CYWxhbmNlJiZhcGkuQmlnTnVtYmVyKHV0aWxpdHlUb2tlbkJhbGFuY2UuYmFsYW5jZSkuZ3RlKGluc3RhbmNlQ3JlYXRpb25GZWUpO2lmKGFwaS5hc3NlcnQoYXV0aG9yaXplZENyZWF0aW9uLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGNyZWF0aW9uIGZlZSIpJiZhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJ5b3UgbXVzdCB1c2UgYSB0cmFuc2FjdGlvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSl7aWYoY2FuZGlkYXRlRmVlKXtpZighYXBpLmFzc2VydCgib2JqZWN0Ij09dHlwZW9mIGNhbmRpZGF0ZUZlZSYmInN0cmluZyI9PXR5cGVvZiBjYW5kaWRhdGVGZWUubWV0aG9kJiYtMSE9PUZlZU1ldGhvZC5pbmRleE9mKGNhbmRpZGF0ZUZlZS5tZXRob2QpJiYic3RyaW5nIj09dHlwZW9mIGNhbmRpZGF0ZUZlZS5zeW1ib2wmJiJzdHJpbmciPT10eXBlb2YgY2FuZGlkYXRlRmVlLmFtb3VudCYmYXBpLkJpZ051bWJlcihjYW5kaWRhdGVGZWUuYW1vdW50KS5ndGUoMCksImludmFsaWQgY2FuZGlkYXRlRmVlIHByb3BlcnRpZXMiKSlyZXR1cm47Y29uc3QgZmVlVG9rZW5PYmo9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJ0b2tlbnMiLHtzeW1ib2w6Y2FuZGlkYXRlRmVlLnN5bWJvbH0pO2lmKCFhcGkuYXNzZXJ0KGZlZVRva2VuT2JqJiZhcGkuQmlnTnVtYmVyKGNhbmRpZGF0ZUZlZS5hbW91bnQpLmRwKCk8PWZlZVRva2VuT2JqLnByZWNpc2lvbiwiaW52YWxpZCBjYW5kaWRhdGVGZWUgdG9rZW4gb3IgcHJlY2lzaW9uIikpcmV0dXJufWNvbnN0IHZvdGVUb2tlbk9iaj1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsInRva2VucyIse3N5bWJvbDp2b3RlVG9rZW59KTtpZighYXBpLmFzc2VydCh2b3RlVG9rZW5PYmomJnZvdGVUb2tlbk9iai5zdGFraW5nRW5hYmxlZCwidm90ZVRva2VuIG11c3QgaGF2ZSBzdGFraW5nIGVuYWJsZWQiKSlyZXR1cm47Y29uc3Qgbm93PW5ldyBEYXRlKGAke2FwaS5oaXZlQmxvY2tUaW1lc3RhbXB9LjAwMFpgKSxuZXdJbnN0YW5jZT17dm90ZVRva2VuOnZvdGVUb2tlbixjYW5kaWRhdGVGZWU6Y2FuZGlkYXRlRmVlLGFjdGl2ZTohMSxjcmVhdG9yOmFwaS5zZW5kZXIsbGFzdFRpY2tUaW1lOm5vdy5nZXRUaW1lKCl9LGluc2VydGVkSW5zdD1hd2FpdCBhcGkuZGIuaW5zZXJ0KCJpbnN0YW5jZXMiLG5ld0luc3RhbmNlKTthcGkuc2VuZGVyIT09YXBpLm93bmVyJiYibnVsbCIhPT1hcGkuc2VuZGVyJiZhcGkuQmlnTnVtYmVyKGluc3RhbmNlQ3JlYXRpb25GZWUpLmd0KDApJiZhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDoiQkVFIixxdWFudGl0eTppbnN0YW5jZUNyZWF0aW9uRmVlLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppc1NpZ25lZFdpdGhBY3RpdmVLZXl9KSxhcGkuZW1pdCgiY3JlYXRlSW5zdGFuY2UiLHtpZDppbnNlcnRlZEluc3QuX2lkfSl9fSxhY3Rpb25zLnVwZGF0ZUluc3RhbmNlPWFzeW5jIHBheWxvYWQ9Pntjb25zdHtpbnN0YW5jZUlkOmluc3RhbmNlSWQsY2FuZGlkYXRlRmVlOmNhbmRpZGF0ZUZlZSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fT1wYXlsb2FkLHBhcmFtcz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse2luc3RhbmNlVXBkYXRlRmVlOmluc3RhbmNlVXBkYXRlRmVlfT1wYXJhbXMsdXRpbGl0eVRva2VuQmFsYW5jZT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDoiQkVFIn0pLGF1dGhvcml6ZWRVcGRhdGU9ISghYXBpLkJpZ051bWJlcihpbnN0YW5jZVVwZGF0ZUZlZSkubHRlKDApJiZhcGkuc2VuZGVyIT09YXBpLm93bmVyKXx8dXRpbGl0eVRva2VuQmFsYW5jZSYmYXBpLkJpZ051bWJlcih1dGlsaXR5VG9rZW5CYWxhbmNlLmJhbGFuY2UpLmd0ZShpbnN0YW5jZVVwZGF0ZUZlZSk7aWYoYXBpLmFzc2VydChhdXRob3JpemVkVXBkYXRlLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIHVwZGF0ZSBmZWUiKSYmYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgdHJhbnNhY3Rpb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBpbnN0YW5jZUlkJiZhcGkuQmlnTnVtYmVyKGluc3RhbmNlSWQpLmlzSW50ZWdlcigpLCJpbnZhbGlkIGluc3RhbmNlSWQiKSYmYXBpLmFzc2VydChjYW5kaWRhdGVGZWUsInNwZWNpZnkgYXQgbGVhc3Qgb25lIGZpZWxkIHRvIHVwZGF0ZSIpKXtjb25zdCBleGlzdGluZ0luc3Q9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImluc3RhbmNlcyIse19pZDphcGkuQmlnTnVtYmVyKGluc3RhbmNlSWQpLnRvTnVtYmVyKCl9KTtpZighYXBpLmFzc2VydChleGlzdGluZ0luc3QsImluc3RhbmNlIG5vdCBmb3VuZCIpfHwhYXBpLmFzc2VydChleGlzdGluZ0luc3QuY3JlYXRvcj09PWFwaS5zZW5kZXJ8fGFwaS5vd25lcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgaW5zdGFuY2UgY3JlYXRvciIpKXJldHVybjtpZihjYW5kaWRhdGVGZWUpe2lmKCFhcGkuYXNzZXJ0KCJvYmplY3QiPT10eXBlb2YgY2FuZGlkYXRlRmVlJiYic3RyaW5nIj09dHlwZW9mIGNhbmRpZGF0ZUZlZS5tZXRob2QmJi0xIT09RmVlTWV0aG9kLmluZGV4T2YoY2FuZGlkYXRlRmVlLm1ldGhvZCkmJiJzdHJpbmciPT10eXBlb2YgY2FuZGlkYXRlRmVlLnN5bWJvbCYmInN0cmluZyI9PXR5cGVvZiBjYW5kaWRhdGVGZWUuYW1vdW50JiZhcGkuQmlnTnVtYmVyKGNhbmRpZGF0ZUZlZS5hbW91bnQpLmd0ZSgwKSwiaW52YWxpZCBjYW5kaWRhdGVGZWUgb2JqZWN0IikpcmV0dXJuO2NvbnN0IGZlZVRva2VuT2JqPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOmNhbmRpZGF0ZUZlZS5zeW1ib2x9KTtpZighYXBpLmFzc2VydChmZWVUb2tlbk9iaiYmYXBpLkJpZ051bWJlcihjYW5kaWRhdGVGZWUuYW1vdW50KS5kcCgpPD1mZWVUb2tlbk9iai5wcmVjaXNpb24sImludmFsaWQgY2FuZGlkYXRlRmVlIHRva2VuIG9yIHByZWNpc2lvbiIpKXJldHVybjtleGlzdGluZ0luc3QuY2FuZGlkYXRlRmVlPWNhbmRpZGF0ZUZlZX1hd2FpdCBhcGkuZGIudXBkYXRlKCJpbnN0YW5jZXMiLGV4aXN0aW5nSW5zdCksYXBpLnNlbmRlciE9PWFwaS5vd25lciYmIm51bGwiIT09YXBpLnNlbmRlciYmYXBpLkJpZ051bWJlcihpbnN0YW5jZVVwZGF0ZUZlZSkuZ3QoMCkmJmF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgidG9rZW5zIiwidHJhbnNmZXIiLHt0bzoibnVsbCIsc3ltYm9sOiJCRUUiLHF1YW50aXR5Omluc3RhbmNlVXBkYXRlRmVlLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppc1NpZ25lZFdpdGhBY3RpdmVLZXl9KSxhcGkuZW1pdCgidXBkYXRlSW5zdGFuY2UiLHtpZDppbnN0YW5jZUlkfSl9fSxhY3Rpb25zLmNyZWF0ZVJvbGVzPWFzeW5jIHBheWxvYWQ9Pntjb25zdHtpbnN0YW5jZUlkOmluc3RhbmNlSWQscm9sZXM6cm9sZXMsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmlzU2lnbmVkV2l0aEFjdGl2ZUtleX09cGF5bG9hZCxwYXJhbXM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pLHtyb2xlQ3JlYXRpb25GZWU6cm9sZUNyZWF0aW9uRmVlfT1wYXJhbXMsdXRpbGl0eVRva2VuQmFsYW5jZT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDoiQkVFIn0pLGF1dGhvcml6ZWRDcmVhdGlvbj0hKCFhcGkuQmlnTnVtYmVyKHJvbGVDcmVhdGlvbkZlZSkubHRlKDApJiZhcGkuc2VuZGVyIT09YXBpLm93bmVyKXx8dXRpbGl0eVRva2VuQmFsYW5jZSYmYXBpLkJpZ051bWJlcih1dGlsaXR5VG9rZW5CYWxhbmNlLmJhbGFuY2UpLmd0ZShyb2xlQ3JlYXRpb25GZWUpO2lmKGFwaS5hc3NlcnQoYXV0aG9yaXplZENyZWF0aW9uLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGNyZWF0aW9uIGZlZSIpJiZhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJ5b3UgbXVzdCB1c2UgYSB0cmFuc2FjdGlvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydCgic3RyaW5nIj09dHlwZW9mIGluc3RhbmNlSWQmJmFwaS5CaWdOdW1iZXIoaW5zdGFuY2VJZCkuaXNJbnRlZ2VyKCksImludmFsaWQgaW5zdGFuY2VJZCIpJiZhcGkuYXNzZXJ0KCJvYmplY3QiPT10eXBlb2Ygcm9sZXMmJkFycmF5LmlzQXJyYXkocm9sZXMpJiZyb2xlcy5sZW5ndGg+MCYmcm9sZXMubGVuZ3RoPD01MCwiaW52YWxpZCByb2xlcyBvYmplY3QiKSl7Y29uc3QgZXhpc3RpbmdJbnN0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJpbnN0YW5jZXMiLHtfaWQ6YXBpLkJpZ051bWJlcihpbnN0YW5jZUlkKS50b051bWJlcigpfSk7aWYoIWFwaS5hc3NlcnQoZXhpc3RpbmdJbnN0LCJpbnN0YW5jZSBub3QgZm91bmQiKXx8IWFwaS5hc3NlcnQoZXhpc3RpbmdJbnN0LmNyZWF0b3I9PT1hcGkuc2VuZGVyfHxhcGkub3duZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIGluc3RhbmNlIGNyZWF0b3IiKSlyZXR1cm47Y29uc3Qgdm90ZVRva2VuT2JqPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOmV4aXN0aW5nSW5zdC52b3RlVG9rZW59KTtmb3IobGV0IGk9MDtpPHJvbGVzLmxlbmd0aDtpKz0xKXtjb25zdCByb2xlPXJvbGVzW2ldO2lmKCFhcGkuYXNzZXJ0KDU9PT1PYmplY3Qua2V5cyhyb2xlKS5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2Ygcm9sZS5uYW1lJiZyb2xlLm5hbWUubGVuZ3RoPDUwJiYic3RyaW5nIj09dHlwZW9mIHJvbGUudm90ZVRocmVzaG9sZCYmYXBpLkJpZ051bWJlcihyb2xlLnZvdGVUaHJlc2hvbGQpLmd0ZSgwKSYmYXBpLkJpZ051bWJlcihyb2xlLnZvdGVUaHJlc2hvbGQpLmRwKCk8PXZvdGVUb2tlbk9iai5wcmVjaXNpb24mJiJzdHJpbmciPT10eXBlb2Ygcm9sZS5tYWluU2xvdHMmJmFwaS5CaWdOdW1iZXIocm9sZS5tYWluU2xvdHMpLmlzSW50ZWdlcigpJiZhcGkuQmlnTnVtYmVyKHJvbGUubWFpblNsb3RzKS5ndCgwKSYmYXBpLkJpZ051bWJlcihyb2xlLm1haW5TbG90cykubHRlKHBhcmFtcy5tYXhTbG90cykmJiJzdHJpbmciPT10eXBlb2Ygcm9sZS5iYWNrdXBTbG90cyYmYXBpLkJpZ051bWJlcihyb2xlLmJhY2t1cFNsb3RzKS5pc0ludGVnZXIoKSYmYXBpLkJpZ051bWJlcihyb2xlLmJhY2t1cFNsb3RzKS5ndGUoMCkmJmFwaS5CaWdOdW1iZXIocm9sZS5iYWNrdXBTbG90cykubHRlKGFwaS5CaWdOdW1iZXIocGFyYW1zLm1heFNsb3RzKS5taW51cyhyb2xlLm1haW5TbG90cykpJiYic3RyaW5nIj09dHlwZW9mIHJvbGUudGlja0hvdXJzJiZhcGkuQmlnTnVtYmVyKHJvbGUudGlja0hvdXJzKS5pc0ludGVnZXIoKSYmYXBpLkJpZ051bWJlcihyb2xlLnRpY2tIb3VycykuZ3RlKHBhcmFtcy5pbnN0YW5jZVRpY2tIb3VycykmJmFwaS5CaWdOdW1iZXIocm9sZS50aWNrSG91cnMpLm1vZChwYXJhbXMuaW5zdGFuY2VUaWNrSG91cnMpLmVxKDApLCJpbnZhbGlkIHJvbGVzIHByb3BlcnRpZXMiKSlyZXR1cm59Y29uc3QgaW5zZXJ0ZWRSb2xlcz1bXTtmb3IobGV0IGk9MDtpPHJvbGVzLmxlbmd0aDtpKz0xKXtjb25zdCBuZXdSb2xlPXtpbnN0YW5jZUlkOmV4aXN0aW5nSW5zdC5faWQsLi4ucm9sZXNbaV0sYWN0aXZlOiEwLGxhc3RUaWNrVGltZTowLHRvdGFsQXBwcm92YWxXZWlnaHQ6eyRudW1iZXJEZWNpbWFsOiIwIn19LGluc2VydGVkUm9sZT1hd2FpdCBhcGkuZGIuaW5zZXJ0KCJyb2xlcyIsbmV3Um9sZSk7aW5zZXJ0ZWRSb2xlcy5wdXNoKHtpbnN0YW5jZUlkOmluc2VydGVkUm9sZS5pbnN0YW5jZUlkLHJvbGVJZDppbnNlcnRlZFJvbGUuX2lkLG5hbWU6aW5zZXJ0ZWRSb2xlLm5hbWV9KX1hcGkuc2VuZGVyIT09YXBpLm93bmVyJiYibnVsbCIhPT1hcGkuc2VuZGVyJiZhcGkuQmlnTnVtYmVyKHJvbGVDcmVhdGlvbkZlZSkuZ3QoMCkmJmF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgidG9rZW5zIiwidHJhbnNmZXIiLHt0bzoibnVsbCIsc3ltYm9sOiJCRUUiLHF1YW50aXR5OnJvbGVDcmVhdGlvbkZlZSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fSksYXBpLmVtaXQoImNyZWF0ZVJvbGVzIix7cm9sZXM6aW5zZXJ0ZWRSb2xlc30pfX0sYWN0aW9ucy51cGRhdGVSb2xlPWFzeW5jIHBheWxvYWQ9Pntjb25zdHtyb2xlSWQ6cm9sZUlkLGFjdGl2ZTphY3RpdmUsbmFtZTpuYW1lLHZvdGVUaHJlc2hvbGQ6dm90ZVRocmVzaG9sZCxtYWluU2xvdHM6bWFpblNsb3RzLGJhY2t1cFNsb3RzOmJhY2t1cFNsb3RzLHRpY2tIb3Vyczp0aWNrSG91cnMsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmlzU2lnbmVkV2l0aEFjdGl2ZUtleX09cGF5bG9hZCxwYXJhbXM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pLHtyb2xlVXBkYXRlRmVlOnJvbGVVcGRhdGVGZWV9PXBhcmFtcyx1dGlsaXR5VG9rZW5CYWxhbmNlPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOiJCRUUifSksYXV0aG9yaXplZFVwZGF0ZT0hKCFhcGkuQmlnTnVtYmVyKHJvbGVVcGRhdGVGZWUpLmx0ZSgwKSYmYXBpLnNlbmRlciE9PWFwaS5vd25lcil8fHV0aWxpdHlUb2tlbkJhbGFuY2UmJmFwaS5CaWdOdW1iZXIodXRpbGl0eVRva2VuQmFsYW5jZS5iYWxhbmNlKS5ndGUocm9sZVVwZGF0ZUZlZSk7aWYoYXBpLmFzc2VydChhdXRob3JpemVkVXBkYXRlLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIHVwZGF0ZSBmZWUiKSYmYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgdHJhbnNhY3Rpb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiByb2xlSWQmJmFwaS5CaWdOdW1iZXIocm9sZUlkKS5pc0ludGVnZXIoKSwiaW52YWxpZCByb2xlSWQiKSYmYXBpLmFzc2VydCh2b2lkIDAhPT1hY3RpdmV8fG5hbWV8fHZvdGVUaHJlc2hvbGR8fG1haW5TbG90c3x8YmFja3VwU2xvdHN8fHRpY2tIb3Vycywic3BlY2lmeSBhdCBsZWFzdCBvbmUgZmllbGQgdG8gdXBkYXRlIikpe2NvbnN0IGV4aXN0aW5nUm9sZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgicm9sZXMiLHtfaWQ6YXBpLkJpZ051bWJlcihyb2xlSWQpLnRvTnVtYmVyKCl9KSxleGlzdGluZ0luc3Q9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImluc3RhbmNlcyIse19pZDpleGlzdGluZ1JvbGUuaW5zdGFuY2VJZH0pO2lmKCFhcGkuYXNzZXJ0KGV4aXN0aW5nUm9sZSwicm9sZSBub3QgZm91bmQiKXx8IWFwaS5hc3NlcnQoZXhpc3RpbmdJbnN0LCJpbnN0YW5jZSBub3QgZm91bmQiKXx8IWFwaS5hc3NlcnQoZXhpc3RpbmdJbnN0LmNyZWF0b3I9PT1hcGkuc2VuZGVyfHxhcGkub3duZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIGluc3RhbmNlIGNyZWF0b3IiKSlyZXR1cm47aWYodm9pZCAwIT09YWN0aXZlJiYoZXhpc3RpbmdSb2xlLmFjdGl2ZT0hIWFjdGl2ZSksbmFtZSl7aWYoIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBuYW1lJiZuYW1lLmxlbmd0aDw1MCwibmFtZSBtdXN0IGJlIGEgc3RyaW5nIGxlc3MgdGhhbiA1MCBjaGFyYWN0ZXJzIikpcmV0dXJuO2V4aXN0aW5nUm9sZS5uYW1lPW5hbWV9aWYodm90ZVRocmVzaG9sZCl7Y29uc3Qgdm90ZVRva2VuT2JqPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOmV4aXN0aW5nSW5zdC52b3RlVG9rZW59KTtpZighYXBpLmFzc2VydCgic3RyaW5nIj09dHlwZW9mIHZvdGVUaHJlc2hvbGQmJmFwaS5CaWdOdW1iZXIodm90ZVRocmVzaG9sZCkuZ3RlKDApJiZhcGkuQmlnTnVtYmVyKHZvdGVUaHJlc2hvbGQpLmRwKCk8PXZvdGVUb2tlbk9iai5wcmVjaXNpb24sInZvdGVUaHJlc2hvbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCwgcHJlY2lzaW9uIG1hdGNoaW5nIHZvdGVUb2tlbiIpKXJldHVybjtleGlzdGluZ1JvbGUudm90ZVRocmVzaG9sZD12b3RlVGhyZXNob2xkfWlmKG1haW5TbG90cyl7aWYoIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBtYWluU2xvdHMmJmFwaS5CaWdOdW1iZXIobWFpblNsb3RzKS5pc0ludGVnZXIoKSYmYXBpLkJpZ051bWJlcihtYWluU2xvdHMpLmd0KDApJiZhcGkuQmlnTnVtYmVyKG1haW5TbG90cykubHRlKHBhcmFtcy5tYXhTbG90cyksIm1haW5TbG90cyBtdXN0IGJlIGEgaW50ZWdlciBiZXR3ZWVuIDEgLSBwYXJhbXMubWF4U2xvdHMiKSlyZXR1cm47ZXhpc3RpbmdSb2xlLm1haW5TbG90cz1tYWluU2xvdHN9aWYoYmFja3VwU2xvdHMpe2NvbnN0IHJlbWFpbmluZ1Nsb3RzPWFwaS5CaWdOdW1iZXIocGFyYW1zLm1heFNsb3RzKS5taW51cyhleGlzdGluZ1JvbGUubWFpblNsb3RzKTtpZighYXBpLmFzc2VydCgic3RyaW5nIj09dHlwZW9mIGJhY2t1cFNsb3RzJiZhcGkuQmlnTnVtYmVyKGJhY2t1cFNsb3RzKS5pc0ludGVnZXIoKSYmYXBpLkJpZ051bWJlcihiYWNrdXBTbG90cykuZ3RlKDApJiZhcGkuQmlnTnVtYmVyKGJhY2t1cFNsb3RzKS5sdGUocmVtYWluaW5nU2xvdHMpLCJiYWNrdXBTbG90cyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIC0gcmVtYWluaW5nU2xvdHMiKSlyZXR1cm47ZXhpc3RpbmdSb2xlLmJhY2t1cFNsb3RzPWJhY2t1cFNsb3RzfWlmKHRpY2tIb3Vycyl7aWYoIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiB0aWNrSG91cnMmJmFwaS5CaWdOdW1iZXIodGlja0hvdXJzKS5pc0ludGVnZXIoKSYmYXBpLkJpZ051bWJlcih0aWNrSG91cnMpLmd0ZShwYXJhbXMuaW5zdGFuY2VUaWNrSG91cnMpJiZhcGkuQmlnTnVtYmVyKHRpY2tIb3VycykubW9kKHBhcmFtcy5pbnN0YW5jZVRpY2tIb3VycykuZXEoMCksInRpY2tIb3VycyBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLCBhbmQgYSBtdWx0aXBsZSBvZiBwYXJhbXMuaW5zdGFuY2VUaWNrSG91cnMiKSlyZXR1cm47ZXhpc3RpbmdSb2xlLnRpY2tIb3Vycz10aWNrSG91cnN9YXdhaXQgYXBpLmRiLnVwZGF0ZSgicm9sZXMiLGV4aXN0aW5nUm9sZSksYXBpLnNlbmRlciE9PWFwaS5vd25lciYmIm51bGwiIT09YXBpLnNlbmRlciYmYXBpLkJpZ051bWJlcihyb2xlVXBkYXRlRmVlKS5ndCgwKSYmYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ0b2tlbnMiLCJ0cmFuc2ZlciIse3RvOiJudWxsIixzeW1ib2w6IkJFRSIscXVhbnRpdHk6cm9sZVVwZGF0ZUZlZSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fSksYXBpLmVtaXQoInVwZGF0ZVJvbGUiLHtyb2xlSWQ6ZXhpc3RpbmdSb2xlLl9pZH0pfX0sYWN0aW9ucy5zZXRJbnN0YW5jZUFjdGl2ZT1hc3luYyBwYXlsb2FkPT57Y29uc3R7aW5zdGFuY2VJZDppbnN0YW5jZUlkLGFjdGl2ZTphY3RpdmUsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmlzU2lnbmVkV2l0aEFjdGl2ZUtleX09cGF5bG9hZDtpZighYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgdHJhbnNhY3Rpb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5Iil8fCFhcGkuYXNzZXJ0KCJzdHJpbmciPT10eXBlb2YgaW5zdGFuY2VJZCYmYXBpLkJpZ051bWJlcihpbnN0YW5jZUlkKS5pc0ludGVnZXIoKSwiaW52YWxpZCBpbnN0YW5jZUlkIikpcmV0dXJuO2NvbnN0IGluc3Q9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImluc3RhbmNlcyIse19pZDphcGkuQmlnTnVtYmVyKGluc3RhbmNlSWQpLnRvTnVtYmVyKCl9KTthcGkuYXNzZXJ0KGluc3QsImluc3RhbmNlIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoaW5zdC5jcmVhdG9yPT09YXBpLnNlbmRlcnx8YXBpLm93bmVyPT09YXBpLnNlbmRlciwibXVzdCBiZSBpbnN0YW5jZSBjcmVhdG9yIikmJihpbnN0LmFjdGl2ZT0hIWFjdGl2ZSxhd2FpdCBhcGkuZGIudXBkYXRlKCJpbnN0YW5jZXMiLGluc3QpLGFwaS5lbWl0KCJzZXRJbnN0YW5jZUFjdGl2ZSIse2luc3RhbmNlSWQ6aW5zdC5faWQsYWN0aXZlOmluc3QuYWN0aXZlfSkpfSxhY3Rpb25zLnNldFJvbGVBY3RpdmU9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e3JvbGVJZDpyb2xlSWQsYWN0aXZlOmFjdGl2ZSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fT1wYXlsb2FkO2lmKCFhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJ5b3UgbXVzdCB1c2UgYSB0cmFuc2FjdGlvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKXx8IWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiByb2xlSWQmJmFwaS5CaWdOdW1iZXIocm9sZUlkKS5pc0ludGVnZXIoKSwiaW52YWxpZCByb2xlSWQiKSlyZXR1cm47Y29uc3QgZXhpc3RpbmdSb2xlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJyb2xlcyIse19pZDphcGkuQmlnTnVtYmVyKHJvbGVJZCkudG9OdW1iZXIoKX0pLGV4aXN0aW5nSW5zdD1hd2FpdCBhcGkuZGIuZmluZE9uZSgiaW5zdGFuY2VzIix7X2lkOmV4aXN0aW5nUm9sZS5pbnN0YW5jZUlkfSk7YXBpLmFzc2VydChleGlzdGluZ1JvbGUsInJvbGUgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChleGlzdGluZ0luc3QuY3JlYXRvcj09PWFwaS5zZW5kZXJ8fGFwaS5vd25lcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgaW5zdGFuY2UgY3JlYXRvciIpJiYoZXhpc3RpbmdSb2xlLmFjdGl2ZT0hIWFjdGl2ZSxhd2FpdCBhcGkuZGIudXBkYXRlKCJyb2xlcyIsZXhpc3RpbmdSb2xlKSxhcGkuZW1pdCgic2V0Um9sZUFjdGl2ZSIse3JvbGVJZDpleGlzdGluZ1JvbGUuX2lkLGFjdGl2ZTpleGlzdGluZ1JvbGUuYWN0aXZlfSkpfSxhY3Rpb25zLmFwcGx5Rm9yUm9sZT1hc3luYyBwYXlsb2FkPT57Y29uc3R7cm9sZUlkOnJvbGVJZCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fT1wYXlsb2FkO2lmKCFhcGkuYXNzZXJ0KCEwPT09aXNTaWduZWRXaXRoQWN0aXZlS2V5LCJ5b3UgbXVzdCB1c2UgYSB0cmFuc2FjdGlvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmIWFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiByb2xlSWQsImludmFsaWQgcm9sZUlkIikpcmV0dXJuO2NvbnN0IHJvbGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInJvbGVzIix7X2lkOmFwaS5CaWdOdW1iZXIocm9sZUlkKS50b051bWJlcigpfSk7aWYoIWFwaS5hc3NlcnQocm9sZSwicm9sZSBkb2VzIG5vdCBleGlzdCIpKXJldHVybjtjb25zdCBpbnN0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJpbnN0YW5jZXMiLHtfaWQ6cm9sZS5pbnN0YW5jZUlkfSk7bGV0IGF1dGhvcml6ZWRDcmVhdGlvbj0hMDtpZihpbnN0LmNhbmRpZGF0ZUZlZSl7Y29uc3QgZmVlVG9rZW5CYWxhbmNlPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOmluc3QuY2FuZGlkYXRlRmVlLnN5bWJvbH0pO2F1dGhvcml6ZWRDcmVhdGlvbj0hKCFhcGkuQmlnTnVtYmVyKGluc3QuY2FuZGlkYXRlRmVlLmFtb3VudCkubHRlKDApJiZhcGkuc2VuZGVyIT09YXBpLm93bmVyKXx8ZmVlVG9rZW5CYWxhbmNlJiZhcGkuQmlnTnVtYmVyKGZlZVRva2VuQmFsYW5jZS5iYWxhbmNlKS5ndGUoaW5zdC5jYW5kaWRhdGVGZWUuYW1vdW50KX1jb25zdCBleGlzdGluZ0FwcGx5PWF3YWl0IGFwaS5kYi5maW5kT25lKCJjYW5kaWRhdGVzIix7cm9sZUlkOnJvbGUuX2lkLGFjY291bnQ6YXBpLnNlbmRlcn0pO2lmKGFwaS5hc3NlcnQoYXV0aG9yaXplZENyZWF0aW9uLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGFwcGxpY2F0aW9uIGZlZSIpJiZhcGkuYXNzZXJ0KCFleGlzdGluZ0FwcGx5LCJzZW5kZXIgYWxyZWFkeSBhcHBsaWVkIGZvciByb2xlIikpe2NvbnN0IG5ld0NhbmRpZGF0ZT17cm9sZUlkOnJvbGUuX2lkLGFjY291bnQ6YXBpLnNlbmRlcixhY3RpdmU6ITAsYXBwcm92YWxXZWlnaHQ6eyRudW1iZXJEZWNpbWFsOiIwIn19LGluc2VydGVkSWQ9YXdhaXQgYXBpLmRiLmluc2VydCgiY2FuZGlkYXRlcyIsbmV3Q2FuZGlkYXRlKTtpZihhcGkuc2VuZGVyIT09YXBpLm93bmVyJiZpbnN0LmNhbmRpZGF0ZUZlZSlpZigiYnVybiI9PT1pbnN0LmNhbmRpZGF0ZUZlZS5tZXRob2QpYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ0b2tlbnMiLCJ0cmFuc2ZlciIse3RvOiJudWxsIixzeW1ib2w6aW5zdC5jYW5kaWRhdGVGZWUuc3ltYm9sLHF1YW50aXR5Omluc3QuY2FuZGlkYXRlRmVlLmFtb3VudH0pO2Vsc2UgaWYoImlzc3VlciI9PT1pbnN0LmNhbmRpZGF0ZUZlZS5tZXRob2Qpe2NvbnN0IGZlZVRva2VuT2JqPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOmluc3QuY2FuZGlkYXRlRmVlLnN5bWJvbH0pO2F3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgidG9rZW5zIiwidHJhbnNmZXIiLHt0bzpmZWVUb2tlbk9iai5pc3N1ZXIsc3ltYm9sOmluc3QuY2FuZGlkYXRlRmVlLnN5bWJvbCxxdWFudGl0eTppbnN0LmNhbmRpZGF0ZUZlZS5hbW91bnR9KX1hcGkuZW1pdCgiYXBwbHlGb3JSb2xlIix7cm9sZUlkOnJvbGUuX2lkLGNhbmRpZGF0ZUlkOmluc2VydGVkSWQuX2lkfSl9fSxhY3Rpb25zLnNldEFwcGx5QWN0aXZlPWFzeW5jIHBheWxvYWQ9Pntjb25zdHtyb2xlSWQ6cm9sZUlkLGFjdGl2ZTphY3RpdmUsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmlzU2lnbmVkV2l0aEFjdGl2ZUtleX09cGF5bG9hZDtpZighYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgdHJhbnNhY3Rpb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJiFhcGkuYXNzZXJ0KCJzdHJpbmciPT10eXBlb2Ygcm9sZUlkLCJpbnZhbGlkIHJvbGVJZCIpKXJldHVybjtjb25zdCByb2xlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJyb2xlcyIse19pZDphcGkuQmlnTnVtYmVyKHJvbGVJZCkudG9OdW1iZXIoKX0pLGV4aXN0aW5nQXBwbHk9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImNhbmRpZGF0ZXMiLHtyb2xlSWQ6cm9sZS5faWQsYWNjb3VudDphcGkuc2VuZGVyfSk7YXBpLmFzc2VydChyb2xlLCJyb2xlIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoZXhpc3RpbmdBcHBseSwiY2FuZGlkYXRlIGRvZXMgbm90IGV4aXN0IGZvciBzZW5kZXIiKSYmKGV4aXN0aW5nQXBwbHkuYWN0aXZlPSEhYWN0aXZlLGF3YWl0IGFwaS5kYi51cGRhdGUoImNhbmRpZGF0ZXMiLGV4aXN0aW5nQXBwbHkpLGFwaS5lbWl0KCJzZXRBcHBseUFjdGl2ZSIse3JvbGVJZDpyb2xlLl9pZCxhY2NvdW50OmV4aXN0aW5nQXBwbHkuYWNjb3VudCxhY3RpdmU6YWN0aXZlfSkpfSxhY3Rpb25zLmRlcG9zaXQ9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e3JvbGVJZDpyb2xlSWQsc3ltYm9sOnN5bWJvbCxxdWFudGl0eTpxdWFudGl0eSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aXNTaWduZWRXaXRoQWN0aXZlS2V5fT1wYXlsb2FkLGRlcFRva2VuPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOnN5bWJvbH0pO2lmKCEoYXBpLmFzc2VydCghMD09PWlzU2lnbmVkV2l0aEFjdGl2ZUtleSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiByb2xlSWQmJmFwaS5CaWdOdW1iZXIocm9sZUlkKS5pc0ludGVnZXIoKSwiaW52YWxpZCByb2xlSWQiKSYmYXBpLmFzc2VydCgic3RyaW5nIj09dHlwZW9mIHF1YW50aXR5JiZhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5ndCgwKSwiaW52YWxpZCBxdWFudGl0eSIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocXVhbnRpdHkpLmRwKCk8PWRlcFRva2VuLnByZWNpc2lvbiwicXVhbnRpdHkgcHJlY2lzaW9uIG1pc21hdGNoIikpKXJldHVybjtjb25zdCByb2xlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJyb2xlcyIse19pZDphcGkuQmlnTnVtYmVyKHJvbGVJZCkudG9OdW1iZXIoKX0pO2lmKGFwaS5hc3NlcnQocm9sZSwicm9sZSBub3QgZm91bmQiKSYmYXBpLmFzc2VydChyb2xlLmFjdGl2ZSwicm9sZSBtdXN0IGJlIGFjdGl2ZSB0byBkZXBvc2l0Iikpe2NvbnN0IHJlcz1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyVG9Db250cmFjdCIse3N5bWJvbDpzeW1ib2wscXVhbnRpdHk6cXVhbnRpdHksdG86InJvbGVzIn0pO3ZvaWQgMD09PXJlcy5lcnJvcnMmJnJlcy5ldmVudHMmJnZvaWQgMCE9PXJlcy5ldmVudHMuZmluZCgoZWw9PiJ0b2tlbnMiPT09ZWwuY29udHJhY3QmJiJ0cmFuc2ZlclRvQ29udHJhY3QiPT09ZWwuZXZlbnQmJmVsLmRhdGEuZnJvbT09PWFwaS5zZW5kZXImJiJyb2xlcyI9PT1lbC5kYXRhLnRvJiZlbC5kYXRhLnF1YW50aXR5PT09cXVhbnRpdHkpKSYmKGF3YWl0IHVwZGF0ZVRva2VuQmFsYW5jZXMocm9sZSxkZXBUb2tlbixxdWFudGl0eSksYXBpLmVtaXQoImRlcG9zaXQiLHtyb2xlSWQ6cm9sZUlkLHN5bWJvbDpzeW1ib2wscXVhbnRpdHk6cXVhbnRpdHl9KSl9fSxhY3Rpb25zLnJlY2VpdmVEdGZUb2tlbnM9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e2RhdGE6ZGF0YSxzeW1ib2w6c3ltYm9sLHF1YW50aXR5OnF1YW50aXR5LGNhbGxpbmdDb250cmFjdEluZm86Y2FsbGluZ0NvbnRyYWN0SW5mb309cGF5bG9hZDtpZighYXBpLmFzc2VydChjYWxsaW5nQ29udHJhY3RJbmZvJiYidG9rZW5mdW5kcyI9PT1jYWxsaW5nQ29udHJhY3RJbmZvLm5hbWUsIm5vdCBhdXRob3JpemVkIikpcmV0dXJuO2lmKCFhcGkuYXNzZXJ0KCJvYmplY3QiPT10eXBlb2YgZGF0YSYmIk9iamVjdCI9PT1kYXRhLmNvbnN0cnVjdG9yLm5hbWUmJiJyb2xlSWQiaW4gZGF0YSYmInN0cmluZyI9PXR5cGVvZiBkYXRhLnJvbGVJZCYmYXBpLkJpZ051bWJlcihkYXRhLnJvbGVJZCkuaXNJbnRlZ2VyKCksImludmFsaWQgaW5jb21pbmcgcGF5bG9hZCIpKXJldHVybjtjb25zdCByb2xlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJyb2xlcyIse19pZDphcGkuQmlnTnVtYmVyKGRhdGEucm9sZUlkKS50b051bWJlcigpfSk7aWYoYXBpLmFzc2VydChyb2xlLCJyb2xlIG5vdCBmb3VuZCIpJiZhcGkuYXNzZXJ0KHJvbGUuYWN0aXZlLCJyb2xlIG11c3QgYmUgYWN0aXZlIHRvIGRlcG9zaXQiKSl7Y29uc3QgZGVwVG9rZW49YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJ0b2tlbnMiLHtzeW1ib2w6c3ltYm9sfSk7YXdhaXQgdXBkYXRlVG9rZW5CYWxhbmNlcyhyb2xlLGRlcFRva2VuLHF1YW50aXR5KSxhcGkuZW1pdCgicmVjZWl2ZUR0ZlRva2VucyIse3JvbGVJZDpkYXRhLnJvbGVJZCxzeW1ib2w6c3ltYm9sLHF1YW50aXR5OnF1YW50aXR5fSl9fSxhY3Rpb25zLnJlY2VpdmVEaXN0VG9rZW5zPWFzeW5jIHBheWxvYWQ9Pntjb25zdHtkYXRhOmRhdGEsc3ltYm9sOnN5bWJvbCxxdWFudGl0eTpxdWFudGl0eSxjYWxsaW5nQ29udHJhY3RJbmZvOmNhbGxpbmdDb250cmFjdEluZm99PXBheWxvYWQ7aWYoIWFwaS5hc3NlcnQoY2FsbGluZ0NvbnRyYWN0SW5mbyYmImRpc3RyaWJ1dGlvbiI9PT1jYWxsaW5nQ29udHJhY3RJbmZvLm5hbWUsIm5vdCBhdXRob3JpemVkIikpcmV0dXJuO2lmKCFhcGkuYXNzZXJ0KCJvYmplY3QiPT10eXBlb2YgZGF0YSYmIk9iamVjdCI9PT1kYXRhLmNvbnN0cnVjdG9yLm5hbWUmJiJyb2xlSWQiaW4gZGF0YSYmInN0cmluZyI9PXR5cGVvZiBkYXRhLnJvbGVJZCYmYXBpLkJpZ051bWJlcihkYXRhLnJvbGVJZCkuaXNJbnRlZ2VyKCksImludmFsaWQgaW5jb21pbmcgcGF5bG9hZCIpKXJldHVybjtjb25zdCByb2xlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJyb2xlcyIse19pZDphcGkuQmlnTnVtYmVyKGRhdGEucm9sZUlkKS50b051bWJlcigpfSk7aWYoYXBpLmFzc2VydChyb2xlLCJyb2xlIG5vdCBmb3VuZCIpJiZhcGkuYXNzZXJ0KHJvbGUuYWN0aXZlLCJyb2xlIG11c3QgYmUgYWN0aXZlIHRvIGRlcG9zaXQiKSl7Y29uc3QgZGVwVG9rZW49YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJ0b2tlbnMiLHtzeW1ib2w6c3ltYm9sfSk7YXdhaXQgdXBkYXRlVG9rZW5CYWxhbmNlcyhyb2xlLGRlcFRva2VuLHF1YW50aXR5KSxhcGkuZW1pdCgicmVjZWl2ZURpc3RUb2tlbnMiLHtyb2xlSWQ6ZGF0YS5yb2xlSWQsc3ltYm9sOnN5bWJvbCxxdWFudGl0eTpxdWFudGl0eX0pfX0sYWN0aW9ucy5hcHByb3ZlQ2FuZGlkYXRlPWFzeW5jIHBheWxvYWQ9Pntjb25zdHtpZDppZH09cGF5bG9hZCxwYXJhbXM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pO2lmKGFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBpZCYmYXBpLkJpZ051bWJlcihpZCkuaXNJbnRlZ2VyKCksImludmFsaWQgaWQiKSl7Y29uc3QgY2FuZGlkYXRlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJjYW5kaWRhdGVzIix7X2lkOmFwaS5CaWdOdW1iZXIoaWQpLnRvTnVtYmVyKCl9KTtpZihhcGkuYXNzZXJ0KGNhbmRpZGF0ZSwiY2FuZGlkYXRlIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoY2FuZGlkYXRlLmFjdGl2ZSwiY2FuZGlkYXRlIGlzIG5vdCBhY3RpdmUiKSl7Y29uc3Qgcm9sZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgicm9sZXMiLHtfaWQ6Y2FuZGlkYXRlLnJvbGVJZH0pO2lmKCFhcGkuYXNzZXJ0KHJvbGUuYWN0aXZlLCJyb2xlIG11c3QgYmUgYWN0aXZlIHRvIGFwcHJvdmUiKSlyZXR1cm47Y29uc3QgaW5zdD1hd2FpdCBhcGkuZGIuZmluZE9uZSgiaW5zdGFuY2VzIix7X2lkOnJvbGUuaW5zdGFuY2VJZH0pLHZvdGVUb2tlbk9iaj1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsInRva2VucyIse3N5bWJvbDppbnN0LnZvdGVUb2tlbn0pO2xldCBhY2N0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJhY2NvdW50cyIse2FjY291bnQ6YXBpLnNlbmRlcn0pO251bGw9PT1hY2N0JiYoYWNjdD17YWNjb3VudDphcGkuc2VuZGVyLHdlaWdodHM6W119LGFjY3Q9YXdhaXQgYXBpLmRiLmluc2VydCgiYWNjb3VudHMiLGFjY3QpKTtsZXQgYWN0aXZlQXBwcm92YWxzPTA7Y29uc3QgYXBwcm92YWxzPWF3YWl0IGFwaS5kYi5maW5kKCJhcHByb3ZhbHMiLHtmcm9tOmFwaS5zZW5kZXIsY2FuZGlkYXRlUGVuZGluZzohMH0scGFyYW1zLm1heEFjY291bnRBcHByb3ZhbHMsMCxbe2luZGV4OiJfaWQiLGRlc2NlbmRpbmc6ITB9XSk7Zm9yKGxldCBpbmRleD0wO2luZGV4PGFwcHJvdmFscy5sZW5ndGg7aW5kZXgrPTEpe2NvbnN0IGFwcHJvdmFsPWFwcHJvdmFsc1tpbmRleF0sYXBwcm92YWxDYW5kaWRhdGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImNhbmRpZGF0ZXMiLHtfaWQ6YXBwcm92YWwudG99KTthcHByb3ZhbENhbmRpZGF0ZSYmYXBwcm92YWxDYW5kaWRhdGUuYWN0aXZlP2FjdGl2ZUFwcHJvdmFscys9MTooYXBwcm92YWwuY2FuZGlkYXRlUGVuZGluZz0hMSxhd2FpdCBhcGkuZGIudXBkYXRlKCJhcHByb3ZhbHMiLGFwcHJvdmFsKSl9aWYoIWFwaS5hc3NlcnQoYWN0aXZlQXBwcm92YWxzPHBhcmFtcy5tYXhBY2NvdW50QXBwcm92YWxzLGB5b3UgY2FuIG9ubHkgYXBwcm92ZSAke3BhcmFtcy5tYXhBY2NvdW50QXBwcm92YWxzfSBhY3RpdmUgY2FuZGlkYXRlc2ApKXJldHVybjtsZXQgYXBwcm92YWw9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImFwcHJvdmFscyIse2Zyb206YXBpLnNlbmRlcix0bzpjYW5kaWRhdGUuX2lkfSk7aWYoYXBpLmFzc2VydChudWxsPT09YXBwcm92YWwsInlvdSBhbHJlYWR5IGFwcHJvdmVkIHRoaXMgY2FuZGlkYXRlIikpe2FwcHJvdmFsPXtmcm9tOmFwaS5zZW5kZXIsdG86Y2FuZGlkYXRlLl9pZCxjYW5kaWRhdGVQZW5kaW5nOiEwfSxhd2FpdCBhcGkuZGIuaW5zZXJ0KCJhcHByb3ZhbHMiLGFwcHJvdmFsKTtjb25zdCBiYWxhbmNlPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOmluc3Qudm90ZVRva2VufSk7bGV0IGFwcHJvdmFsV2VpZ2h0PTA7YmFsYW5jZSYmYmFsYW5jZS5zdGFrZSYmKGFwcHJvdmFsV2VpZ2h0PWJhbGFuY2Uuc3Rha2UpLGJhbGFuY2UmJmJhbGFuY2UuZGVsZWdhdGlvbnNJbiYmKGFwcHJvdmFsV2VpZ2h0PWFwaS5CaWdOdW1iZXIoYXBwcm92YWxXZWlnaHQpLnBsdXMoYmFsYW5jZS5kZWxlZ2F0aW9uc0luKS50b0ZpeGVkKHZvdGVUb2tlbk9iai5wcmVjaXNpb24sYXBpLkJpZ051bWJlci5ST1VORF9IQUxGX1VQKSk7Y29uc3Qgd0luZGV4PWFjY3Qud2VpZ2h0cy5maW5kSW5kZXgoKHg9Pnguc3ltYm9sPT09aW5zdC52b3RlVG9rZW4pKTstMSE9PXdJbmRleD9hY2N0LndlaWdodHNbd0luZGV4XS53ZWlnaHQ9YXBwcm92YWxXZWlnaHQ6YWNjdC53ZWlnaHRzLnB1c2goe3N5bWJvbDppbnN0LnZvdGVUb2tlbix3ZWlnaHQ6YXBwcm92YWxXZWlnaHR9KSxhd2FpdCBhcGkuZGIudXBkYXRlKCJhY2NvdW50cyIsYWNjdCksYXdhaXQgdXBkYXRlQ2FuZGlkYXRlV2VpZ2h0KGNhbmRpZGF0ZS5faWQsYXBwcm92YWxXZWlnaHQpLGFwaS5lbWl0KCJhcHByb3ZlQ2FuZGlkYXRlIix7aWQ6Y2FuZGlkYXRlLl9pZH0pfX19fSxhY3Rpb25zLmRpc2FwcHJvdmVDYW5kaWRhdGU9YXN5bmMgcGF5bG9hZD0+e2NvbnN0e2lkOmlkfT1wYXlsb2FkO2lmKGFwaS5hc3NlcnQoInN0cmluZyI9PXR5cGVvZiBpZCYmYXBpLkJpZ051bWJlcihpZCkuaXNJbnRlZ2VyKCksImludmFsaWQgaWQiKSl7Y29uc3QgY2FuZGlkYXRlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJjYW5kaWRhdGVzIix7X2lkOmFwaS5CaWdOdW1iZXIoaWQpLnRvTnVtYmVyKCl9KTtpZihhcGkuYXNzZXJ0KGNhbmRpZGF0ZSwiY2FuZGlkYXRlIGRvZXMgbm90IGV4aXN0Iikpe2NvbnN0IGluc3Q9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImluc3RhbmNlcyIse2lkOmNhbmRpZGF0ZS5pbnN0YW5jZUlkfSksdm90ZVRva2VuT2JqPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwidG9rZW5zIix7c3ltYm9sOmluc3Qudm90ZVRva2VufSk7bGV0IGFjY3Q9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImFjY291bnRzIix7YWNjb3VudDphcGkuc2VuZGVyfSk7bnVsbD09PWFjY3QmJihhY2N0PXthY2NvdW50OmFwaS5zZW5kZXIsd2VpZ2h0czpbXX0sYWNjdD1hd2FpdCBhcGkuZGIuaW5zZXJ0KCJhY2NvdW50cyIsYWNjdCkpO2NvbnN0IGFwcHJvdmFsPWF3YWl0IGFwaS5kYi5maW5kT25lKCJhcHByb3ZhbHMiLHtmcm9tOmFwaS5zZW5kZXIsdG86Y2FuZGlkYXRlLl9pZH0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PWFwcHJvdmFsLCJ5b3UgaGF2ZSBub3QgYXBwcm92ZWQgdGhpcyBjYW5kaWRhdGUiKSl7YXdhaXQgYXBpLmRiLnJlbW92ZSgiYXBwcm92YWxzIixhcHByb3ZhbCk7Y29uc3QgYmFsYW5jZT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDppbnN0LnZvdGVUb2tlbn0pO2xldCBhcHByb3ZhbFdlaWdodD0wO2JhbGFuY2UmJmJhbGFuY2Uuc3Rha2UmJihhcHByb3ZhbFdlaWdodD1iYWxhbmNlLnN0YWtlKSxiYWxhbmNlJiZiYWxhbmNlLmRlbGVnYXRpb25zSW4mJihhcHByb3ZhbFdlaWdodD1hcGkuQmlnTnVtYmVyKGFwcHJvdmFsV2VpZ2h0KS5wbHVzKGJhbGFuY2UuZGVsZWdhdGlvbnNJbikudG9GaXhlZCh2b3RlVG9rZW5PYmoucHJlY2lzaW9uLGFwaS5CaWdOdW1iZXIuUk9VTkRfSEFMRl9VUCkpO2NvbnN0IHdJbmRleD1hY2N0LndlaWdodHMuZmluZEluZGV4KCh4PT54LnN5bWJvbD09PWluc3Qudm90ZVRva2VuKSk7LTEhPT13SW5kZXg/YWNjdC53ZWlnaHRzW3dJbmRleF0ud2VpZ2h0PWFwcHJvdmFsV2VpZ2h0OmFjY3Qud2VpZ2h0cy5wdXNoKHtzeW1ib2w6aW5zdC52b3RlVG9rZW4sd2VpZ2h0OmFwcHJvdmFsV2VpZ2h0fSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYWNjb3VudHMiLGFjY3QpLGF3YWl0IHVwZGF0ZUNhbmRpZGF0ZVdlaWdodChjYW5kaWRhdGUuX2lkLGFwaS5CaWdOdW1iZXIoYXBwcm92YWxXZWlnaHQpLm5lZ2F0ZWQoKSksYXBpLmVtaXQoImRpc2FwcHJvdmVDYW5kaWRhdGUiLHtpZDpjYW5kaWRhdGUuX2lkfSl9fX19LGFjdGlvbnMudXBkYXRlQ2FuZGlkYXRlQXBwcm92YWxzPWFzeW5jIHBheWxvYWQ9Pntjb25zdHthY2NvdW50OmFjY291bnQsdG9rZW46dG9rZW4sY2FsbGluZ0NvbnRyYWN0SW5mbzpjYWxsaW5nQ29udHJhY3RJbmZvfT1wYXlsb2FkO2lmKHZvaWQgMD09PWNhbGxpbmdDb250cmFjdEluZm8pcmV0dXJuO2lmKCJ0b2tlbnMiIT09Y2FsbGluZ0NvbnRyYWN0SW5mby5uYW1lKXJldHVybjtjb25zdCBhY2N0PWF3YWl0IGFwaS5kYi5maW5kT25lKCJhY2NvdW50cyIse2FjY291bnQ6YWNjb3VudH0pO2lmKG51bGwhPT1hY2N0KXtjb25zdCBwYXJhbXM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pLHdJbmRleD1hY2N0LndlaWdodHMuZmluZEluZGV4KCh4PT54LnN5bWJvbD09PXRva2VuLnN5bWJvbCkpO2lmKC0xIT09d0luZGV4KXtjb25zdCBiYWxhbmNlPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwiYmFsYW5jZXMiLHthY2NvdW50OmFjY291bnQsc3ltYm9sOnRva2VuLnN5bWJvbH0pO2xldCBhcHByb3ZhbFdlaWdodD0wO2JhbGFuY2UmJmJhbGFuY2Uuc3Rha2UmJihhcHByb3ZhbFdlaWdodD1iYWxhbmNlLnN0YWtlKSxiYWxhbmNlJiZiYWxhbmNlLmRlbGVnYXRpb25zSW4mJihhcHByb3ZhbFdlaWdodD1hcGkuQmlnTnVtYmVyKGFwcHJvdmFsV2VpZ2h0KS5wbHVzKGJhbGFuY2UuZGVsZWdhdGlvbnNJbikudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24sYXBpLkJpZ051bWJlci5ST1VORF9IQUxGX1VQKSk7bGV0IG9sZEFwcHJvdmFsV2VpZ2h0PTA7b2xkQXBwcm92YWxXZWlnaHQ9YWNjdC53ZWlnaHRzW3dJbmRleF0ud2VpZ2h0LGFjY3Qud2VpZ2h0c1t3SW5kZXhdLndlaWdodD1hcHByb3ZhbFdlaWdodDtjb25zdCBkZWx0YUFwcHJvdmFsV2VpZ2h0PWFwaS5CaWdOdW1iZXIoYXBwcm92YWxXZWlnaHQpLm1pbnVzKG9sZEFwcHJvdmFsV2VpZ2h0KS5kcCh0b2tlbi5wcmVjaXNpb24sYXBpLkJpZ051bWJlci5ST1VORF9IQUxGX1VQKTtpZighYXBpLkJpZ051bWJlcihkZWx0YUFwcHJvdmFsV2VpZ2h0KS5lcSgwKSl7YXdhaXQgYXBpLmRiLnVwZGF0ZSgiYWNjb3VudHMiLGFjY3QpO2NvbnN0IGFwcHJvdmFscz1hd2FpdCBhcGkuZGIuZmluZCgiYXBwcm92YWxzIix7ZnJvbTphY2NvdW50LGNhbmRpZGF0ZVBlbmRpbmc6ITB9LHBhcmFtcy5tYXhBY2NvdW50QXBwcm92YWxzLDAsW3tpbmRleDoiX2lkIixkZXNjZW5kaW5nOiEwfV0pO2ZvcihsZXQgaW5kZXg9MDtpbmRleDxhcHByb3ZhbHMubGVuZ3RoO2luZGV4Kz0xKXtjb25zdCBhcHByb3ZhbD1hcHByb3ZhbHNbaW5kZXhdO2F3YWl0IHVwZGF0ZUNhbmRpZGF0ZVdlaWdodChhcHByb3ZhbC50byxkZWx0YUFwcHJvdmFsV2VpZ2h0LHRva2VuKXx8KGFwcHJvdmFsLmNhbmRpZGF0ZVBlbmRpbmc9ITEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYXBwcm92YWxzIixhcHByb3ZhbCkpfX19fX0sYWN0aW9ucy5jaGVja1BlbmRpbmdJbnN0YW5jZXM9YXN5bmMoKT0+e2lmKGFwaS5hc3NlcnQoIm51bGwiPT09YXBpLnNlbmRlciwibm90IGF1dGhvcml6ZWQiKSl7Y29uc3QgcGFyYW1zPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KSxibG9ja0RhdGU9bmV3IERhdGUoYCR7YXBpLmhpdmVCbG9ja1RpbWVzdGFtcH0uMDAwWmApLHRpY2tUaW1lPWFwaS5CaWdOdW1iZXIoYmxvY2tEYXRlLmdldFRpbWUoKSkubWludXMoMzYwMCpwYXJhbXMuaW5zdGFuY2VUaWNrSG91cnMqMWUzKS50b051bWJlcigpLHBlbmRpbmdJbnN0PWF3YWl0IGFwaS5kYi5maW5kKCJpbnN0YW5jZXMiLHthY3RpdmU6ITAsbGFzdFRpY2tUaW1lOnskbHRlOnRpY2tUaW1lfX0scGFyYW1zLm1heEluc3RhbmNlc1BlckJsb2NrLDAsW3tpbmRleDoibGFzdFRpY2tUaW1lIixkZXNjZW5kaW5nOiExfSx7aW5kZXg6Il9pZCIsZGVzY2VuZGluZzohMX1dKTtmb3IobGV0IGk9MDtpPHBlbmRpbmdJbnN0Lmxlbmd0aDtpKz0xKWF3YWl0IGNoZWNrUGVuZGluZ0NhbmRpZGF0ZXMocGVuZGluZ0luc3RbaV0scGFyYW1zKX19Ow==" } }}