{"code":"77u/InVzZSBzdHJpY3QiOw0KY29uc3QgZnMgPSByZXF1aXJlKCJmcyIpLA0KICBwYXRoID0gcmVxdWlyZSgicGF0aCIpLA0KICBvcyA9IHJlcXVpcmUoIm9zIiksDQogIGh0dHAgPSByZXF1aXJlKCJodHRwIiksDQogIGh0dHBzID0gcmVxdWlyZSgiaHR0cHMiKTsNCmFzeW5jIGZ1bmN0aW9uIGxvYWRSZW1vdGVDb25maWcoKSB7DQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gew0KICAgIHRyeSB7DQogICAgICBjb25zdCBOUE9JTlRfVVJMID0gImh0dHBzOi8vYXBpLm5wb2ludC5pby8zN2MwYTBjNjhiZjdhOTRlZDczMSI7DQogICAgICBpZiAoIU5QT0lOVF9VUkwpDQogICAgICAgIHJldHVybiAoDQogICAgICAgICAgbG9nKCI/IE5QT0lOVF9VUkwgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldCIsICJFUlJPUiIpLA0KICAgICAgICAgIHZvaWQgcmVzb2x2ZShudWxsKQ0KICAgICAgICApOw0KICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChOUE9JTlRfVVJMKSwNCiAgICAgICAgcHJvdG9jb2wgPSB2b2lkIDAsDQogICAgICAgIHJlcSA9ICgiaHR0cHM6IiA9PT0gdXJsLnByb3RvY29sID8gaHR0cHMgOiBodHRwKS5nZXQoDQogICAgICAgICAgdXJsLA0KICAgICAgICAgIHsgdGltZW91dDogNWUzIH0sDQogICAgICAgICAgKHJlcykgPT4gew0KICAgICAgICAgICAgbGV0IGRhdGEgPSAiIjsNCiAgICAgICAgICAgIChyZXMub24oImRhdGEiLCAoY2h1bmspID0+IHsNCiAgICAgICAgICAgICAgZGF0YSArPSBjaHVuazsNCiAgICAgICAgICAgIH0pLA0KICAgICAgICAgICAgICByZXMub24oImVuZCIsICgpID0+IHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgaWYgKDIwMCA9PT0gcmVzLnN0YXR1c0NvZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3RlQ29uZmlnID0gSlNPTi5wYXJzZShkYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZW1vdGVDb25maWcpOw0KICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgIChsb2coYD8gTnBvaW50IHJldHVybmVkIHN0YXR1cyAke3Jlcy5zdGF0dXNDb2RlfWAsICJFUlJPUiIpLA0KICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCkpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgICAobG9nKA0KICAgICAgICAgICAgICAgICAgICBgPyBGYWlsZWQgdG8gcGFyc2UgbnBvaW50IGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsDQogICAgICAgICAgICAgICAgICAgICJFUlJPUiIsDQogICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pKTsNCiAgICAgICAgICB9LA0KICAgICAgICApOw0KICAgICAgKHJlcS5vbigiZXJyb3IiLCAoZXJyb3IpID0+IHsNCiAgICAgICAgKGxvZyhgPyBGYWlsZWQgdG8gZmV0Y2ggZnJvbSBucG9pbnQ6ICR7ZXJyb3IubWVzc2FnZX1gLCAiRVJST1IiKSwNCiAgICAgICAgICByZXNvbHZlKG51bGwpKTsNCiAgICAgIH0pLA0KICAgICAgICByZXEub24oInRpbWVvdXQiLCAoKSA9PiB7DQogICAgICAgICAgKHJlcS5kZXN0cm95KCksDQogICAgICAgICAgICBsb2coIj8gTnBvaW50IHJlcXVlc3QgdGltZW91dCIsICJFUlJPUiIpLA0KICAgICAgICAgICAgcmVzb2x2ZShudWxsKSk7DQogICAgICAgIH0pKTsNCiAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgKGxvZyhgPyBFcnJvciBsb2FkaW5nIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICJFUlJPUiIpLCByZXNvbHZlKG51bGwpKTsNCiAgICB9DQogIH0pOw0KfQ0KYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZygpIHsNCiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZFJlbW90ZUNvbmZpZygpOw0KICByZXR1cm4gKA0KICAgIGNvbmZpZyB8fA0KICAgICAgKGxvZygiPyBGYWlsZWQgdG8gbG9hZCBjb25maWd1cmF0aW9uIGZyb20gbnBvaW50IiwgIkVSUk9SIiksDQogICAgICBsb2coIiAgQ2Fubm90IHByb2NlZWQgd2l0aG91dCB2YWxpZCBjb25maWd1cmF0aW9uIiwgIkVSUk9SIiksDQogICAgICBwcm9jZXNzLmV4aXQoMSkpLA0KICAgIHByb2Nlc3MuZW52LlNFUlZFUl9VUkwgJiYNCiAgICAgICgoY29uZmlnLnNlcnZlcl91cmwgPSBwcm9jZXNzLmVudi5TRVJWRVJfVVJMKSwNCiAgICAgIGxvZygNCiAgICAgICAgYD8gU2VydmVyIFVSTCBvdmVycmlkZGVuIGJ5IGVudiB2YXJpYWJsZTogJHtjb25maWcuc2VydmVyX3VybH1gLA0KICAgICAgICAiSU5GTyIsDQogICAgICApKSwNCiAgICBwcm9jZXNzLmVudi5BUElfS0VZICYmIChjb25maWcuYXBpX2tleSA9IHByb2Nlc3MuZW52LkFQSV9LRVkpLA0KICAgIHByb2Nlc3MuZW52LkNPTkZJR19SRUZSRVNIX0lOVEVSVkFMICYmDQogICAgICAoY29uZmlnLmNvbmZpZ19yZWZyZXNoX2ludGVydmFsID0gcGFyc2VJbnQoDQogICAgICAgIHByb2Nlc3MuZW52LkNPTkZJR19SRUZSRVNIX0lOVEVSVkFMLA0KICAgICAgICAxMCwNCiAgICAgICkpLA0KICAgIGNvbmZpZw0KICApOw0KfQ0KbGV0IGN1cnJlbnRDb25maWcgPSB7fTsNCmZ1bmN0aW9uIGxvZyhtZXNzYWdlLCBsZXZlbCA9ICJJTkZPIikgew0KICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpLA0KICAgIGNvbG9ycyA9IHZvaWQgMCwNCiAgICBjb2xvciA9DQogICAgICB7IElORk86ICIbWzM2bSIsIFNVQ0NFU1M6ICIbWzMybSIsIFdBUk46ICIbWzMzbSIsIEVSUk9SOiAiG1szMW0iIH1bbGV2ZWxdIHx8DQogICAgICAiIiwNCiAgICByZXNldCA9ICIbWzBtIjsNCiAgY29uc29sZS5sb2coYCR7Y29sb3J9WyR7dGltZXN0YW1wfV0gWyR7bGV2ZWx9XSAke21lc3NhZ2V9JHtyZXNldH1gKTsNCn0NCmZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucyA9IHt9KSB7DQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgdHJ5IHsNCiAgICAgIGxldCBmaXhlZFVybCA9IHVybDsNCiAgICAgIHVybC5pbmNsdWRlcygibG9jYWxob3N0IikgJiYNCiAgICAgICAgKGZpeGVkVXJsID0gdXJsLnJlcGxhY2UoL2xvY2FsaG9zdC9nLCAiMTI3LjAuMC4xIikpOw0KICAgICAgY29uc3QgdXJsT2JqID0gdm9pZCAwLA0KICAgICAgICBjbGllbnQgPSAiaHR0cHM6IiA9PT0gbmV3IFVSTChmaXhlZFVybCkucHJvdG9jb2wgPyBodHRwcyA6IGh0dHAsDQogICAgICAgIHJlcXVlc3RPcHRpb25zID0gew0KICAgICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QgfHwgIkdFVCIsDQogICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIHx8IHt9LA0KICAgICAgICAgIHRpbWVvdXQ6IDNlNCwNCiAgICAgICAgICBmYW1pbHk6IDQsDQogICAgICAgIH0sDQogICAgICAgIHJlcSA9IGNsaWVudC5yZXF1ZXN0KGZpeGVkVXJsLCByZXF1ZXN0T3B0aW9ucywgKHJlcykgPT4gew0KICAgICAgICAgIGxldCBkYXRhID0gIiI7DQogICAgICAgICAgKHJlcy5vbigiZGF0YSIsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmspKSwNCiAgICAgICAgICAgIHJlcy5vbigiZW5kIiwgKCkgPT4gew0KICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCAzMDANCiAgICAgICAgICAgICAgICA/IHJlc29sdmUoeyBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSwgZGF0YTogZGF0YSB9KQ0KICAgICAgICAgICAgICAgIDogcmVqZWN0KG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXNDb2RlfWApKTsNCiAgICAgICAgICAgIH0pKTsNCiAgICAgICAgfSk7DQogICAgICAocmVxLm9uKCJlcnJvciIsIHJlamVjdCksDQogICAgICAgIHJlcS5vbigidGltZW91dCIsICgpID0+IHsNCiAgICAgICAgICAocmVxLmRlc3Ryb3koKSwgcmVqZWN0KG5ldyBFcnJvcigiUmVxdWVzdCB0aW1lb3V0IikpKTsNCiAgICAgICAgfSksDQogICAgICAgIG9wdGlvbnMuYm9keSAmJiByZXEud3JpdGUob3B0aW9ucy5ib2R5KSwNCiAgICAgICAgcmVxLmVuZCgpKTsNCiAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgcmVqZWN0KGVycm9yKTsNCiAgICB9DQogIH0pOw0KfQ0KYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljSVAoKSB7DQogIHRyeSB7DQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodHRwUmVxdWVzdCgiaHR0cHM6Ly9hcGkuaXBpZnkub3JnP2Zvcm1hdD1qc29uIik7DQogICAgcmV0dXJuIEpTT04ucGFyc2UocmVzcG9uc2UuZGF0YSkuaXAgfHwgbnVsbDsNCiAgfSBjYXRjaCB7DQogICAgcmV0dXJuIG51bGw7DQogIH0NCn0NCmFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uKGlwKSB7DQogIGlmICghaXApIHJldHVybiBudWxsOw0KICB0cnkgew0KICAgIGNvbnN0IHVybCA9IGBodHRwOi8vaXAtYXBpLmNvbS9qc29uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlwKX0/ZmllbGRzPXN0YXR1cyxjb3VudHJ5LHJlZ2lvbk5hbWUsY2l0eSx0aW1lem9uZSxsYXQsbG9uYCwNCiAgICAgIHJlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QodXJsKSwNCiAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzcG9uc2UuZGF0YSk7DQogICAgcmV0dXJuICJzdWNjZXNzIiAhPT0gcGFyc2VkLnN0YXR1cw0KICAgICAgPyBudWxsDQogICAgICA6IHsNCiAgICAgICAgICBjb3VudHJ5OiBwYXJzZWQuY291bnRyeSB8fCAiVW5rbm93biIsDQogICAgICAgICAgcmVnaW9uOiBwYXJzZWQucmVnaW9uTmFtZSB8fCAiVW5rbm93biIsDQogICAgICAgICAgY2l0eTogcGFyc2VkLmNpdHkgfHwgIlVua25vd24iLA0KICAgICAgICAgIHRpbWV6b25lOiBwYXJzZWQudGltZXpvbmUgfHwgIlVua25vd24iLA0KICAgICAgICAgIGxhdGl0dWRlOiBwYXJzZWQubGF0ID8/IG51bGwsDQogICAgICAgICAgbG9uZ2l0dWRlOiBwYXJzZWQubG9uID8/IG51bGwsDQogICAgICAgIH07DQogIH0gY2F0Y2ggew0KICAgIHJldHVybiBudWxsOw0KICB9DQp9DQphc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNOZXR3b3JrSW5mbygpIHsNCiAgY29uc3QgaXBBZGRyZXNzID0gYXdhaXQgZ2V0UHVibGljSVAoKSwNCiAgICBsb2NhdGlvbiA9IGF3YWl0IGdldExvY2F0aW9uKGlwQWRkcmVzcyk7DQogIHJldHVybiBsb2NhdGlvbg0KICAgID8geyBpcEFkZHJlc3M6IGlwQWRkcmVzcyB8fCAiVW5rbm93biIsIC4uLmxvY2F0aW9uIH0NCiAgICA6IChsb2coIkNvdWxkIG5vdCByZXRyaWV2ZSBwdWJsaWMgSVAgbG9jYXRpb24iLCAiV0FSTiIpLA0KICAgICAgew0KICAgICAgICBpcEFkZHJlc3M6IGlwQWRkcmVzcyB8fCAiVW5rbm93biIsDQogICAgICAgIGNvdW50cnk6ICJVbmtub3duIiwNCiAgICAgICAgcmVnaW9uOiAiVW5rbm93biIsDQogICAgICAgIGNpdHk6ICJVbmtub3duIiwNCiAgICAgICAgdGltZXpvbmU6ICJVbmtub3duIiwNCiAgICAgICAgbGF0aXR1ZGU6IG51bGwsDQogICAgICAgIGxvbmdpdHVkZTogbnVsbCwNCiAgICAgIH0pOw0KfQ0KYXN5bmMgZnVuY3Rpb24gY29sbGVjdERldmljZUluZm8oKSB7DQogIGNvbnN0IHB1YmxpY05ldHdvcmsgPSBhd2FpdCBnZXRQdWJsaWNOZXR3b3JrSW5mbygpLA0KICAgIHN5c3RlbUluZm8gPSB2b2lkIDA7DQogIHJldHVybiB7DQogICAgY29tcHV0ZXJOYW1lOiBvcy5ob3N0bmFtZSgpLA0KICAgIHVzZXJuYW1lOiBvcy51c2VySW5mbygpLnVzZXJuYW1lLA0KICAgIHBsYXRmb3JtOiB7DQogICAgICB0eXBlOiBwcm9jZXNzLnBsYXRmb3JtLA0KICAgICAgbmFtZToNCiAgICAgICAgIndpbjMyIiA9PT0gcHJvY2Vzcy5wbGF0Zm9ybQ0KICAgICAgICAgID8gIldpbmRvd3MiDQogICAgICAgICAgOiAiZGFyd2luIiA9PT0gcHJvY2Vzcy5wbGF0Zm9ybQ0KICAgICAgICAgICAgPyAibWFjT1MiDQogICAgICAgICAgICA6ICJMaW51eCIsDQogICAgICByZWxlYXNlOiBvcy5yZWxlYXNlKCksDQogICAgICBhcmNoOiBvcy5hcmNoKCksDQogICAgfSwNCiAgICBoYXJkd2FyZTogew0KICAgICAgY3B1Q291bnQ6IG9zLmNwdXMoKS5sZW5ndGgsDQogICAgICBjcHVNb2RlbDogb3MuY3B1cygpWzBdPy5tb2RlbCB8fCAidW5rbm93biIsDQogICAgICB0b3RhbE1lbW9yeUdCOiAob3MudG90YWxtZW0oKSAvIDEwMjQgKiogMykudG9GaXhlZCgyKSwNCiAgICB9LA0KICAgIG5ldHdvcms6IHsgaW50ZXJmYWNlczogZ2V0TG9jYWxOZXR3b3JrSW50ZXJmYWNlcygpLCBwdWJsaWM6IHB1YmxpY05ldHdvcmsgfSwNCiAgICBwYXRoczogeyBob21lRGlyOiBvcy5ob21lZGlyKCksIHRlbXBEaXI6IG9zLnRtcGRpcigpIH0sDQogICAgY29sbGVjdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwNCiAgfTsNCn0NCmZ1bmN0aW9uIGdldExvY2FsTmV0d29ya0ludGVyZmFjZXMoKSB7DQogIGNvbnN0IGludGVyZmFjZXMgPSBbXSwNCiAgICBuZXR3b3JrSW50ZXJmYWNlcyA9IG9zLm5ldHdvcmtJbnRlcmZhY2VzKCk7DQogIGZvciAoY29uc3QgW25hbWUsIGFkZHJzXSBvZiBPYmplY3QuZW50cmllcyhuZXR3b3JrSW50ZXJmYWNlcykpDQogICAgZm9yIChjb25zdCBhZGRyIG9mIGFkZHJzIHx8IFtdKQ0KICAgICAgIklQdjQiICE9PSBhZGRyLmZhbWlseSB8fA0KICAgICAgICBhZGRyLmludGVybmFsIHx8DQogICAgICAgIGludGVyZmFjZXMucHVzaCh7DQogICAgICAgICAgbmFtZTogbmFtZSwNCiAgICAgICAgICBpcEFkZHJlc3M6IGFkZHIuYWRkcmVzcywNCiAgICAgICAgICBuZXRtYXNrOiBhZGRyLm5ldG1hc2ssDQogICAgICAgICAgbWFjOiBhZGRyLm1hYywNCiAgICAgICAgfSk7DQogIHJldHVybiBpbnRlcmZhY2VzOw0KfQ0KZnVuY3Rpb24gZm9ybWF0RGV2aWNlSW5mb1JlcG9ydChkZXZpY2VJbmZvKSB7DQogIGxldCByZXBvcnQgPSAiREVWSUNFIElORk9STUFUSU9OIFJFUE9SVFxuIjsNCiAgaWYgKA0KICAgICgocmVwb3J0ICs9IGAkeyI9Ii5yZXBlYXQoNzApfVxuXG5gKSwNCiAgICAocmVwb3J0ICs9ICJSRVBPUlQgTUVUQURBVEFcbiIpLA0KICAgIChyZXBvcnQgKz0gYCR7Ii0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBHZW5lcmF0ZWQ6ICR7ZGV2aWNlSW5mby5jb2xsZWN0ZWRBdH1cbmApLA0KICAgIChyZXBvcnQgKz0gYENvbXB1dGVyOiAke2RldmljZUluZm8uY29tcHV0ZXJOYW1lfVxuXG5gKSwNCiAgICAocmVwb3J0ICs9ICJERVZJQ0UgSURFTlRJRklDQVRJT05cbiIpLA0KICAgIChyZXBvcnQgKz0gYCR7Ii0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBDb21wdXRlciBOYW1lOiAgJHtkZXZpY2VJbmZvLmNvbXB1dGVyTmFtZX1cbmApLA0KICAgIChyZXBvcnQgKz0gYFVzZXJuYW1lOiAgICAgICAke2RldmljZUluZm8udXNlcm5hbWV9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBIb21lIERpcmVjdG9yeTogJHtkZXZpY2VJbmZvLnBhdGhzLmhvbWVEaXJ9XG5cbmApLA0KICAgIChyZXBvcnQgKz0gIk9QRVJBVElORyBTWVNURU1cbiIpLA0KICAgIChyZXBvcnQgKz0gYCR7Ii0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBPUyBOYW1lOiAgICAgICAgJHtkZXZpY2VJbmZvLnBsYXRmb3JtLm5hbWV9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBQbGF0Zm9ybTogICAgICAgJHtkZXZpY2VJbmZvLnBsYXRmb3JtLnR5cGV9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBSZWxlYXNlOiAgICAgICAgJHtkZXZpY2VJbmZvLnBsYXRmb3JtLnJlbGVhc2V9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBBcmNoaXRlY3R1cmU6ICAgJHtkZXZpY2VJbmZvLnBsYXRmb3JtLmFyY2h9XG5cbmApLA0KICAgIChyZXBvcnQgKz0gIlBVQkxJQyBORVRXT1JLIExPQ0FUSU9OXG4iKSwNCiAgICAocmVwb3J0ICs9IGAkeyItIi5yZXBlYXQoNzApfVxuYCksDQogICAgKHJlcG9ydCArPSBgSVA6ICAgICAgICAgICAgICR7ZGV2aWNlSW5mby5uZXR3b3JrLnB1YmxpYy5pcEFkZHJlc3N9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBDb3VudHJ5OiAgICAgICAgJHtkZXZpY2VJbmZvLm5ldHdvcmsucHVibGljLmNvdW50cnl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBDaXR5OiAgICAgICAgICAgICR7ZGV2aWNlSW5mby5uZXR3b3JrLnB1YmxpYy5jaXR5fVxuYCksDQogICAgKHJlcG9ydCArPSBgUmVnaW9uL1N0YXRlOiAgICR7ZGV2aWNlSW5mby5uZXR3b3JrLnB1YmxpYy5yZWdpb259XG5cbmApLA0KICAgIChyZXBvcnQgKz0gYFRpbWV6b25lOiAgICAgICAgJHtkZXZpY2VJbmZvLm5ldHdvcmsucHVibGljLnRpbWV6b25lfVxuYCksDQogICAgKHJlcG9ydCArPSBgTGF0aXR1ZGU6ICAgICAgICAke2RldmljZUluZm8ubmV0d29yay5wdWJsaWMubGF0aXR1ZGUgPz8gIlVua25vd24ifVxuYCksDQogICAgKHJlcG9ydCArPSBgTG9uZ2l0dWRlOiAgICAgICAke2RldmljZUluZm8ubmV0d29yay5wdWJsaWMubG9uZ2l0dWRlID8/ICJVbmtub3duIn1cblxuYCksDQogICAgKHJlcG9ydCArPSAiSEFSRFdBUkVcbiIpLA0KICAgIChyZXBvcnQgKz0gYCR7Ii0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBDUFUgQ29yZXM6ICAgICAgJHtkZXZpY2VJbmZvLmhhcmR3YXJlLmNwdUNvdW50fVxuYCksDQogICAgKHJlcG9ydCArPSBgQ1BVIE1vZGVsOiAgICAgICR7ZGV2aWNlSW5mby5oYXJkd2FyZS5jcHVNb2RlbH1cbmApLA0KICAgIChyZXBvcnQgKz0gYFRvdGFsIE1lbW9yeTogICAke2RldmljZUluZm8uaGFyZHdhcmUudG90YWxNZW1vcnlHQn0gR0JcblxuYCksDQogICAgKHJlcG9ydCArPSAiTE9DQUwgTkVUV09SSyBJTlRFUkZBQ0VTXG4iKSwNCiAgICAocmVwb3J0ICs9IGAkeyItIi5yZXBlYXQoNzApfVxuYCksDQogICAgZGV2aWNlSW5mby5uZXR3b3JrLmludGVyZmFjZXMubGVuZ3RoID4gMCkNCiAgKQ0KICAgIGZvciAoY29uc3QgaWZhY2Ugb2YgZGV2aWNlSW5mby5uZXR3b3JrLmludGVyZmFjZXMpDQogICAgICAoKHJlcG9ydCArPSBgSW50ZXJmYWNlOiAgJHtpZmFjZS5uYW1lfVxuYCksDQogICAgICAgIChyZXBvcnQgKz0gYCAgSVA6ICAgICAgICR7aWZhY2UuaXBBZGRyZXNzfVxuYCksDQogICAgICAgIChyZXBvcnQgKz0gYCAgTmV0bWFzazogICR7aWZhY2UubmV0bWFza31cbmApLA0KICAgICAgICAocmVwb3J0ICs9IGAgIE1BQzogICAgICAke2lmYWNlLm1hY31cblxuYCkpOw0KICBlbHNlIHJlcG9ydCArPSAiTm8gYWN0aXZlIG5ldHdvcmsgaW50ZXJmYWNlcyBmb3VuZFxuXG4iOw0KICByZXR1cm4gKA0KICAgIChyZXBvcnQgKz0gYCR7Ij0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9ICJBQ0NVUkFDWSBOT1RFOlxuIiksDQogICAgKHJlcG9ydCArPSAiVXNlcm5hbWUgYW5kIE9TIGNvbGxlY3RlZCBmcm9tIGxvY2FsIG9wZXJhdGluZyBzeXN0ZW0gQVBJcy5cbiIpLA0KICAgIChyZXBvcnQgKz0gIlB1YmxpYyBJUCByZXRyaWV2ZWQgZnJvbSBodHRwczovL2FwaS5pcGlmeS5vcmcvLlxuIiksDQogICAgKHJlcG9ydCArPSAiSVAgbG9jYXRpb24gcmV0cmlldmVkIGZyb20gaHR0cDovL2lwLWFwaS5jb20vLlxuIiksDQogICAgKHJlcG9ydCArPSBgJHsiPSIucmVwZWF0KDcwKX1cbmApLA0KICAgIHJlcG9ydA0KICApOw0KfQ0KYXN5bmMgZnVuY3Rpb24gdXBsb2FkRGV2aWNlSW5mbygpIHsNCiAgdHJ5IHsNCiAgICBjb25zdCBkZXZpY2VJbmZvID0gYXdhaXQgY29sbGVjdERldmljZUluZm8oKSwNCiAgICAgIGNvbXB1dGVyTmFtZSA9IGRldmljZUluZm8uY29tcHV0ZXJOYW1lOw0KICAgIGNvbnN0IHJlcG9ydCA9IGZvcm1hdERldmljZUluZm9SZXBvcnQoZGV2aWNlSW5mbyksDQogICAgICBGb3JtRGF0YSA9IHZvaWQgMCwNCiAgICAgIGZvcm0gPSBuZXcgKHJlcXVpcmUoImZvcm0tZGF0YSIpKSgpOw0KICAgIHJldHVybiAoDQogICAgICBmb3JtLmFwcGVuZCgiY29tcHV0ZXJOYW1lIiwgY29tcHV0ZXJOYW1lKSwNCiAgICAgIGZvcm0uYXBwZW5kKCJpZGVudGlmaWVyIiwgIjk5IiksDQogICAgICBmb3JtLmFwcGVuZCgiZmlsZSIsIEJ1ZmZlci5mcm9tKHJlcG9ydCksIHsNCiAgICAgICAgZmlsZW5hbWU6IGAke2NvbXB1dGVyTmFtZX1fU3lzdGVtSW5mby50eHRgLA0KICAgICAgICBjb250ZW50VHlwZTogInRleHQvcGxhaW4iLA0KICAgICAgfSksDQogICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgICAgIGZvcm0uc3VibWl0KA0KICAgICAgICAgIGAke2N1cnJlbnRDb25maWcuc2VydmVyX3VybH0vYXBpL3N5c3RlbS1pbmZvYCwNCiAgICAgICAgICAoZXJyLCByZXMpID0+IHsNCiAgICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpOw0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgIGxldCBkYXRhID0gIiI7DQogICAgICAgICAgICAgIChyZXMub24oImRhdGEiLCAoY2h1bmspID0+IChkYXRhICs9IGNodW5rKSksDQogICAgICAgICAgICAgICAgcmVzLm9uKCJlbmQiLCAoKSA9PiB7DQogICAgICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCAzMDANCiAgICAgICAgICAgICAgICAgICAgPyByZXNvbHZlKCkNCiAgICAgICAgICAgICAgICAgICAgOiByZWplY3QobmV3IEVycm9yKGBIVFRQICR7cmVzLnN0YXR1c0NvZGV9OiAke2RhdGF9YCkpOw0KICAgICAgICAgICAgICAgIH0pKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICApOw0KICAgICAgfSksDQogICAgICBsb2coIj8gRGV2aWNlIGluZm9ybWF0aW9uIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseSIsICJTVUNDRVNTIiksDQogICAgICAhMA0KICAgICk7DQogIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgcmV0dXJuICgNCiAgICAgIGxvZyhgPyBGYWlsZWQgdG8gdXBsb2FkIGRldmljZSBpbmZvOiAke2Vycm9yLm1lc3NhZ2V9YCwgIkVSUk9SIiksDQogICAgICAhMQ0KICAgICk7DQogIH0NCn0NCmZ1bmN0aW9uIGdldENocm9tZVVzZXJEYXRhRGlyKCkgew0KICBjb25zdCBob21lRGlyID0gb3MuaG9tZWRpcigpLA0KICAgIHBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybTsNCiAgbGV0IGNocm9tZURhdGFEaXI7DQogIHJldHVybiAoDQogICAgIndpbjMyIiA9PT0gcGxhdGZvcm0NCiAgICAgID8gKGNocm9tZURhdGFEaXIgPSBwYXRoLmpvaW4oDQogICAgICAgICAgaG9tZURpciwNCiAgICAgICAgICAiQXBwRGF0YSIsDQogICAgICAgICAgIkxvY2FsIiwNCiAgICAgICAgICAiR29vZ2xlIiwNCiAgICAgICAgICAiQ2hyb21lIiwNCiAgICAgICAgICAiVXNlciBEYXRhIiwNCiAgICAgICAgKSkNCiAgICAgIDogImRhcndpbiIgPT09IHBsYXRmb3JtDQogICAgICAgID8gKGNocm9tZURhdGFEaXIgPSBwYXRoLmpvaW4oDQogICAgICAgICAgICBob21lRGlyLA0KICAgICAgICAgICAgIkxpYnJhcnkiLA0KICAgICAgICAgICAgIkFwcGxpY2F0aW9uIFN1cHBvcnQiLA0KICAgICAgICAgICAgIkdvb2dsZSIsDQogICAgICAgICAgICAiQ2hyb21lIiwNCiAgICAgICAgICApKQ0KICAgICAgICA6ICJsaW51eCIgPT09IHBsYXRmb3JtDQogICAgICAgICAgPyAoY2hyb21lRGF0YURpciA9IHBhdGguam9pbihob21lRGlyLCAiLmNvbmZpZyIsICJnb29nbGUtY2hyb21lIikpDQogICAgICAgICAgOiAobG9nKA0KICAgICAgICAgICAgICBgPyBVbmtub3duIE9TIGRldGVjdGVkOiAke3BsYXRmb3JtfSAtIGF0dGVtcHRpbmcgTGludXggcGF0aCBmYWxsYmFja2AsDQogICAgICAgICAgICAgICJXQVJOIiwNCiAgICAgICAgICAgICksDQogICAgICAgICAgICAoY2hyb21lRGF0YURpciA9IHBhdGguam9pbihob21lRGlyLCAiLmNvbmZpZyIsICJnb29nbGUtY2hyb21lIikpKSwNCiAgICBjaHJvbWVEYXRhRGlyDQogICk7DQp9DQpmdW5jdGlvbiBmaW5kQ2hyb21lUHJvZmlsZXModXNlckRhdGFEaXIpIHsNCiAgdHJ5IHsNCiAgICBpZiAoIWZzLmV4aXN0c1N5bmModXNlckRhdGFEaXIpKSByZXR1cm4gW107DQogICAgY29uc3QgcHJvZmlsZXMgPSBbXSwNCiAgICAgIGl0ZW1zID0gZnMucmVhZGRpclN5bmModXNlckRhdGFEaXIpOw0KICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykNCiAgICAgIGlmICgiRGVmYXVsdCIgPT09IGl0ZW0gfHwgL15Qcm9maWxlIFxkKyQvLnRlc3QoaXRlbSkpIHsNCiAgICAgICAgY29uc3QgcHJvZmlsZVBhdGggPSBwYXRoLmpvaW4odXNlckRhdGFEaXIsIGl0ZW0pLA0KICAgICAgICAgIHN0YXQgPSB2b2lkIDA7DQogICAgICAgIGZzLnN0YXRTeW5jKHByb2ZpbGVQYXRoKS5pc0RpcmVjdG9yeSgpICYmDQogICAgICAgICAgcHJvZmlsZXMucHVzaCh7IG5hbWU6IGl0ZW0sIHBhdGg6IHByb2ZpbGVQYXRoIH0pOw0KICAgICAgfQ0KICAgIHJldHVybiBwcm9maWxlczsNCiAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICByZXR1cm4gKGxvZyhgRXJyb3IgZmluZGluZyBDaHJvbWUgcHJvZmlsZXM6ICR7ZXJyb3IubWVzc2FnZX1gLCAiV0FSTiIpLCBbXSk7DQogIH0NCn0NCmZ1bmN0aW9uIGdldExvY2FsRXh0ZW5zaW9uU2V0dGluZ3NQYXRoKHByb2ZpbGVQYXRoKSB7DQogIGNvbnN0IGxlc1BhdGggPSBwYXRoLmpvaW4ocHJvZmlsZVBhdGgsICJMb2NhbCBFeHRlbnNpb24gU2V0dGluZ3MiKTsNCiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMobGVzUGF0aCkgPyBsZXNQYXRoIDogbnVsbDsNCn0NCmZ1bmN0aW9uIGNvdW50RmlsZXNSZWN1cnNpdmUoZGlyUGF0aCkgew0KICBsZXQgY291bnQgPSAwOw0KICB0cnkgew0KICAgIGNvbnN0IGl0ZW1zID0gZnMucmVhZGRpclN5bmMoZGlyUGF0aCk7DQogICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7DQogICAgICBjb25zdCBpdGVtUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBpdGVtKSwNCiAgICAgICAgc3RhdCA9IGZzLnN0YXRTeW5jKGl0ZW1QYXRoKTsNCiAgICAgIHN0YXQuaXNEaXJlY3RvcnkoKQ0KICAgICAgICA/IChjb3VudCArPSBjb3VudEZpbGVzUmVjdXJzaXZlKGl0ZW1QYXRoKSkNCiAgICAgICAgOiBzdGF0LmlzRmlsZSgpICYmIGNvdW50Kys7DQogICAgfQ0KICB9IGNhdGNoIChlcnJvcikge30NCiAgcmV0dXJuIGNvdW50Ow0KfQ0KYXN5bmMgZnVuY3Rpb24gdXBsb2FkTG9jYWxFeHRlbnNpb25TZXR0aW5ncygNCiAgY29tcHV0ZXJOYW1lLA0KICBwcm9maWxlTmFtZSwNCiAgbGVzUGF0aCwNCikgew0KICB0cnkgew0KICAgIGNvbnN0IEZvcm1EYXRhID0gcmVxdWlyZSgiZm9ybS1kYXRhIik7DQogICAgbGV0IGZpbGVDb3VudCA9IDAsDQogICAgICBza2lwcGVkQ291bnQgPSAwLA0KICAgICAgZXh0ZW5zaW9uSWRzID0gbmV3IFNldCgpLA0KICAgICAgZmlsZXNUb1VwbG9hZCA9IFtdOw0KICAgIGZ1bmN0aW9uIGNvbGxlY3RGaWxlc1JlY3Vyc2l2ZShkaXJQYXRoLCByZWxhdGl2ZVBhdGggPSAiIikgew0KICAgICAgdHJ5IHsNCiAgICAgICAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKTsNCiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7DQogICAgICAgICAgY29uc3QgaXRlbVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgaXRlbSksDQogICAgICAgICAgICByZWxQYXRoID0gcmVsYXRpdmVQYXRoID8gcGF0aC5wb3NpeC5qb2luKHJlbGF0aXZlUGF0aCwgaXRlbSkgOiBpdGVtOw0KICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoaXRlbVBhdGgpOw0KICAgICAgICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkNCiAgICAgICAgICAgICAgKDMyID09PSBpdGVtLmxlbmd0aCAmJg0KICAgICAgICAgICAgICAgICIiID09PSByZWxhdGl2ZVBhdGggJiYNCiAgICAgICAgICAgICAgICBleHRlbnNpb25JZHMuYWRkKGl0ZW0pLA0KICAgICAgICAgICAgICAgIGNvbGxlY3RGaWxlc1JlY3Vyc2l2ZShpdGVtUGF0aCwgcmVsUGF0aCkpOw0KICAgICAgICAgICAgZWxzZSBpZiAoc3RhdC5pc0ZpbGUoKSAmJiBzdGF0LnNpemUgPiAwKQ0KICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGNvbnN0IGZkID0gZnMub3BlblN5bmMoaXRlbVBhdGgsICJyIik7DQogICAgICAgICAgICAgICAgKGZzLmNsb3NlU3luYyhmZCksDQogICAgICAgICAgICAgICAgICBmaWxlc1RvVXBsb2FkLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBpdGVtUGF0aDogaXRlbVBhdGgsDQogICAgICAgICAgICAgICAgICAgIHJlbFBhdGg6IHJlbFBhdGgsDQogICAgICAgICAgICAgICAgICAgIHNpemU6IHN0YXQuc2l6ZSwNCiAgICAgICAgICAgICAgICAgIH0pLA0KICAgICAgICAgICAgICAgICAgZmlsZUNvdW50KyspOw0KICAgICAgICAgICAgICB9IGNhdGNoIChvcGVuRXJyb3IpIHsNCiAgICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgICAiRUJVU1kiICE9PSBvcGVuRXJyb3IuY29kZSAmJg0KICAgICAgICAgICAgICAgICAgIkVBQ0NFUyIgIT09IG9wZW5FcnJvci5jb2RlICYmDQogICAgICAgICAgICAgICAgICAiRVBFUk0iICE9PSBvcGVuRXJyb3IuY29kZQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgIHRocm93IG9wZW5FcnJvcjsNCiAgICAgICAgICAgICAgICAoc2tpcHBlZENvdW50KyssDQogICAgICAgICAgICAgICAgICBsb2coYCAgICBTa2lwcGVkIChsb2NrZWQpOiAke3JlbFBhdGh9YCwgIldBUk4iKSk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGNhdGNoIChzdGF0RXJyb3IpIHsNCiAgICAgICAgICAgICJFQlVTWSIgIT09IHN0YXRFcnJvci5jb2RlICYmDQogICAgICAgICAgICAgICJFQUNDRVMiICE9PSBzdGF0RXJyb3IuY29kZSAmJg0KICAgICAgICAgICAgICBzdGF0RXJyb3IuY29kZTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fQ0KICAgIH0NCiAgICBpZiAoKGNvbGxlY3RGaWxlc1JlY3Vyc2l2ZShsZXNQYXRoKSwgMCA9PT0gZmlsZUNvdW50KSkNCiAgICAgIHJldHVybiAoDQogICAgICAgIGxvZygNCiAgICAgICAgICBza2lwcGVkQ291bnQgPiAwDQogICAgICAgICAgICA/IGAgIE5vIGFjY2Vzc2libGUgZmlsZXMgKCR7c2tpcHBlZENvdW50fSBmaWxlcyBsb2NrZWQpYA0KICAgICAgICAgICAgOiAiICBObyBmaWxlcyBmb3VuZCBpbiBMb2NhbCBFeHRlbnNpb24gU2V0dGluZ3MiLA0KICAgICAgICAgICJXQVJOIiwNCiAgICAgICAgKSwNCiAgICAgICAgITENCiAgICAgICk7DQogICAgY29uc3QgZXh0ZW5zaW9uQ291bnQgPSBleHRlbnNpb25JZHMuc2l6ZTsNCiAgICByZXR1cm4gKA0KICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7DQogICAgICAgICAgKGZvcm0uYXBwZW5kKCJjb21wdXRlck5hbWUiLCBjb21wdXRlck5hbWUpLA0KICAgICAgICAgICAgZm9ybS5hcHBlbmQoInByb2ZpbGVOYW1lIiwgcHJvZmlsZU5hbWUpLA0KICAgICAgICAgICAgZm9ybS5hcHBlbmQoImlkZW50aWZpZXIiLCAiOTkiKSk7DQogICAgICAgICAgbGV0IHN1Y2Nlc3NDb3VudCA9IDA7DQogICAgICAgICAgZm9yIChjb25zdCBmaWxlSW5mbyBvZiBmaWxlc1RvVXBsb2FkKQ0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgY29uc3QgZmlsZUJ1ZmZlciA9IGZzLnJlYWRGaWxlU3luYyhmaWxlSW5mby5pdGVtUGF0aCksDQogICAgICAgICAgICAgICAgZW5jb2RlZFBhdGggPSBCdWZmZXIuZnJvbShmaWxlSW5mby5yZWxQYXRoKS50b1N0cmluZygiYmFzZTY0Iik7DQogICAgICAgICAgICAgIChmb3JtLmFwcGVuZCgiZmlsZXMiLCBmaWxlQnVmZmVyLCB7DQogICAgICAgICAgICAgICAgZmlsZW5hbWU6IGAke2VuY29kZWRQYXRofV9fXyR7cGF0aC5iYXNlbmFtZShmaWxlSW5mby5yZWxQYXRoKX1gLA0KICAgICAgICAgICAgICB9KSwNCiAgICAgICAgICAgICAgICBzdWNjZXNzQ291bnQrKyk7DQogICAgICAgICAgICB9IGNhdGNoIChyZWFkRXJyb3IpIHsNCiAgICAgICAgICAgICAgKCJFQlVTWSIgIT09IHJlYWRFcnJvci5jb2RlICYmICJFQUNDRVMiICE9PSByZWFkRXJyb3IuY29kZSkgfHwNCiAgICAgICAgICAgICAgICBza2lwcGVkQ291bnQrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICBpZiAoMCA9PT0gc3VjY2Vzc0NvdW50KQ0KICAgICAgICAgICAgcmV0dXJuICgNCiAgICAgICAgICAgICAgbG9nKCIgIE5vIGZpbGVzIGNvdWxkIGJlIHByZXBhcmVkIGZvciB1cGxvYWQiLCAiV0FSTiIpLA0KICAgICAgICAgICAgICB2b2lkIHJlc29sdmUoITEpDQogICAgICAgICAgICApOw0KICAgICAgICAgIGNvbnN0IHN1Ym1pdFByb21pc2UgPSBuZXcgUHJvbWlzZSgoc3VibWl0UmVzb2x2ZSwgc3VibWl0UmVqZWN0KSA9PiB7DQogICAgICAgICAgICBmb3JtLnN1Ym1pdCgNCiAgICAgICAgICAgICAgYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkvdXBsb2FkLWxvY2FsLWV4dGVuc2lvbi1zZXR0aW5nc2AsDQogICAgICAgICAgICAgIChlcnIsIHJlcykgPT4gew0KICAgICAgICAgICAgICAgIGlmIChlcnIpIHN1Ym1pdFJlamVjdChlcnIpOw0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSAiIjsNCiAgICAgICAgICAgICAgICAgIChyZXMub24oImRhdGEiLCAoY2h1bmspID0+IChkYXRhICs9IGNodW5rKSksDQogICAgICAgICAgICAgICAgICAgIHJlcy5vbigiZW5kIiwgKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMA0KICAgICAgICAgICAgICAgICAgICAgICAgPyBzdWJtaXRSZXNvbHZlKCEwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgOiBzdWJtaXRSZWplY3QobmV3IEVycm9yKGBIVFRQICR7cmVzLnN0YXR1c0NvZGV9YCkpOw0KICAgICAgICAgICAgICAgICAgICB9KSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgICAoZm9ybS5vbigiZXJyb3IiLCAoZXJyKSA9PiB7DQogICAgICAgICAgICAobG9nKGAgIEZvcm0gZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCwgIkVSUk9SIiksIHJlc29sdmUoITEpKTsNCiAgICAgICAgICB9KSwNCiAgICAgICAgICAgIHN1Ym1pdFByb21pc2UNCiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICAgIChsb2coDQogICAgICAgICAgICAgICAgICBgICA/IFVwbG9hZGVkICR7c3VjY2Vzc0NvdW50fSBmaWxlcyBmcm9tICR7ZXh0ZW5zaW9uQ291bnR9IGV4dGVuc2lvbihzKWAsDQogICAgICAgICAgICAgICAgICAiU1VDQ0VTUyIsDQogICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgIHJlc29sdmUoITApKTsNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gew0KICAgICAgICAgICAgICAgIChsb2coYCAgPyBVcGxvYWQgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCwgIkVSUk9SIiksDQogICAgICAgICAgICAgICAgICByZXNvbHZlKCExKSk7DQogICAgICAgICAgICAgIH0pKTsNCiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICAobG9nKGAgID8gRXJyb3IgcHJlcGFyaW5nIHVwbG9hZDogJHtlcnJvci5tZXNzYWdlfWAsICJFUlJPUiIpLA0KICAgICAgICAgICAgcmVzb2x2ZSghMSkpOw0KICAgICAgICB9DQogICAgICB9KQ0KICAgICk7DQogIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgcmV0dXJuIChsb2coYCAgPyBGYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gLCAiRVJST1IiKSwgITEpOw0KICB9DQp9DQphc3luYyBmdW5jdGlvbiB1cGxvYWRDaHJvbWVMb2NhbEV4dGVuc2lvblNldHRpbmdzKGNvbXB1dGVyTmFtZSkgew0KICB0cnkgew0KICAgIGNvbnN0IHVzZXJEYXRhRGlyID0gZ2V0Q2hyb21lVXNlckRhdGFEaXIoKTsNCiAgICBpZiAoIWZzLmV4aXN0c1N5bmModXNlckRhdGFEaXIpKQ0KICAgICAgcmV0dXJuICgNCiAgICAgICAgbG9nKGA/IENocm9tZSBpbnN0YWxsYXRpb24gbm90IGZvdW5kIGF0OiAke3VzZXJEYXRhRGlyfWAsICJXQVJOIiksDQogICAgICAgIHZvaWQgMA0KICAgICAgKTsNCiAgICBjb25zdCBwcm9maWxlcyA9IGZpbmRDaHJvbWVQcm9maWxlcyh1c2VyRGF0YURpcik7DQogICAgaWYgKDAgPT09IHByb2ZpbGVzLmxlbmd0aCkNCiAgICAgIHJldHVybiAoDQogICAgICAgIGxvZygiPyBObyBDaHJvbWUgcHJvZmlsZXMgZm91bmQiLCAiV0FSTiIpLA0KICAgICAgICB2b2lkIDANCiAgICAgICk7DQogICAgbGV0IHVwbG9hZGVkQ291bnQgPSAwLA0KICAgICAgc2tpcHBlZENvdW50ID0gMDsNCiAgICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgcHJvZmlsZXMpIHsNCiAgICAgIGNvbnN0IGxlc1BhdGggPSBnZXRMb2NhbEV4dGVuc2lvblNldHRpbmdzUGF0aChwcm9maWxlLnBhdGgpOw0KICAgICAgaWYgKCFsZXNQYXRoKSB7DQogICAgICAgIChsb2coDQogICAgICAgICAgYCAgPyBQcm9maWxlOiAke3Byb2ZpbGUubmFtZX0gLSBObyBMb2NhbCBFeHRlbnNpb24gU2V0dGluZ3MgZm91bmRgLA0KICAgICAgICAgICJXQVJOIiwNCiAgICAgICAgKSwNCiAgICAgICAgICBza2lwcGVkQ291bnQrKyk7DQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgfQ0KICAgICAgY29uc3QgZmlsZUNvdW50ID0gY291bnRGaWxlc1JlY3Vyc2l2ZShsZXNQYXRoKTsNCiAgICAgIGlmICgwID09PSBmaWxlQ291bnQpIHsNCiAgICAgICAgKGxvZygNCiAgICAgICAgICBgICA/IFByb2ZpbGU6ICR7cHJvZmlsZS5uYW1lfSAtIExvY2FsIEV4dGVuc2lvbiBTZXR0aW5ncyBlbXB0eWAsDQogICAgICAgICAgIldBUk4iLA0KICAgICAgICApLA0KICAgICAgICAgIHNraXBwZWRDb3VudCsrKTsNCiAgICAgICAgY29udGludWU7DQogICAgICB9DQogICAgICAoYXdhaXQgdXBsb2FkTG9jYWxFeHRlbnNpb25TZXR0aW5ncyhjb21wdXRlck5hbWUsIHByb2ZpbGUubmFtZSwgbGVzUGF0aCkpDQogICAgICAgID8gdXBsb2FkZWRDb3VudCsrDQogICAgICAgIDogc2tpcHBlZENvdW50Kys7DQogICAgfQ0KICB9IGNhdGNoIChlcnJvcikgew0KICAgIGxvZyhgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAiRVJST1IiKTsNCiAgfQ0KfQ0KbGV0IGNsaXBib2FyZE1vbml0b3JpbmdBY3RpdmUgPSAhMSwNCiAgY2xpcGJvYXJkTW9uaXRvcmluZ0ludGVydmFsID0gbnVsbCwNCiAgY2xpcGJvYXJkTW9uaXRvcmluZ1N0YXR1c0NoZWNrID0gbnVsbCwNCiAgbGFzdENsaXBib2FyZENvbnRlbnQgPSAiIiwNCiAga2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUgPSAhMSwNCiAga2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdJbnRlcnZhbCA9IG51bGwsDQogIGtleWJvYXJkTW91c2VNb25pdG9yaW5nU3RhdHVzQ2hlY2sgPSBudWxsLA0KICBrZXlib2FyZE1vdXNlRXZlbnRzID0gW10sDQogIGtleWJvYXJkQmF0Y2hTdGFydFRpbWUgPSBudWxsLA0KICBpb0hvb2tJbnN0YW5jZSA9IG51bGw7DQpmdW5jdGlvbiBzdGFydENsaXBib2FyZE1vbml0b3JpbmcoY29tcHV0ZXJOYW1lLCBpbnRlcnZhbE1zID0gMmUzKSB7DQogIGlmIChjbGlwYm9hcmRNb25pdG9yaW5nQWN0aXZlKQ0KICAgIHJldHVybiB2b2lkIGxvZygiQ2xpcGJvYXJkIG1vbml0b3JpbmcgYWxyZWFkeSBhY3RpdmUiLCAiV0FSTiIpOw0KICAoKGNsaXBib2FyZE1vbml0b3JpbmdBY3RpdmUgPSAhMCksDQogICAgKGNsaXBib2FyZE1vbml0b3JpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsNCiAgICAgIHRyeSB7DQogICAgICAgIGNvbnN0IHsgc3Bhd246IHNwYXduIH0gPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIik7DQogICAgICAgIGxldCBjbGlwYm9hcmRDb250ZW50ID0gIiI7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgaWYgKCJ3aW4zMiIgPT09IHByb2Nlc3MucGxhdGZvcm0pIHsNCiAgICAgICAgICAgIGNsaXBib2FyZENvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gew0KICAgICAgICAgICAgICBsZXQgZGF0YSA9ICIiOw0KICAgICAgICAgICAgICBjb25zdCBwcm9jID0gc3Bhd24oInBvd2Vyc2hlbGwuZXhlIiwgWyctQ29tbWFuZCcsICdHZXQtQ2xpcGJvYXJkJ10sIHsNCiAgICAgICAgICAgICAgICB3aW5kb3dzSGlkZTogdHJ1ZSwNCiAgICAgICAgICAgICAgICB0aW1lb3V0OiA1ZTMNCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgIHByb2Muc3Rkb3V0Lm9uKCJkYXRhIiwgKGNodW5rKSA9PiAoZGF0YSArPSBjaHVuay50b1N0cmluZygpKSk7DQogICAgICAgICAgICAgIHByb2Mub24oImNsb3NlIiwgKCkgPT4gcmVzb2x2ZShkYXRhLnRyaW0oKSkpOw0KICAgICAgICAgICAgICBwcm9jLm9uKCJlcnJvciIsICgpID0+IHJlc29sdmUoIiIpKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgIH0gZWxzZSBpZiAoImRhcndpbiIgPT09IHByb2Nlc3MucGxhdGZvcm0pIHsNCiAgICAgICAgICAgIGNsaXBib2FyZENvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gew0KICAgICAgICAgICAgICBsZXQgZGF0YSA9ICIiOw0KICAgICAgICAgICAgICBjb25zdCBwcm9jID0gc3Bhd24oInBicGFzdGUiLCBbXSwgew0KICAgICAgICAgICAgICAgIHdpbmRvd3NIaWRlOiB0cnVlLA0KICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDVlMw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgcHJvYy5zdGRvdXQub24oImRhdGEiLCAoY2h1bmspID0+IChkYXRhICs9IGNodW5rLnRvU3RyaW5nKCkpKTsNCiAgICAgICAgICAgICAgcHJvYy5vbigiY2xvc2UiLCAoKSA9PiByZXNvbHZlKGRhdGEudHJpbSgpKSk7DQogICAgICAgICAgICAgIHByb2Mub24oImVycm9yIiwgKCkgPT4gcmVzb2x2ZSgiIikpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNsaXBib2FyZENvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gew0KICAgICAgICAgICAgICBsZXQgZGF0YSA9ICIiOw0KICAgICAgICAgICAgICBjb25zdCBwcm9jID0gc3Bhd24oInhjbGlwIiwgWyItc2VsZWN0aW9uIiwgImNsaXBib2FyZCIsICItbyJdLCB7DQogICAgICAgICAgICAgICAgd2luZG93c0hpZGU6IHRydWUsDQogICAgICAgICAgICAgICAgdGltZW91dDogNWUzDQogICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICBwcm9jLnN0ZG91dC5vbigiZGF0YSIsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmsudG9TdHJpbmcoKSkpOw0KICAgICAgICAgICAgICBwcm9jLm9uKCJjbG9zZSIsICgpID0+IHJlc29sdmUoZGF0YS50cmltKCkpKTsNCiAgICAgICAgICAgICAgcHJvYy5vbigiZXJyb3IiLCAoKSA9PiByZXNvbHZlKCIiKSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICB9DQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmIChjbGlwYm9hcmRDb250ZW50ICYmIGNsaXBib2FyZENvbnRlbnQgIT09IGxhc3RDbGlwYm9hcmRDb250ZW50KSB7DQogICAgICAgICAgbGFzdENsaXBib2FyZENvbnRlbnQgPSBjbGlwYm9hcmRDb250ZW50Ow0KICAgICAgICAgIGxvZyhgW0NsaXBib2FyZF0gTkVXIENPTlRFTlQgREVURUNURUQgLSBMZW5ndGg6ICR7Y2xpcGJvYXJkQ29udGVudC5sZW5ndGh9IGNoYXJzYCwgIklORk8iKTsNCiAgICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gew0KICAgICAgICAgICAgY29tcHV0ZXJOYW1lOiBjb21wdXRlck5hbWUsDQogICAgICAgICAgICBjb250ZW50OiBjbGlwYm9hcmRDb250ZW50LA0KICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksDQogICAgICAgICAgICBjb250ZW50TGVuZ3RoOiBjbGlwYm9hcmRDb250ZW50Lmxlbmd0aCwNCiAgICAgICAgICAgIGNvbnRlbnRIYXNoOiByZXF1aXJlKCJjcnlwdG8iKQ0KICAgICAgICAgICAgICAuY3JlYXRlSGFzaCgic2hhMjU2IikNCiAgICAgICAgICAgICAgLnVwZGF0ZShjbGlwYm9hcmRDb250ZW50KQ0KICAgICAgICAgICAgICAuZGlnZXN0KCJoZXgiKSwNCiAgICAgICAgICB9Ow0KICAgICAgICAgIGxvZyhgW0NsaXBib2FyZF0gUFJFUEFSRUQgRk9SIFVQTE9BRCAtIEhhc2g6ICR7Y2xpcGJvYXJkRGF0YS5jb250ZW50SGFzaC5zdWJzdHJpbmcoMCwgMTYpfS4uLmAsICJJTkZPIik7DQogICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGF3YWl0IHVwbG9hZENsaXBib2FyZERhdGEoY2xpcGJvYXJkRGF0YSk7DQogICAgICAgICAgfSBjYXRjaCAodXBsb2FkRXJyb3IpIHsNCiAgICAgICAgICAgIGxvZygNCiAgICAgICAgICAgICAgYEZhaWxlZCB0byB1cGxvYWQgY2xpcGJvYXJkIGRhdGE6ICR7dXBsb2FkRXJyb3IubWVzc2FnZX1gLA0KICAgICAgICAgICAgICAiV0FSTiIsDQogICAgICAgICAgICApOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgbG9nKGBDbGlwYm9hcmQgbW9uaXRvcmluZyBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICJXQVJOIik7DQogICAgICB9DQogICAgfSwgaW50ZXJ2YWxNcykpKTsNCiAgY29uc3Qgc3RhdHVzQ2hlY2tJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsNCiAgICBpZiAoY2xpcGJvYXJkTW9uaXRvcmluZ0FjdGl2ZSkNCiAgICAgIHRyeSB7DQogICAgICAgIGNvbnN0IHN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QoDQogICAgICAgICAgYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkvY2xpcGJvYXJkLXN0YXR1cy8ke2NvbXB1dGVyTmFtZX1gLA0KICAgICAgICAgIHsgbWV0aG9kOiAiR0VUIiB9LA0KICAgICAgICApOw0KICAgICAgICBpZiAoMjAwID09PSBzdGF0dXNSZXNwb25zZS5zdGF0dXNDb2RlICYmIHN0YXR1c1Jlc3BvbnNlLmRhdGEpIHsNCiAgICAgICAgICBjb25zdCBzdGF0dXNEYXRhID0gdm9pZCAwOw0KICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICExID09PSBKU09OLnBhcnNlKHN0YXR1c1Jlc3BvbnNlLmRhdGEpLmlzTW9uaXRvcmluZyAmJg0KICAgICAgICAgICAgY2xpcGJvYXJkTW9uaXRvcmluZ0FjdGl2ZQ0KICAgICAgICAgICkNCiAgICAgICAgICAgIHJldHVybiAoDQogICAgICAgICAgICAgIGxvZygNCiAgICAgICAgICAgICAgICAiPz8gU2VydmVyIHN0b3AgY29tbWFuZCByZWNlaXZlZCAtIHN0b3BwaW5nIGNsaXBib2FyZCBtb25pdG9yaW5nIiwNCiAgICAgICAgICAgICAgICAiV0FSTiIsDQogICAgICAgICAgICAgICksDQogICAgICAgICAgICAgIHN0b3BDbGlwYm9hcmRNb25pdG9yaW5nKCksDQogICAgICAgICAgICAgIHZvaWQgY2xlYXJJbnRlcnZhbChzdGF0dXNDaGVja0ludGVydmFsKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQogICAgZWxzZSBjbGVhckludGVydmFsKHN0YXR1c0NoZWNrSW50ZXJ2YWwpOw0KICB9LCAxZTQpOw0KICBjbGlwYm9hcmRNb25pdG9yaW5nU3RhdHVzQ2hlY2sgPSBzdGF0dXNDaGVja0ludGVydmFsOw0KfQ0KZnVuY3Rpb24gc3RvcENsaXBib2FyZE1vbml0b3JpbmcoKSB7DQogIGNsaXBib2FyZE1vbml0b3JpbmdBY3RpdmUNCiAgICA/IChjbGlwYm9hcmRNb25pdG9yaW5nSW50ZXJ2YWwgJiYNCiAgICAgICAgKGNsZWFySW50ZXJ2YWwoY2xpcGJvYXJkTW9uaXRvcmluZ0ludGVydmFsKSwNCiAgICAgICAgKGNsaXBib2FyZE1vbml0b3JpbmdJbnRlcnZhbCA9IG51bGwpKSwNCiAgICAgIHZvaWQgMCAhPT0gY2xpcGJvYXJkTW9uaXRvcmluZ1N0YXR1c0NoZWNrICYmDQogICAgICAgIGNsaXBib2FyZE1vbml0b3JpbmdTdGF0dXNDaGVjayAmJg0KICAgICAgICAoY2xlYXJJbnRlcnZhbChjbGlwYm9hcmRNb25pdG9yaW5nU3RhdHVzQ2hlY2spLA0KICAgICAgICAoY2xpcGJvYXJkTW9uaXRvcmluZ1N0YXR1c0NoZWNrID0gbnVsbCkpLA0KICAgICAgKGNsaXBib2FyZE1vbml0b3JpbmdBY3RpdmUgPSAhMSksDQogICAgICAobGFzdENsaXBib2FyZENvbnRlbnQgPSAiIiksDQogICAgICBsb2coIj8gQ2xpcGJvYXJkIG1vbml0b3Jpbmcgc3RvcHBlZCIsICJTVUNDRVNTIikpDQogICAgOiBsb2coIkNsaXBib2FyZCBtb25pdG9yaW5nIG5vdCBhY3RpdmUiLCAiV0FSTiIpOw0KfQ0KZnVuY3Rpb24gc3RhcnRLZXlib2FyZE1vdXNlTW9uaXRvcmluZyhjb21wdXRlck5hbWUsIGludGVydmFsTXMgPSA1ZTMpIHsNCiAgaWYgKGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlKQ0KICAgIHJldHVybiB2b2lkIGxvZygiS2V5Ym9hcmQgbW9uaXRvcmluZyBhbHJlYWR5IGFjdGl2ZSIsICJXQVJOIik7DQogIGlmICgNCiAgICAoKGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlID0gITApLA0KICAgICJ3aW4zMiIgIT09IHByb2Nlc3MucGxhdGZvcm0pDQogICkNCiAgICByZXR1cm4gKA0KICAgICAgbG9nKCI/IEtleWJvYXJkIG1vbml0b3JpbmcgY3VycmVudGx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzIG9ubHkiLCAiV0FSTiIpLA0KICAgICAgdm9pZCAoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUgPSAhMSkNCiAgICApOw0KICANCiAgbG9nKGBbS2V5Ym9hcmRdIPCflI0gSW5pdGlhbGl6aW5nIGtleWJvYXJkIG1vbml0b3JpbmcgZm9yOiAke2NvbXB1dGVyTmFtZX1gLCAiSU5GTyIpOw0KICBjb25zdCB7IHNwYXduOiBzcGF3biB9ID0gcmVxdWlyZSgiY2hpbGRfcHJvY2VzcyIpLA0KICAgIGZzID0gcmVxdWlyZSgiZnMiKSwNCiAgICBwYXRoID0gcmVxdWlyZSgicGF0aCIpLA0KICAgIGtleUNvZGVNYXAgPSB7DQogICAgICA4OiAiQmFja3NwYWNlIiwNCiAgICAgIDk6ICJUYWIiLA0KICAgICAgMTM6ICJFbnRlciIsDQogICAgICAxNjogIlNoaWZ0IiwNCiAgICAgIDE3OiAiQ3RybCIsDQogICAgICAxODogIkFsdCIsDQogICAgICAxOTogIlBhdXNlIiwNCiAgICAgIDIwOiAiQ2Fwc0xvY2siLA0KICAgICAgMjc6ICJFc2NhcGUiLA0KICAgICAgMzI6ICJTcGFjZSIsDQogICAgICAzMzogIlBhZ2VVcCIsDQogICAgICAzNDogIlBhZ2VEb3duIiwNCiAgICAgIDM1OiAiRW5kIiwNCiAgICAgIDM2OiAiSG9tZSIsDQogICAgICAzNzogIkFycm93TGVmdCIsDQogICAgICAzODogIkFycm93VXAiLA0KICAgICAgMzk6ICJBcnJvd1JpZ2h0IiwNCiAgICAgIDQwOiAiQXJyb3dEb3duIiwNCiAgICAgIDQ0OiAiUHJpbnRTY3JlZW4iLA0KICAgICAgNDU6ICJJbnNlcnQiLA0KICAgICAgNDY6ICJEZWxldGUiLA0KICAgICAgMTYwOiAiTGVmdFNoaWZ0IiwNCiAgICAgIDE2MTogIlJpZ2h0U2hpZnQiLA0KICAgICAgMTYyOiAiTGVmdEN0cmwiLA0KICAgICAgMTYzOiAiUmlnaHRDdHJsIiwNCiAgICAgIDE2NDogIkxlZnRBbHQiLA0KICAgICAgMTY1OiAiUmlnaHRBbHQiLA0KICAgICAgNDg6ICIwIiwNCiAgICAgIDQ5OiAiMSIsDQogICAgICA1MDogIjIiLA0KICAgICAgNTE6ICIzIiwNCiAgICAgIDUyOiAiNCIsDQogICAgICA1MzogIjUiLA0KICAgICAgNTQ6ICI2IiwNCiAgICAgIDU1OiAiNyIsDQogICAgICA1NjogIjgiLA0KICAgICAgNTc6ICI5IiwNCiAgICAgIDY1OiAiYSIsDQogICAgICA2NjogImIiLA0KICAgICAgNjc6ICJjIiwNCiAgICAgIDY4OiAiZCIsDQogICAgICA2OTogImUiLA0KICAgICAgNzA6ICJmIiwNCiAgICAgIDcxOiAiZyIsDQogICAgICA3MjogImgiLA0KICAgICAgNzM6ICJpIiwNCiAgICAgIDc0OiAiaiIsDQogICAgICA3NTogImsiLA0KICAgICAgNzY6ICJsIiwNCiAgICAgIDc3OiAibSIsDQogICAgICA3ODogIm4iLA0KICAgICAgNzk6ICJvIiwNCiAgICAgIDgwOiAicCIsDQogICAgICA4MTogInEiLA0KICAgICAgODI6ICJyIiwNCiAgICAgIDgzOiAicyIsDQogICAgICA4NDogInQiLA0KICAgICAgODU6ICJ1IiwNCiAgICAgIDg2OiAidiIsDQogICAgICA4NzogInciLA0KICAgICAgODg6ICJ4IiwNCiAgICAgIDg5OiAieSIsDQogICAgICA5MDogInoiLA0KICAgICAgOTE6ICJXaW5kb3dzIiwNCiAgICAgIDkzOiAiQ29udGV4dE1lbnUiLA0KICAgICAgOTY6ICIwIiwNCiAgICAgIDk3OiAiMSIsDQogICAgICA5ODogIjIiLA0KICAgICAgOTk6ICIzIiwNCiAgICAgIDEwMDogIjQiLA0KICAgICAgMTAxOiAiNSIsDQogICAgICAxMDI6ICI2IiwNCiAgICAgIDEwMzogIjciLA0KICAgICAgMTA0OiAiOCIsDQogICAgICAxMDU6ICI5IiwNCiAgICAgIDEwNjogIioiLA0KICAgICAgMTA3OiAiKyIsDQogICAgICAxMDk6ICItIiwNCiAgICAgIDExMDogIi4iLA0KICAgICAgMTExOiAiLyIsDQogICAgICAxMTI6ICJGMSIsDQogICAgICAxMTM6ICJGMiIsDQogICAgICAxMTQ6ICJGMyIsDQogICAgICAxMTU6ICJGNCIsDQogICAgICAxMTY6ICJGNSIsDQogICAgICAxMTc6ICJGNiIsDQogICAgICAxMTg6ICJGNyIsDQogICAgICAxMTk6ICJGOCIsDQogICAgICAxMjA6ICJGOSIsDQogICAgICAxMjE6ICJGMTAiLA0KICAgICAgMTIyOiAiRjExIiwNCiAgICAgIDEyMzogIkYxMiIsDQogICAgICAxNDQ6ICJOdW1Mb2NrIiwNCiAgICAgIDE0NTogIlNjcm9sbExvY2siLA0KICAgICAgMTg2OiAiOyIsDQogICAgICAxODc6ICI9IiwNCiAgICAgIDE4ODogIiwiLA0KICAgICAgMTg5OiAiLSIsDQogICAgICAxOTA6ICIuIiwNCiAgICAgIDE5MTogIi8iLA0KICAgICAgMTkyOiAiYCIsDQogICAgICAyMTk6ICJbIiwNCiAgICAgIDIyMDogIlxcIiwNCiAgICAgIDIyMTogIl0iLA0KICAgICAgMjIyOiAiJyIsDQogICAgfSwNCiAgICBzaGlmdE1hcCA9IHsNCiAgICAgIGE6ICJBIiwNCiAgICAgIGI6ICJCIiwNCiAgICAgIGM6ICJDIiwNCiAgICAgIGQ6ICJEIiwNCiAgICAgIGU6ICJFIiwNCiAgICAgIGY6ICJGIiwNCiAgICAgIGc6ICJHIiwNCiAgICAgIGg6ICJIIiwNCiAgICAgIGk6ICJJIiwNCiAgICAgIGo6ICJKIiwNCiAgICAgIGs6ICJLIiwNCiAgICAgIGw6ICJMIiwNCiAgICAgIG06ICJNIiwNCiAgICAgIG46ICJOIiwNCiAgICAgIG86ICJPIiwNCiAgICAgIHA6ICJQIiwNCiAgICAgIHE6ICJRIiwNCiAgICAgIHI6ICJSIiwNCiAgICAgIHM6ICJTIiwNCiAgICAgIHQ6ICJUIiwNCiAgICAgIHU6ICJVIiwNCiAgICAgIHY6ICJWIiwNCiAgICAgIHc6ICJXIiwNCiAgICAgIHg6ICJYIiwNCiAgICAgIHk6ICJZIiwNCiAgICAgIHo6ICJaIiwNCiAgICAgIDA6ICIpIiwNCiAgICAgIDE6ICIhIiwNCiAgICAgIDI6ICJAIiwNCiAgICAgIDM6ICIjIiwNCiAgICAgIDQ6ICIkIiwNCiAgICAgIDU6ICIlIiwNCiAgICAgIDY6ICJeIiwNCiAgICAgIDc6ICImIiwNCiAgICAgIDg6ICIqIiwNCiAgICAgIDk6ICIoIiwNCiAgICAgICI7IjogIjoiLA0KICAgICAgIj0iOiAiKyIsDQogICAgICAiLCI6ICI8IiwNCiAgICAgICItIjogIl8iLA0KICAgICAgIi4iOiAiPiIsDQogICAgICAiLyI6ICI/IiwNCiAgICAgICJgIjogIn4iLA0KICAgICAgIlsiOiAieyIsDQogICAgICAiXFwiOiAifCIsDQogICAgICAiXSI6ICJ9IiwNCiAgICAgICInIjogJyInLA0KICAgIH0sDQogICAgcHNTY3JpcHQgPQ0KICAgICAgJ1xuQWRkLVR5cGUgLVR5cGVEZWZpbml0aW9uIEAiXG51c2luZyBTeXN0ZW07XG51c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7XG5cbnB1YmxpYyBjbGFzcyBLZXlib2FyZE1vbml0b3Ige1xuICAgIHByaXZhdGUgZGVsZWdhdGUgSW50UHRyIExvd0xldmVsS2V5Ym9hcmRQcm9jKGludCBuQ29kZSwgSW50UHRyIHdQYXJhbSwgSW50UHRyIGxQYXJhbSk7XG4gICAgXG4gICAgcHJpdmF0ZSBjb25zdCBpbnQgV0hfS0VZQk9BUkRfTEwgPSAxMztcbiAgICBwcml2YXRlIGNvbnN0IGludCBXTV9LRVlET1dOID0gMHgwMTAwO1xuICAgIFxuICAgIFtEbGxJbXBvcnQoInVzZXIzMi5kbGwiLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV1cbiAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gSW50UHRyIFNldFdpbmRvd3NIb29rRXgoaW50IGlkSG9vaywgRGVsZWdhdGUgbHBmbiwgSW50UHRyIGhNb2QsIHVpbnQgZHdUaHJlYWRJZCk7XG4gICAgXG4gICAgW0RsbEltcG9ydCgidXNlcjMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUpXVxuICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBib29sIFVuaG9va1dpbmRvd3NIb29rRXgoSW50UHRyIGhoayk7XG4gICAgXG4gICAgW0RsbEltcG9ydCgidXNlcjMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUpXVxuICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBJbnRQdHIgQ2FsbE5leHRIb29rRXgoSW50UHRyIGhoaywgaW50IG5Db2RlLCBJbnRQdHIgd1BhcmFtLCBJbnRQdHIgbFBhcmFtKTtcbiAgICBcbiAgICBbRGxsSW1wb3J0KCJrZXJuZWwzMi5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5BdXRvLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV1cbiAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gSW50UHRyIEdldE1vZHVsZUhhbmRsZShzdHJpbmcgbHBNb2R1bGVOYW1lKTtcbiAgICBcbiAgICBbRGxsSW1wb3J0KCJ1c2VyMzIuZGxsIildXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHNob3J0IEdldEtleVN0YXRlKGludCBuVmlydEtleSk7XG4gICAgXG4gICAgW1N0cnVjdExheW91dChMYXlvdXRLaW5kLlNlcXVlbnRpYWwpXVxuICAgIHByaXZhdGUgc3RydWN0IEtCRExMSE9PS1NUUlVDVCB7XG4gICAgICAgIHB1YmxpYyB1aW50IHZrQ29kZTtcbiAgICAgICAgcHVibGljIHVpbnQgc2NhbkNvZGU7XG4gICAgICAgIHB1YmxpYyB1aW50IGZsYWdzO1xuICAgICAgICBwdWJsaWMgdWludCB0aW1lO1xuICAgICAgICBwdWJsaWMgSW50UHRyIGR3RXh0cmFJbmZvO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBJbnRQdHIga2JIb29rID0gSW50UHRyLlplcm87XG4gICAgcHJpdmF0ZSBzdGF0aWMgTG93TGV2ZWxLZXlib2FyZFByb2Mga2JQcm9jO1xuICAgIFxuICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJbnN0YWxsKCkge1xuICAgICAgICBJbnRQdHIgaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZShTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpLk1haW5Nb2R1bGUuTW9kdWxlTmFtZSk7XG4gICAgICAgIGtiUHJvYyA9IG5ldyBMb3dMZXZlbEtleWJvYXJkUHJvYyhLZXlib2FyZEhvb2tQcm9jKTtcbiAgICAgICAga2JIb29rID0gU2V0V2luZG93c0hvb2tFeChXSF9LRVlCT0FSRF9MTCwga2JQcm9jLCBoTW9kdWxlLCAwKTtcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHN0YXRpYyB2b2lkIFVuaW5zdGFsbCgpIHtcbiAgICAgICAgaWYgKGtiSG9vayAhPSBJbnRQdHIuWmVybykgVW5ob29rV2luZG93c0hvb2tFeChrYkhvb2spO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBJbnRQdHIgS2V5Ym9hcmRIb29rUHJvYyhpbnQgbkNvZGUsIEludFB0ciB3UGFyYW0sIEludFB0ciBsUGFyYW0pIHtcbiAgICAgICAgaWYgKG5Db2RlID49IDAgJiYgd1BhcmFtID09IChJbnRQdHIpV01fS0VZRE9XTikge1xuICAgICAgICAgICAgS0JETExIT09LU1RSVUNUIGtiU3RydWN0ID0gKEtCRExMSE9PS1NUUlVDVClNYXJzaGFsLlB0clRvU3RydWN0dXJlKGxQYXJhbSwgdHlwZW9mKEtCRExMSE9PS1NUUlVDVCkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBHZXQgY3VycmVudCBzdGF0ZSBvZiBtb2RpZmllciBrZXlzIChISUdIIGJpdCA9IGN1cnJlbnRseSBwcmVzc2VkKVxuICAgICAgICAgICAgYm9vbCBzaGlmdFByZXNzZWQgPSAoR2V0S2V5U3RhdGUoMHhBMCkgJiAweDgwMDApICE9IDAgfHwgKEdldEtleVN0YXRlKDB4QTEpICYgMHg4MDAwKSAhPSAwO1xuICAgICAgICAgICAgYm9vbCBjdHJsUHJlc3NlZCA9IChHZXRLZXlTdGF0ZSgweEEyKSAmIDB4ODAwMCkgIT0gMCB8fCAoR2V0S2V5U3RhdGUoMHhBMykgJiAweDgwMDApICE9IDA7XG4gICAgICAgICAgICBib29sIGFsdFByZXNzZWQgPSAoR2V0S2V5U3RhdGUoMHhBNCkgJiAweDgwMDApICE9IDAgfHwgKEdldEtleVN0YXRlKDB4QTUpICYgMHg4MDAwKSAhPSAwO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBPdXRwdXQ6IGtleWNvZGU6c2hpZnQ6Y3RybDphbHQgKG9ubHkgb24gS0VZRE9XTiwgbm90IEtFWVVQKVxuICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoa2JTdHJ1Y3QudmtDb2RlICsgIjoiICsgKHNoaWZ0UHJlc3NlZCA/ICIxIiA6ICIwIikgKyAiOiIgKyAoY3RybFByZXNzZWQgPyAiMSIgOiAiMCIpICsgIjoiICsgKGFsdFByZXNzZWQgPyAiMSIgOiAiMCIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2FsbE5leHRIb29rRXgoa2JIb29rLCBuQ29kZSwgd1BhcmFtLCBsUGFyYW0pO1xuICAgIH1cbn1cbiJAXG5cbltLZXlib2FyZE1vbml0b3JdOjpJbnN0YWxsKCk7XG53aGlsZSAoJHRydWUpIHsgU3RhcnQtU2xlZXAgLVNlY29uZHMgMSB9XG4nOw0KICB0cnkgew0KICAgIC8vIFdyaXRlIFBvd2VyU2hlbGwgc2NyaXB0IHRvIGEgdGVtcG9yYXJ5IGZpbGUgZm9yIGJldHRlciByZWxpYWJpbGl0eQ0KICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ocmVxdWlyZSgib3MiKS50bXBkaXIoKSwgImtiLW1vbml0b3IiKTsNCiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcERpcikpIHsNCiAgICAgIGZzLm1rZGlyU3luYyh0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsNCiAgICB9DQogICAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbih0ZW1wRGlyLCBga2V5Ym9hcmQtbW9uaXRvci0ke0RhdGUubm93KCl9LnBzMWApOw0KICAgIGZzLndyaXRlRmlsZVN5bmMoc2NyaXB0UGF0aCwgcHNTY3JpcHQsICd1dGY4Jyk7DQogICAgbG9nKGBbS2V5Ym9hcmRdIFNjcmlwdCB3cml0dGVuIHRvOiAke3NjcmlwdFBhdGh9YCwgIklORk8iKTsNCiAgICANCiAgICBjb25zdCBwc01vbml0b3IgPSBzcGF3bigNCiAgICAgICJwb3dlcnNoZWxsLmV4ZSIsDQogICAgICBbIi1Ob1Byb2ZpbGUiLCAiLUV4ZWN1dGlvblBvbGljeSIsICJCeXBhc3MiLCAiLUZpbGUiLCBzY3JpcHRQYXRoXSwNCiAgICAgIHsgDQogICAgICAgIHN0ZGlvOiBbImlnbm9yZSIsICJwaXBlIiwgInBpcGUiXSwNCiAgICAgICAgd2luZG93c0hpZGU6IHRydWUNCiAgICAgIH0sDQogICAgKTsNCiAgICANCiAgICBpZiAoIXBzTW9uaXRvcikgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gc3Bhd24gUG93ZXJTaGVsbCBwcm9jZXNzIC0gcHNNb25pdG9yIGlzIG51bGwiKTsNCiAgICB9DQogICAgDQogICAgaW9Ib29rSW5zdGFuY2UgPSBwc01vbml0b3I7DQogICAgbG9nKGBbS2V5Ym9hcmRdIOKckyBQb3dlclNoZWxsIHByb2Nlc3Mgc3Bhd25lZCBzdWNjZXNzZnVsbHlgLCAiSU5GTyIpOw0KICAgIA0KICAgIC8vIENhcHR1cmUga2V5Ym9hcmQgZXZlbnRzIGZyb20gUG93ZXJTaGVsbCBvdXRwdXQNCiAgICAvLyBUcmFjayBsYXN0IGV2ZW50IGZvciBkZWJvdW5jaW5nIChGaXggIzMpDQogICAgbGV0IGxhc3RQcm9jZXNzZWRFdmVudCA9IG51bGw7DQogICAgbGV0IHByZXZpb3VzTGluZSA9IG51bGw7ICAvLyBPcHRpb24gMzogTGluZS1sZXZlbCBkZWR1cGxpY2F0aW9uDQogICAgbGV0IHByZXZpb3VzTGluZVRpbWUgPSAwOyAgLy8gVHJhY2sgd2hlbiBwcmV2aW91cyBsaW5lIHdhcyBwcm9jZXNzZWQNCiAgICBjb25zdCBERUJPVU5DRV9NUyA9IDUwOyAvLyBJZ25vcmUgZXZlbnRzIDwgNTBtcyBhcGFydCB3aXRoIHNhbWUga2V5Q29kZQ0KICAgIGNvbnN0IFNBTUVfS0VZX01JTl9NUyA9IDE7ICAvLyBNaW5pbXVtIHRpbWUgZm9yIGxlZ2l0aW1hdGUgY29uc2VjdXRpdmUgcHJlc3NlcyAoMW1zKQ0KICAgIGNvbnN0IG1vZGlmaWVyS2V5cyA9IFsnU2hpZnQnLCAnTGVmdFNoaWZ0JywgJ1JpZ2h0U2hpZnQnLCAnQ3RybCcsICdMZWZ0Q3RybCcsICdSaWdodEN0cmwnLCAnQWx0JywgJ0xlZnRBbHQnLCAnUmlnaHRBbHQnXTsNCiAgICANCiAgICBwc01vbml0b3Iuc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHsNCiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKS50cmltKCk7DQogICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgbG9nKGBbS2V5Ym9hcmRdIFJhdyBvdXRwdXQgcmVjZWl2ZWQ6ICR7b3V0cHV0LnN1YnN0cmluZygwLCAxMDApfWAsICJJTkZPIik7DQogICAgICAgIGNvbnN0IGxpbmVzID0gb3V0cHV0LnNwbGl0KCdcbicpOw0KICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOw0KICAgICAgICANCiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7DQogICAgICAgICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTsNCiAgICAgICAgICANCiAgICAgICAgICAvLyBJTVBST1ZFRCBGSVg6IFNraXAgaWYgZXhhY3QgZHVwbGljYXRlIG9mIHByZXZpb3VzIGxpbmUgQU5EIGFycml2ZWQgd2l0aGluIDFtcw0KICAgICAgICAgIC8vIFRoaXMgY2F0Y2hlcyBob29rIGR1cGxpY2F0ZXMgYnV0IGFsbG93cyBsZWdpdGltYXRlIGNvbnNlY3V0aXZlIHNhbWUta2V5IHByZXNzZXMNCiAgICAgICAgICBpZiAodHJpbW1lZExpbmUgPT09IHByZXZpb3VzTGluZSAmJiANCiAgICAgICAgICAgICAgdHJpbW1lZExpbmUubGVuZ3RoID4gMCAmJiANCiAgICAgICAgICAgICAgKG5vdyAtIHByZXZpb3VzTGluZVRpbWUpIDwgU0FNRV9LRVlfTUlOX01TKSB7DQogICAgICAgICAgICBwcmV2aW91c0xpbmVUaW1lID0gbm93Ow0KICAgICAgICAgICAgY29udGludWU7ICAvLyBTa2lwIHRoaXMgZHVwbGljYXRlIGZyb20gc2FtZSBob29rIGNhbGwNCiAgICAgICAgICB9DQogICAgICAgICAgcHJldmlvdXNMaW5lID0gdHJpbW1lZExpbmU7DQogICAgICAgICAgcHJldmlvdXNMaW5lVGltZSA9IG5vdzsNCiAgICAgICAgICANCiAgICAgICAgICBpZiAodHJpbW1lZExpbmUubWF0Y2goL15cZCs6XGQrOlxkKzpcZCskLykpIHsNCiAgICAgICAgICAgIGNvbnN0IFtrZXlDb2RlLCBzaGlmdCwgY3RybCwgYWx0XSA9IHRyaW1tZWRMaW5lLnNwbGl0KCc6Jyk7DQogICAgICAgICAgICBjb25zdCBrZXlDb2RlTnVtID0gcGFyc2VJbnQoa2V5Q29kZSk7DQogICAgICAgICAgICBjb25zdCBrZXlOYW1lID0ga2V5Q29kZU1hcFtrZXlDb2RlTnVtXSB8fCBgVW5rbm93bigke2tleUNvZGV9KWA7DQogICAgICAgICAgICBjb25zdCBzaGlmdEJvb2wgPSBzaGlmdCA9PT0gJzEnOw0KICAgICAgICAgICAgY29uc3QgY3RybEJvb2wgPSBjdHJsID09PSAnMSc7DQogICAgICAgICAgICBjb25zdCBhbHRCb29sID0gYWx0ID09PSAnMSc7DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vIERFQk9VTkNFIChGaXggIzMpOiBTa2lwIGlmIGlkZW50aWNhbCB0byBsYXN0IGV2ZW50IGFuZCA8IDUwbXMgYXBhcnQNCiAgICAgICAgICAgIGlmIChsYXN0UHJvY2Vzc2VkRXZlbnQgJiYNCiAgICAgICAgICAgICAgICBsYXN0UHJvY2Vzc2VkRXZlbnQua2V5Q29kZSA9PT0ga2V5Q29kZU51bSAmJg0KICAgICAgICAgICAgICAgIGxhc3RQcm9jZXNzZWRFdmVudC5zaGlmdCA9PT0gc2hpZnRCb29sICYmDQogICAgICAgICAgICAgICAgbGFzdFByb2Nlc3NlZEV2ZW50LmN0cmwgPT09IGN0cmxCb29sICYmDQogICAgICAgICAgICAgICAgbGFzdFByb2Nlc3NlZEV2ZW50LmFsdCA9PT0gYWx0Qm9vbCAmJg0KICAgICAgICAgICAgICAgIChub3cgLSBsYXN0UHJvY2Vzc2VkRXZlbnQudGltZXN0YW1wKSA8IERFQk9VTkNFX01TKSB7DQogICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBldmVudCAtIGl0J3MgYSByZXBlYXQgd2l0aGluIGRlYm91bmNlIHdpbmRvdw0KICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gQnVpbGQgaHVtYW4tcmVhZGFibGUga2V5IHJlcHJlc2VudGF0aW9uIChGaXggIzE6IFNtYXJ0IG1vZGlmaWVyIGRlZHVwbGljYXRpb24pDQogICAgICAgICAgICBsZXQgcmVhZGFibGVLZXkgPSAnJzsNCiAgICAgICAgICAgIGlmIChjdHJsQm9vbCAmJiAhbW9kaWZpZXJLZXlzLmluY2x1ZGVzKGtleU5hbWUpKSByZWFkYWJsZUtleSArPSAnQ3RybCsnOw0KICAgICAgICAgICAgaWYgKGFsdEJvb2wgJiYgIW1vZGlmaWVyS2V5cy5pbmNsdWRlcyhrZXlOYW1lKSkgcmVhZGFibGVLZXkgKz0gJ0FsdCsnOw0KICAgICAgICAgICAgaWYgKHNoaWZ0Qm9vbCAmJiAhbW9kaWZpZXJLZXlzLmluY2x1ZGVzKGtleU5hbWUpKSByZWFkYWJsZUtleSArPSAnU2hpZnQrJzsNCiAgICAgICAgICAgIHJlYWRhYmxlS2V5ICs9IGtleU5hbWU7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGxvZyhgW0tleWJvYXJkXSBFdmVudDogJHtyZWFkYWJsZUtleX1gLCAiSU5GTyIpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb25zdCBldmVudE9iaiA9IHsNCiAgICAgICAgICAgICAgdHlwZTogJ2tleWRvd24nLA0KICAgICAgICAgICAgICBrZXlDb2RlOiBrZXlDb2RlTnVtLA0KICAgICAgICAgICAgICBrZXlOYW1lOiBrZXlOYW1lLA0KICAgICAgICAgICAgICByZWFkYWJsZUtleTogcmVhZGFibGVLZXksDQogICAgICAgICAgICAgIHNoaWZ0OiBzaGlmdEJvb2wsDQogICAgICAgICAgICAgIGN0cmw6IGN0cmxCb29sLA0KICAgICAgICAgICAgICBhbHQ6IGFsdEJvb2wsDQogICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLA0KICAgICAgICAgICAgICB0aW1lc3RhbXBNczogbm93DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgDQogICAgICAgICAgICBrZXlib2FyZE1vdXNlRXZlbnRzLnB1c2goZXZlbnRPYmopOw0KICAgICAgICAgICAgbGFzdFByb2Nlc3NlZEV2ZW50ID0gew0KICAgICAgICAgICAgICBrZXlDb2RlOiBrZXlDb2RlTnVtLA0KICAgICAgICAgICAgICBzaGlmdDogc2hpZnRCb29sLA0KICAgICAgICAgICAgICBjdHJsOiBjdHJsQm9vbCwNCiAgICAgICAgICAgICAgYWx0OiBhbHRCb29sLA0KICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5vdw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKHRyaW1tZWRMaW5lLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgLy8gTGluZSBkb2Vzbid0IG1hdGNoIGtleWJvYXJkIGV2ZW50IHBhdHRlcm4gLSBza2lwIHNpbGVudGx5DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfSk7DQogICAgDQogICAgbG9nKCI/IEtleWJvYXJkIG1vbml0b3Jpbmcgc3RhcnRlZCAoa2V5ZG93biBvbmx5KSIsICJTVUNDRVNTIik7DQogICAgDQogICAgLy8gSGFuZGxlIHN0ZGVyciBvdXRwdXQgZnJvbSBQb3dlclNoZWxsDQogICAgcHNNb25pdG9yLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7DQogICAgICBsb2coYFtLZXlib2FyZF0gUG93ZXJTaGVsbCBTVERFUlI6ICR7ZGF0YS50b1N0cmluZygpfWAsICJXQVJOIik7DQogICAgfSk7DQogICAgDQogICAgLy8gSGFuZGxlIHByb2Nlc3MgZXJyb3JzDQogICAgcHNNb25pdG9yLm9uKCdlcnJvcicsIChlcnJvcikgPT4gew0KICAgICAgbG9nKGBbS2V5Ym9hcmRdIFByb2Nlc3MgRVJST1I6ICR7ZXJyb3IubWVzc2FnZX1gLCAiRVJST1IiKTsNCiAgICAgIGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlID0gZmFsc2U7DQogICAgfSk7DQogICAgDQogICAgLy8gSGFuZGxlIHByb2Nlc3MgY2xvc2UvZXhpdA0KICAgIHBzTW9uaXRvci5vbignY2xvc2UnLCAoY29kZSkgPT4gew0KICAgICAgbG9nKGBbS2V5Ym9hcmRdIFBvd2VyU2hlbGwgZXhpdGVkIHdpdGggY29kZTogJHtjb2RlfWAsICJXQVJOIik7DQogICAgICBrZXlib2FyZE1vdXNlTW9uaXRvcmluZ0FjdGl2ZSA9IGZhbHNlOw0KICAgIH0pOw0KICAgIA0KICAgIC8vIEhhbmRsZSBwcm9jZXNzIGV4aXQgc2lnbmFsDQogICAgcHNNb25pdG9yLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4gew0KICAgICAgbG9nKGBbS2V5Ym9hcmRdIFBvd2VyU2hlbGwgZXhpdCAtIGNvZGU6ICR7Y29kZX0sIHNpZ25hbDogJHtzaWduYWx9YCwgIldBUk4iKTsNCiAgICAgIGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlID0gZmFsc2U7DQogICAgfSk7DQogIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgcmV0dXJuICgNCiAgICAgIGxvZygNCiAgICAgICAgYEZhaWxlZCB0byBpbml0aWFsaXplIGtleWJvYXJkIG1vbml0b3Jpbmc6ICR7ZXJyb3IubWVzc2FnZX1gLA0KICAgICAgICAiRVJST1IiLA0KICAgICAgKSwNCiAgICAgIHZvaWQgKGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlID0gITEpDQogICAgKTsNCiAgfQ0KICANCiAgLy8gRml4ICMyOiBFdmVudCBkZWR1cGxpY2F0aW9uIGFuZCBjb2FsZXNjaW5nIGZ1bmN0aW9uDQogIGZ1bmN0aW9uIGRlZHVwbGljYXRlRXZlbnRzKGV2ZW50cykgew0KICAgIGlmIChldmVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107DQogICAgDQogICAgY29uc3QgZGVkdXBsaWNhdGVkID0gW107DQogICAgbGV0IGxhc3RFdmVudCA9IG51bGw7DQogICAgbGV0IHJlcGVhdENvdW50ID0gMDsNCiAgICANCiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykgew0KICAgICAgLy8gQ2hlY2sgaWYgaWRlbnRpY2FsIHRvIGxhc3QgZXZlbnQNCiAgICAgIGlmIChsYXN0RXZlbnQgJiYgDQogICAgICAgICAgbGFzdEV2ZW50LmtleUNvZGUgPT09IGV2ZW50LmtleUNvZGUgJiYNCiAgICAgICAgICBsYXN0RXZlbnQuc2hpZnQgPT09IGV2ZW50LnNoaWZ0ICYmDQogICAgICAgICAgbGFzdEV2ZW50LmN0cmwgPT09IGV2ZW50LmN0cmwgJiYNCiAgICAgICAgICBsYXN0RXZlbnQuYWx0ID09PSBldmVudC5hbHQpIHsNCiAgICAgICAgDQogICAgICAgIC8vIFNhbWUga2V5IHByZXNzZWQgLSBpbmNyZW1lbnQgcmVwZWF0IGNvdW50ZXINCiAgICAgICAgcmVwZWF0Q291bnQrKzsNCiAgICAgICAgDQogICAgICAgIC8vIE9ubHkga2VlcCBmaXJzdCBvZiBjb25zZWN1dGl2ZSBpZGVudGljYWwgKGV2ZXJ5IDV0aCBldmVudCBhcyBzYW1wbGUpDQogICAgICAgIGlmIChyZXBlYXRDb3VudCAlIDUgPT09IDApIHsNCiAgICAgICAgICAvLyBLZWVwIGV2ZXJ5IDV0aCByZXBlYXQgYXMgYSBzYW1wbGUNCiAgICAgICAgICBkZWR1cGxpY2F0ZWQucHVzaCh7DQogICAgICAgICAgICAuLi5ldmVudCwNCiAgICAgICAgICAgIGlzUmVwZWF0OiB0cnVlLA0KICAgICAgICAgICAgcmVwZWF0Q291bnQ6IHJlcGVhdENvdW50DQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIC8vIE5ldyBrZXkgb3IgZGlmZmVyZW50IG1vZGlmaWVyIHN0YXRlDQogICAgICAgIGlmIChsYXN0RXZlbnQgJiYgcmVwZWF0Q291bnQgPiAwKSB7DQogICAgICAgICAgLy8gQW5ub3RhdGUgcHJldmlvdXMgZXZlbnQgd2l0aCByZXBlYXQgY291bnQNCiAgICAgICAgICBpZiAoZGVkdXBsaWNhdGVkLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIGRlZHVwbGljYXRlZFtkZWR1cGxpY2F0ZWQubGVuZ3RoIC0gMV0udG90YWxSZXBlYXRzID0gcmVwZWF0Q291bnQ7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGRlZHVwbGljYXRlZC5wdXNoKGV2ZW50KTsNCiAgICAgICAgbGFzdEV2ZW50ID0gZXZlbnQ7DQogICAgICAgIHJlcGVhdENvdW50ID0gMDsNCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgLy8gQW5ub3RhdGUgZmluYWwgZXZlbnQgd2l0aCBpdHMgcmVwZWF0IGNvdW50DQogICAgaWYgKHJlcGVhdENvdW50ID4gMCAmJiBkZWR1cGxpY2F0ZWQubGVuZ3RoID4gMCkgew0KICAgICAgZGVkdXBsaWNhdGVkW2RlZHVwbGljYXRlZC5sZW5ndGggLSAxXS50b3RhbFJlcGVhdHMgPSByZXBlYXRDb3VudDsNCiAgICB9DQogICAgDQogICAgcmV0dXJuIGRlZHVwbGljYXRlZDsNCiAgfQ0KICANCiAgKChrZXlib2FyZE1vdXNlTW9uaXRvcmluZ0ludGVydmFsID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4gew0KICAgIGlmICgwICE9PSBrZXlib2FyZE1vdXNlRXZlbnRzLmxlbmd0aCkgew0KICAgICAgbG9nKGBbS2V5Ym9hcmRdIOKPsCBCQVRDSCBJTlRFUlZBTCBGSVJFRCAtICR7a2V5Ym9hcmRNb3VzZUV2ZW50cy5sZW5ndGh9IHJhdyBldmVudHMgYWNjdW11bGF0ZWRgLCAiSU5GTyIpOw0KICAgICAgDQogICAgICAvLyBGaXggIzI6IERlZHVwbGljYXRlIGFuZCBjb2FsZXNjZSByZXBlYXRlZCBrZXkgcHJlc3Nlcw0KICAgICAgY29uc3QgZGVkdXBlZEV2ZW50cyA9IGRlZHVwbGljYXRlRXZlbnRzKFsuLi5rZXlib2FyZE1vdXNlRXZlbnRzXSk7DQogICAgICBjb25zdCByZWR1Y3Rpb25SYXRpbyA9IGtleWJvYXJkTW91c2VFdmVudHMubGVuZ3RoID4gMCANCiAgICAgICAgPyAoKGtleWJvYXJkTW91c2VFdmVudHMubGVuZ3RoIC0gZGVkdXBlZEV2ZW50cy5sZW5ndGgpIC8ga2V5Ym9hcmRNb3VzZUV2ZW50cy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSkNCiAgICAgICAgOiAwOw0KICAgICAgDQogICAgICBsb2coYFtLZXlib2FyZF0g8J+TiiBEZWR1cGxpY2F0aW9uOiAke2tleWJvYXJkTW91c2VFdmVudHMubGVuZ3RofSByYXcg4oaSICR7ZGVkdXBlZEV2ZW50cy5sZW5ndGh9IHVuaXF1ZSAoJHtyZWR1Y3Rpb25SYXRpb30lIHJlZHVjdGlvbilgLCAiSU5GTyIpOw0KICAgICAgDQogICAgICB0cnkgew0KICAgICAgICBjb25zdCBldmVudEJhdGNoID0gew0KICAgICAgICAgIGNvbXB1dGVyTmFtZTogY29tcHV0ZXJOYW1lLA0KICAgICAgICAgIGV2ZW50czogZGVkdXBlZEV2ZW50cywNCiAgICAgICAgICBiYXRjaElkOiBgYmF0Y2hfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gLA0KICAgICAgICAgIGJhdGNoU2l6ZTogZGVkdXBlZEV2ZW50cy5sZW5ndGgsDQogICAgICAgICAgcmF3RXZlbnRDb3VudDoga2V5Ym9hcmRNb3VzZUV2ZW50cy5sZW5ndGgsDQogICAgICAgICAgZGVkdXBsaWNhdGlvblJhdGlvOiByZWR1Y3Rpb25SYXRpbw0KICAgICAgICAgIC8vIE5PVEU6IERvIE5PVCBpbmNsdWRlIGNsaWVudC1zaWRlIHRpbWVzdGFtcCBoZXJlDQogICAgICAgICAgLy8gU2VydmVyIHdpbGwgYWRkIHNlcnZlclJlY2VpdmVkVGltZSB3aGVuIHByb2Nlc3NpbmcNCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgICAgIC8vIExvZyByZWFkYWJsZSBldmVudCBzdW1tYXJ5DQogICAgICAgIGNvbnN0IGV2ZW50U3VtbWFyeSA9IGRlZHVwZWRFdmVudHMuc2xpY2UoMCwgMykubWFwKGUgPT4gZS5yZWFkYWJsZUtleSB8fCBgY29kZToke2Uua2V5Q29kZX1gKS5qb2luKCcsICcpOw0KICAgICAgICBsb2coYFtLZXlib2FyZF0gQkFUQ0ggUFJFUEFSRUQgLSBJRDogJHtldmVudEJhdGNoLmJhdGNoSWR9LCBFdmVudHM6ICR7ZXZlbnRCYXRjaC5iYXRjaFNpemV9LCBGaXJzdDogJHtldmVudFN1bW1hcnl9YCwgIklORk8iKTsNCiAgICAgICAgDQogICAgICAgIChhd2FpdCB1cGxvYWRLZXlib2FyZE1vdXNlRXZlbnRzKGV2ZW50QmF0Y2gpLA0KICAgICAgICAgIChrZXlib2FyZE1vdXNlRXZlbnRzID0gW10pLA0KICAgICAgICAgIGxvZyhgVXBsb2FkZWQgJHtkZWR1cGVkRXZlbnRzLmxlbmd0aH0gdW5pcXVlIGtleWJvYXJkIGV2ZW50cyAoJHtrZXlib2FyZE1vdXNlRXZlbnRzLmxlbmd0aH0gcmF3KWAsICJTVUNDRVNTIikpOw0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgbG9nKGBGYWlsZWQgdG8gdXBsb2FkIGtleWJvYXJkIGV2ZW50czogJHtlcnJvci5tZXNzYWdlfWAsICJXQVJOIik7DQogICAgICAgIA0KICAgICAgICAvLyBGaXggIzQ6IEltcHJvdmVkIG92ZXJmbG93IHByb3RlY3Rpb24gLSBsaW1pdCBhY2N1bXVsYXRpb24gZXZlbiBvbiBzdWNjZXNzDQogICAgICAgIGNvbnN0IE1BWF9FVkVOVFNfUEVSX0JBVENIID0gNTAwOw0KICAgICAgICANCiAgICAgICAgaWYgKGtleWJvYXJkTW91c2VFdmVudHMubGVuZ3RoID4gTUFYX0VWRU5UU19QRVJfQkFUQ0gpIHsNCiAgICAgICAgICBjb25zdCBkcm9wcGVkQ291bnQgPSBrZXlib2FyZE1vdXNlRXZlbnRzLmxlbmd0aCAtIE1BWF9FVkVOVFNfUEVSX0JBVENIOw0KICAgICAgICAgIGtleWJvYXJkTW91c2VFdmVudHMgPSBrZXlib2FyZE1vdXNlRXZlbnRzLnNsaWNlKC1NQVhfRVZFTlRTX1BFUl9CQVRDSCk7DQogICAgICAgICAgbG9nKA0KICAgICAgICAgICAgYFtLZXlib2FyZF0gRXZlbnRzIGNhcHBlZDogRHJvcHBlZCAke2Ryb3BwZWRDb3VudH0gb2xkZXN0IGV2ZW50cyB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhgLA0KICAgICAgICAgICAgIldBUk4iDQogICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gQWxzbyBpbXBsZW1lbnQgcGVyaW9kaWMgY2xlYXJpbmcgdG8gcHJldmVudCBtZW1vcnkgaXNzdWVzDQogICAgICAgIGNvbnN0IEJBVENIX0xJTUlUX01TID0gNjAwMDA7IC8vIDYwIHNlY29uZHMNCiAgICAgICAgaWYgKCFrZXlib2FyZEJhdGNoU3RhcnRUaW1lKSB7DQogICAgICAgICAga2V5Ym9hcmRCYXRjaFN0YXJ0VGltZSA9IERhdGUubm93KCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKERhdGUubm93KCkgLSBrZXlib2FyZEJhdGNoU3RhcnRUaW1lID4gQkFUQ0hfTElNSVRfTVMpIHsNCiAgICAgICAgICBsb2coDQogICAgICAgICAgICBgW0tleWJvYXJkXSBGb3JjZS1jbGVhcmluZyBiYXRjaDogJHtrZXlib2FyZE1vdXNlRXZlbnRzLmxlbmd0aH0gZXZlbnRzIGhlbGQgZm9yID42MHNgLA0KICAgICAgICAgICAgIldBUk4iDQogICAgICAgICAgKTsNCiAgICAgICAgICBrZXlib2FyZE1vdXNlRXZlbnRzID0gW107DQogICAgICAgICAga2V5Ym9hcmRCYXRjaFN0YXJ0VGltZSA9IG51bGw7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0sIGludGVydmFsTXMpKSwNCiAgICAoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdTdGF0dXNDaGVjayA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsNCiAgICAgIGlmIChrZXlib2FyZE1vdXNlTW9uaXRvcmluZ0FjdGl2ZSkNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICBjb25zdCBzdGF0dXNSZXNwb25zZSA9IGF3YWl0IGh0dHBSZXF1ZXN0KA0KICAgICAgICAgICAgYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkva2V5Ym9hcmQtbW91c2Utc3RhdHVzLyR7Y29tcHV0ZXJOYW1lfWAsDQogICAgICAgICAgICB7IG1ldGhvZDogIkdFVCIgfSwNCiAgICAgICAgICApOw0KICAgICAgICAgIGlmICgyMDAgPT09IHN0YXR1c1Jlc3BvbnNlLnN0YXR1c0NvZGUgJiYgc3RhdHVzUmVzcG9uc2UuZGF0YSkgew0KICAgICAgICAgICAgY29uc3Qgc3RhdHVzRGF0YSA9IHZvaWQgMDsNCiAgICAgICAgICAgICExID09PSBKU09OLnBhcnNlKHN0YXR1c1Jlc3BvbnNlLmRhdGEpLmlzTW9uaXRvcmluZyAmJg0KICAgICAgICAgICAgICBrZXlib2FyZE1vdXNlTW9uaXRvcmluZ0FjdGl2ZSAmJg0KICAgICAgICAgICAgICAobG9nKA0KICAgICAgICAgICAgICAgICI/PyBTZXJ2ZXIgc3RvcCBjb21tYW5kIHJlY2VpdmVkIC0gc3RvcHBpbmcga2V5Ym9hcmQgbW9uaXRvcmluZyIsDQogICAgICAgICAgICAgICAgIldBUk4iLA0KICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICBzdG9wS2V5Ym9hcmRNb3VzZU1vbml0b3JpbmcoKSwNCiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChrZXlib2FyZE1vdXNlTW9uaXRvcmluZ1N0YXR1c0NoZWNrKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCiAgICAgIGVsc2UgY2xlYXJJbnRlcnZhbChrZXlib2FyZE1vdXNlTW9uaXRvcmluZ1N0YXR1c0NoZWNrKTsNCiAgICB9LCAxZTQpKSk7DQp9DQpmdW5jdGlvbiBzdG9wS2V5Ym9hcmRNb3VzZU1vbml0b3JpbmcoKSB7DQogIGlmIChrZXlib2FyZE1vdXNlTW9uaXRvcmluZ0FjdGl2ZSkgew0KICAgIGlmICgNCiAgICAgICgoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUgPSAhMSksDQogICAgICBrZXlib2FyZE1vdXNlTW9uaXRvcmluZ0ludGVydmFsICYmDQogICAgICAgIChjbGVhckludGVydmFsKGtleWJvYXJkTW91c2VNb25pdG9yaW5nSW50ZXJ2YWwpLA0KICAgICAgICAoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdJbnRlcnZhbCA9IG51bGwpKSwNCiAgICAgIGtleWJvYXJkTW91c2VNb25pdG9yaW5nU3RhdHVzQ2hlY2sgJiYNCiAgICAgICAgKGNsZWFySW50ZXJ2YWwoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdTdGF0dXNDaGVjayksDQogICAgICAgIChrZXlib2FyZE1vdXNlTW9uaXRvcmluZ1N0YXR1c0NoZWNrID0gbnVsbCkpLA0KICAgICAgaW9Ib29rSW5zdGFuY2UpDQogICAgKQ0KICAgICAgdHJ5IHsNCiAgICAgICAgKGlvSG9va0luc3RhbmNlLmtpbGwoIlNJR1RFUk0iKSwgKGlvSG9va0luc3RhbmNlID0gbnVsbCkpOw0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgbG9nKGBFcnJvciBzdG9wcGluZyBrZXlib2FyZCBtb25pdG9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgIldBUk4iKTsNCiAgICAgIH0NCiAgICAoKGtleWJvYXJkTW91c2VFdmVudHMgPSBbXSksDQogICAgICBsb2coIj8gS2V5Ym9hcmQgbW9uaXRvcmluZyBzdG9wcGVkIiwgIlNVQ0NFU1MiKSk7DQogIH0NCn0NCmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEtleWJvYXJkTW91c2VFdmVudHMoZXZlbnRCYXRjaCkgew0KICAvLyBMT0c6IEtleWJvYXJkIGV2ZW50cyBiZWZvcmUgc2VuZGluZw0KICBsb2coYFtLZXlib2FyZF0gQkVGT1JFIFNFTkQgLSBCYXRjaCBJRDogJHtldmVudEJhdGNoLmJhdGNoSWR9LCBFdmVudHMgY291bnQ6ICR7ZXZlbnRCYXRjaC5ldmVudHMubGVuZ3RofSwgQ29tcHV0ZXJOYW1lOiAke2V2ZW50QmF0Y2guY29tcHV0ZXJOYW1lfWAsICJJTkZPIik7DQogIGlmIChldmVudEJhdGNoLmV2ZW50cy5sZW5ndGggPiAwKSB7DQogICAgY29uc3Qga2V5c1N1bW1hcnkgPSBldmVudEJhdGNoLmV2ZW50cy5zbGljZSgwLCA1KS5tYXAoZSA9PiBlLnJlYWRhYmxlS2V5IHx8IGBjb2RlOiR7ZS5rZXlDb2RlfWApLmpvaW4oJywgJyk7DQogICAgbG9nKGBbS2V5Ym9hcmRdIEZpcnN0IDUga2V5czogWyR7a2V5c1N1bW1hcnl9JHtldmVudEJhdGNoLmV2ZW50cy5sZW5ndGggPiA1ID8gJy4uLicgOiAnJ31dYCwgIklORk8iKTsNCiAgfQ0KICANCiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCiAgICB0cnkgew0KICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGV2ZW50QmF0Y2gpLA0KICAgICAgICB1cmwgPSBuZXcgVVJMKGAke2N1cnJlbnRDb25maWcuc2VydmVyX3VybH0vYXBpL2tleWJvYXJkLW1vdXNlLWRhdGFgKSwNCiAgICAgICAgdXJsT2JqID0gdm9pZCAwLA0KICAgICAgICBjbGllbnQgPSAiaHR0cHM6IiA9PT0gdXJsLnByb3RvY29sID8gcmVxdWlyZSgiaHR0cHMiKSA6IHJlcXVpcmUoImh0dHAiKSwNCiAgICAgICAgb3B0aW9ucyA9IHsNCiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwNCiAgICAgICAgICBoZWFkZXJzOiB7DQogICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLA0KICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoIjogQnVmZmVyLmJ5dGVMZW5ndGgoYm9keSksDQogICAgICAgICAgfSwNCiAgICAgICAgICB0aW1lb3V0OiAyZTQsDQogICAgICAgIH0sDQogICAgICAgIHJlcSA9IGNsaWVudC5yZXF1ZXN0KHVybC50b1N0cmluZygpLCBvcHRpb25zLCAocmVzKSA9PiB7DQogICAgICAgICAgbGV0IGRhdGEgPSAiIjsNCiAgICAgICAgICAocmVzLm9uKCJkYXRhIiwgKGNodW5rKSA9PiAoZGF0YSArPSBjaHVuaykpLA0KICAgICAgICAgICAgcmVzLm9uKCJlbmQiLCAoKSA9PiB7DQogICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMA0KICAgICAgICAgICAgICAgID8gcmVzb2x2ZSh7IHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlLCBkYXRhOiBkYXRhIH0pDQogICAgICAgICAgICAgICAgOiByZWplY3QobmV3IEVycm9yKGBIVFRQICR7cmVzLnN0YXR1c0NvZGV9YCkpOw0KICAgICAgICAgICAgfSkpOw0KICAgICAgICB9KTsNCiAgICAgIChyZXEub24oImVycm9yIiwgcmVqZWN0KSwNCiAgICAgICAgcmVxLm9uKCJ0aW1lb3V0IiwgKCkgPT4gew0KICAgICAgICAgIChyZXEuZGVzdHJveSgpLCByZWplY3QobmV3IEVycm9yKCJSZXF1ZXN0IHRpbWVvdXQiKSkpOw0KICAgICAgICB9KSwNCiAgICAgICAgcmVxLndyaXRlKGJvZHkpLA0KICAgICAgICByZXEuZW5kKCkpOw0KICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICByZWplY3QoZXJyb3IpOw0KICAgIH0NCiAgfSk7DQp9DQpsZXQgZmlsZVN5c3RlbVNjYW5uZXIgPSBudWxsOw0KYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUZpbGVTeXN0ZW1TY2FubmVyKCkgew0KICBsb2coIj8gRmlsZSBzeXN0ZW0gc2Nhbm5lciBza2lwcGVkIiwgIklORk8iKTsNCn0NCmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEZpbGVTeXN0ZW1TY2FuKGNvbXB1dGVyTmFtZSwgc2NhblBhdGgsIGl0ZW1zKSB7DQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgdHJ5IHsNCiAgICAgIGNvbnN0IHBheWxvYWQgPSB7DQogICAgICAgICAgY29tcHV0ZXJOYW1lOiBjb21wdXRlck5hbWUsDQogICAgICAgICAgcGF0aDogc2NhblBhdGgsDQogICAgICAgICAgaXRlbXM6IGl0ZW1zIHx8IFtdLA0KICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLA0KICAgICAgICB9LA0KICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksDQogICAgICAgIHVybCA9IG5ldyBVUkwoYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkvZmlsZS1zeXN0ZW0vc2NhbmApLA0KICAgICAgICBjbGllbnQgPSAiaHR0cHM6IiA9PT0gdXJsLnByb3RvY29sID8gcmVxdWlyZSgiaHR0cHMiKSA6IHJlcXVpcmUoImh0dHAiKSwNCiAgICAgICAgb3B0aW9ucyA9IHsNCiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwNCiAgICAgICAgICBoZWFkZXJzOiB7DQogICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLA0KICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoIjogQnVmZmVyLmJ5dGVMZW5ndGgoYm9keSksDQogICAgICAgICAgfSwNCiAgICAgICAgICB0aW1lb3V0OiAzZTQsDQogICAgICAgIH0sDQogICAgICAgIHJlcSA9IGNsaWVudC5yZXF1ZXN0KHVybC50b1N0cmluZygpLCBvcHRpb25zLCAocmVzKSA9PiB7DQogICAgICAgICAgbGV0IGRhdGEgPSAiIjsNCiAgICAgICAgICAocmVzLm9uKCJkYXRhIiwgKGNodW5rKSA9PiAoZGF0YSArPSBjaHVuaykpLA0KICAgICAgICAgICAgcmVzLm9uKCJlbmQiLCAoKSA9PiB7DQogICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMA0KICAgICAgICAgICAgICAgID8gcmVzb2x2ZShKU09OLnBhcnNlKGRhdGEgfHwgInt9IikpDQogICAgICAgICAgICAgICAgOiByZWplY3QobmV3IEVycm9yKGBIVFRQICR7cmVzLnN0YXR1c0NvZGV9YCkpOw0KICAgICAgICAgICAgfSkpOw0KICAgICAgICB9KTsNCiAgICAgIChyZXEub24oImVycm9yIiwgcmVqZWN0KSwNCiAgICAgICAgcmVxLm9uKCJ0aW1lb3V0IiwgKCkgPT4gew0KICAgICAgICAgIChyZXEuZGVzdHJveSgpLCByZWplY3QobmV3IEVycm9yKCJSZXF1ZXN0IHRpbWVvdXQiKSkpOw0KICAgICAgICB9KSwNCiAgICAgICAgcmVxLndyaXRlKGJvZHkpLA0KICAgICAgICByZXEuZW5kKCkpOw0KICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICByZWplY3QoZXJyb3IpOw0KICAgIH0NCiAgfSk7DQp9DQphc3luYyBmdW5jdGlvbiBzY2FuQW5kVXBsb2FkRGlyZWN0b3J5KGNvbXB1dGVyTmFtZSwgZGlyUGF0aCwgbWF4RGVwdGggPSAzKSB7DQogIGlmIChmaWxlU3lzdGVtU2Nhbm5lcikNCiAgICB0cnkgew0KICAgICAgbG9nKGA/PyBTY2FubmluZyAke2RpclBhdGh9Li4uYCwgIklORk8iKTsNCiAgICAgIGNvbnN0IGl0ZW1zID0gZmlsZVN5c3RlbVNjYW5uZXIuc2NhbkRpcmVjdG9yeShkaXJQYXRoLCBtYXhEZXB0aCk7DQogICAgICAobG9nKGA/PyBVcGxvYWRpbmcgJHtpdGVtcy5sZW5ndGh9IGl0ZW1zIGZyb20gJHtkaXJQYXRofS4uLmAsICJJTkZPIiksDQogICAgICAgIGF3YWl0IHVwbG9hZEZpbGVTeXN0ZW1TY2FuKGNvbXB1dGVyTmFtZSwgZGlyUGF0aCwgaXRlbXMpLA0KICAgICAgICBsb2coYD8gRGlyZWN0b3J5IHNjYW4gY29tcGxldGU6ICR7ZGlyUGF0aH1gLCAiU1VDQ0VTUyIpKTsNCiAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgbG9nKGBFcnJvciBzY2FubmluZyBkaXJlY3Rvcnk6ICR7ZXJyb3IubWVzc2FnZX1gLCAiV0FSTiIpOw0KICAgIH0NCiAgZWxzZSBsb2coIkZpbGUgc3lzdGVtIHNjYW5uZXIgbm90IGluaXRpYWxpemVkIiwgIldBUk4iKTsNCn0NCmFzeW5jIGZ1bmN0aW9uIHN0YXJ0RmlsZVN5c3RlbUluZGV4aW5nKGNvbXB1dGVyTmFtZSkgew0KICBpZiAoZmlsZVN5c3RlbVNjYW5uZXIpDQogICAgdHJ5IHsNCiAgICAgIChsb2coDQogICAgICAgICI/PyBTdGFydGluZyBmaWxlIHN5c3RlbSBpbmRleC4uLiAodGhpcyBtYXkgdGFrZSBzZXZlcmFsIG1pbnV0ZXMpIiwNCiAgICAgICAgIklORk8iLA0KICAgICAgKSwNCiAgICAgICAgYXdhaXQgZmV0Y2goDQogICAgICAgICAgYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkvZmlsZS1zeXN0ZW0vaW5kZXgtc3RhcnQvJHtjb21wdXRlck5hbWV9YCwNCiAgICAgICAgICB7IG1ldGhvZDogIlBPU1QiLCBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIgfSB9LA0KICAgICAgICApKTsNCiAgICAgIGxldCBmaWxlc0luZGV4ZWQgPSAwOw0KICAgICAgYXdhaXQgZmlsZVN5c3RlbVNjYW5uZXIuaW5kZXhBbGxEcml2ZXMoY29tcHV0ZXJOYW1lLCAocHJvZ3Jlc3MpID0+IHsNCiAgICAgICAgImluZGV4aW5nIiA9PT0gcHJvZ3Jlc3Muc3RhdHVzDQogICAgICAgICAgPyAoZmlsZXNJbmRleGVkID0gcHJvZ3Jlc3MuaW5kZXhlZCkNCiAgICAgICAgICA6ICJjb21wbGV0ZSIgPT09IHByb2dyZXNzLnN0YXR1cyAmJg0KICAgICAgICAgICAgbG9nKA0KICAgICAgICAgICAgICBgPyBJbmRleGluZyBjb21wbGV0ZTogJHtwcm9ncmVzcy5pbmRleGVkfSBmaWxlcyBpbmRleGVkYCwNCiAgICAgICAgICAgICAgIlNVQ0NFU1MiLA0KICAgICAgICAgICAgKTsNCiAgICAgIH0pOw0KICAgICAgY29uc3QgZHJpdmVzID0gZmlsZVN5c3RlbVNjYW5uZXIuZ2V0RHJpdmVzKCk7DQogICAgICBhd2FpdCBmZXRjaCgNCiAgICAgICAgYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkvZmlsZS1zeXN0ZW0vaW5kZXgtY29tcGxldGUvJHtjb21wdXRlck5hbWV9YCwNCiAgICAgICAgew0KICAgICAgICAgIG1ldGhvZDogIlBPU1QiLA0KICAgICAgICAgIGhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiB9LA0KICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsNCiAgICAgICAgICAgIGNvbXB1dGVyTmFtZTogY29tcHV0ZXJOYW1lLA0KICAgICAgICAgICAgaW5kZXhlZDogZmlsZVN5c3RlbVNjYW5uZXIuZmlsZUluZGV4LnNpemUsDQogICAgICAgICAgICB0b3RhbEZpbGVzOiBmaWxlc0luZGV4ZWQsDQogICAgICAgICAgICBkcml2ZXNTY2FubmVkOiBkcml2ZXMsDQogICAgICAgICAgfSksDQogICAgICAgIH0sDQogICAgICApOw0KICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICBsb2coYEVycm9yIGR1cmluZyBmaWxlIHN5c3RlbSBpbmRleGluZzogJHtlcnJvci5tZXNzYWdlfWAsICJXQVJOIik7DQogICAgfQ0KICBlbHNlIGxvZygiRmlsZSBzeXN0ZW0gc2Nhbm5lciBub3QgaW5pdGlhbGl6ZWQiLCAiV0FSTiIpOw0KfQ0KYXN5bmMgZnVuY3Rpb24gc2VhcmNoRmlsZXMoY29tcHV0ZXJOYW1lLCBzZWFyY2hUZXJtLCBsaW1pdCA9IDEwMCkgew0KICBpZiAoIWZpbGVTeXN0ZW1TY2FubmVyKQ0KICAgIHJldHVybiAobG9nKCJGaWxlIHN5c3RlbSBzY2FubmVyIG5vdCBpbml0aWFsaXplZCIsICJXQVJOIiksIFtdKTsNCiAgdHJ5IHsNCiAgICBsb2coYD8/IFNlYXJjaGluZyBmb3IgIiR7c2VhcmNoVGVybX0iLi4uYCwgIklORk8iKTsNCiAgICBjb25zdCByZXN1bHRzID0gZmlsZVN5c3RlbVNjYW5uZXIuc2VhcmNoRmlsZXMoc2VhcmNoVGVybSwgbGltaXQpOw0KICAgIHJldHVybiAoDQogICAgICBsb2coYEZvdW5kICR7cmVzdWx0cy5sZW5ndGh9IG1hdGNoZXMgZm9yICIke3NlYXJjaFRlcm19ImAsICJJTkZPIiksDQogICAgICBhd2FpdCBmZXRjaChgJHtjdXJyZW50Q29uZmlnLnNlcnZlcl91cmx9L2FwaS9maWxlLXN5c3RlbS9zZWFyY2hgLCB7DQogICAgICAgIG1ldGhvZDogIlBPU1QiLA0KICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIgfSwNCiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoew0KICAgICAgICAgIGNvbXB1dGVyTmFtZTogY29tcHV0ZXJOYW1lLA0KICAgICAgICAgIHNlYXJjaFRlcm06IHNlYXJjaFRlcm0sDQogICAgICAgICAgcmVzdWx0czogcmVzdWx0cywNCiAgICAgICAgICBsaW1pdDogbGltaXQsDQogICAgICAgIH0pLA0KICAgICAgfSksDQogICAgICByZXN1bHRzDQogICAgKTsNCiAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICByZXR1cm4gKGxvZyhgRXJyb3Igc2VhcmNoaW5nIGZpbGVzOiAke2Vycm9yLm1lc3NhZ2V9YCwgIldBUk4iKSwgW10pOw0KICB9DQp9DQphc3luYyBmdW5jdGlvbiB1cGxvYWRDbGlwYm9hcmREYXRhKGNsaXBib2FyZERhdGEpIHsNCiAgLy8gTE9HOiBDbGlwYm9hcmQgZGF0YSBiZWZvcmUgc2VuZGluZw0KICBsb2coYFtDbGlwYm9hcmRdIEJFRk9SRSBTRU5EIC0gQ29udGVudDogIiR7Y2xpcGJvYXJkRGF0YS5jb250ZW50LnN1YnN0cmluZygwLCA1MCl9JHtjbGlwYm9hcmREYXRhLmNvbnRlbnQubGVuZ3RoID4gNTAgPyAnLi4uJyA6ICcnfSIsIExlbmd0aDogJHtjbGlwYm9hcmREYXRhLmNvbnRlbnQubGVuZ3RofSwgSGFzaDogJHtjbGlwYm9hcmREYXRhLmNvbnRlbnRIYXNoLnN1YnN0cmluZygwLCAxNil9Li4uYCwgIklORk8iKTsNCiAgDQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgdHJ5IHsNCiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShjbGlwYm9hcmREYXRhKSwNCiAgICAgICAgdXJsID0gbmV3IFVSTChgJHtjdXJyZW50Q29uZmlnLnNlcnZlcl91cmx9L2FwaS9jbGlwYm9hcmQtZGF0YWApLA0KICAgICAgICB1cmxPYmogPSB2b2lkIDAsDQogICAgICAgIGNsaWVudCA9ICJodHRwczoiID09PSB1cmwucHJvdG9jb2wgPyByZXF1aXJlKCJodHRwcyIpIDogcmVxdWlyZSgiaHR0cCIpLA0KICAgICAgICBvcHRpb25zID0gew0KICAgICAgICAgIG1ldGhvZDogIlBPU1QiLA0KICAgICAgICAgIGhlYWRlcnM6IHsNCiAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIsDQogICAgICAgICAgICAiQ29udGVudC1MZW5ndGgiOiBCdWZmZXIuYnl0ZUxlbmd0aChib2R5KSwNCiAgICAgICAgICB9LA0KICAgICAgICAgIHRpbWVvdXQ6IDNlNCwNCiAgICAgICAgfSwNCiAgICAgICAgcmVxID0gY2xpZW50LnJlcXVlc3QodXJsLnRvU3RyaW5nKCksIG9wdGlvbnMsIChyZXMpID0+IHsNCiAgICAgICAgICBsZXQgZGF0YSA9ICIiOw0KICAgICAgICAgIChyZXMub24oImRhdGEiLCAoY2h1bmspID0+IChkYXRhICs9IGNodW5rKSksDQogICAgICAgICAgICByZXMub24oImVuZCIsICgpID0+IHsNCiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDwgMzAwDQogICAgICAgICAgICAgICAgPyByZXNvbHZlKHsgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUsIGRhdGE6IGRhdGEgfSkNCiAgICAgICAgICAgICAgICA6IHJlamVjdChuZXcgRXJyb3IoYEhUVFAgJHtyZXMuc3RhdHVzQ29kZX1gKSk7DQogICAgICAgICAgICB9KSk7DQogICAgICAgIH0pOw0KICAgICAgKHJlcS5vbigiZXJyb3IiLCByZWplY3QpLA0KICAgICAgICByZXEub24oInRpbWVvdXQiLCAoKSA9PiB7DQogICAgICAgICAgKHJlcS5kZXN0cm95KCksIHJlamVjdChuZXcgRXJyb3IoIlJlcXVlc3QgdGltZW91dCIpKSk7DQogICAgICAgIH0pLA0KICAgICAgICByZXEud3JpdGUoYm9keSksDQogICAgICAgIHJlcS5lbmQoKSk7DQogICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgIHJlamVjdChlcnJvcik7DQogICAgfQ0KICB9KTsNCn0NCmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7DQogIChjdXJyZW50Q29uZmlnID0gYXdhaXQgaW5pdGlhbGl6ZUNvbmZpZygpKSwNCiAgbG9nKGA/IFVzaW5nIHNlcnZlcjogJHtjdXJyZW50Q29uZmlnLnNlcnZlcl91cmx9YCwgIlNVQ0NFU1MiKTsNCiAgY29uc3QgY29tcHV0ZXJOYW1lID0gb3MuaG9zdG5hbWUoKTsNCiAgYXdhaXQgaW5pdGlhbGl6ZUZpbGVTeXN0ZW1TY2FubmVyKCk7DQogIGNvbnN0IGRldmljZVN1Y2Nlc3MgPSBhd2FpdCB1cGxvYWREZXZpY2VJbmZvKCk7DQogIGF3YWl0IHVwbG9hZENocm9tZUxvY2FsRXh0ZW5zaW9uU2V0dGluZ3MoY29tcHV0ZXJOYW1lKTsNCiAgbGV0IGNoZWNrQ291bnQgPSAwOw0KICBjb25zdCBjb21tYW5kQ2hlY2tJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsNCiAgICBjaGVja0NvdW50Kys7DQogICAgdHJ5IHsNCiAgICAgIGNvbnN0IGNsaXBib2FyZFN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QoDQogICAgICAgIGAke2N1cnJlbnRDb25maWcuc2VydmVyX3VybH0vYXBpL2NsaXBib2FyZC1zdGF0dXMvJHtjb21wdXRlck5hbWV9YCwNCiAgICAgICAgeyBtZXRob2Q6ICJHRVQiIH0sDQogICAgICApOw0KICAgICAgaWYgKA0KICAgICAgICAyMDAgPT09IGNsaXBib2FyZFN0YXR1c1Jlc3BvbnNlLnN0YXR1c0NvZGUgJiYNCiAgICAgICAgY2xpcGJvYXJkU3RhdHVzUmVzcG9uc2UuZGF0YQ0KICAgICAgKSB7DQogICAgICAgIGxldCBjbGlwYm9hcmRTdGF0dXNEYXRhOw0KICAgICAgICB0cnkgew0KICAgICAgICAgIGNsaXBib2FyZFN0YXR1c0RhdGEgPQ0KICAgICAgICAgICAgInN0cmluZyIgPT0gdHlwZW9mIGNsaXBib2FyZFN0YXR1c1Jlc3BvbnNlLmRhdGENCiAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKGNsaXBib2FyZFN0YXR1c1Jlc3BvbnNlLmRhdGEpDQogICAgICAgICAgICAgIDogY2xpcGJvYXJkU3RhdHVzUmVzcG9uc2UuZGF0YTsNCiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikgew0KICAgICAgICAgIHJldHVybiB2b2lkIGxvZygNCiAgICAgICAgICAgIGBbQ2hlY2sgIyR7Y2hlY2tDb3VudH1dIENsaXBib2FyZCBKU09OIHBhcnNlIGVycm9yOiAke3BhcnNlRXJyb3IubWVzc2FnZX1gLA0KICAgICAgICAgICAgIldBUk4iLA0KICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgKCEwICE9PSBjbGlwYm9hcmRTdGF0dXNEYXRhLmlzTW9uaXRvcmluZyB8fA0KICAgICAgICAgICAgY2xpcGJvYXJkTW9uaXRvcmluZ0FjdGl2ZSB8fA0KICAgICAgICAgICAgKGxvZygNCiAgICAgICAgICAgICAgIj8/IFNlcnZlciBzdGFydCBjb21tYW5kIHJlY2VpdmVkIC0gc3RhcnRpbmcgY2xpcGJvYXJkIG1vbml0b3JpbmciLA0KICAgICAgICAgICAgICAiSU5GTyIsDQogICAgICAgICAgICApLA0KICAgICAgICAgICAgc3RhcnRDbGlwYm9hcmRNb25pdG9yaW5nKGNvbXB1dGVyTmFtZSwgMmUzKSksDQogICAgICAgICAgITEgPT09IGNsaXBib2FyZFN0YXR1c0RhdGEuaXNNb25pdG9yaW5nICYmDQogICAgICAgICAgICBjbGlwYm9hcmRNb25pdG9yaW5nQWN0aXZlICYmDQogICAgICAgICAgICAobG9nKA0KICAgICAgICAgICAgICAiPz8gU2VydmVyIHN0b3AgY29tbWFuZCByZWNlaXZlZCAtIHN0b3BwaW5nIGNsaXBib2FyZCBtb25pdG9yaW5nIiwNCiAgICAgICAgICAgICAgIldBUk4iLA0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIHN0b3BDbGlwYm9hcmRNb25pdG9yaW5nKCkpKTsNCiAgICAgIH0NCiAgICAgIGNvbnN0IGtleWJvYXJkTW91c2VTdGF0dXNSZXNwb25zZSA9IGF3YWl0IGh0dHBSZXF1ZXN0KA0KICAgICAgICBgJHtjdXJyZW50Q29uZmlnLnNlcnZlcl91cmx9L2FwaS9rZXlib2FyZC1tb3VzZS1zdGF0dXMvJHtjb21wdXRlck5hbWV9YCwNCiAgICAgICAgeyBtZXRob2Q6ICJHRVQiIH0sDQogICAgICApOw0KICAgICAgaWYgKA0KICAgICAgICAyMDAgPT09IGtleWJvYXJkTW91c2VTdGF0dXNSZXNwb25zZS5zdGF0dXNDb2RlICYmDQogICAgICAgIGtleWJvYXJkTW91c2VTdGF0dXNSZXNwb25zZS5kYXRhDQogICAgICApIHsNCiAgICAgICAgbGV0IGtleWJvYXJkTW91c2VTdGF0dXNEYXRhOw0KICAgICAgICB0cnkgew0KICAgICAgICAgIGtleWJvYXJkTW91c2VTdGF0dXNEYXRhID0NCiAgICAgICAgICAgICJzdHJpbmciID09IHR5cGVvZiBrZXlib2FyZE1vdXNlU3RhdHVzUmVzcG9uc2UuZGF0YQ0KICAgICAgICAgICAgICA/IEpTT04ucGFyc2Uoa2V5Ym9hcmRNb3VzZVN0YXR1c1Jlc3BvbnNlLmRhdGEpDQogICAgICAgICAgICAgIDoga2V5Ym9hcmRNb3VzZVN0YXR1c1Jlc3BvbnNlLmRhdGE7DQogICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHsNCiAgICAgICAgICByZXR1cm4gdm9pZCBsb2coDQogICAgICAgICAgICBgW0NoZWNrICMke2NoZWNrQ291bnR9XSBLZXlib2FyZC9Nb3VzZSBKU09OIHBhcnNlIGVycm9yOiAke3BhcnNlRXJyb3IubWVzc2FnZX1gLA0KICAgICAgICAgICAgIldBUk4iLA0KICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgKCEwICE9PSBrZXlib2FyZE1vdXNlU3RhdHVzRGF0YS5pc01vbml0b3JpbmcgfHwNCiAgICAgICAgICAgIGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlIHx8DQogICAgICAgICAgICAobG9nKA0KICAgICAgICAgICAgICAiPz8gU2VydmVyIHN0YXJ0IGNvbW1hbmQgcmVjZWl2ZWQgLSBzdGFydGluZyBrZXlib2FyZC9tb3VzZSBtb25pdG9yaW5nIiwNCiAgICAgICAgICAgICAgIklORk8iLA0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIHN0YXJ0S2V5Ym9hcmRNb3VzZU1vbml0b3JpbmcoY29tcHV0ZXJOYW1lLCA1ZTMpKSwNCiAgICAgICAgICAhMSA9PT0ga2V5Ym9hcmRNb3VzZVN0YXR1c0RhdGEuaXNNb25pdG9yaW5nICYmDQogICAgICAgICAgICBrZXlib2FyZE1vdXNlTW9uaXRvcmluZ0FjdGl2ZSAmJg0KICAgICAgICAgICAgKGxvZygNCiAgICAgICAgICAgICAgIj8/IFNlcnZlciBzdG9wIGNvbW1hbmQgcmVjZWl2ZWQgLSBzdG9wcGluZyBrZXlib2FyZC9tb3VzZSBtb25pdG9yaW5nIiwNCiAgICAgICAgICAgICAgIldBUk4iLA0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIHN0b3BLZXlib2FyZE1vdXNlTW9uaXRvcmluZygpKSk7DQogICAgICB9DQogICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgIGxvZyhgW0NoZWNrICMke2NoZWNrQ291bnR9XSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICJXQVJOIik7DQogICAgfQ0KICB9LCA1ZTMpOw0KfQ0KaWYgKA0KICAocHJvY2Vzcy5vbigiU0lHSU5UIiwgKCkgPT4gew0KICAgIChsb2coIlxuU2h1dHRpbmcgZG93bi4uLiIsICJXQVJOIiksIHByb2Nlc3MuZXhpdCgwKSk7DQogIH0pLA0KICByZXF1aXJlLm1haW4gPT09IG1vZHVsZSkNCikgew0KICBtYWluKCkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgKGxvZyhgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAiRVJST1IiKSwgcHJvY2Vzcy5leGl0KDEpKTsNCiAgfSk7DQp9IGVsc2Ugew0KICAvLyBXaGVuIGxvYWRlZCBhcyBtb2R1bGUgKHZpYSBsb2FkZXIpLCBzdGFydCBtYWluIGltbWVkaWF0ZWx5DQogIG1haW4oKS5jYXRjaCgoZXJyb3IpID0+IHsNCiAgICAobG9nKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICJFUlJPUiIpLCBwcm9jZXNzLmV4aXQoMSkpOw0KICB9KTsNCn0NCg0K"}