diff --git a/libs/native-federation-node/src/lib/utils/fstart.mjs b/libs/native-federation-node/src/lib/utils/fstart.mjs index 2f264b28..502ef7a7 100644 --- a/libs/native-federation-node/src/lib/utils/fstart.mjs +++ b/libs/native-federation-node/src/lib/utils/fstart.mjs @@ -314,7 +314,7 @@ function emptyMap() { // libs/native-federation-node/src/lib/utils/loader-as-data-url.js var resolver = - 'aW1wb3J0IHBhdGggZnJvbSAncGF0aCc7CmltcG9ydCB1cmwgZnJvbSAndXJsJzsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7CgpleHBvcnQgY29uc3QgSU1QT1JUX01BUF9GSUxFX05BTUUgPSAnbm9kZS5pbXBvcnRtYXAnOwoKY29uc3QgYmFzZVVSTCA9IHVybC5wYXRoVG9GaWxlVVJMKHByb2Nlc3MuY3dkKCkpICsgcGF0aC5zZXA7CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNuZXctcmVzb2x2ZS1hbGdvcml0aG0KZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTcGVjaWZpZXIoaW1wb3J0TWFwLCBzcGVjaWZpZXIsIHBhcmVudFVSTCkgewogIGxldCBjdXJyZW50QmFzZVVSTDsKICBpZiAocGFyZW50VVJMKSB7CiAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHBhcmVudFVSTC5sYXN0SW5kZXhPZihwYXRoLnNlcCk7CiAgICBjdXJyZW50QmFzZVVSTCA9IHBhcmVudFVSTC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCArIDEpOwogIH0gZWxzZSB7CiAgICBjdXJyZW50QmFzZVVSTCA9IGJhc2VVUkw7CiAgfQogIGNvbnN0IG5vcm1hbGl6ZWRTcGVjaWZpZXIgPQogICAgcGFyc2VVUkxMaWtlU3BlY2lmaWVyKHNwZWNpZmllciwgY3VycmVudEJhc2VVUkwpIHx8IHNwZWNpZmllcjsKICBmb3IgKGxldCBzY29wZVByZWZpeCBpbiBpbXBvcnRNYXAuc2NvcGVzKSB7CiAgICBpZiAoCiAgICAgIHNjb3BlUHJlZml4ID09PSBjdXJyZW50QmFzZVVSTCB8fAogICAgICAoc2NvcGVQcmVmaXguZW5kc1dpdGgoJy8nKSAmJiBjdXJyZW50QmFzZVVSTC5zdGFydHNXaXRoKHNjb3BlUHJlZml4KSkKICAgICkgewogICAgICBjb25zdCBzY29wZUltcG9ydHNNYXRjaCA9IHJlc29sdmVJbXBvcnRzTWF0Y2goCiAgICAgICAgbm9ybWFsaXplZFNwZWNpZmllciwKICAgICAgICBpbXBvcnRNYXAuc2NvcGVzW3Njb3BlUHJlZml4XSwKICAgICAgKTsKICAgICAgaWYgKHNjb3BlSW1wb3J0c01hdGNoKSB7CiAgICAgICAgcmV0dXJuIHNjb3BlSW1wb3J0c01hdGNoOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCB0b3BMZXZlbEltcG9ydHNNYXRjaCA9IHJlc29sdmVJbXBvcnRzTWF0Y2goCiAgICAgICAgbm9ybWFsaXplZFNwZWNpZmllciwKICAgICAgICBpbXBvcnRNYXAuaW1wb3J0cywKICAgICAgKTsKICAgICAgaWYgKHRvcExldmVsSW1wb3J0c01hdGNoKSB7CiAgICAgICAgcmV0dXJuIHRvcExldmVsSW1wb3J0c01hdGNoOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gcmVzb2x2ZUltcG9ydHNNYXRjaChub3JtYWxpemVkU3BlY2lmaWVyLCBpbXBvcnRNYXAuaW1wb3J0cyk7Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI3Jlc29sdmUtYW4taW1wb3J0cy1tYXRjaApmdW5jdGlvbiByZXNvbHZlSW1wb3J0c01hdGNoKG5vcm1hbGl6ZWRTcGVjaWZpZXIsIHNwZWNpZmllck1hcCkgewogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBzcGVjaWZpZXJNYXApIHsKICAgIGNvbnN0IHJlc29sdXRpb25SZXN1bHQgPSBzcGVjaWZpZXJNYXBbc3BlY2lmaWVyS2V5XTsKCiAgICBpZiAoc3BlY2lmaWVyS2V5ID09PSBub3JtYWxpemVkU3BlY2lmaWVyKSB7CiAgICAgIGlmIChyZXNvbHV0aW9uUmVzdWx0ID09PSBudWxsKSB7CiAgICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgICAgYFRoZSBpbXBvcnQgbWFwIHJlc29sdXRpb24gb2YgJHtzcGVjaWZpZXJLZXl9IGZhaWxlZCBkdWUgdG8gYSBudWxsIGVudHJ5YCwKICAgICAgICApOwogICAgICB9CiAgICAgIHJldHVybiByZXNvbHV0aW9uUmVzdWx0OwogICAgfSBlbHNlIGlmICgKICAgICAgc3BlY2lmaWVyS2V5LmVuZHNXaXRoKCcvJykgJiYKICAgICAgbm9ybWFsaXplZFNwZWNpZmllci5zdGFydHNXaXRoKHNwZWNpZmllcktleSkKICAgICkgewogICAgICBpZiAocmVzb2x1dGlvblJlc3VsdCA9PT0gbnVsbCkgewogICAgICAgIHRocm93IFR5cGVFcnJvcigKICAgICAgICAgIGBUaGUgaW1wb3J0IG1hcCByZXNvbHV0aW9uIG9mICR7c3BlY2lmaWVyS2V5fSBmYWlsZWQgZHVlIHRvIGEgbnVsbCBlbnRyeWAsCiAgICAgICAgKTsKICAgICAgfQogICAgICBjb25zdCBhZnRlclByZWZpeCA9IG5vcm1hbGl6ZWRTcGVjaWZpZXIuc2xpY2Uoc3BlY2lmaWVyS2V5Lmxlbmd0aCk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIG5ldyBVUkwoYWZ0ZXJQcmVmaXgsIHJlc29sdXRpb25SZXN1bHQpLmhyZWY7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHRocm93IFR5cGVFcnJvcigKICAgICAgICAgIGBUaGUgaW1wb3J0IG1hcCByZXNvbHV0aW9uIG9mICR7c3BlY2lmaWVyS2V5fSBmYWlsZWQgZHVlIHRvIFVSTCBwYXJzZSBmYWlsdXJlYCwKICAgICAgICApOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9pbXBvcnQtbWFwcy8jcGFyc2luZwpleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgLy8gU3RlcCAyCiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CgogIC8vIFN0ZXAgMwogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cyA9IHt9OwoKICAvLyBTdGVwIDQKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZCwgJ2ltcG9ydHMnKSkgewogICAgLy8gU3RlcCA0LjEKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuaW1wb3J0cykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJpbXBvcnRzIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdGApOwogICAgfQoKICAgIC8vIFN0ZXAgNC4yCiAgICBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cyA9IHNvcnRBbmROb3JtYWxpemVTcGVjaWZpZXJNYXAoCiAgICAgIHBhcnNlZC5pbXBvcnRzLAogICAgICBiYXNlVVJMLAogICAgKTsKICB9CgogIC8vIFN0ZXAgNQogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0ge307CgogIC8vIFN0ZXAgNgogIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyc2VkLCAnc2NvcGVzJykpIHsKICAgIC8vIFN0ZXAgNi4xCiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLnNjb3BlcykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJzY29wZXMiIHByb3BlcnR5IG11c3QgYmUgYW4gb2JqZWN0YCk7CiAgICB9CgogICAgLy8gU3RlcCA2LjIKICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSBzb3J0QW5kTm9ybWFsaXplU2NvcGVzKHBhcnNlZC5zY29wZXMsIGJhc2VVUkwpOwogIH0KCiAgLy8gU3RlcCA3CiAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhwYXJzZWQpLmZpbHRlcigKICAgIChrZXkpID0+IGtleSAhPT0gJ2ltcG9ydHMnICYmIGtleSAhPT0gJ3Njb3BlcycsCiAgKTsKICBpZiAoaW52YWxpZEtleXMubGVuZ3RoID4gMCkgewogICAgY29uc29sZS53YXJuKAogICAgICBgSW52YWxpZCB0b3AtbGV2ZWwga2V5JHsKICAgICAgICBpbnZhbGlkS2V5cy5sZW5ndGggPiAwID8gJ3MnIDogJycKICAgICAgfSBpbiBpbXBvcnQgbWFwIC0gJHtpbnZhbGlkS2V5cy5qb2luKCcsICcpfWAsCiAgICApOwogIH0KCiAgLy8gU3RlcCA4CiAgcmV0dXJuIHsKICAgIGltcG9ydHM6IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzLAogICAgc2NvcGVzOiBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzLAogIH07Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI3NvcnQtYW5kLW5vcm1hbGl6ZS1hLXNwZWNpZmllci1tYXAKZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcChtYXAsIGJhc2VVUkwpIHsKICBjb25zdCBub3JtYWxpemVkID0ge307CgogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBtYXApIHsKICAgIGNvbnN0IHZhbHVlID0gbWFwW3NwZWNpZmllcktleV07CgogICAgY29uc3Qgbm9ybWFsaXplZFNwZWNpZmllcktleSA9IG5vcm1hbGl6ZVNwZWNpZmllcktleShzcGVjaWZpZXJLZXksIGJhc2VVUkwpOwogICAgaWYgKG5vcm1hbGl6ZWRTcGVjaWZpZXJLZXkgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CgogICAgbGV0IGFkZHJlc3NVUkwgPSBwYXJzZVVSTExpa2VTcGVjaWZpZXIodmFsdWUsIGJhc2VVUkwpOwogICAgaWYgKGFkZHJlc3NVUkwgPT09IG51bGwpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9J2AsCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoc3BlY2lmaWVyS2V5LmVuZHNXaXRoKCcvJykgJiYgIWFkZHJlc3NVUkwuZW5kc1dpdGgoJy8nKSkgewogICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgYEludmFsaWQgVVJMIGFkZHJlc3MgZm9yIGltcG9ydCBtYXAgc3BlY2lmaWVyICcke3NwZWNpZmllcktleX0nIC0gc2luY2UgdGhlIHNwZWNpZmllciBlbmRzIGluIHNsYXNoLCBzbyBtdXN0IHRoZSBhZGRyZXNzYCwKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBhZGRyZXNzVVJMOwogIH0KCiAgcmV0dXJuIG5vcm1hbGl6ZWQ7Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI25vcm1hbGl6ZS1hLXNwZWNpZmllci1rZXkKZnVuY3Rpb24gbm9ybWFsaXplU3BlY2lmaWVyS2V5KGtleSkgewogIGlmIChrZXkgPT09ICcnKSB7CiAgICBjb25zb2xlLndhcm4oYFNwZWNpZmllciBrZXlzIGluIGltcG9ydCBtYXBzIG1heSBub3QgYmUgdGhlIGVtcHR5IHN0cmluZ2ApOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICByZXR1cm4gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKGtleSwgYmFzZVVSTCkgfHwga2V5Owp9CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNwYXJzZS1hLXVybC1saWtlLWltcG9ydC1zcGVjaWZpZXIKZnVuY3Rpb24gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKHNwZWNpZmllciwgYmFzZVVSTCkgewogIGNvbnN0IHVzZUJhc2VVcmxBc1BhcmVudCA9CiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLycpIHx8CiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSB8fAogICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4uLycpOwoKICB0cnkgewogICAgcmV0dXJuIG5ldyBVUkwoc3BlY2lmaWVyLCB1c2VCYXNlVXJsQXNQYXJlbnQgPyBiYXNlVVJMIDogdW5kZWZpbmVkKS5ocmVmOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNzb3J0LWFuZC1ub3JtYWxpemUtc2NvcGVzCmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTY29wZXMobWFwLCBiYXNlVVJMKSB7CiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTsKCiAgZm9yIChsZXQgc2NvcGVQcmVmaXggaW4gbWFwKSB7CiAgICBjb25zdCBwb3RlbnRpYWxTcGVjaWZpZXJNYXAgPSBtYXBbc2NvcGVQcmVmaXhdOwogICAgaWYgKCFpc1BsYWluT2JqZWN0KHBvdGVudGlhbFNwZWNpZmllck1hcCkpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgIGBUaGUgdmFsdWUgb2Ygc2NvcGUgJHtzY29wZVByZWZpeH0gbXVzdCBiZSBhIEpTT04gb2JqZWN0YCwKICAgICAgKTsKICAgIH0KCiAgICBsZXQgc2NvcGVQcmVmaXhVUkw7CiAgICB0cnkgewogICAgICBzY29wZVByZWZpeFVSTCA9IG5ldyBVUkwoc2NvcGVQcmVmaXgsIGJhc2VVUkwpLmhyZWY7CiAgICB9IGNhdGNoIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBTY29wZSBwcmVmaXggVVJMICcke3Njb3BlUHJlZml4fScgd2FzIG5vdCBwYXJzZWFibGUgaW4gaW1wb3J0IG1hcGAsCiAgICAgICk7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIG5vcm1hbGl6ZWRbc2NvcGVQcmVmaXhVUkxdID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcG90ZW50aWFsU3BlY2lmaWVyTWFwLAogICAgICBiYXNlVVJMLAogICAgKTsKICB9CgogIHJldHVybiBub3JtYWxpemVkOwp9CgpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikgewogIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmICFBcnJheS5pc0FycmF5KG9iaik7Cn0KCi8vIC0tLQoKbGV0IGltcG9ydE1hcFByb21pc2UgPSBnZXRJbXBvcnRNYXBQcm9taXNlKCk7CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZShzcGVjaWZpZXIsIGNvbnRleHQsIGRlZmF1bHRSZXNvbHZlKSB7CiAgY29uc3QgeyBwYXJlbnRVUkwgPSBudWxsIH0gPSBjb250ZXh0OwogIGNvbnN0IGltcG9ydE1hcCA9IGF3YWl0IGltcG9ydE1hcFByb21pc2U7CiAgY29uc3QgaW1wb3J0TWFwVXJsID0gcmVzb2x2ZVNwZWNpZmllcihpbXBvcnRNYXAsIHNwZWNpZmllciwgcGFyZW50VVJMKTsKCiAgcmV0dXJuIGRlZmF1bHRSZXNvbHZlKGltcG9ydE1hcFVybCA/PyBzcGVjaWZpZXIsIGNvbnRleHQsIGRlZmF1bHRSZXNvbHZlKTsKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWQodXJsLCBjb250ZXh0LCBkZWZhdWx0TG9hZCkgewogIGlmICh1cmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IHVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7CiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpOwogICAgaWYgKCFyZXMub2spIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggbW9kdWxlIGZyb20gJHt1cmx9YCk7CiAgICB9CiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZXMudGV4dCgpOwogICAgcmV0dXJuIHsKICAgICAgc2hvcnRDaXJjdWl0OiB0cnVlLAogICAgICBmb3JtYXQ6ICdtb2R1bGUnLAogICAgICBzb3VyY2UsCiAgICB9OwogIH0KCiAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnbm9kZTonKSkgewogICAgY29udGV4dC5mb3JtYXQgPSAnbW9kdWxlJzsKICB9CgogIHJldHVybiBkZWZhdWx0TG9hZCh1cmwsIGNvbnRleHQsIGRlZmF1bHRMb2FkKTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0SW1wb3J0TWFwUHJvbWlzZSgpIHsKICBjb25zdCByZWxhdGl2ZVBhdGggPSBwcm9jZXNzLmVudi5JTVBPUlRfTUFQX1BBVEggfHwgSU1QT1JUX01BUF9GSUxFX05BTUU7CiAgY29uc3QgaW1wb3J0TWFwUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZWxhdGl2ZVBhdGgpOwoKICBsZXQgc3RyOwogIHRyeSB7CiAgICBzdHIgPSBhd2FpdCBmcy5yZWFkRmlsZShpbXBvcnRNYXBQYXRoKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBlbXB0eU1hcCgpOwogIH0KCiAgbGV0IGpzb247CiAgdHJ5IHsKICAgIGpzb24gPSBhd2FpdCBKU09OLnBhcnNlKHN0cik7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB0aHJvdyBFcnJvcigKICAgICAgYEltcG9ydCBtYXAgYXQgJHtpbXBvcnRNYXBQYXRofSBjb250YWlucyBpbnZhbGlkIGpzb246ICR7ZXJyLm1lc3NhZ2V9YCwKICAgICk7CiAgfQoKICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAoanNvbik7Cn0KCmdsb2JhbC5ub2RlTG9hZGVyID0gZ2xvYmFsLm5vZGVMb2FkZXIgfHwge307CgpnbG9iYWwubm9kZUxvYWRlci5zZXRJbXBvcnRNYXBQcm9taXNlID0gZnVuY3Rpb24gc2V0SW1wb3J0TWFwUHJvbWlzZShwcm9taXNlKSB7CiAgaW1wb3J0TWFwUHJvbWlzZSA9IHByb21pc2UudGhlbigobWFwKSA9PiB7CiAgICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAobWFwKTsKICB9KTsKfTsKCmZ1bmN0aW9uIGVtcHR5TWFwKCkgewogIHJldHVybiB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH07Cn0K'; + 'aW1wb3J0IHBhdGggZnJvbSAncGF0aCc7CmltcG9ydCB1cmwgZnJvbSAndXJsJzsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7CgpleHBvcnQgY29uc3QgSU1QT1JUX01BUF9GSUxFX05BTUUgPSAnbm9kZS5pbXBvcnRtYXAnOwoKY29uc3QgYmFzZVVSTCA9IHVybC5wYXRoVG9GaWxlVVJMKHByb2Nlc3MuY3dkKCkpICsgcGF0aC5zZXA7CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNuZXctcmVzb2x2ZS1hbGdvcml0aG0KZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTcGVjaWZpZXIoaW1wb3J0TWFwLCBzcGVjaWZpZXIsIHBhcmVudFVSTCkgewogIGxldCBjdXJyZW50QmFzZVVSTDsKICBpZiAocGFyZW50VVJMKSB7CiAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHBhcmVudFVSTC5sYXN0SW5kZXhPZihwYXRoLnNlcCk7CiAgICBjdXJyZW50QmFzZVVSTCA9IHBhcmVudFVSTC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCArIDEpOwogIH0gZWxzZSB7CiAgICBjdXJyZW50QmFzZVVSTCA9IGJhc2VVUkw7CiAgfQogIGNvbnN0IG5vcm1hbGl6ZWRTcGVjaWZpZXIgPQogICAgcGFyc2VVUkxMaWtlU3BlY2lmaWVyKHNwZWNpZmllciwgY3VycmVudEJhc2VVUkwpIHx8IHNwZWNpZmllcjsKICBmb3IgKGxldCBzY29wZVByZWZpeCBpbiBpbXBvcnRNYXAuc2NvcGVzKSB7CiAgICBpZiAoCiAgICAgIHNjb3BlUHJlZml4ID09PSBjdXJyZW50QmFzZVVSTCB8fAogICAgICAoc2NvcGVQcmVmaXguZW5kc1dpdGgoJy8nKSAmJiBjdXJyZW50QmFzZVVSTC5zdGFydHNXaXRoKHNjb3BlUHJlZml4KSkKICAgICkgewogICAgICBjb25zdCBzY29wZUltcG9ydHNNYXRjaCA9IHJlc29sdmVJbXBvcnRzTWF0Y2goCiAgICAgICAgbm9ybWFsaXplZFNwZWNpZmllciwKICAgICAgICBpbXBvcnRNYXAuc2NvcGVzW3Njb3BlUHJlZml4XSwKICAgICAgKTsKICAgICAgaWYgKHNjb3BlSW1wb3J0c01hdGNoKSB7CiAgICAgICAgcmV0dXJuIHNjb3BlSW1wb3J0c01hdGNoOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gcmVzb2x2ZUltcG9ydHNNYXRjaChub3JtYWxpemVkU3BlY2lmaWVyLCBpbXBvcnRNYXAuaW1wb3J0cyk7Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI3Jlc29sdmUtYW4taW1wb3J0cy1tYXRjaApmdW5jdGlvbiByZXNvbHZlSW1wb3J0c01hdGNoKG5vcm1hbGl6ZWRTcGVjaWZpZXIsIHNwZWNpZmllck1hcCkgewogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBzcGVjaWZpZXJNYXApIHsKICAgIGNvbnN0IHJlc29sdXRpb25SZXN1bHQgPSBzcGVjaWZpZXJNYXBbc3BlY2lmaWVyS2V5XTsKCiAgICBpZiAoc3BlY2lmaWVyS2V5ID09PSBub3JtYWxpemVkU3BlY2lmaWVyKSB7CiAgICAgIGlmIChyZXNvbHV0aW9uUmVzdWx0ID09PSBudWxsKSB7CiAgICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgICAgYFRoZSBpbXBvcnQgbWFwIHJlc29sdXRpb24gb2YgJHtzcGVjaWZpZXJLZXl9IGZhaWxlZCBkdWUgdG8gYSBudWxsIGVudHJ5YCwKICAgICAgICApOwogICAgICB9CiAgICAgIHJldHVybiByZXNvbHV0aW9uUmVzdWx0OwogICAgfSBlbHNlIGlmICgKICAgICAgc3BlY2lmaWVyS2V5LmVuZHNXaXRoKCcvJykgJiYKICAgICAgbm9ybWFsaXplZFNwZWNpZmllci5zdGFydHNXaXRoKHNwZWNpZmllcktleSkKICAgICkgewogICAgICBpZiAocmVzb2x1dGlvblJlc3VsdCA9PT0gbnVsbCkgewogICAgICAgIHRocm93IFR5cGVFcnJvcigKICAgICAgICAgIGBUaGUgaW1wb3J0IG1hcCByZXNvbHV0aW9uIG9mICR7c3BlY2lmaWVyS2V5fSBmYWlsZWQgZHVlIHRvIGEgbnVsbCBlbnRyeWAsCiAgICAgICAgKTsKICAgICAgfQogICAgICBjb25zdCBhZnRlclByZWZpeCA9IG5vcm1hbGl6ZWRTcGVjaWZpZXIuc2xpY2Uoc3BlY2lmaWVyS2V5Lmxlbmd0aCk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIG5ldyBVUkwoYWZ0ZXJQcmVmaXgsIHJlc29sdXRpb25SZXN1bHQpLmhyZWY7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHRocm93IFR5cGVFcnJvcigKICAgICAgICAgIGBUaGUgaW1wb3J0IG1hcCByZXNvbHV0aW9uIG9mICR7c3BlY2lmaWVyS2V5fSBmYWlsZWQgZHVlIHRvIFVSTCBwYXJzZSBmYWlsdXJlYCwKICAgICAgICApOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9pbXBvcnQtbWFwcy8jcGFyc2luZwpleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgLy8gU3RlcCAyCiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CgogIC8vIFN0ZXAgMwogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cyA9IHt9OwoKICAvLyBTdGVwIDQKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZCwgJ2ltcG9ydHMnKSkgewogICAgLy8gU3RlcCA0LjEKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuaW1wb3J0cykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJpbXBvcnRzIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdGApOwogICAgfQoKICAgIC8vIFN0ZXAgNC4yCiAgICBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cyA9IHNvcnRBbmROb3JtYWxpemVTcGVjaWZpZXJNYXAoCiAgICAgIHBhcnNlZC5pbXBvcnRzLAogICAgICBiYXNlVVJMLAogICAgKTsKICB9CgogIC8vIFN0ZXAgNQogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0ge307CgogIC8vIFN0ZXAgNgogIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyc2VkLCAnc2NvcGVzJykpIHsKICAgIC8vIFN0ZXAgNi4xCiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLnNjb3BlcykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJzY29wZXMiIHByb3BlcnR5IG11c3QgYmUgYW4gb2JqZWN0YCk7CiAgICB9CgogICAgLy8gU3RlcCA2LjIKICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSBzb3J0QW5kTm9ybWFsaXplU2NvcGVzKHBhcnNlZC5zY29wZXMsIGJhc2VVUkwpOwogIH0KCiAgLy8gU3RlcCA3CiAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhwYXJzZWQpLmZpbHRlcigKICAgIChrZXkpID0+IGtleSAhPT0gJ2ltcG9ydHMnICYmIGtleSAhPT0gJ3Njb3BlcycsCiAgKTsKICBpZiAoaW52YWxpZEtleXMubGVuZ3RoID4gMCkgewogICAgY29uc29sZS53YXJuKAogICAgICBgSW52YWxpZCB0b3AtbGV2ZWwga2V5JHsKICAgICAgICBpbnZhbGlkS2V5cy5sZW5ndGggPiAwID8gJ3MnIDogJycKICAgICAgfSBpbiBpbXBvcnQgbWFwIC0gJHtpbnZhbGlkS2V5cy5qb2luKCcsICcpfWAsCiAgICApOwogIH0KCiAgLy8gU3RlcCA4CiAgcmV0dXJuIHsKICAgIGltcG9ydHM6IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzLAogICAgc2NvcGVzOiBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzLAogIH07Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI3NvcnQtYW5kLW5vcm1hbGl6ZS1hLXNwZWNpZmllci1tYXAKZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcChtYXAsIGJhc2VVUkwpIHsKICBjb25zdCBub3JtYWxpemVkID0ge307CgogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBtYXApIHsKICAgIGNvbnN0IHZhbHVlID0gbWFwW3NwZWNpZmllcktleV07CgogICAgY29uc3Qgbm9ybWFsaXplZFNwZWNpZmllcktleSA9IG5vcm1hbGl6ZVNwZWNpZmllcktleShzcGVjaWZpZXJLZXksIGJhc2VVUkwpOwogICAgaWYgKG5vcm1hbGl6ZWRTcGVjaWZpZXJLZXkgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CgogICAgbGV0IGFkZHJlc3NVUkwgPSBwYXJzZVVSTExpa2VTcGVjaWZpZXIodmFsdWUsIGJhc2VVUkwpOwogICAgaWYgKGFkZHJlc3NVUkwgPT09IG51bGwpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9J2AsCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoc3BlY2lmaWVyS2V5LmVuZHNXaXRoKCcvJykgJiYgIWFkZHJlc3NVUkwuZW5kc1dpdGgoJy8nKSkgewogICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgYEludmFsaWQgVVJMIGFkZHJlc3MgZm9yIGltcG9ydCBtYXAgc3BlY2lmaWVyICcke3NwZWNpZmllcktleX0nIC0gc2luY2UgdGhlIHNwZWNpZmllciBlbmRzIGluIHNsYXNoLCBzbyBtdXN0IHRoZSBhZGRyZXNzYCwKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBhZGRyZXNzVVJMOwogIH0KCiAgcmV0dXJuIG5vcm1hbGl6ZWQ7Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI25vcm1hbGl6ZS1hLXNwZWNpZmllci1rZXkKZnVuY3Rpb24gbm9ybWFsaXplU3BlY2lmaWVyS2V5KGtleSkgewogIGlmIChrZXkgPT09ICcnKSB7CiAgICBjb25zb2xlLndhcm4oYFNwZWNpZmllciBrZXlzIGluIGltcG9ydCBtYXBzIG1heSBub3QgYmUgdGhlIGVtcHR5IHN0cmluZ2ApOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICByZXR1cm4gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKGtleSwgYmFzZVVSTCkgfHwga2V5Owp9CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNwYXJzZS1hLXVybC1saWtlLWltcG9ydC1zcGVjaWZpZXIKZnVuY3Rpb24gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKHNwZWNpZmllciwgYmFzZVVSTCkgewogIGNvbnN0IHVzZUJhc2VVcmxBc1BhcmVudCA9CiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLycpIHx8CiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSB8fAogICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4uLycpOwoKICB0cnkgewogICAgcmV0dXJuIG5ldyBVUkwoc3BlY2lmaWVyLCB1c2VCYXNlVXJsQXNQYXJlbnQgPyBiYXNlVVJMIDogdW5kZWZpbmVkKS5ocmVmOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNzb3J0LWFuZC1ub3JtYWxpemUtc2NvcGVzCmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTY29wZXMobWFwLCBiYXNlVVJMKSB7CiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTsKCiAgZm9yIChsZXQgc2NvcGVQcmVmaXggaW4gbWFwKSB7CiAgICBjb25zdCBwb3RlbnRpYWxTcGVjaWZpZXJNYXAgPSBtYXBbc2NvcGVQcmVmaXhdOwogICAgaWYgKCFpc1BsYWluT2JqZWN0KHBvdGVudGlhbFNwZWNpZmllck1hcCkpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgIGBUaGUgdmFsdWUgb2Ygc2NvcGUgJHtzY29wZVByZWZpeH0gbXVzdCBiZSBhIEpTT04gb2JqZWN0YCwKICAgICAgKTsKICAgIH0KCiAgICBsZXQgc2NvcGVQcmVmaXhVUkw7CiAgICB0cnkgewogICAgICBzY29wZVByZWZpeFVSTCA9IG5ldyBVUkwoc2NvcGVQcmVmaXgsIGJhc2VVUkwpLmhyZWY7CiAgICB9IGNhdGNoIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBTY29wZSBwcmVmaXggVVJMICcke3Njb3BlUHJlZml4fScgd2FzIG5vdCBwYXJzZWFibGUgaW4gaW1wb3J0IG1hcGAsCiAgICAgICk7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIG5vcm1hbGl6ZWRbc2NvcGVQcmVmaXhVUkxdID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcG90ZW50aWFsU3BlY2lmaWVyTWFwLAogICAgICBiYXNlVVJMLAogICAgKTsKICB9CgogIHJldHVybiBub3JtYWxpemVkOwp9CgpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikgewogIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmICFBcnJheS5pc0FycmF5KG9iaik7Cn0KCi8vIC0tLQoKbGV0IGltcG9ydE1hcFByb21pc2UgPSBnZXRJbXBvcnRNYXBQcm9taXNlKCk7CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZShzcGVjaWZpZXIsIGNvbnRleHQsIGRlZmF1bHRSZXNvbHZlKSB7CiAgY29uc3QgeyBwYXJlbnRVUkwgPSBudWxsIH0gPSBjb250ZXh0OwogIGNvbnN0IGltcG9ydE1hcCA9IGF3YWl0IGltcG9ydE1hcFByb21pc2U7CiAgY29uc3QgaW1wb3J0TWFwVXJsID0gcmVzb2x2ZVNwZWNpZmllcihpbXBvcnRNYXAsIHNwZWNpZmllciwgcGFyZW50VVJMKTsKCiAgcmV0dXJuIGRlZmF1bHRSZXNvbHZlKGltcG9ydE1hcFVybCA/PyBzcGVjaWZpZXIsIGNvbnRleHQsIGRlZmF1bHRSZXNvbHZlKTsKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWQodXJsLCBjb250ZXh0LCBkZWZhdWx0TG9hZCkgewogIGlmICh1cmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IHVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7CiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpOwogICAgaWYgKCFyZXMub2spIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggbW9kdWxlIGZyb20gJHt1cmx9YCk7CiAgICB9CiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZXMudGV4dCgpOwogICAgcmV0dXJuIHsKICAgICAgc2hvcnRDaXJjdWl0OiB0cnVlLAogICAgICBmb3JtYXQ6ICdtb2R1bGUnLAogICAgICBzb3VyY2UsCiAgICB9OwogIH0KCiAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnbm9kZTonKSkgewogICAgY29udGV4dC5mb3JtYXQgPSAnbW9kdWxlJzsKICB9CgogIHJldHVybiBkZWZhdWx0TG9hZCh1cmwsIGNvbnRleHQsIGRlZmF1bHRMb2FkKTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0SW1wb3J0TWFwUHJvbWlzZSgpIHsKICBjb25zdCByZWxhdGl2ZVBhdGggPSBwcm9jZXNzLmVudi5JTVBPUlRfTUFQX1BBVEggfHwgSU1QT1JUX01BUF9GSUxFX05BTUU7CiAgY29uc3QgaW1wb3J0TWFwUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZWxhdGl2ZVBhdGgpOwoKICBsZXQgc3RyOwogIHRyeSB7CiAgICBzdHIgPSBhd2FpdCBmcy5yZWFkRmlsZShpbXBvcnRNYXBQYXRoKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBlbXB0eU1hcCgpOwogIH0KCiAgbGV0IGpzb247CiAgdHJ5IHsKICAgIGpzb24gPSBhd2FpdCBKU09OLnBhcnNlKHN0cik7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB0aHJvdyBFcnJvcigKICAgICAgYEltcG9ydCBtYXAgYXQgJHtpbXBvcnRNYXBQYXRofSBjb250YWlucyBpbnZhbGlkIGpzb246ICR7ZXJyLm1lc3NhZ2V9YCwKICAgICk7CiAgfQoKICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAoanNvbik7Cn0KCmdsb2JhbC5ub2RlTG9hZGVyID0gZ2xvYmFsLm5vZGVMb2FkZXIgfHwge307CgpnbG9iYWwubm9kZUxvYWRlci5zZXRJbXBvcnRNYXBQcm9taXNlID0gZnVuY3Rpb24gc2V0SW1wb3J0TWFwUHJvbWlzZShwcm9taXNlKSB7CiAgaW1wb3J0TWFwUHJvbWlzZSA9IHByb21pc2UudGhlbigobWFwKSA9PiB7CiAgICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAobWFwKTsKICB9KTsKfTsKCmZ1bmN0aW9uIGVtcHR5TWFwKCkgewogIHJldHVybiB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH07Cn0K'; // libs/native-federation-node/src/lib/node/init-node-federation.ts var defaultOptions = { diff --git a/libs/native-federation-node/src/lib/utils/import-map-loader.js b/libs/native-federation-node/src/lib/utils/import-map-loader.js index 21dc80de..d939b7a6 100644 --- a/libs/native-federation-node/src/lib/utils/import-map-loader.js +++ b/libs/native-federation-node/src/lib/utils/import-map-loader.js @@ -29,14 +29,6 @@ export function resolveSpecifier(importMap, specifier, parentURL) { if (scopeImportsMatch) { return scopeImportsMatch; } - } else { - const topLevelImportsMatch = resolveImportsMatch( - normalizedSpecifier, - importMap.imports, - ); - if (topLevelImportsMatch) { - return topLevelImportsMatch; - } } } diff --git a/libs/native-federation-node/src/lib/utils/loader-as-data-url.js b/libs/native-federation-node/src/lib/utils/loader-as-data-url.js index 425926fb..4670b050 100644 --- a/libs/native-federation-node/src/lib/utils/loader-as-data-url.js +++ b/libs/native-federation-node/src/lib/utils/loader-as-data-url.js @@ -1,2 +1,2 @@ export const resolver = - 'aW1wb3J0IHBhdGggZnJvbSAncGF0aCc7CmltcG9ydCB1cmwgZnJvbSAndXJsJzsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7CgpleHBvcnQgY29uc3QgSU1QT1JUX01BUF9GSUxFX05BTUUgPSAnbm9kZS5pbXBvcnRtYXAnOwoKY29uc3QgYmFzZVVSTCA9IHVybC5wYXRoVG9GaWxlVVJMKHByb2Nlc3MuY3dkKCkpICsgcGF0aC5zZXA7CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNuZXctcmVzb2x2ZS1hbGdvcml0aG0KZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTcGVjaWZpZXIoaW1wb3J0TWFwLCBzcGVjaWZpZXIsIHBhcmVudFVSTCkgewogIGxldCBjdXJyZW50QmFzZVVSTDsKICBpZiAocGFyZW50VVJMKSB7CiAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHBhcmVudFVSTC5sYXN0SW5kZXhPZihwYXRoLnNlcCk7CiAgICBjdXJyZW50QmFzZVVSTCA9IHBhcmVudFVSTC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCArIDEpOwogIH0gZWxzZSB7CiAgICBjdXJyZW50QmFzZVVSTCA9IGJhc2VVUkw7CiAgfQogIGNvbnN0IG5vcm1hbGl6ZWRTcGVjaWZpZXIgPQogICAgcGFyc2VVUkxMaWtlU3BlY2lmaWVyKHNwZWNpZmllciwgY3VycmVudEJhc2VVUkwpIHx8IHNwZWNpZmllcjsKICBmb3IgKGxldCBzY29wZVByZWZpeCBpbiBpbXBvcnRNYXAuc2NvcGVzKSB7CiAgICBpZiAoCiAgICAgIHNjb3BlUHJlZml4ID09PSBjdXJyZW50QmFzZVVSTCB8fAogICAgICAoc2NvcGVQcmVmaXguZW5kc1dpdGgoJy8nKSAmJiBjdXJyZW50QmFzZVVSTC5zdGFydHNXaXRoKHNjb3BlUHJlZml4KSkKICAgICkgewogICAgICBjb25zdCBzY29wZUltcG9ydHNNYXRjaCA9IHJlc29sdmVJbXBvcnRzTWF0Y2goCiAgICAgICAgbm9ybWFsaXplZFNwZWNpZmllciwKICAgICAgICBpbXBvcnRNYXAuc2NvcGVzW3Njb3BlUHJlZml4XSwKICAgICAgKTsKICAgICAgaWYgKHNjb3BlSW1wb3J0c01hdGNoKSB7CiAgICAgICAgcmV0dXJuIHNjb3BlSW1wb3J0c01hdGNoOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCB0b3BMZXZlbEltcG9ydHNNYXRjaCA9IHJlc29sdmVJbXBvcnRzTWF0Y2goCiAgICAgICAgbm9ybWFsaXplZFNwZWNpZmllciwKICAgICAgICBpbXBvcnRNYXAuaW1wb3J0cywKICAgICAgKTsKICAgICAgaWYgKHRvcExldmVsSW1wb3J0c01hdGNoKSB7CiAgICAgICAgcmV0dXJuIHRvcExldmVsSW1wb3J0c01hdGNoOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gcmVzb2x2ZUltcG9ydHNNYXRjaChub3JtYWxpemVkU3BlY2lmaWVyLCBpbXBvcnRNYXAuaW1wb3J0cyk7Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI3Jlc29sdmUtYW4taW1wb3J0cy1tYXRjaApmdW5jdGlvbiByZXNvbHZlSW1wb3J0c01hdGNoKG5vcm1hbGl6ZWRTcGVjaWZpZXIsIHNwZWNpZmllck1hcCkgewogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBzcGVjaWZpZXJNYXApIHsKICAgIGNvbnN0IHJlc29sdXRpb25SZXN1bHQgPSBzcGVjaWZpZXJNYXBbc3BlY2lmaWVyS2V5XTsKCiAgICBpZiAoc3BlY2lmaWVyS2V5ID09PSBub3JtYWxpemVkU3BlY2lmaWVyKSB7CiAgICAgIGlmIChyZXNvbHV0aW9uUmVzdWx0ID09PSBudWxsKSB7CiAgICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgICAgYFRoZSBpbXBvcnQgbWFwIHJlc29sdXRpb24gb2YgJHtzcGVjaWZpZXJLZXl9IGZhaWxlZCBkdWUgdG8gYSBudWxsIGVudHJ5YCwKICAgICAgICApOwogICAgICB9CiAgICAgIHJldHVybiByZXNvbHV0aW9uUmVzdWx0OwogICAgfSBlbHNlIGlmICgKICAgICAgc3BlY2lmaWVyS2V5LmVuZHNXaXRoKCcvJykgJiYKICAgICAgbm9ybWFsaXplZFNwZWNpZmllci5zdGFydHNXaXRoKHNwZWNpZmllcktleSkKICAgICkgewogICAgICBpZiAocmVzb2x1dGlvblJlc3VsdCA9PT0gbnVsbCkgewogICAgICAgIHRocm93IFR5cGVFcnJvcigKICAgICAgICAgIGBUaGUgaW1wb3J0IG1hcCByZXNvbHV0aW9uIG9mICR7c3BlY2lmaWVyS2V5fSBmYWlsZWQgZHVlIHRvIGEgbnVsbCBlbnRyeWAsCiAgICAgICAgKTsKICAgICAgfQogICAgICBjb25zdCBhZnRlclByZWZpeCA9IG5vcm1hbGl6ZWRTcGVjaWZpZXIuc2xpY2Uoc3BlY2lmaWVyS2V5Lmxlbmd0aCk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIG5ldyBVUkwoYWZ0ZXJQcmVmaXgsIHJlc29sdXRpb25SZXN1bHQpLmhyZWY7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHRocm93IFR5cGVFcnJvcigKICAgICAgICAgIGBUaGUgaW1wb3J0IG1hcCByZXNvbHV0aW9uIG9mICR7c3BlY2lmaWVyS2V5fSBmYWlsZWQgZHVlIHRvIFVSTCBwYXJzZSBmYWlsdXJlYCwKICAgICAgICApOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9pbXBvcnQtbWFwcy8jcGFyc2luZwpleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgLy8gU3RlcCAyCiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CgogIC8vIFN0ZXAgMwogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cyA9IHt9OwoKICAvLyBTdGVwIDQKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZCwgJ2ltcG9ydHMnKSkgewogICAgLy8gU3RlcCA0LjEKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuaW1wb3J0cykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJpbXBvcnRzIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdGApOwogICAgfQoKICAgIC8vIFN0ZXAgNC4yCiAgICBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cyA9IHNvcnRBbmROb3JtYWxpemVTcGVjaWZpZXJNYXAoCiAgICAgIHBhcnNlZC5pbXBvcnRzLAogICAgICBiYXNlVVJMLAogICAgKTsKICB9CgogIC8vIFN0ZXAgNQogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0ge307CgogIC8vIFN0ZXAgNgogIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyc2VkLCAnc2NvcGVzJykpIHsKICAgIC8vIFN0ZXAgNi4xCiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLnNjb3BlcykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJzY29wZXMiIHByb3BlcnR5IG11c3QgYmUgYW4gb2JqZWN0YCk7CiAgICB9CgogICAgLy8gU3RlcCA2LjIKICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSBzb3J0QW5kTm9ybWFsaXplU2NvcGVzKHBhcnNlZC5zY29wZXMsIGJhc2VVUkwpOwogIH0KCiAgLy8gU3RlcCA3CiAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhwYXJzZWQpLmZpbHRlcigKICAgIChrZXkpID0+IGtleSAhPT0gJ2ltcG9ydHMnICYmIGtleSAhPT0gJ3Njb3BlcycsCiAgKTsKICBpZiAoaW52YWxpZEtleXMubGVuZ3RoID4gMCkgewogICAgY29uc29sZS53YXJuKAogICAgICBgSW52YWxpZCB0b3AtbGV2ZWwga2V5JHsKICAgICAgICBpbnZhbGlkS2V5cy5sZW5ndGggPiAwID8gJ3MnIDogJycKICAgICAgfSBpbiBpbXBvcnQgbWFwIC0gJHtpbnZhbGlkS2V5cy5qb2luKCcsICcpfWAsCiAgICApOwogIH0KCiAgLy8gU3RlcCA4CiAgcmV0dXJuIHsKICAgIGltcG9ydHM6IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzLAogICAgc2NvcGVzOiBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzLAogIH07Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI3NvcnQtYW5kLW5vcm1hbGl6ZS1hLXNwZWNpZmllci1tYXAKZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcChtYXAsIGJhc2VVUkwpIHsKICBjb25zdCBub3JtYWxpemVkID0ge307CgogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBtYXApIHsKICAgIGNvbnN0IHZhbHVlID0gbWFwW3NwZWNpZmllcktleV07CgogICAgY29uc3Qgbm9ybWFsaXplZFNwZWNpZmllcktleSA9IG5vcm1hbGl6ZVNwZWNpZmllcktleShzcGVjaWZpZXJLZXksIGJhc2VVUkwpOwogICAgaWYgKG5vcm1hbGl6ZWRTcGVjaWZpZXJLZXkgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CgogICAgbGV0IGFkZHJlc3NVUkwgPSBwYXJzZVVSTExpa2VTcGVjaWZpZXIodmFsdWUsIGJhc2VVUkwpOwogICAgaWYgKGFkZHJlc3NVUkwgPT09IG51bGwpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9J2AsCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoc3BlY2lmaWVyS2V5LmVuZHNXaXRoKCcvJykgJiYgIWFkZHJlc3NVUkwuZW5kc1dpdGgoJy8nKSkgewogICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgYEludmFsaWQgVVJMIGFkZHJlc3MgZm9yIGltcG9ydCBtYXAgc3BlY2lmaWVyICcke3NwZWNpZmllcktleX0nIC0gc2luY2UgdGhlIHNwZWNpZmllciBlbmRzIGluIHNsYXNoLCBzbyBtdXN0IHRoZSBhZGRyZXNzYCwKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBhZGRyZXNzVVJMOwogIH0KCiAgcmV0dXJuIG5vcm1hbGl6ZWQ7Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI25vcm1hbGl6ZS1hLXNwZWNpZmllci1rZXkKZnVuY3Rpb24gbm9ybWFsaXplU3BlY2lmaWVyS2V5KGtleSkgewogIGlmIChrZXkgPT09ICcnKSB7CiAgICBjb25zb2xlLndhcm4oYFNwZWNpZmllciBrZXlzIGluIGltcG9ydCBtYXBzIG1heSBub3QgYmUgdGhlIGVtcHR5IHN0cmluZ2ApOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICByZXR1cm4gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKGtleSwgYmFzZVVSTCkgfHwga2V5Owp9CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNwYXJzZS1hLXVybC1saWtlLWltcG9ydC1zcGVjaWZpZXIKZnVuY3Rpb24gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKHNwZWNpZmllciwgYmFzZVVSTCkgewogIGNvbnN0IHVzZUJhc2VVcmxBc1BhcmVudCA9CiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLycpIHx8CiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSB8fAogICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4uLycpOwoKICB0cnkgewogICAgcmV0dXJuIG5ldyBVUkwoc3BlY2lmaWVyLCB1c2VCYXNlVXJsQXNQYXJlbnQgPyBiYXNlVVJMIDogdW5kZWZpbmVkKS5ocmVmOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNzb3J0LWFuZC1ub3JtYWxpemUtc2NvcGVzCmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTY29wZXMobWFwLCBiYXNlVVJMKSB7CiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTsKCiAgZm9yIChsZXQgc2NvcGVQcmVmaXggaW4gbWFwKSB7CiAgICBjb25zdCBwb3RlbnRpYWxTcGVjaWZpZXJNYXAgPSBtYXBbc2NvcGVQcmVmaXhdOwogICAgaWYgKCFpc1BsYWluT2JqZWN0KHBvdGVudGlhbFNwZWNpZmllck1hcCkpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgIGBUaGUgdmFsdWUgb2Ygc2NvcGUgJHtzY29wZVByZWZpeH0gbXVzdCBiZSBhIEpTT04gb2JqZWN0YCwKICAgICAgKTsKICAgIH0KCiAgICBsZXQgc2NvcGVQcmVmaXhVUkw7CiAgICB0cnkgewogICAgICBzY29wZVByZWZpeFVSTCA9IG5ldyBVUkwoc2NvcGVQcmVmaXgsIGJhc2VVUkwpLmhyZWY7CiAgICB9IGNhdGNoIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBTY29wZSBwcmVmaXggVVJMICcke3Njb3BlUHJlZml4fScgd2FzIG5vdCBwYXJzZWFibGUgaW4gaW1wb3J0IG1hcGAsCiAgICAgICk7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIG5vcm1hbGl6ZWRbc2NvcGVQcmVmaXhVUkxdID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcG90ZW50aWFsU3BlY2lmaWVyTWFwLAogICAgICBiYXNlVVJMLAogICAgKTsKICB9CgogIHJldHVybiBub3JtYWxpemVkOwp9CgpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikgewogIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmICFBcnJheS5pc0FycmF5KG9iaik7Cn0KCi8vIC0tLQoKbGV0IGltcG9ydE1hcFByb21pc2UgPSBnZXRJbXBvcnRNYXBQcm9taXNlKCk7CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZShzcGVjaWZpZXIsIGNvbnRleHQsIGRlZmF1bHRSZXNvbHZlKSB7CiAgY29uc3QgeyBwYXJlbnRVUkwgPSBudWxsIH0gPSBjb250ZXh0OwogIGNvbnN0IGltcG9ydE1hcCA9IGF3YWl0IGltcG9ydE1hcFByb21pc2U7CiAgY29uc3QgaW1wb3J0TWFwVXJsID0gcmVzb2x2ZVNwZWNpZmllcihpbXBvcnRNYXAsIHNwZWNpZmllciwgcGFyZW50VVJMKTsKCiAgcmV0dXJuIGRlZmF1bHRSZXNvbHZlKGltcG9ydE1hcFVybCA/PyBzcGVjaWZpZXIsIGNvbnRleHQsIGRlZmF1bHRSZXNvbHZlKTsKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWQodXJsLCBjb250ZXh0LCBkZWZhdWx0TG9hZCkgewogIGlmICh1cmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IHVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7CiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpOwogICAgaWYgKCFyZXMub2spIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggbW9kdWxlIGZyb20gJHt1cmx9YCk7CiAgICB9CiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZXMudGV4dCgpOwogICAgcmV0dXJuIHsKICAgICAgc2hvcnRDaXJjdWl0OiB0cnVlLAogICAgICBmb3JtYXQ6ICdtb2R1bGUnLAogICAgICBzb3VyY2UsCiAgICB9OwogIH0KCiAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnbm9kZTonKSkgewogICAgY29udGV4dC5mb3JtYXQgPSAnbW9kdWxlJzsKICB9CgogIHJldHVybiBkZWZhdWx0TG9hZCh1cmwsIGNvbnRleHQsIGRlZmF1bHRMb2FkKTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0SW1wb3J0TWFwUHJvbWlzZSgpIHsKICBjb25zdCByZWxhdGl2ZVBhdGggPSBwcm9jZXNzLmVudi5JTVBPUlRfTUFQX1BBVEggfHwgSU1QT1JUX01BUF9GSUxFX05BTUU7CiAgY29uc3QgaW1wb3J0TWFwUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZWxhdGl2ZVBhdGgpOwoKICBsZXQgc3RyOwogIHRyeSB7CiAgICBzdHIgPSBhd2FpdCBmcy5yZWFkRmlsZShpbXBvcnRNYXBQYXRoKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBlbXB0eU1hcCgpOwogIH0KCiAgbGV0IGpzb247CiAgdHJ5IHsKICAgIGpzb24gPSBhd2FpdCBKU09OLnBhcnNlKHN0cik7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB0aHJvdyBFcnJvcigKICAgICAgYEltcG9ydCBtYXAgYXQgJHtpbXBvcnRNYXBQYXRofSBjb250YWlucyBpbnZhbGlkIGpzb246ICR7ZXJyLm1lc3NhZ2V9YCwKICAgICk7CiAgfQoKICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAoanNvbik7Cn0KCmdsb2JhbC5ub2RlTG9hZGVyID0gZ2xvYmFsLm5vZGVMb2FkZXIgfHwge307CgpnbG9iYWwubm9kZUxvYWRlci5zZXRJbXBvcnRNYXBQcm9taXNlID0gZnVuY3Rpb24gc2V0SW1wb3J0TWFwUHJvbWlzZShwcm9taXNlKSB7CiAgaW1wb3J0TWFwUHJvbWlzZSA9IHByb21pc2UudGhlbigobWFwKSA9PiB7CiAgICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAobWFwKTsKICB9KTsKfTsKCmZ1bmN0aW9uIGVtcHR5TWFwKCkgewogIHJldHVybiB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH07Cn0K'; + 'aW1wb3J0IHBhdGggZnJvbSAncGF0aCc7CmltcG9ydCB1cmwgZnJvbSAndXJsJzsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7CgpleHBvcnQgY29uc3QgSU1QT1JUX01BUF9GSUxFX05BTUUgPSAnbm9kZS5pbXBvcnRtYXAnOwoKY29uc3QgYmFzZVVSTCA9IHVybC5wYXRoVG9GaWxlVVJMKHByb2Nlc3MuY3dkKCkpICsgcGF0aC5zZXA7CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNuZXctcmVzb2x2ZS1hbGdvcml0aG0KZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTcGVjaWZpZXIoaW1wb3J0TWFwLCBzcGVjaWZpZXIsIHBhcmVudFVSTCkgewogIGxldCBjdXJyZW50QmFzZVVSTDsKICBpZiAocGFyZW50VVJMKSB7CiAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHBhcmVudFVSTC5sYXN0SW5kZXhPZihwYXRoLnNlcCk7CiAgICBjdXJyZW50QmFzZVVSTCA9IHBhcmVudFVSTC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCArIDEpOwogIH0gZWxzZSB7CiAgICBjdXJyZW50QmFzZVVSTCA9IGJhc2VVUkw7CiAgfQogIGNvbnN0IG5vcm1hbGl6ZWRTcGVjaWZpZXIgPQogICAgcGFyc2VVUkxMaWtlU3BlY2lmaWVyKHNwZWNpZmllciwgY3VycmVudEJhc2VVUkwpIHx8IHNwZWNpZmllcjsKICBmb3IgKGxldCBzY29wZVByZWZpeCBpbiBpbXBvcnRNYXAuc2NvcGVzKSB7CiAgICBpZiAoCiAgICAgIHNjb3BlUHJlZml4ID09PSBjdXJyZW50QmFzZVVSTCB8fAogICAgICAoc2NvcGVQcmVmaXguZW5kc1dpdGgoJy8nKSAmJiBjdXJyZW50QmFzZVVSTC5zdGFydHNXaXRoKHNjb3BlUHJlZml4KSkKICAgICkgewogICAgICBjb25zdCBzY29wZUltcG9ydHNNYXRjaCA9IHJlc29sdmVJbXBvcnRzTWF0Y2goCiAgICAgICAgbm9ybWFsaXplZFNwZWNpZmllciwKICAgICAgICBpbXBvcnRNYXAuc2NvcGVzW3Njb3BlUHJlZml4XSwKICAgICAgKTsKICAgICAgaWYgKHNjb3BlSW1wb3J0c01hdGNoKSB7CiAgICAgICAgcmV0dXJuIHNjb3BlSW1wb3J0c01hdGNoOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gcmVzb2x2ZUltcG9ydHNNYXRjaChub3JtYWxpemVkU3BlY2lmaWVyLCBpbXBvcnRNYXAuaW1wb3J0cyk7Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI3Jlc29sdmUtYW4taW1wb3J0cy1tYXRjaApmdW5jdGlvbiByZXNvbHZlSW1wb3J0c01hdGNoKG5vcm1hbGl6ZWRTcGVjaWZpZXIsIHNwZWNpZmllck1hcCkgewogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBzcGVjaWZpZXJNYXApIHsKICAgIGNvbnN0IHJlc29sdXRpb25SZXN1bHQgPSBzcGVjaWZpZXJNYXBbc3BlY2lmaWVyS2V5XTsKCiAgICBpZiAoc3BlY2lmaWVyS2V5ID09PSBub3JtYWxpemVkU3BlY2lmaWVyKSB7CiAgICAgIGlmIChyZXNvbHV0aW9uUmVzdWx0ID09PSBudWxsKSB7CiAgICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgICAgYFRoZSBpbXBvcnQgbWFwIHJlc29sdXRpb24gb2YgJHtzcGVjaWZpZXJLZXl9IGZhaWxlZCBkdWUgdG8gYSBudWxsIGVudHJ5YCwKICAgICAgICApOwogICAgICB9CiAgICAgIHJldHVybiByZXNvbHV0aW9uUmVzdWx0OwogICAgfSBlbHNlIGlmICgKICAgICAgc3BlY2lmaWVyS2V5LmVuZHNXaXRoKCcvJykgJiYKICAgICAgbm9ybWFsaXplZFNwZWNpZmllci5zdGFydHNXaXRoKHNwZWNpZmllcktleSkKICAgICkgewogICAgICBpZiAocmVzb2x1dGlvblJlc3VsdCA9PT0gbnVsbCkgewogICAgICAgIHRocm93IFR5cGVFcnJvcigKICAgICAgICAgIGBUaGUgaW1wb3J0IG1hcCByZXNvbHV0aW9uIG9mICR7c3BlY2lmaWVyS2V5fSBmYWlsZWQgZHVlIHRvIGEgbnVsbCBlbnRyeWAsCiAgICAgICAgKTsKICAgICAgfQogICAgICBjb25zdCBhZnRlclByZWZpeCA9IG5vcm1hbGl6ZWRTcGVjaWZpZXIuc2xpY2Uoc3BlY2lmaWVyS2V5Lmxlbmd0aCk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIG5ldyBVUkwoYWZ0ZXJQcmVmaXgsIHJlc29sdXRpb25SZXN1bHQpLmhyZWY7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHRocm93IFR5cGVFcnJvcigKICAgICAgICAgIGBUaGUgaW1wb3J0IG1hcCByZXNvbHV0aW9uIG9mICR7c3BlY2lmaWVyS2V5fSBmYWlsZWQgZHVlIHRvIFVSTCBwYXJzZSBmYWlsdXJlYCwKICAgICAgICApOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9pbXBvcnQtbWFwcy8jcGFyc2luZwpleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgLy8gU3RlcCAyCiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CgogIC8vIFN0ZXAgMwogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cyA9IHt9OwoKICAvLyBTdGVwIDQKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZCwgJ2ltcG9ydHMnKSkgewogICAgLy8gU3RlcCA0LjEKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuaW1wb3J0cykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJpbXBvcnRzIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdGApOwogICAgfQoKICAgIC8vIFN0ZXAgNC4yCiAgICBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cyA9IHNvcnRBbmROb3JtYWxpemVTcGVjaWZpZXJNYXAoCiAgICAgIHBhcnNlZC5pbXBvcnRzLAogICAgICBiYXNlVVJMLAogICAgKTsKICB9CgogIC8vIFN0ZXAgNQogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0ge307CgogIC8vIFN0ZXAgNgogIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyc2VkLCAnc2NvcGVzJykpIHsKICAgIC8vIFN0ZXAgNi4xCiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLnNjb3BlcykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJzY29wZXMiIHByb3BlcnR5IG11c3QgYmUgYW4gb2JqZWN0YCk7CiAgICB9CgogICAgLy8gU3RlcCA2LjIKICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSBzb3J0QW5kTm9ybWFsaXplU2NvcGVzKHBhcnNlZC5zY29wZXMsIGJhc2VVUkwpOwogIH0KCiAgLy8gU3RlcCA3CiAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhwYXJzZWQpLmZpbHRlcigKICAgIChrZXkpID0+IGtleSAhPT0gJ2ltcG9ydHMnICYmIGtleSAhPT0gJ3Njb3BlcycsCiAgKTsKICBpZiAoaW52YWxpZEtleXMubGVuZ3RoID4gMCkgewogICAgY29uc29sZS53YXJuKAogICAgICBgSW52YWxpZCB0b3AtbGV2ZWwga2V5JHsKICAgICAgICBpbnZhbGlkS2V5cy5sZW5ndGggPiAwID8gJ3MnIDogJycKICAgICAgfSBpbiBpbXBvcnQgbWFwIC0gJHtpbnZhbGlkS2V5cy5qb2luKCcsICcpfWAsCiAgICApOwogIH0KCiAgLy8gU3RlcCA4CiAgcmV0dXJuIHsKICAgIGltcG9ydHM6IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzLAogICAgc2NvcGVzOiBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzLAogIH07Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI3NvcnQtYW5kLW5vcm1hbGl6ZS1hLXNwZWNpZmllci1tYXAKZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcChtYXAsIGJhc2VVUkwpIHsKICBjb25zdCBub3JtYWxpemVkID0ge307CgogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBtYXApIHsKICAgIGNvbnN0IHZhbHVlID0gbWFwW3NwZWNpZmllcktleV07CgogICAgY29uc3Qgbm9ybWFsaXplZFNwZWNpZmllcktleSA9IG5vcm1hbGl6ZVNwZWNpZmllcktleShzcGVjaWZpZXJLZXksIGJhc2VVUkwpOwogICAgaWYgKG5vcm1hbGl6ZWRTcGVjaWZpZXJLZXkgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CgogICAgbGV0IGFkZHJlc3NVUkwgPSBwYXJzZVVSTExpa2VTcGVjaWZpZXIodmFsdWUsIGJhc2VVUkwpOwogICAgaWYgKGFkZHJlc3NVUkwgPT09IG51bGwpIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBJbnZhbGlkIFVSTCBhZGRyZXNzIGZvciBpbXBvcnQgbWFwIHNwZWNpZmllciAnJHtzcGVjaWZpZXJLZXl9J2AsCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoc3BlY2lmaWVyS2V5LmVuZHNXaXRoKCcvJykgJiYgIWFkZHJlc3NVUkwuZW5kc1dpdGgoJy8nKSkgewogICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgYEludmFsaWQgVVJMIGFkZHJlc3MgZm9yIGltcG9ydCBtYXAgc3BlY2lmaWVyICcke3NwZWNpZmllcktleX0nIC0gc2luY2UgdGhlIHNwZWNpZmllciBlbmRzIGluIHNsYXNoLCBzbyBtdXN0IHRoZSBhZGRyZXNzYCwKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBhZGRyZXNzVVJMOwogIH0KCiAgcmV0dXJuIG5vcm1hbGl6ZWQ7Cn0KCi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vaW1wb3J0LW1hcHMvI25vcm1hbGl6ZS1hLXNwZWNpZmllci1rZXkKZnVuY3Rpb24gbm9ybWFsaXplU3BlY2lmaWVyS2V5KGtleSkgewogIGlmIChrZXkgPT09ICcnKSB7CiAgICBjb25zb2xlLndhcm4oYFNwZWNpZmllciBrZXlzIGluIGltcG9ydCBtYXBzIG1heSBub3QgYmUgdGhlIGVtcHR5IHN0cmluZ2ApOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICByZXR1cm4gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKGtleSwgYmFzZVVSTCkgfHwga2V5Owp9CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNwYXJzZS1hLXVybC1saWtlLWltcG9ydC1zcGVjaWZpZXIKZnVuY3Rpb24gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKHNwZWNpZmllciwgYmFzZVVSTCkgewogIGNvbnN0IHVzZUJhc2VVcmxBc1BhcmVudCA9CiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLycpIHx8CiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSB8fAogICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4uLycpOwoKICB0cnkgewogICAgcmV0dXJuIG5ldyBVUkwoc3BlY2lmaWVyLCB1c2VCYXNlVXJsQXNQYXJlbnQgPyBiYXNlVVJMIDogdW5kZWZpbmVkKS5ocmVmOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgovLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2ltcG9ydC1tYXBzLyNzb3J0LWFuZC1ub3JtYWxpemUtc2NvcGVzCmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTY29wZXMobWFwLCBiYXNlVVJMKSB7CiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTsKCiAgZm9yIChsZXQgc2NvcGVQcmVmaXggaW4gbWFwKSB7CiAgICBjb25zdCBwb3RlbnRpYWxTcGVjaWZpZXJNYXAgPSBtYXBbc2NvcGVQcmVmaXhdOwogICAgaWYgKCFpc1BsYWluT2JqZWN0KHBvdGVudGlhbFNwZWNpZmllck1hcCkpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgIGBUaGUgdmFsdWUgb2Ygc2NvcGUgJHtzY29wZVByZWZpeH0gbXVzdCBiZSBhIEpTT04gb2JqZWN0YCwKICAgICAgKTsKICAgIH0KCiAgICBsZXQgc2NvcGVQcmVmaXhVUkw7CiAgICB0cnkgewogICAgICBzY29wZVByZWZpeFVSTCA9IG5ldyBVUkwoc2NvcGVQcmVmaXgsIGJhc2VVUkwpLmhyZWY7CiAgICB9IGNhdGNoIHsKICAgICAgY29uc29sZS53YXJuKAogICAgICAgIGBTY29wZSBwcmVmaXggVVJMICcke3Njb3BlUHJlZml4fScgd2FzIG5vdCBwYXJzZWFibGUgaW4gaW1wb3J0IG1hcGAsCiAgICAgICk7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIG5vcm1hbGl6ZWRbc2NvcGVQcmVmaXhVUkxdID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcG90ZW50aWFsU3BlY2lmaWVyTWFwLAogICAgICBiYXNlVVJMLAogICAgKTsKICB9CgogIHJldHVybiBub3JtYWxpemVkOwp9CgpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikgewogIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmICFBcnJheS5pc0FycmF5KG9iaik7Cn0KCi8vIC0tLQoKbGV0IGltcG9ydE1hcFByb21pc2UgPSBnZXRJbXBvcnRNYXBQcm9taXNlKCk7CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZShzcGVjaWZpZXIsIGNvbnRleHQsIGRlZmF1bHRSZXNvbHZlKSB7CiAgY29uc3QgeyBwYXJlbnRVUkwgPSBudWxsIH0gPSBjb250ZXh0OwogIGNvbnN0IGltcG9ydE1hcCA9IGF3YWl0IGltcG9ydE1hcFByb21pc2U7CiAgY29uc3QgaW1wb3J0TWFwVXJsID0gcmVzb2x2ZVNwZWNpZmllcihpbXBvcnRNYXAsIHNwZWNpZmllciwgcGFyZW50VVJMKTsKCiAgcmV0dXJuIGRlZmF1bHRSZXNvbHZlKGltcG9ydE1hcFVybCA/PyBzcGVjaWZpZXIsIGNvbnRleHQsIGRlZmF1bHRSZXNvbHZlKTsKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWQodXJsLCBjb250ZXh0LCBkZWZhdWx0TG9hZCkgewogIGlmICh1cmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IHVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7CiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpOwogICAgaWYgKCFyZXMub2spIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggbW9kdWxlIGZyb20gJHt1cmx9YCk7CiAgICB9CiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZXMudGV4dCgpOwogICAgcmV0dXJuIHsKICAgICAgc2hvcnRDaXJjdWl0OiB0cnVlLAogICAgICBmb3JtYXQ6ICdtb2R1bGUnLAogICAgICBzb3VyY2UsCiAgICB9OwogIH0KCiAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnbm9kZTonKSkgewogICAgY29udGV4dC5mb3JtYXQgPSAnbW9kdWxlJzsKICB9CgogIHJldHVybiBkZWZhdWx0TG9hZCh1cmwsIGNvbnRleHQsIGRlZmF1bHRMb2FkKTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0SW1wb3J0TWFwUHJvbWlzZSgpIHsKICBjb25zdCByZWxhdGl2ZVBhdGggPSBwcm9jZXNzLmVudi5JTVBPUlRfTUFQX1BBVEggfHwgSU1QT1JUX01BUF9GSUxFX05BTUU7CiAgY29uc3QgaW1wb3J0TWFwUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZWxhdGl2ZVBhdGgpOwoKICBsZXQgc3RyOwogIHRyeSB7CiAgICBzdHIgPSBhd2FpdCBmcy5yZWFkRmlsZShpbXBvcnRNYXBQYXRoKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBlbXB0eU1hcCgpOwogIH0KCiAgbGV0IGpzb247CiAgdHJ5IHsKICAgIGpzb24gPSBhd2FpdCBKU09OLnBhcnNlKHN0cik7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB0aHJvdyBFcnJvcigKICAgICAgYEltcG9ydCBtYXAgYXQgJHtpbXBvcnRNYXBQYXRofSBjb250YWlucyBpbnZhbGlkIGpzb246ICR7ZXJyLm1lc3NhZ2V9YCwKICAgICk7CiAgfQoKICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAoanNvbik7Cn0KCmdsb2JhbC5ub2RlTG9hZGVyID0gZ2xvYmFsLm5vZGVMb2FkZXIgfHwge307CgpnbG9iYWwubm9kZUxvYWRlci5zZXRJbXBvcnRNYXBQcm9taXNlID0gZnVuY3Rpb24gc2V0SW1wb3J0TWFwUHJvbWlzZShwcm9taXNlKSB7CiAgaW1wb3J0TWFwUHJvbWlzZSA9IHByb21pc2UudGhlbigobWFwKSA9PiB7CiAgICByZXR1cm4gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAobWFwKTsKICB9KTsKfTsKCmZ1bmN0aW9uIGVtcHR5TWFwKCkgewogIHJldHVybiB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH07Cn0K'; diff --git a/libs/native-federation/src/tools/fstart-as-data-url.ts b/libs/native-federation/src/tools/fstart-as-data-url.ts index 21d8317b..80ab54b4 100644 --- a/libs/native-federation/src/tools/fstart-as-data-url.ts +++ b/libs/native-federation/src/tools/fstart-as-data-url.ts @@ -1,2 +1,2 @@ export const fstart = - 'Ly8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvbm9kZS9pbml0LW5vZGUtZmVkZXJhdGlvbi50cwppbXBvcnQgeyByZWdpc3RlciB9IGZyb20gIm5vZGU6bW9kdWxlIjsKaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gIm5vZGU6dXJsIjsKaW1wb3J0ICogYXMgZnMyIGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgKiBhcyBwYXRoMiBmcm9tICJub2RlOnBhdGgiOwoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvZ2xvYmFsLWNhY2hlLnRzCnZhciBuZk5hbWVzcGFjZSA9ICJfX05BVElWRV9GRURFUkFUSU9OX18iOwp2YXIgZ2xvYmFsMiA9IGdsb2JhbFRoaXM7Cmdsb2JhbDJbbmZOYW1lc3BhY2VdID8/PSB7CiAgZXh0ZXJuYWxzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogIHJlbW90ZU5hbWVzVG9SZW1vdGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCiAgYmFzZVVybFRvUmVtb3RlTmFtZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkKfTsKdmFyIGdsb2JhbENhY2hlID0gZ2xvYmFsMltuZk5hbWVzcGFjZV07CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9leHRlcm5hbHMudHMKdmFyIGV4dGVybmFscyA9IGdsb2JhbENhY2hlLmV4dGVybmFsczsKZnVuY3Rpb24gZ2V0RXh0ZXJuYWxLZXkoc2hhcmVkKSB7CiAgcmV0dXJuIGAke3NoYXJlZC5wYWNrYWdlTmFtZX1AJHtzaGFyZWQudmVyc2lvbn1gOwp9CmZ1bmN0aW9uIGdldEV4dGVybmFsVXJsKHNoYXJlZCkgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIHJldHVybiBleHRlcm5hbHMuZ2V0KHBhY2thZ2VLZXkpOwp9CmZ1bmN0aW9uIHNldEV4dGVybmFsVXJsKHNoYXJlZCwgdXJsMikgewogIGNvbnN0IHBhY2thZ2VLZXkgPSBnZXRFeHRlcm5hbEtleShzaGFyZWQpOwogIGV4dGVybmFscy5zZXQocGFja2FnZUtleSwgdXJsMik7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL21vZGVsL2ltcG9ydC1tYXAudHMKZnVuY3Rpb24gbWVyZ2VJbXBvcnRNYXBzKG1hcDEsIG1hcDIpIHsKICByZXR1cm4gewogICAgaW1wb3J0czogeyAuLi5tYXAxLmltcG9ydHMsIC4uLm1hcDIuaW1wb3J0cyB9LAogICAgc2NvcGVzOiB7IC4uLm1hcDEuc2NvcGVzLCAuLi5tYXAyLnNjb3BlcyB9CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvcmVtb3Rlcy50cwp2YXIgcmVtb3RlTmFtZXNUb1JlbW90ZSA9IGdsb2JhbENhY2hlLnJlbW90ZU5hbWVzVG9SZW1vdGU7CnZhciBiYXNlVXJsVG9SZW1vdGVOYW1lcyA9IGdsb2JhbENhY2hlLmJhc2VVcmxUb1JlbW90ZU5hbWVzOwpmdW5jdGlvbiBhZGRSZW1vdGUocmVtb3RlTmFtZSwgcmVtb3RlKSB7CiAgcmVtb3RlTmFtZXNUb1JlbW90ZS5zZXQocmVtb3RlTmFtZSwgcmVtb3RlKTsKICBiYXNlVXJsVG9SZW1vdGVOYW1lcy5zZXQocmVtb3RlLmJhc2VVcmwsIHJlbW90ZU5hbWUpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi91dGlscy9wYXRoLXV0aWxzLnRzCmZ1bmN0aW9uIGdldERpcmVjdG9yeSh1cmwyKSB7CiAgY29uc3QgcGFydHMgPSB1cmwyLnNwbGl0KCIvIik7CiAgcGFydHMucG9wKCk7CiAgcmV0dXJuIHBhcnRzLmpvaW4oIi8iKTsKfQpmdW5jdGlvbiBqb2luUGF0aHMocGF0aDEsIHBhdGgyMikgewogIHdoaWxlIChwYXRoMS5lbmRzV2l0aCgiLyIpKSB7CiAgICBwYXRoMSA9IHBhdGgxLnN1YnN0cmluZygwLCBwYXRoMS5sZW5ndGggLSAxKTsKICB9CiAgaWYgKHBhdGgyMi5zdGFydHNXaXRoKCIuLyIpKSB7CiAgICBwYXRoMjIgPSBwYXRoMjIuc3Vic3RyaW5nKDIsIHBhdGgyMi5sZW5ndGgpOwogIH0KICByZXR1cm4gYCR7cGF0aDF9LyR7cGF0aDIyfWA7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL3dhdGNoLWZlZGVyYXRpb24tYnVpbGQudHMKZnVuY3Rpb24gd2F0Y2hGZWRlcmF0aW9uQnVpbGRDb21wbGV0aW9uKGVuZHBvaW50KSB7CiAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoZW5kcG9pbnQpOwogIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsKICAgIGlmIChkYXRhLnR5cGUgPT09ICJmZWRlcmF0aW9uLXJlYnVpbGQtY29tcGxldGUiIC8qIENPTVBMRVRFRCAqLykgewogICAgICBjb25zb2xlLmxvZygiW0ZlZGVyYXRpb25dIFJlYnVpbGQgY29tcGxldGVkLCByZWxvYWRpbmcuLi4iKTsKICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQogIH07CiAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjb25zb2xlLndhcm4oIltGZWRlcmF0aW9uXSBTU0UgY29ubmVjdGlvbiBlcnJvcjoiLCBldmVudCk7CiAgfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvaW5pdC1mZWRlcmF0aW9uLnRzCmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvcyhyZW1vdGVzLCBvcHRpb25zID0geyB0aHJvd0lmUmVtb3RlTm90Rm91bmQ6IGZhbHNlIH0pIHsKICBjb25zdCBwcm9jZXNzUmVtb3RlSW5mb1Byb21pc2VzID0gT2JqZWN0LmtleXMocmVtb3RlcykubWFwKAogICAgYXN5bmMgKHJlbW90ZU5hbWUpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBsZXQgdXJsMiA9IHJlbW90ZXNbcmVtb3RlTmFtZV07CiAgICAgICAgaWYgKG9wdGlvbnMuY2FjaGVUYWcpIHsKICAgICAgICAgIGNvbnN0IGFkZEFwcGVuZCA9IHJlbW90ZXNbcmVtb3RlTmFtZV0uaW5jbHVkZXMoIj8iKSA/ICImIiA6ICI/IjsKICAgICAgICAgIHVybDIgKz0gYCR7YWRkQXBwZW5kfXQ9JHtvcHRpb25zLmNhY2hlVGFnfWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhd2FpdCBwcm9jZXNzUmVtb3RlSW5mbyh1cmwyLCByZW1vdGVOYW1lKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnN0IGVycm9yID0gYEVycm9yIGxvYWRpbmcgcmVtb3RlIGVudHJ5IGZvciAke3JlbW90ZU5hbWV9IGZyb20gZmlsZSAke3JlbW90ZXNbcmVtb3RlTmFtZV19YDsKICAgICAgICBpZiAob3B0aW9ucy50aHJvd0lmUmVtb3RlTm90Rm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgKTsKICBjb25zdCByZW1vdGVJbXBvcnRNYXBzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvY2Vzc1JlbW90ZUluZm9Qcm9taXNlcyk7CiAgY29uc3QgaW1wb3J0TWFwID0gcmVtb3RlSW1wb3J0TWFwcy5yZWR1Y2UoCiAgICAoYWNjLCByZW1vdGVJbXBvcnRNYXApID0+IHJlbW90ZUltcG9ydE1hcCA/IG1lcmdlSW1wb3J0TWFwcyhhY2MsIHJlbW90ZUltcG9ydE1hcCkgOiBhY2MsCiAgICB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH0KICApOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1JlbW90ZUluZm8oZmVkZXJhdGlvbkluZm9VcmwsIHJlbW90ZU5hbWUpIHsKICBjb25zdCBiYXNlVXJsID0gZ2V0RGlyZWN0b3J5KGZlZGVyYXRpb25JbmZvVXJsKTsKICBjb25zdCByZW1vdGVJbmZvID0gYXdhaXQgbG9hZEZlZGVyYXRpb25JbmZvKGZlZGVyYXRpb25JbmZvVXJsKTsKICBpZiAoIXJlbW90ZU5hbWUpIHsKICAgIHJlbW90ZU5hbWUgPSByZW1vdGVJbmZvLm5hbWU7CiAgfQogIGlmIChyZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50KSB7CiAgICB3YXRjaEZlZGVyYXRpb25CdWlsZENvbXBsZXRpb24oCiAgICAgIGJhc2VVcmwgKyByZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50CiAgICApOwogIH0KICBjb25zdCBpbXBvcnRNYXAgPSBjcmVhdGVSZW1vdGVJbXBvcnRNYXAocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCk7CiAgYWRkUmVtb3RlKHJlbW90ZU5hbWUsIHsgLi4ucmVtb3RlSW5mbywgYmFzZVVybCB9KTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUltcG9ydE1hcChyZW1vdGVJbmZvLCByZW1vdGVOYW1lLCBiYXNlVXJsKSB7CiAgY29uc3QgaW1wb3J0cyA9IHByb2Nlc3NFeHBvc2VkKHJlbW90ZUluZm8sIHJlbW90ZU5hbWUsIGJhc2VVcmwpOwogIGNvbnN0IHNjb3BlcyA9IHByb2Nlc3NSZW1vdGVJbXBvcnRzKHJlbW90ZUluZm8sIGJhc2VVcmwpOwogIHJldHVybiB7IGltcG9ydHMsIHNjb3BlcyB9Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGZWRlcmF0aW9uSW5mbyh1cmwyKSB7CiAgY29uc3QgaW5mbyA9IGF3YWl0IGZldGNoKHVybDIpLnRoZW4oKHIpID0+IHIuanNvbigpKTsKICByZXR1cm4gaW5mbzsKfQpmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW1wb3J0cyhyZW1vdGVJbmZvLCBiYXNlVXJsKSB7CiAgY29uc3Qgc2NvcGVzID0ge307CiAgY29uc3Qgc2NvcGVkSW1wb3J0cyA9IHt9OwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIHJlbW90ZUluZm8uc2hhcmVkKSB7CiAgICBjb25zdCBvdXRGaWxlTmFtZSA9IGdldEV4dGVybmFsVXJsKHNoYXJlZCkgPz8gam9pblBhdGhzKGJhc2VVcmwsIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgICBzZXRFeHRlcm5hbFVybChzaGFyZWQsIG91dEZpbGVOYW1lKTsKICAgIHNjb3BlZEltcG9ydHNbc2hhcmVkLnBhY2thZ2VOYW1lXSA9IG91dEZpbGVOYW1lOwogIH0KICBzY29wZXNbYmFzZVVybCArICIvIl0gPSBzY29wZWRJbXBvcnRzOwogIHJldHVybiBzY29wZXM7Cn0KZnVuY3Rpb24gcHJvY2Vzc0V4cG9zZWQocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCkgewogIGNvbnN0IGltcG9ydHMgPSB7fTsKICBmb3IgKGNvbnN0IGV4cG9zZWQgb2YgcmVtb3RlSW5mby5leHBvc2VzKSB7CiAgICBjb25zdCBrZXkgPSBqb2luUGF0aHMocmVtb3RlTmFtZSwgZXhwb3NlZC5rZXkpOwogICAgY29uc3QgdmFsdWUgPSBqb2luUGF0aHMoYmFzZVVybCwgZXhwb3NlZC5vdXRGaWxlTmFtZSk7CiAgICBpbXBvcnRzW2tleV0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIGltcG9ydHM7Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hvc3RJbmZvKGhvc3RJbmZvLCByZWxCdW5kbGVzUGF0aCA9ICIuLyIpIHsKICBjb25zdCBpbXBvcnRzID0gaG9zdEluZm8uc2hhcmVkLnJlZHVjZSgKICAgIChhY2MsIGN1cikgPT4gKHsKICAgICAgLi4uYWNjLAogICAgICBbY3VyLnBhY2thZ2VOYW1lXTogcmVsQnVuZGxlc1BhdGggKyBjdXIub3V0RmlsZU5hbWUKICAgIH0pLAogICAge30KICApOwogIGZvciAoY29uc3Qgc2hhcmVkIG9mIGhvc3RJbmZvLnNoYXJlZCkgewogICAgc2V0RXh0ZXJuYWxVcmwoc2hhcmVkLCByZWxCdW5kbGVzUGF0aCArIHNoYXJlZC5vdXRGaWxlTmFtZSk7CiAgfQogIHJldHVybiB7IGltcG9ydHMsIHNjb3Blczoge30gfTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvaW1wb3J0LW1hcC1sb2FkZXIuanMKaW1wb3J0IHBhdGggZnJvbSAicGF0aCI7CmltcG9ydCB1cmwgZnJvbSAidXJsIjsKaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICJmcyI7CnZhciBJTVBPUlRfTUFQX0ZJTEVfTkFNRSA9ICJub2RlLmltcG9ydG1hcCI7CnZhciBiYXNlVVJMID0gdXJsLnBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSkgKyBwYXRoLnNlcDsKZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VJbXBvcnRNYXAocGFyc2VkKSB7CiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcnNlZCkpIHsKICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSB0b3AgbGV2ZWwgbXVzdCBiZSBhbiBvYmplY3RgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0ge307CiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJzZWQsICJpbXBvcnRzIikpIHsKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuaW1wb3J0cykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJpbXBvcnRzIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdGApOwogICAgfQogICAgc29ydGVkQW5kTm9ybWFsaXplZEltcG9ydHMgPSBzb3J0QW5kTm9ybWFsaXplU3BlY2lmaWVyTWFwKAogICAgICBwYXJzZWQuaW1wb3J0cywKICAgICAgYmFzZVVSTAogICAgKTsKICB9CiAgbGV0IHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSB7fTsKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZCwgInNjb3BlcyIpKSB7CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLnNjb3BlcykpIHsKICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaW1wb3J0IG1hcCAtICJzY29wZXMiIHByb3BlcnR5IG11c3QgYmUgYW4gb2JqZWN0YCk7CiAgICB9CiAgICBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzID0gc29ydEFuZE5vcm1hbGl6ZVNjb3BlcyhwYXJzZWQuc2NvcGVzLCBiYXNlVVJMKTsKICB9CiAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhwYXJzZWQpLmZpbHRlcigKICAgIChrZXkpID0+IGtleSAhPT0gImltcG9ydHMiICYmIGtleSAhPT0gInNjb3BlcyIKICApOwogIGlmIChpbnZhbGlkS2V5cy5sZW5ndGggPiAwKSB7CiAgICBjb25zb2xlLndhcm4oCiAgICAgIGBJbnZhbGlkIHRvcC1sZXZlbCBrZXkke2ludmFsaWRLZXlzLmxlbmd0aCA+IDAgPyAicyIgOiAiIn0gaW4gaW1wb3J0IG1hcCAtICR7aW52YWxpZEtleXMuam9pbigiLCAiKX1gCiAgICApOwogIH0KICByZXR1cm4gewogICAgaW1wb3J0czogc29ydGVkQW5kTm9ybWFsaXplZEltcG9ydHMsCiAgICBzY29wZXM6IHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMKICB9Owp9CmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTcGVjaWZpZXJNYXAobWFwLCBiYXNlVVJMMikgewogIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fTsKICBmb3IgKGxldCBzcGVjaWZpZXJLZXkgaW4gbWFwKSB7CiAgICBjb25zdCB2YWx1ZSA9IG1hcFtzcGVjaWZpZXJLZXldOwogICAgY29uc3Qgbm9ybWFsaXplZFNwZWNpZmllcktleSA9IG5vcm1hbGl6ZVNwZWNpZmllcktleShzcGVjaWZpZXJLZXksIGJhc2VVUkwyKTsKICAgIGlmIChub3JtYWxpemVkU3BlY2lmaWVyS2V5ID09PSBudWxsKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGV0IGFkZHJlc3NVUkwgPSBwYXJzZVVSTExpa2VTcGVjaWZpZXIodmFsdWUsIGJhc2VVUkwyKTsKICAgIGlmIChhZGRyZXNzVVJMID09PSBudWxsKSB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgSW52YWxpZCBVUkwgYWRkcmVzcyBmb3IgaW1wb3J0IG1hcCBzcGVjaWZpZXIgJyR7c3BlY2lmaWVyS2V5fSdgCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChzcGVjaWZpZXJLZXkuZW5kc1dpdGgoIi8iKSAmJiAhYWRkcmVzc1VSTC5lbmRzV2l0aCgiLyIpKSB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgSW52YWxpZCBVUkwgYWRkcmVzcyBmb3IgaW1wb3J0IG1hcCBzcGVjaWZpZXIgJyR7c3BlY2lmaWVyS2V5fScgLSBzaW5jZSB0aGUgc3BlY2lmaWVyIGVuZHMgaW4gc2xhc2gsIHNvIG11c3QgdGhlIGFkZHJlc3NgCiAgICAgICk7CiAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBudWxsOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZFNwZWNpZmllcktleV0gPSBhZGRyZXNzVVJMOwogIH0KICByZXR1cm4gbm9ybWFsaXplZDsKfQpmdW5jdGlvbiBub3JtYWxpemVTcGVjaWZpZXJLZXkoa2V5KSB7CiAgaWYgKGtleSA9PT0gIiIpIHsKICAgIGNvbnNvbGUud2FybihgU3BlY2lmaWVyIGtleXMgaW4gaW1wb3J0IG1hcHMgbWF5IG5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nYCk7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIHBhcnNlVVJMTGlrZVNwZWNpZmllcihrZXksIGJhc2VVUkwpIHx8IGtleTsKfQpmdW5jdGlvbiBwYXJzZVVSTExpa2VTcGVjaWZpZXIoc3BlY2lmaWVyLCBiYXNlVVJMMikgewogIGNvbnN0IHVzZUJhc2VVcmxBc1BhcmVudCA9IHNwZWNpZmllci5zdGFydHNXaXRoKCIvIikgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi4vIikgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoIi4uLyIpOwogIHRyeSB7CiAgICByZXR1cm4gbmV3IFVSTChzcGVjaWZpZXIsIHVzZUJhc2VVcmxBc1BhcmVudCA/IGJhc2VVUkwyIDogdm9pZCAwKS5ocmVmOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIG51bGw7CiAgfQp9CmZ1bmN0aW9uIHNvcnRBbmROb3JtYWxpemVTY29wZXMobWFwLCBiYXNlVVJMMikgewogIGxldCBub3JtYWxpemVkID0ge307CiAgZm9yIChsZXQgc2NvcGVQcmVmaXggaW4gbWFwKSB7CiAgICBjb25zdCBwb3RlbnRpYWxTcGVjaWZpZXJNYXAgPSBtYXBbc2NvcGVQcmVmaXhdOwogICAgaWYgKCFpc1BsYWluT2JqZWN0KHBvdGVudGlhbFNwZWNpZmllck1hcCkpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKAogICAgICAgIGBUaGUgdmFsdWUgb2Ygc2NvcGUgJHtzY29wZVByZWZpeH0gbXVzdCBiZSBhIEpTT04gb2JqZWN0YAogICAgICApOwogICAgfQogICAgbGV0IHNjb3BlUHJlZml4VVJMOwogICAgdHJ5IHsKICAgICAgc2NvcGVQcmVmaXhVUkwgPSBuZXcgVVJMKHNjb3BlUHJlZml4LCBiYXNlVVJMMikuaHJlZjsKICAgIH0gY2F0Y2ggewogICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgYFNjb3BlIHByZWZpeCBVUkwgJyR7c2NvcGVQcmVmaXh9JyB3YXMgbm90IHBhcnNlYWJsZSBpbiBpbXBvcnQgbWFwYAogICAgICApOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIG5vcm1hbGl6ZWRbc2NvcGVQcmVmaXhVUkxdID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcG90ZW50aWFsU3BlY2lmaWVyTWFwLAogICAgICBiYXNlVVJMMgogICAgKTsKICB9CiAgcmV0dXJuIG5vcm1hbGl6ZWQ7Cn0KZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHsKICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKSAmJiAhQXJyYXkuaXNBcnJheShvYmopOwp9CnZhciBpbXBvcnRNYXBQcm9taXNlID0gZ2V0SW1wb3J0TWFwUHJvbWlzZSgpOwphc3luYyBmdW5jdGlvbiBnZXRJbXBvcnRNYXBQcm9taXNlKCkgewogIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHByb2Nlc3MuZW52LklNUE9SVF9NQVBfUEFUSCB8fCBJTVBPUlRfTUFQX0ZJTEVfTkFNRTsKICBjb25zdCBpbXBvcnRNYXBQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlbGF0aXZlUGF0aCk7CiAgbGV0IHN0cjsKICB0cnkgewogICAgc3RyID0gYXdhaXQgZnMucmVhZEZpbGUoaW1wb3J0TWFwUGF0aCk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICByZXR1cm4gZW1wdHlNYXAoKTsKICB9CiAgbGV0IGpzb247CiAgdHJ5IHsKICAgIGpzb24gPSBhd2FpdCBKU09OLnBhcnNlKHN0cik7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB0aHJvdyBFcnJvcigKICAgICAgYEltcG9ydCBtYXAgYXQgJHtpbXBvcnRNYXBQYXRofSBjb250YWlucyBpbnZhbGlkIGpzb246ICR7ZXJyLm1lc3NhZ2V9YAogICAgKTsKICB9CiAgcmV0dXJuIHJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKGpzb24pOwp9Cmdsb2JhbC5ub2RlTG9hZGVyID0gZ2xvYmFsLm5vZGVMb2FkZXIgfHwge307Cmdsb2JhbC5ub2RlTG9hZGVyLnNldEltcG9ydE1hcFByb21pc2UgPSBmdW5jdGlvbiBzZXRJbXBvcnRNYXBQcm9taXNlKHByb21pc2UpIHsKICBpbXBvcnRNYXBQcm9taXNlID0gcHJvbWlzZS50aGVuKChtYXApID0+IHsKICAgIHJldHVybiByZXNvbHZlQW5kQ29tcG9zZUltcG9ydE1hcChtYXApOwogIH0pOwp9OwpmdW5jdGlvbiBlbXB0eU1hcCgpIHsKICByZXR1cm4geyBpbXBvcnRzOiB7fSwgc2NvcGVzOiB7fSB9Owp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi91dGlscy9sb2FkZXItYXMtZGF0YS11cmwuanMKdmFyIHJlc29sdmVyID0gImFXMXdiM0owSUhCaGRHZ2dabkp2YlNBbmNHRjBhQ2M3Q21sdGNHOXlkQ0IxY213Z1puSnZiU0FuZFhKc0p6c0thVzF3YjNKMElIc2djSEp2YldselpYTWdZWE1nWm5NZ2ZTQm1jbTl0SUNkbWN5YzdDZ3BsZUhCdmNuUWdZMjl1YzNRZ1NVMVFUMUpVWDAxQlVGOUdTVXhGWDA1QlRVVWdQU0FuYm05a1pTNXBiWEJ2Y25SdFlYQW5Pd29LWTI5dWMzUWdZbUZ6WlZWU1RDQTlJSFZ5YkM1d1lYUm9WRzlHYVd4bFZWSk1LSEJ5YjJObGMzTXVZM2RrS0NrcElDc2djR0YwYUM1elpYQTdDZ292THlCb2RIUndjem92TDNkcFkyY3VaMmwwYUhWaUxtbHZMMmx0Y0c5eWRDMXRZWEJ6THlOdVpYY3RjbVZ6YjJ4MlpTMWhiR2R2Y21sMGFHMEtaWGh3YjNKMElHWjFibU4wYVc5dUlISmxjMjlzZG1WVGNHVmphV1pwWlhJb2FXMXdiM0owVFdGd0xDQnpjR1ZqYVdacFpYSXNJSEJoY21WdWRGVlNUQ2tnZXdvZ0lHeGxkQ0JqZFhKeVpXNTBRbUZ6WlZWU1REc0tJQ0JwWmlBb2NHRnlaVzUwVlZKTUtTQjdDaUFnSUNCamIyNXpkQ0JzWVhOMFUyeGhjMmhKYm1SbGVDQTlJSEJoY21WdWRGVlNUQzVzWVhOMFNXNWtaWGhQWmlod1lYUm9Mbk5sY0NrN0NpQWdJQ0JqZFhKeVpXNTBRbUZ6WlZWU1RDQTlJSEJoY21WdWRGVlNUQzV6YkdsalpTZ3dMQ0JzWVhOMFUyeGhjMmhKYm1SbGVDQXJJREVwT3dvZ0lIMGdaV3h6WlNCN0NpQWdJQ0JqZFhKeVpXNTBRbUZ6WlZWU1RDQTlJR0poYzJWVlVrdzdDaUFnZlFvZ0lHTnZibk4wSUc1dmNtMWhiR2w2WldSVGNHVmphV1pwWlhJZ1BRb2dJQ0FnY0dGeWMyVlZVa3hNYVd0bFUzQmxZMmxtYVdWeUtITndaV05wWm1sbGNpd2dZM1Z5Y21WdWRFSmhjMlZWVWt3cElIeDhJSE53WldOcFptbGxjanNLSUNCbWIzSWdLR3hsZENCelkyOXdaVkJ5WldacGVDQnBiaUJwYlhCdmNuUk5ZWEF1YzJOdmNHVnpLU0I3Q2lBZ0lDQnBaaUFvQ2lBZ0lDQWdJSE5qYjNCbFVISmxabWw0SUQwOVBTQmpkWEp5Wlc1MFFtRnpaVlZTVENCOGZBb2dJQ0FnSUNBb2MyTnZjR1ZRY21WbWFYZ3VaVzVrYzFkcGRHZ29KeThuS1NBbUppQmpkWEp5Wlc1MFFtRnpaVlZTVEM1emRHRnlkSE5YYVhSb0tITmpiM0JsVUhKbFptbDRLU2tLSUNBZ0lDa2dld29nSUNBZ0lDQmpiMjV6ZENCelkyOXdaVWx0Y0c5eWRITk5ZWFJqYUNBOUlISmxjMjlzZG1WSmJYQnZjblJ6VFdGMFkyZ29DaUFnSUNBZ0lDQWdibTl5YldGc2FYcGxaRk53WldOcFptbGxjaXdLSUNBZ0lDQWdJQ0JwYlhCdmNuUk5ZWEF1YzJOdmNHVnpXM05qYjNCbFVISmxabWw0WFN3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYVdZZ0tITmpiM0JsU1cxd2IzSjBjMDFoZEdOb0tTQjdDaUFnSUNBZ0lDQWdjbVYwZFhKdUlITmpiM0JsU1cxd2IzSjBjMDFoZEdOb093b2dJQ0FnSUNCOUNpQWdJQ0I5SUdWc2MyVWdld29nSUNBZ0lDQmpiMjV6ZENCMGIzQk1aWFpsYkVsdGNHOXlkSE5OWVhSamFDQTlJSEpsYzI5c2RtVkpiWEJ2Y25SelRXRjBZMmdvQ2lBZ0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2l3S0lDQWdJQ0FnSUNCcGJYQnZjblJOWVhBdWFXMXdiM0owY3l3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYVdZZ0tIUnZjRXhsZG1Wc1NXMXdiM0owYzAxaGRHTm9LU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJSFJ2Y0V4bGRtVnNTVzF3YjNKMGMwMWhkR05vT3dvZ0lDQWdJQ0I5Q2lBZ0lDQjlDaUFnZlFvS0lDQnlaWFIxY200Z2NtVnpiMngyWlVsdGNHOXlkSE5OWVhSamFDaHViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlMQ0JwYlhCdmNuUk5ZWEF1YVcxd2IzSjBjeWs3Q24wS0NpOHZJR2gwZEhCek9pOHZkMmxqWnk1bmFYUm9kV0l1YVc4dmFXMXdiM0owTFcxaGNITXZJM0psYzI5c2RtVXRZVzR0YVcxd2IzSjBjeTF0WVhSamFBcG1kVzVqZEdsdmJpQnlaWE52YkhabFNXMXdiM0owYzAxaGRHTm9LRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWElzSUhOd1pXTnBabWxsY2sxaGNDa2dld29nSUdadmNpQW9iR1YwSUhOd1pXTnBabWxsY2t0bGVTQnBiaUJ6Y0dWamFXWnBaWEpOWVhBcElIc0tJQ0FnSUdOdmJuTjBJSEpsYzI5c2RYUnBiMjVTWlhOMWJIUWdQU0J6Y0dWamFXWnBaWEpOWVhCYmMzQmxZMmxtYVdWeVMyVjVYVHNLQ2lBZ0lDQnBaaUFvYzNCbFkybG1hV1Z5UzJWNUlEMDlQU0J1YjNKdFlXeHBlbVZrVTNCbFkybG1hV1Z5S1NCN0NpQWdJQ0FnSUdsbUlDaHlaWE52YkhWMGFXOXVVbVZ6ZFd4MElEMDlQU0J1ZFd4c0tTQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1ZIbHdaVVZ5Y205eUtBb2dJQ0FnSUNBZ0lDQWdZRlJvWlNCcGJYQnZjblFnYldGd0lISmxjMjlzZFhScGIyNGdiMllnSkh0emNHVmphV1pwWlhKTFpYbDlJR1poYVd4bFpDQmtkV1VnZEc4Z1lTQnVkV3hzSUdWdWRISjVZQ3dLSUNBZ0lDQWdJQ0FwT3dvZ0lDQWdJQ0I5Q2lBZ0lDQWdJSEpsZEhWeWJpQnlaWE52YkhWMGFXOXVVbVZ6ZFd4ME93b2dJQ0FnZlNCbGJITmxJR2xtSUNnS0lDQWdJQ0FnYzNCbFkybG1hV1Z5UzJWNUxtVnVaSE5YYVhSb0tDY3ZKeWtnSmlZS0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2k1emRHRnlkSE5YYVhSb0tITndaV05wWm1sbGNrdGxlU2tLSUNBZ0lDa2dld29nSUNBZ0lDQnBaaUFvY21WemIyeDFkR2x2YmxKbGMzVnNkQ0E5UFQwZ2JuVnNiQ2tnZXdvZ0lDQWdJQ0FnSUhSb2NtOTNJRlI1Y0dWRmNuSnZjaWdLSUNBZ0lDQWdJQ0FnSUdCVWFHVWdhVzF3YjNKMElHMWhjQ0J5WlhOdmJIVjBhVzl1SUc5bUlDUjdjM0JsWTJsbWFXVnlTMlY1ZlNCbVlXbHNaV1FnWkhWbElIUnZJR0VnYm5Wc2JDQmxiblJ5ZVdBc0NpQWdJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnSUNCamIyNXpkQ0JoWm5SbGNsQnlaV1pwZUNBOUlHNXZjbTFoYkdsNlpXUlRjR1ZqYVdacFpYSXVjMnhwWTJVb2MzQmxZMmxtYVdWeVMyVjVMbXhsYm1kMGFDazdDaUFnSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsZHlCVlVrd29ZV1owWlhKUWNtVm1hWGdzSUhKbGMyOXNkWFJwYjI1U1pYTjFiSFFwTG1oeVpXWTdDaUFnSUNBZ0lIMGdZMkYwWTJnZ2V3b2dJQ0FnSUNBZ0lIUm9jbTkzSUZSNWNHVkZjbkp2Y2lnS0lDQWdJQ0FnSUNBZ0lHQlVhR1VnYVcxd2IzSjBJRzFoY0NCeVpYTnZiSFYwYVc5dUlHOW1JQ1I3YzNCbFkybG1hV1Z5UzJWNWZTQm1ZV2xzWldRZ1pIVmxJSFJ2SUZWU1RDQndZWEp6WlNCbVlXbHNkWEpsWUN3S0lDQWdJQ0FnSUNBcE93b2dJQ0FnSUNCOUNpQWdJQ0I5Q2lBZ2ZRb0tJQ0J5WlhSMWNtNGdiblZzYkRzS2ZRb0tMeThnYUhSMGNITTZMeTkzYVdObkxtZHBkR2gxWWk1cGJ5OXBiWEJ2Y25RdGJXRndjeThqY0dGeWMybHVad3BsZUhCdmNuUWdablZ1WTNScGIyNGdjbVZ6YjJ4MlpVRnVaRU52YlhCdmMyVkpiWEJ2Y25STllYQW9jR0Z5YzJWa0tTQjdDaUFnTHk4Z1UzUmxjQ0F5Q2lBZ2FXWWdLQ0ZwYzFCc1lXbHVUMkpxWldOMEtIQmhjbk5sWkNrcElIc0tJQ0FnSUhSb2NtOTNJRVZ5Y205eUtHQkpiblpoYkdsa0lHbHRjRzl5ZENCdFlYQWdMU0IwYjNBZ2JHVjJaV3dnYlhWemRDQmlaU0JoYmlCdlltcGxZM1JnS1RzS0lDQjlDZ29nSUM4dklGTjBaWEFnTXdvZ0lHeGxkQ0J6YjNKMFpXUkJibVJPYjNKdFlXeHBlbVZrU1cxd2IzSjBjeUE5SUh0OU93b0tJQ0F2THlCVGRHVndJRFFLSUNCcFppQW9UMkpxWldOMExuQnliM1J2ZEhsd1pTNW9ZWE5QZDI1UWNtOXdaWEowZVM1allXeHNLSEJoY25ObFpDd2dKMmx0Y0c5eWRITW5LU2tnZXdvZ0lDQWdMeThnVTNSbGNDQTBMakVLSUNBZ0lHbG1JQ2doYVhOUWJHRnBiazlpYW1WamRDaHdZWEp6WldRdWFXMXdiM0owY3lrcElIc0tJQ0FnSUNBZ2RHaHliM2NnUlhKeWIzSW9ZRWx1ZG1Gc2FXUWdhVzF3YjNKMElHMWhjQ0F0SUNKcGJYQnZjblJ6SWlCd2NtOXdaWEowZVNCdGRYTjBJR0psSUdGdUlHOWlhbVZqZEdBcE93b2dJQ0FnZlFvS0lDQWdJQzh2SUZOMFpYQWdOQzR5Q2lBZ0lDQnpiM0owWldSQmJtUk9iM0p0WVd4cGVtVmtTVzF3YjNKMGN5QTlJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRjR1ZqYVdacFpYSk5ZWEFvQ2lBZ0lDQWdJSEJoY25ObFpDNXBiWEJ2Y25SekxBb2dJQ0FnSUNCaVlYTmxWVkpNTEFvZ0lDQWdLVHNLSUNCOUNnb2dJQzh2SUZOMFpYQWdOUW9nSUd4bGRDQnpiM0owWldSQmJtUk9iM0p0WVd4cGVtVmtVMk52Y0dWeklEMGdlMzA3Q2dvZ0lDOHZJRk4wWlhBZ05nb2dJR2xtSUNoUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG1oaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2NHRnljMlZrTENBbmMyTnZjR1Z6SnlrcElIc0tJQ0FnSUM4dklGTjBaWEFnTmk0eENpQWdJQ0JwWmlBb0lXbHpVR3hoYVc1UFltcGxZM1FvY0dGeWMyVmtMbk5qYjNCbGN5a3BJSHNLSUNBZ0lDQWdkR2h5YjNjZ1JYSnliM0lvWUVsdWRtRnNhV1FnYVcxd2IzSjBJRzFoY0NBdElDSnpZMjl3WlhNaUlIQnliM0JsY25SNUlHMTFjM1FnWW1VZ1lXNGdiMkpxWldOMFlDazdDaUFnSUNCOUNnb2dJQ0FnTHk4Z1UzUmxjQ0EyTGpJS0lDQWdJSE52Y25SbFpFRnVaRTV2Y20xaGJHbDZaV1JUWTI5d1pYTWdQU0J6YjNKMFFXNWtUbTl5YldGc2FYcGxVMk52Y0dWektIQmhjbk5sWkM1elkyOXdaWE1zSUdKaGMyVlZVa3dwT3dvZ0lIMEtDaUFnTHk4Z1UzUmxjQ0EzQ2lBZ1kyOXVjM1FnYVc1MllXeHBaRXRsZVhNZ1BTQlBZbXBsWTNRdWEyVjVjeWh3WVhKelpXUXBMbVpwYkhSbGNpZ0tJQ0FnSUNoclpYa3BJRDArSUd0bGVTQWhQVDBnSjJsdGNHOXlkSE1uSUNZbUlHdGxlU0FoUFQwZ0ozTmpiM0JsY3ljc0NpQWdLVHNLSUNCcFppQW9hVzUyWVd4cFpFdGxlWE11YkdWdVozUm9JRDRnTUNrZ2V3b2dJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNCZ1NXNTJZV3hwWkNCMGIzQXRiR1YyWld3Z2EyVjVKSHNLSUNBZ0lDQWdJQ0JwYm5aaGJHbGtTMlY1Y3k1c1pXNW5kR2dnUGlBd0lEOGdKM01uSURvZ0p5Y0tJQ0FnSUNBZ2ZTQnBiaUJwYlhCdmNuUWdiV0Z3SUMwZ0pIdHBiblpoYkdsa1MyVjVjeTVxYjJsdUtDY3NJQ2NwZldBc0NpQWdJQ0FwT3dvZ0lIMEtDaUFnTHk4Z1UzUmxjQ0E0Q2lBZ2NtVjBkWEp1SUhzS0lDQWdJR2x0Y0c5eWRITTZJSE52Y25SbFpFRnVaRTV2Y20xaGJHbDZaV1JKYlhCdmNuUnpMQW9nSUNBZ2MyTnZjR1Z6T2lCemIzSjBaV1JCYm1ST2IzSnRZV3hwZW1Wa1UyTnZjR1Z6TEFvZ0lIMDdDbjBLQ2k4dklHaDBkSEJ6T2k4dmQybGpaeTVuYVhSb2RXSXVhVzh2YVcxd2IzSjBMVzFoY0hNdkkzTnZjblF0WVc1a0xXNXZjbTFoYkdsNlpTMWhMWE53WldOcFptbGxjaTF0WVhBS1puVnVZM1JwYjI0Z2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDaHRZWEFzSUdKaGMyVlZVa3dwSUhzS0lDQmpiMjV6ZENCdWIzSnRZV3hwZW1Wa0lEMGdlMzA3Q2dvZ0lHWnZjaUFvYkdWMElITndaV05wWm1sbGNrdGxlU0JwYmlCdFlYQXBJSHNLSUNBZ0lHTnZibk4wSUhaaGJIVmxJRDBnYldGd1czTndaV05wWm1sbGNrdGxlVjA3Q2dvZ0lDQWdZMjl1YzNRZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNrdGxlU0E5SUc1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2t0bGVTaHpjR1ZqYVdacFpYSkxaWGtzSUdKaGMyVlZVa3dwT3dvZ0lDQWdhV1lnS0c1dmNtMWhiR2w2WldSVGNHVmphV1pwWlhKTFpYa2dQVDA5SUc1MWJHd3BJSHNLSUNBZ0lDQWdZMjl1ZEdsdWRXVTdDaUFnSUNCOUNnb2dJQ0FnYkdWMElHRmtaSEpsYzNOVlVrd2dQU0J3WVhKelpWVlNURXhwYTJWVGNHVmphV1pwWlhJb2RtRnNkV1VzSUdKaGMyVlZVa3dwT3dvZ0lDQWdhV1lnS0dGa1pISmxjM05WVWt3Z1BUMDlJRzUxYkd3cElIc0tJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLQW9nSUNBZ0lDQWdJR0JKYm5aaGJHbGtJRlZTVENCaFpHUnlaWE56SUdadmNpQnBiWEJ2Y25RZ2JXRndJSE53WldOcFptbGxjaUFuSkh0emNHVmphV1pwWlhKTFpYbDlKMkFzQ2lBZ0lDQWdJQ2s3Q2lBZ0lDQWdJRzV2Y20xaGJHbDZaV1JiYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVWMGdQU0J1ZFd4c093b2dJQ0FnSUNCamIyNTBhVzUxWlRzS0lDQWdJSDBLQ2lBZ0lDQnBaaUFvYzNCbFkybG1hV1Z5UzJWNUxtVnVaSE5YYVhSb0tDY3ZKeWtnSmlZZ0lXRmtaSEpsYzNOVlVrd3VaVzVrYzFkcGRHZ29KeThuS1NrZ2V3b2dJQ0FnSUNCamIyNXpiMnhsTG5kaGNtNG9DaUFnSUNBZ0lDQWdZRWx1ZG1Gc2FXUWdWVkpNSUdGa1pISmxjM01nWm05eUlHbHRjRzl5ZENCdFlYQWdjM0JsWTJsbWFXVnlJQ2NrZTNOd1pXTnBabWxsY2t0bGVYMG5JQzBnYzJsdVkyVWdkR2hsSUhOd1pXTnBabWxsY2lCbGJtUnpJR2x1SUhOc1lYTm9MQ0J6YnlCdGRYTjBJSFJvWlNCaFpHUnlaWE56WUN3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZ0dWIzSnRZV3hwZW1Wa1UzQmxZMmxtYVdWeVMyVjVYU0E5SUc1MWJHdzdDaUFnSUNBZ0lHTnZiblJwYm5WbE93b2dJQ0FnZlFvS0lDQWdJRzV2Y20xaGJHbDZaV1JiYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVWMGdQU0JoWkdSeVpYTnpWVkpNT3dvZ0lIMEtDaUFnY21WMGRYSnVJRzV2Y20xaGJHbDZaV1E3Q24wS0NpOHZJR2gwZEhCek9pOHZkMmxqWnk1bmFYUm9kV0l1YVc4dmFXMXdiM0owTFcxaGNITXZJMjV2Y20xaGJHbDZaUzFoTFhOd1pXTnBabWxsY2kxclpYa0tablZ1WTNScGIyNGdibTl5YldGc2FYcGxVM0JsWTJsbWFXVnlTMlY1S0d0bGVTa2dld29nSUdsbUlDaHJaWGtnUFQwOUlDY25LU0I3Q2lBZ0lDQmpiMjV6YjJ4bExuZGhjbTRvWUZOd1pXTnBabWxsY2lCclpYbHpJR2x1SUdsdGNHOXlkQ0J0WVhCeklHMWhlU0J1YjNRZ1ltVWdkR2hsSUdWdGNIUjVJSE4wY21sdVoyQXBPd29nSUNBZ2NtVjBkWEp1SUc1MWJHdzdDaUFnZlFvS0lDQnlaWFIxY200Z2NHRnljMlZWVWt4TWFXdGxVM0JsWTJsbWFXVnlLR3RsZVN3Z1ltRnpaVlZTVENrZ2ZId2dhMlY1T3dwOUNnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU53WVhKelpTMWhMWFZ5YkMxc2FXdGxMV2x0Y0c5eWRDMXpjR1ZqYVdacFpYSUtablZ1WTNScGIyNGdjR0Z5YzJWVlVreE1hV3RsVTNCbFkybG1hV1Z5S0hOd1pXTnBabWxsY2l3Z1ltRnpaVlZTVENrZ2V3b2dJR052Ym5OMElIVnpaVUpoYzJWVmNteEJjMUJoY21WdWRDQTlDaUFnSUNCemNHVmphV1pwWlhJdWMzUmhjblJ6VjJsMGFDZ25MeWNwSUh4OENpQWdJQ0J6Y0dWamFXWnBaWEl1YzNSaGNuUnpWMmwwYUNnbkxpOG5LU0I4ZkFvZ0lDQWdjM0JsWTJsbWFXVnlMbk4wWVhKMGMxZHBkR2dvSnk0dUx5Y3BPd29LSUNCMGNua2dld29nSUNBZ2NtVjBkWEp1SUc1bGR5QlZVa3dvYzNCbFkybG1hV1Z5TENCMWMyVkNZWE5sVlhKc1FYTlFZWEpsYm5RZ1B5QmlZWE5sVlZKTUlEb2dkVzVrWldacGJtVmtLUzVvY21WbU93b2dJSDBnWTJGMFkyZ2dld29nSUNBZ2NtVjBkWEp1SUc1MWJHdzdDaUFnZlFwOUNnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU56YjNKMExXRnVaQzF1YjNKdFlXeHBlbVV0YzJOdmNHVnpDbVoxYm1OMGFXOXVJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRZMjl3WlhNb2JXRndMQ0JpWVhObFZWSk1LU0I3Q2lBZ2JHVjBJRzV2Y20xaGJHbDZaV1FnUFNCN2ZUc0tDaUFnWm05eUlDaHNaWFFnYzJOdmNHVlFjbVZtYVhnZ2FXNGdiV0Z3S1NCN0NpQWdJQ0JqYjI1emRDQndiM1JsYm5ScFlXeFRjR1ZqYVdacFpYSk5ZWEFnUFNCdFlYQmJjMk52Y0dWUWNtVm1hWGhkT3dvZ0lDQWdhV1lnS0NGcGMxQnNZV2x1VDJKcVpXTjBLSEJ2ZEdWdWRHbGhiRk53WldOcFptbGxjazFoY0NrcElIc0tJQ0FnSUNBZ2RHaHliM2NnVkhsd1pVVnljbTl5S0FvZ0lDQWdJQ0FnSUdCVWFHVWdkbUZzZFdVZ2IyWWdjMk52Y0dVZ0pIdHpZMjl3WlZCeVpXWnBlSDBnYlhWemRDQmlaU0JoSUVwVFQwNGdiMkpxWldOMFlDd0tJQ0FnSUNBZ0tUc0tJQ0FnSUgwS0NpQWdJQ0JzWlhRZ2MyTnZjR1ZRY21WbWFYaFZVa3c3Q2lBZ0lDQjBjbmtnZXdvZ0lDQWdJQ0J6WTI5d1pWQnlaV1pwZUZWU1RDQTlJRzVsZHlCVlVrd29jMk52Y0dWUWNtVm1hWGdzSUdKaGMyVlZVa3dwTG1oeVpXWTdDaUFnSUNCOUlHTmhkR05vSUhzS0lDQWdJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNBZ0lHQlRZMjl3WlNCd2NtVm1hWGdnVlZKTUlDY2tlM05qYjNCbFVISmxabWw0ZlNjZ2QyRnpJRzV2ZENCd1lYSnpaV0ZpYkdVZ2FXNGdhVzF3YjNKMElHMWhjR0FzQ2lBZ0lDQWdJQ2s3Q2lBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ2ZRb0tJQ0FnSUc1dmNtMWhiR2w2WldSYmMyTnZjR1ZRY21WbWFYaFZVa3hkSUQwZ2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDZ0tJQ0FnSUNBZ2NHOTBaVzUwYVdGc1UzQmxZMmxtYVdWeVRXRndMQW9nSUNBZ0lDQmlZWE5sVlZKTUxBb2dJQ0FnS1RzS0lDQjlDZ29nSUhKbGRIVnliaUJ1YjNKdFlXeHBlbVZrT3dwOUNncG1kVzVqZEdsdmJpQnBjMUJzWVdsdVQySnFaV04wS0c5aWFpa2dld29nSUhKbGRIVnliaUJ2WW1vZ1BUMDlJRTlpYW1WamRDaHZZbW9wSUNZbUlDRkJjbkpoZVM1cGMwRnljbUY1S0c5aWFpazdDbjBLQ2k4dklDMHRMUW9LYkdWMElHbHRjRzl5ZEUxaGNGQnliMjFwYzJVZ1BTQm5aWFJKYlhCdmNuUk5ZWEJRY205dGFYTmxLQ2s3Q2dwbGVIQnZjblFnWVhONWJtTWdablZ1WTNScGIyNGdjbVZ6YjJ4MlpTaHpjR1ZqYVdacFpYSXNJR052Ym5SbGVIUXNJR1JsWm1GMWJIUlNaWE52YkhabEtTQjdDaUFnWTI5dWMzUWdleUJ3WVhKbGJuUlZVa3dnUFNCdWRXeHNJSDBnUFNCamIyNTBaWGgwT3dvZ0lHTnZibk4wSUdsdGNHOXlkRTFoY0NBOUlHRjNZV2wwSUdsdGNHOXlkRTFoY0ZCeWIyMXBjMlU3Q2lBZ1kyOXVjM1FnYVcxd2IzSjBUV0Z3VlhKc0lEMGdjbVZ6YjJ4MlpWTndaV05wWm1sbGNpaHBiWEJ2Y25STllYQXNJSE53WldOcFptbGxjaXdnY0dGeVpXNTBWVkpNS1RzS0NpQWdjbVYwZFhKdUlHUmxabUYxYkhSU1pYTnZiSFpsS0dsdGNHOXlkRTFoY0ZWeWJDQS9QeUJ6Y0dWamFXWnBaWElzSUdOdmJuUmxlSFFzSUdSbFptRjFiSFJTWlhOdmJIWmxLVHNLZlFvS1pYaHdiM0owSUdGemVXNWpJR1oxYm1OMGFXOXVJR3h2WVdRb2RYSnNMQ0JqYjI1MFpYaDBMQ0JrWldaaGRXeDBURzloWkNrZ2V3b2dJR2xtSUNoMWNtd3VjM1JoY25SelYybDBhQ2duYUhSMGNEb3ZMeWNwSUh4OElIVnliQzV6ZEdGeWRITlhhWFJvS0Nkb2RIUndjem92THljcEtTQjdDaUFnSUNCamIyNXpkQ0J5WlhNZ1BTQmhkMkZwZENCbVpYUmphQ2gxY213cE93b2dJQ0FnYVdZZ0tDRnlaWE11YjJzcElIc0tJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0dCR1lXbHNaV1FnZEc4Z1ptVjBZMmdnYlc5a2RXeGxJR1p5YjIwZ0pIdDFjbXg5WUNrN0NpQWdJQ0I5Q2lBZ0lDQmpiMjV6ZENCemIzVnlZMlVnUFNCaGQyRnBkQ0J5WlhNdWRHVjRkQ2dwT3dvZ0lDQWdjbVYwZFhKdUlIc0tJQ0FnSUNBZ2MyaHZjblJEYVhKamRXbDBPaUIwY25WbExBb2dJQ0FnSUNCbWIzSnRZWFE2SUNkdGIyUjFiR1VuTEFvZ0lDQWdJQ0J6YjNWeVkyVXNDaUFnSUNCOU93b2dJSDBLQ2lBZ2FXWWdLQ0YxY213dWMzUmhjblJ6VjJsMGFDZ25ibTlrWlRvbktTa2dld29nSUNBZ1kyOXVkR1Y0ZEM1bWIzSnRZWFFnUFNBbmJXOWtkV3hsSnpzS0lDQjlDZ29nSUhKbGRIVnliaUJrWldaaGRXeDBURzloWkNoMWNtd3NJR052Ym5SbGVIUXNJR1JsWm1GMWJIUk1iMkZrS1RzS2ZRb0tZWE41Ym1NZ1puVnVZM1JwYjI0Z1oyVjBTVzF3YjNKMFRXRndVSEp2YldselpTZ3BJSHNLSUNCamIyNXpkQ0J5Wld4aGRHbDJaVkJoZEdnZ1BTQndjbTlqWlhOekxtVnVkaTVKVFZCUFVsUmZUVUZRWDFCQlZFZ2dmSHdnU1UxUVQxSlVYMDFCVUY5R1NVeEZYMDVCVFVVN0NpQWdZMjl1YzNRZ2FXMXdiM0owVFdGd1VHRjBhQ0E5SUhCaGRHZ3VjbVZ6YjJ4MlpTaHdjbTlqWlhOekxtTjNaQ2dwTENCeVpXeGhkR2wyWlZCaGRHZ3BPd29LSUNCc1pYUWdjM1J5T3dvZ0lIUnllU0I3Q2lBZ0lDQnpkSElnUFNCaGQyRnBkQ0JtY3k1eVpXRmtSbWxzWlNocGJYQnZjblJOWVhCUVlYUm9LVHNLSUNCOUlHTmhkR05vSUNobGNuSXBJSHNLSUNBZ0lISmxkSFZ5YmlCbGJYQjBlVTFoY0NncE93b2dJSDBLQ2lBZ2JHVjBJR3B6YjI0N0NpQWdkSEo1SUhzS0lDQWdJR3B6YjI0Z1BTQmhkMkZwZENCS1UwOU9MbkJoY25ObEtITjBjaWs3Q2lBZ2ZTQmpZWFJqYUNBb1pYSnlLU0I3Q2lBZ0lDQjBhSEp2ZHlCRmNuSnZjaWdLSUNBZ0lDQWdZRWx0Y0c5eWRDQnRZWEFnWVhRZ0pIdHBiWEJ2Y25STllYQlFZWFJvZlNCamIyNTBZV2x1Y3lCcGJuWmhiR2xrSUdwemIyNDZJQ1I3WlhKeUxtMWxjM05oWjJWOVlDd0tJQ0FnSUNrN0NpQWdmUW9LSUNCeVpYUjFjbTRnY21WemIyeDJaVUZ1WkVOdmJYQnZjMlZKYlhCdmNuUk5ZWEFvYW5OdmJpazdDbjBLQ21kc2IySmhiQzV1YjJSbFRHOWhaR1Z5SUQwZ1oyeHZZbUZzTG01dlpHVk1iMkZrWlhJZ2ZId2dlMzA3Q2dwbmJHOWlZV3d1Ym05a1pVeHZZV1JsY2k1elpYUkpiWEJ2Y25STllYQlFjbTl0YVhObElEMGdablZ1WTNScGIyNGdjMlYwU1cxd2IzSjBUV0Z3VUhKdmJXbHpaU2h3Y205dGFYTmxLU0I3Q2lBZ2FXMXdiM0owVFdGd1VISnZiV2x6WlNBOUlIQnliMjFwYzJVdWRHaGxiaWdvYldGd0tTQTlQaUI3Q2lBZ0lDQnlaWFIxY200Z2NtVnpiMngyWlVGdVpFTnZiWEJ2YzJWSmJYQnZjblJOWVhBb2JXRndLVHNLSUNCOUtUc0tmVHNLQ21aMWJtTjBhVzl1SUdWdGNIUjVUV0Z3S0NrZ2V3b2dJSEpsZEhWeWJpQjdJR2x0Y0c5eWRITTZJSHQ5TENCelkyOXdaWE02SUh0OUlIMDdDbjBLIjsKCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL25vZGUvaW5pdC1ub2RlLWZlZGVyYXRpb24udHMKdmFyIGRlZmF1bHRPcHRpb25zID0gewogIHJlbW90ZXNPck1hbmlmZXN0VXJsOiB7fSwKICByZWxCdW5kbGVQYXRoOiAiLi4vYnJvd3NlciIsCiAgdGhyb3dJZlJlbW90ZU5vdEZvdW5kOiBmYWxzZQp9Owphc3luYyBmdW5jdGlvbiBpbml0Tm9kZUZlZGVyYXRpb24ob3B0aW9ucykgewogIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH07CiAgY29uc3QgaW1wb3J0TWFwID0gYXdhaXQgY3JlYXRlTm9kZUltcG9ydE1hcChtZXJnZWRPcHRpb25zKTsKICBhd2FpdCB3cml0ZUltcG9ydE1hcChpbXBvcnRNYXApOwogIGF3YWl0IHdyaXRlUmVzb2x2ZXIoKTsKICByZWdpc3RlcihwYXRoVG9GaWxlVVJMKCIuL2ZlZGVyYXRpb24tcmVzb2x2ZXIubWpzIikuaHJlZik7Cn0KYXN5bmMgZnVuY3Rpb24gY3JlYXRlTm9kZUltcG9ydE1hcChvcHRpb25zKSB7CiAgY29uc3QgeyByZW1vdGVzT3JNYW5pZmVzdFVybCwgcmVsQnVuZGxlUGF0aCB9ID0gb3B0aW9uczsKICBjb25zdCByZW1vdGVzID0gdHlwZW9mIHJlbW90ZXNPck1hbmlmZXN0VXJsID09PSAib2JqZWN0IiA/IHJlbW90ZXNPck1hbmlmZXN0VXJsIDogYXdhaXQgbG9hZEZzTWFuaWZlc3QocmVtb3Rlc09yTWFuaWZlc3RVcmwpOwogIGNvbnN0IGhvc3RJbmZvID0gYXdhaXQgbG9hZEZzRmVkZXJhdGlvbkluZm8ocmVsQnVuZGxlUGF0aCk7CiAgY29uc3QgaG9zdEltcG9ydE1hcCA9IGF3YWl0IHByb2Nlc3NIb3N0SW5mbyhob3N0SW5mbywgIi4vIiArIHJlbEJ1bmRsZVBhdGgpOwogIGNvbnN0IHJlbW90ZXNJbXBvcnRNYXAgPSBhd2FpdCBwcm9jZXNzUmVtb3RlSW5mb3MocmVtb3RlcywgewogICAgdGhyb3dJZlJlbW90ZU5vdEZvdW5kOiBvcHRpb25zLnRocm93SWZSZW1vdGVOb3RGb3VuZCwKICAgIGNhY2hlVGFnOiBvcHRpb25zLmNhY2hlVGFnCiAgfSk7CiAgY29uc3QgaW1wb3J0TWFwID0gbWVyZ2VJbXBvcnRNYXBzKGhvc3RJbXBvcnRNYXAsIHJlbW90ZXNJbXBvcnRNYXApOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gbG9hZEZzTWFuaWZlc3QobWFuaWZlc3RVcmwpIHsKICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMyLnJlYWRGaWxlKG1hbmlmZXN0VXJsLCAidXRmLTgiKTsKICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoY29udGVudCk7CiAgcmV0dXJuIG1hbmlmZXN0Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGc0ZlZGVyYXRpb25JbmZvKHJlbEJ1bmRsZVBhdGgpIHsKICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoMi5qb2luKHJlbEJ1bmRsZVBhdGgsICJyZW1vdGVFbnRyeS5qc29uIik7CiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzMi5yZWFkRmlsZShtYW5pZmVzdFBhdGgsICJ1dGYtOCIpOwogIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShjb250ZW50KTsKICByZXR1cm4gbWFuaWZlc3Q7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVJbXBvcnRNYXAobWFwKSB7CiAgYXdhaXQgZnMyLndyaXRlRmlsZSgKICAgIElNUE9SVF9NQVBfRklMRV9OQU1FLAogICAgSlNPTi5zdHJpbmdpZnkobWFwLCBudWxsLCAyKSwKICAgICJ1dGYtOCIKICApOwp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlUmVzb2x2ZXIoKSB7CiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20ocmVzb2x2ZXIsICJiYXNlNjQiKTsKICBhd2FpdCBmczIud3JpdGVGaWxlKCJmZWRlcmF0aW9uLXJlc29sdmVyLm1qcyIsIGJ1ZmZlciwgInV0Zi04Iik7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2ZzdGFydC1hcmdzLXBhcnNlci50cwppbXBvcnQgKiBhcyBmczMgZnJvbSAibm9kZTpmcyI7CnZhciBkZWZhdWx0QXJncyA9IHsKICBlbnRyeTogIi4vc2VydmVyLm1qcyIsCiAgcmVtb3Rlc09yTWFuaWZlc3RVcmw6ICIuLi9icm93c2VyL2ZlZGVyYXRpb24ubWFuaWZlc3QuanNvbiIsCiAgcmVsQnVuZGxlUGF0aDogIi4uL2Jyb3dzZXIvIgp9OwpmdW5jdGlvbiBwYXJzZUZTdGFydEFyZ3MoKSB7CiAgY29uc3QgYXJnczIgPSB7CiAgICBlbnRyeTogIiIsCiAgICByZW1vdGVzT3JNYW5pZmVzdFVybDogIiIsCiAgICByZWxCdW5kbGVQYXRoOiAiIgogIH07CiAgbGV0IGtleSA9ICIiOwogIGZvciAobGV0IGkgPSAyOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBjYW5kID0gcHJvY2Vzcy5hcmd2W2ldOwogICAgaWYgKGNhbmQuc3RhcnRzV2l0aCgiLS0iKSkgewogICAgICBjb25zdCBjYW5kS2V5ID0gY2FuZC5zdWJzdHJpbmcoMik7CiAgICAgIGlmIChkZWZhdWx0QXJnc1tjYW5kS2V5XSkgewogICAgICAgIGtleSA9IGNhbmRLZXk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgc3dpdGNoICR7Y2FuZH0gbm90IHN1cHBvcnRlZCFgKTsKICAgICAgICBleGl0V2l0aFVzYWdlKGRlZmF1bHRBcmdzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChrZXkpIHsKICAgICAgYXJnczJba2V5XSA9IGNhbmQ7CiAgICAgIGtleSA9ICIiOwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS5lcnJvcihgdW5yZWxhZGVkIHZhbHVlICR7Y2FuZH0hYCk7CiAgICAgIGV4aXRXaXRoVXNhZ2UoZGVmYXVsdEFyZ3MpOwogICAgfQogIH0KICBhcHBseURlZmF1bHRBcmdzKGFyZ3MyKTsKICByZXR1cm4gYXJnczI7Cn0KZnVuY3Rpb24gYXBwbHlEZWZhdWx0QXJncyhhcmdzMikgewogIGlmIChhcmdzMi5yZWxCdW5kbGVQYXRoICYmICFhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCkgewogICAgY29uc3QgY2FuZCA9IGRlZmF1bHRBcmdzLnJlbEJ1bmRsZVBhdGggKyAiZmVkZXJhdGlvbi5tYW5pZmVzdC5qc29uIjsKICAgIGlmIChmczMuZXhpc3RzU3luYyhjYW5kKSkgewogICAgICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IGNhbmQ7CiAgICB9CiAgfQogIGFyZ3MyLmVudHJ5ID0gYXJnczIuZW50cnkgfHwgZGVmYXVsdEFyZ3MuZW50cnk7CiAgYXJnczIucmVsQnVuZGxlUGF0aCA9IGFyZ3MyLnJlbEJ1bmRsZVBhdGggfHwgZGVmYXVsdEFyZ3MucmVsQnVuZGxlUGF0aDsKICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IGFyZ3MyLnJlbW90ZXNPck1hbmlmZXN0VXJsIHx8IGRlZmF1bHRBcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsOwogIGlmICghZnMzLmV4aXN0c1N5bmMoYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwpKSB7CiAgICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IHZvaWQgMDsKICB9Cn0KZnVuY3Rpb24gZXhpdFdpdGhVc2FnZShkZWZhdWx0QXJnczIpIHsKICBsZXQgYXJnczIgPSAiIjsKICBmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0QXJnczIpIHsKICAgIGFyZ3MyICs9IGBbLS0ke2tleX0gJHtkZWZhdWx0QXJnczJba2V5XX1dIGA7CiAgfQogIGNvbnNvbGUubG9nKCJ1c2FnZTogbmZzdGFydCAiICsgYXJnczIpOwogIHByb2Nlc3MuZXhpdCgxKTsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvdXRpbHMvZnN0YXJ0LnRzCnZhciBhcmdzID0gcGFyc2VGU3RhcnRBcmdzKCk7Cihhc3luYyAoKSA9PiB7CiAgYXdhaXQgaW5pdE5vZGVGZWRlcmF0aW9uKHsKICAgIC4uLmFyZ3MucmVtb3Rlc09yTWFuaWZlc3RVcmwgPyB7IHJlbW90ZXNPck1hbmlmZXN0VXJsOiBhcmdzLnJlbW90ZXNPck1hbmlmZXN0VXJsIH0gOiB7fSwKICAgIHJlbEJ1bmRsZVBhdGg6IGFyZ3MucmVsQnVuZGxlUGF0aAogIH0pOwogIGF3YWl0IGltcG9ydChhcmdzLmVudHJ5KTsKfSkoKTsK'; + 'Ly8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ub2RlL3NyYy9saWIvbm9kZS9pbml0LW5vZGUtZmVkZXJhdGlvbi50cwppbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJ25vZGU6bW9kdWxlJzsKaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJzsKaW1wb3J0ICogYXMgZnMyIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnOwppbXBvcnQgKiBhcyBwYXRoMiBmcm9tICdub2RlOnBhdGgnOwoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvZ2xvYmFsLWNhY2hlLnRzCnZhciBuZk5hbWVzcGFjZSA9ICdfX05BVElWRV9GRURFUkFUSU9OX18nOwp2YXIgZ2xvYmFsMiA9IGdsb2JhbFRoaXM7Cmdsb2JhbDJbbmZOYW1lc3BhY2VdID8/PSB7CiAgZXh0ZXJuYWxzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLAogIHJlbW90ZU5hbWVzVG9SZW1vdGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCiAgYmFzZVVybFRvUmVtb3RlTmFtZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksCn07CnZhciBnbG9iYWxDYWNoZSA9IGdsb2JhbDJbbmZOYW1lc3BhY2VdOwoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvZXh0ZXJuYWxzLnRzCnZhciBleHRlcm5hbHMgPSBnbG9iYWxDYWNoZS5leHRlcm5hbHM7CmZ1bmN0aW9uIGdldEV4dGVybmFsS2V5KHNoYXJlZCkgewogIHJldHVybiBgJHtzaGFyZWQucGFja2FnZU5hbWV9QCR7c2hhcmVkLnZlcnNpb259YDsKfQpmdW5jdGlvbiBnZXRFeHRlcm5hbFVybChzaGFyZWQpIHsKICBjb25zdCBwYWNrYWdlS2V5ID0gZ2V0RXh0ZXJuYWxLZXkoc2hhcmVkKTsKICByZXR1cm4gZXh0ZXJuYWxzLmdldChwYWNrYWdlS2V5KTsKfQpmdW5jdGlvbiBzZXRFeHRlcm5hbFVybChzaGFyZWQsIHVybDIpIHsKICBjb25zdCBwYWNrYWdlS2V5ID0gZ2V0RXh0ZXJuYWxLZXkoc2hhcmVkKTsKICBleHRlcm5hbHMuc2V0KHBhY2thZ2VLZXksIHVybDIpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9pbXBvcnQtbWFwLnRzCmZ1bmN0aW9uIG1lcmdlSW1wb3J0TWFwcyhtYXAxLCBtYXAyKSB7CiAgcmV0dXJuIHsKICAgIGltcG9ydHM6IHsgLi4ubWFwMS5pbXBvcnRzLCAuLi5tYXAyLmltcG9ydHMgfSwKICAgIHNjb3BlczogeyAuLi5tYXAxLnNjb3BlcywgLi4ubWFwMi5zY29wZXMgfSwKICB9Owp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi9tb2RlbC9yZW1vdGVzLnRzCnZhciByZW1vdGVOYW1lc1RvUmVtb3RlID0gZ2xvYmFsQ2FjaGUucmVtb3RlTmFtZXNUb1JlbW90ZTsKdmFyIGJhc2VVcmxUb1JlbW90ZU5hbWVzID0gZ2xvYmFsQ2FjaGUuYmFzZVVybFRvUmVtb3RlTmFtZXM7CmZ1bmN0aW9uIGFkZFJlbW90ZShyZW1vdGVOYW1lLCByZW1vdGUpIHsKICByZW1vdGVOYW1lc1RvUmVtb3RlLnNldChyZW1vdGVOYW1lLCByZW1vdGUpOwogIGJhc2VVcmxUb1JlbW90ZU5hbWVzLnNldChyZW1vdGUuYmFzZVVybCwgcmVtb3RlTmFtZSk7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL3V0aWxzL3BhdGgtdXRpbHMudHMKZnVuY3Rpb24gZ2V0RGlyZWN0b3J5KHVybDIpIHsKICBjb25zdCBwYXJ0cyA9IHVybDIuc3BsaXQoJy8nKTsKICBwYXJ0cy5wb3AoKTsKICByZXR1cm4gcGFydHMuam9pbignLycpOwp9CmZ1bmN0aW9uIGpvaW5QYXRocyhwYXRoMSwgcGF0aDIyKSB7CiAgd2hpbGUgKHBhdGgxLmVuZHNXaXRoKCcvJykpIHsKICAgIHBhdGgxID0gcGF0aDEuc3Vic3RyaW5nKDAsIHBhdGgxLmxlbmd0aCAtIDEpOwogIH0KICBpZiAocGF0aDIyLnN0YXJ0c1dpdGgoJy4vJykpIHsKICAgIHBhdGgyMiA9IHBhdGgyMi5zdWJzdHJpbmcoMiwgcGF0aDIyLmxlbmd0aCk7CiAgfQogIHJldHVybiBgJHtwYXRoMX0vJHtwYXRoMjJ9YDsKfQoKLy8gbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvd2F0Y2gtZmVkZXJhdGlvbi1idWlsZC50cwpmdW5jdGlvbiB3YXRjaEZlZGVyYXRpb25CdWlsZENvbXBsZXRpb24oZW5kcG9pbnQpIHsKICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZShlbmRwb2ludCk7CiAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsKICAgIGlmIChkYXRhLnR5cGUgPT09ICdmZWRlcmF0aW9uLXJlYnVpbGQtY29tcGxldGUnIC8qIENPTVBMRVRFRCAqLykgewogICAgICBjb25zb2xlLmxvZygnW0ZlZGVyYXRpb25dIFJlYnVpbGQgY29tcGxldGVkLCByZWxvYWRpbmcuLi4nKTsKICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQogIH07CiAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uIChldmVudCkgewogICAgY29uc29sZS53YXJuKCdbRmVkZXJhdGlvbl0gU1NFIGNvbm5lY3Rpb24gZXJyb3I6JywgZXZlbnQpOwogIH07Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL2luaXQtZmVkZXJhdGlvbi50cwphc3luYyBmdW5jdGlvbiBwcm9jZXNzUmVtb3RlSW5mb3MoCiAgcmVtb3RlcywKICBvcHRpb25zID0geyB0aHJvd0lmUmVtb3RlTm90Rm91bmQ6IGZhbHNlIH0sCikgewogIGNvbnN0IHByb2Nlc3NSZW1vdGVJbmZvUHJvbWlzZXMgPSBPYmplY3Qua2V5cyhyZW1vdGVzKS5tYXAoCiAgICBhc3luYyAocmVtb3RlTmFtZSkgPT4gewogICAgICB0cnkgewogICAgICAgIGxldCB1cmwyID0gcmVtb3Rlc1tyZW1vdGVOYW1lXTsKICAgICAgICBpZiAob3B0aW9ucy5jYWNoZVRhZykgewogICAgICAgICAgY29uc3QgYWRkQXBwZW5kID0gcmVtb3Rlc1tyZW1vdGVOYW1lXS5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nOwogICAgICAgICAgdXJsMiArPSBgJHthZGRBcHBlbmR9dD0ke29wdGlvbnMuY2FjaGVUYWd9YDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGF3YWl0IHByb2Nlc3NSZW1vdGVJbmZvKHVybDIsIHJlbW90ZU5hbWUpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgY29uc3QgZXJyb3IgPSBgRXJyb3IgbG9hZGluZyByZW1vdGUgZW50cnkgZm9yICR7cmVtb3RlTmFtZX0gZnJvbSBmaWxlICR7cmVtb3Rlc1tyZW1vdGVOYW1lXX1gOwogICAgICAgIGlmIChvcHRpb25zLnRocm93SWZSZW1vdGVOb3RGb3VuZCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTsKICAgICAgICB9CiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0sCiAgKTsKICBjb25zdCByZW1vdGVJbXBvcnRNYXBzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvY2Vzc1JlbW90ZUluZm9Qcm9taXNlcyk7CiAgY29uc3QgaW1wb3J0TWFwID0gcmVtb3RlSW1wb3J0TWFwcy5yZWR1Y2UoCiAgICAoYWNjLCByZW1vdGVJbXBvcnRNYXApID0+CiAgICAgIHJlbW90ZUltcG9ydE1hcCA/IG1lcmdlSW1wb3J0TWFwcyhhY2MsIHJlbW90ZUltcG9ydE1hcCkgOiBhY2MsCiAgICB7IGltcG9ydHM6IHt9LCBzY29wZXM6IHt9IH0sCiAgKTsKICByZXR1cm4gaW1wb3J0TWFwOwp9CmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvKGZlZGVyYXRpb25JbmZvVXJsLCByZW1vdGVOYW1lKSB7CiAgY29uc3QgYmFzZVVybCA9IGdldERpcmVjdG9yeShmZWRlcmF0aW9uSW5mb1VybCk7CiAgY29uc3QgcmVtb3RlSW5mbyA9IGF3YWl0IGxvYWRGZWRlcmF0aW9uSW5mbyhmZWRlcmF0aW9uSW5mb1VybCk7CiAgaWYgKCFyZW1vdGVOYW1lKSB7CiAgICByZW1vdGVOYW1lID0gcmVtb3RlSW5mby5uYW1lOwogIH0KICBpZiAocmVtb3RlSW5mby5idWlsZE5vdGlmaWNhdGlvbnNFbmRwb2ludCkgewogICAgd2F0Y2hGZWRlcmF0aW9uQnVpbGRDb21wbGV0aW9uKAogICAgICBiYXNlVXJsICsgcmVtb3RlSW5mby5idWlsZE5vdGlmaWNhdGlvbnNFbmRwb2ludCwKICAgICk7CiAgfQogIGNvbnN0IGltcG9ydE1hcCA9IGNyZWF0ZVJlbW90ZUltcG9ydE1hcChyZW1vdGVJbmZvLCByZW1vdGVOYW1lLCBiYXNlVXJsKTsKICBhZGRSZW1vdGUocmVtb3RlTmFtZSwgeyAuLi5yZW1vdGVJbmZvLCBiYXNlVXJsIH0pOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KZnVuY3Rpb24gY3JlYXRlUmVtb3RlSW1wb3J0TWFwKHJlbW90ZUluZm8sIHJlbW90ZU5hbWUsIGJhc2VVcmwpIHsKICBjb25zdCBpbXBvcnRzID0gcHJvY2Vzc0V4cG9zZWQocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCk7CiAgY29uc3Qgc2NvcGVzID0gcHJvY2Vzc1JlbW90ZUltcG9ydHMocmVtb3RlSW5mbywgYmFzZVVybCk7CiAgcmV0dXJuIHsgaW1wb3J0cywgc2NvcGVzIH07Cn0KYXN5bmMgZnVuY3Rpb24gbG9hZEZlZGVyYXRpb25JbmZvKHVybDIpIHsKICBjb25zdCBpbmZvID0gYXdhaXQgZmV0Y2godXJsMikudGhlbigocikgPT4gci5qc29uKCkpOwogIHJldHVybiBpbmZvOwp9CmZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbXBvcnRzKHJlbW90ZUluZm8sIGJhc2VVcmwpIHsKICBjb25zdCBzY29wZXMgPSB7fTsKICBjb25zdCBzY29wZWRJbXBvcnRzID0ge307CiAgZm9yIChjb25zdCBzaGFyZWQgb2YgcmVtb3RlSW5mby5zaGFyZWQpIHsKICAgIGNvbnN0IG91dEZpbGVOYW1lID0KICAgICAgZ2V0RXh0ZXJuYWxVcmwoc2hhcmVkKSA/PyBqb2luUGF0aHMoYmFzZVVybCwgc2hhcmVkLm91dEZpbGVOYW1lKTsKICAgIHNldEV4dGVybmFsVXJsKHNoYXJlZCwgb3V0RmlsZU5hbWUpOwogICAgc2NvcGVkSW1wb3J0c1tzaGFyZWQucGFja2FnZU5hbWVdID0gb3V0RmlsZU5hbWU7CiAgfQogIHNjb3Blc1tiYXNlVXJsICsgJy8nXSA9IHNjb3BlZEltcG9ydHM7CiAgcmV0dXJuIHNjb3BlczsKfQpmdW5jdGlvbiBwcm9jZXNzRXhwb3NlZChyZW1vdGVJbmZvLCByZW1vdGVOYW1lLCBiYXNlVXJsKSB7CiAgY29uc3QgaW1wb3J0cyA9IHt9OwogIGZvciAoY29uc3QgZXhwb3NlZCBvZiByZW1vdGVJbmZvLmV4cG9zZXMpIHsKICAgIGNvbnN0IGtleSA9IGpvaW5QYXRocyhyZW1vdGVOYW1lLCBleHBvc2VkLmtleSk7CiAgICBjb25zdCB2YWx1ZSA9IGpvaW5QYXRocyhiYXNlVXJsLCBleHBvc2VkLm91dEZpbGVOYW1lKTsKICAgIGltcG9ydHNba2V5XSA9IHZhbHVlOwogIH0KICByZXR1cm4gaW1wb3J0czsKfQphc3luYyBmdW5jdGlvbiBwcm9jZXNzSG9zdEluZm8oaG9zdEluZm8sIHJlbEJ1bmRsZXNQYXRoID0gJy4vJykgewogIGNvbnN0IGltcG9ydHMgPSBob3N0SW5mby5zaGFyZWQucmVkdWNlKAogICAgKGFjYywgY3VyKSA9PiAoewogICAgICAuLi5hY2MsCiAgICAgIFtjdXIucGFja2FnZU5hbWVdOiByZWxCdW5kbGVzUGF0aCArIGN1ci5vdXRGaWxlTmFtZSwKICAgIH0pLAogICAge30sCiAgKTsKICBmb3IgKGNvbnN0IHNoYXJlZCBvZiBob3N0SW5mby5zaGFyZWQpIHsKICAgIHNldEV4dGVybmFsVXJsKHNoYXJlZCwgcmVsQnVuZGxlc1BhdGggKyBzaGFyZWQub3V0RmlsZU5hbWUpOwogIH0KICByZXR1cm4geyBpbXBvcnRzLCBzY29wZXM6IHt9IH07Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2ltcG9ydC1tYXAtbG9hZGVyLmpzCmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnOwppbXBvcnQgdXJsIGZyb20gJ3VybCc7CmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnZnMnOwp2YXIgSU1QT1JUX01BUF9GSUxFX05BTUUgPSAnbm9kZS5pbXBvcnRtYXAnOwp2YXIgYmFzZVVSTCA9IHVybC5wYXRoVG9GaWxlVVJMKHByb2Nlc3MuY3dkKCkpICsgcGF0aC5zZXA7CmZ1bmN0aW9uIHJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKHBhcnNlZCkgewogIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQpKSB7CiAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBpbXBvcnQgbWFwIC0gdG9wIGxldmVsIG11c3QgYmUgYW4gb2JqZWN0YCk7CiAgfQogIGxldCBzb3J0ZWRBbmROb3JtYWxpemVkSW1wb3J0cyA9IHt9OwogIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyc2VkLCAnaW1wb3J0cycpKSB7CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocGFyc2VkLmltcG9ydHMpKSB7CiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGltcG9ydCBtYXAgLSAiaW1wb3J0cyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzID0gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcCgKICAgICAgcGFyc2VkLmltcG9ydHMsCiAgICAgIGJhc2VVUkwsCiAgICApOwogIH0KICBsZXQgc29ydGVkQW5kTm9ybWFsaXplZFNjb3BlcyA9IHt9OwogIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyc2VkLCAnc2NvcGVzJykpIHsKICAgIGlmICghaXNQbGFpbk9iamVjdChwYXJzZWQuc2NvcGVzKSkgewogICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBpbXBvcnQgbWFwIC0gInNjb3BlcyIgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3RgKTsKICAgIH0KICAgIHNvcnRlZEFuZE5vcm1hbGl6ZWRTY29wZXMgPSBzb3J0QW5kTm9ybWFsaXplU2NvcGVzKHBhcnNlZC5zY29wZXMsIGJhc2VVUkwpOwogIH0KICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKHBhcnNlZCkuZmlsdGVyKAogICAgKGtleSkgPT4ga2V5ICE9PSAnaW1wb3J0cycgJiYga2V5ICE9PSAnc2NvcGVzJywKICApOwogIGlmIChpbnZhbGlkS2V5cy5sZW5ndGggPiAwKSB7CiAgICBjb25zb2xlLndhcm4oCiAgICAgIGBJbnZhbGlkIHRvcC1sZXZlbCBrZXkke2ludmFsaWRLZXlzLmxlbmd0aCA+IDAgPyAncycgOiAnJ30gaW4gaW1wb3J0IG1hcCAtICR7aW52YWxpZEtleXMuam9pbignLCAnKX1gLAogICAgKTsKICB9CiAgcmV0dXJuIHsKICAgIGltcG9ydHM6IHNvcnRlZEFuZE5vcm1hbGl6ZWRJbXBvcnRzLAogICAgc2NvcGVzOiBzb3J0ZWRBbmROb3JtYWxpemVkU2NvcGVzLAogIH07Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNwZWNpZmllck1hcChtYXAsIGJhc2VVUkwyKSB7CiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9OwogIGZvciAobGV0IHNwZWNpZmllcktleSBpbiBtYXApIHsKICAgIGNvbnN0IHZhbHVlID0gbWFwW3NwZWNpZmllcktleV07CiAgICBjb25zdCBub3JtYWxpemVkU3BlY2lmaWVyS2V5ID0gbm9ybWFsaXplU3BlY2lmaWVyS2V5KAogICAgICBzcGVjaWZpZXJLZXksCiAgICAgIGJhc2VVUkwyLAogICAgKTsKICAgIGlmIChub3JtYWxpemVkU3BlY2lmaWVyS2V5ID09PSBudWxsKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGV0IGFkZHJlc3NVUkwgPSBwYXJzZVVSTExpa2VTcGVjaWZpZXIodmFsdWUsIGJhc2VVUkwyKTsKICAgIGlmIChhZGRyZXNzVVJMID09PSBudWxsKSB7CiAgICAgIGNvbnNvbGUud2FybigKICAgICAgICBgSW52YWxpZCBVUkwgYWRkcmVzcyBmb3IgaW1wb3J0IG1hcCBzcGVjaWZpZXIgJyR7c3BlY2lmaWVyS2V5fSdgLAogICAgICApOwogICAgICBub3JtYWxpemVkW25vcm1hbGl6ZWRTcGVjaWZpZXJLZXldID0gbnVsbDsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoc3BlY2lmaWVyS2V5LmVuZHNXaXRoKCcvJykgJiYgIWFkZHJlc3NVUkwuZW5kc1dpdGgoJy8nKSkgewogICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgYEludmFsaWQgVVJMIGFkZHJlc3MgZm9yIGltcG9ydCBtYXAgc3BlY2lmaWVyICcke3NwZWNpZmllcktleX0nIC0gc2luY2UgdGhlIHNwZWNpZmllciBlbmRzIGluIHNsYXNoLCBzbyBtdXN0IHRoZSBhZGRyZXNzYCwKICAgICAgKTsKICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IG51bGw7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbm9ybWFsaXplZFtub3JtYWxpemVkU3BlY2lmaWVyS2V5XSA9IGFkZHJlc3NVUkw7CiAgfQogIHJldHVybiBub3JtYWxpemVkOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZVNwZWNpZmllcktleShrZXkpIHsKICBpZiAoa2V5ID09PSAnJykgewogICAgY29uc29sZS53YXJuKGBTcGVjaWZpZXIga2V5cyBpbiBpbXBvcnQgbWFwcyBtYXkgbm90IGJlIHRoZSBlbXB0eSBzdHJpbmdgKTsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gcGFyc2VVUkxMaWtlU3BlY2lmaWVyKGtleSwgYmFzZVVSTCkgfHwga2V5Owp9CmZ1bmN0aW9uIHBhcnNlVVJMTGlrZVNwZWNpZmllcihzcGVjaWZpZXIsIGJhc2VVUkwyKSB7CiAgY29uc3QgdXNlQmFzZVVybEFzUGFyZW50ID0KICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCcvJykgfHwKICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpIHx8CiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi4vJyk7CiAgdHJ5IHsKICAgIHJldHVybiBuZXcgVVJMKHNwZWNpZmllciwgdXNlQmFzZVVybEFzUGFyZW50ID8gYmFzZVVSTDIgOiB2b2lkIDApLmhyZWY7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gc29ydEFuZE5vcm1hbGl6ZVNjb3BlcyhtYXAsIGJhc2VVUkwyKSB7CiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTsKICBmb3IgKGxldCBzY29wZVByZWZpeCBpbiBtYXApIHsKICAgIGNvbnN0IHBvdGVudGlhbFNwZWNpZmllck1hcCA9IG1hcFtzY29wZVByZWZpeF07CiAgICBpZiAoIWlzUGxhaW5PYmplY3QocG90ZW50aWFsU3BlY2lmaWVyTWFwKSkgewogICAgICB0aHJvdyBUeXBlRXJyb3IoCiAgICAgICAgYFRoZSB2YWx1ZSBvZiBzY29wZSAke3Njb3BlUHJlZml4fSBtdXN0IGJlIGEgSlNPTiBvYmplY3RgLAogICAgICApOwogICAgfQogICAgbGV0IHNjb3BlUHJlZml4VVJMOwogICAgdHJ5IHsKICAgICAgc2NvcGVQcmVmaXhVUkwgPSBuZXcgVVJMKHNjb3BlUHJlZml4LCBiYXNlVVJMMikuaHJlZjsKICAgIH0gY2F0Y2ggewogICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgYFNjb3BlIHByZWZpeCBVUkwgJyR7c2NvcGVQcmVmaXh9JyB3YXMgbm90IHBhcnNlYWJsZSBpbiBpbXBvcnQgbWFwYCwKICAgICAgKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBub3JtYWxpemVkW3Njb3BlUHJlZml4VVJMXSA9IHNvcnRBbmROb3JtYWxpemVTcGVjaWZpZXJNYXAoCiAgICAgIHBvdGVudGlhbFNwZWNpZmllck1hcCwKICAgICAgYmFzZVVSTDIsCiAgICApOwogIH0KICByZXR1cm4gbm9ybWFsaXplZDsKfQpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikgewogIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmICFBcnJheS5pc0FycmF5KG9iaik7Cn0KdmFyIGltcG9ydE1hcFByb21pc2UgPSBnZXRJbXBvcnRNYXBQcm9taXNlKCk7CmFzeW5jIGZ1bmN0aW9uIGdldEltcG9ydE1hcFByb21pc2UoKSB7CiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcHJvY2Vzcy5lbnYuSU1QT1JUX01BUF9QQVRIIHx8IElNUE9SVF9NQVBfRklMRV9OQU1FOwogIGNvbnN0IGltcG9ydE1hcFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVsYXRpdmVQYXRoKTsKICBsZXQgc3RyOwogIHRyeSB7CiAgICBzdHIgPSBhd2FpdCBmcy5yZWFkRmlsZShpbXBvcnRNYXBQYXRoKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHJldHVybiBlbXB0eU1hcCgpOwogIH0KICBsZXQganNvbjsKICB0cnkgewogICAganNvbiA9IGF3YWl0IEpTT04ucGFyc2Uoc3RyKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHRocm93IEVycm9yKAogICAgICBgSW1wb3J0IG1hcCBhdCAke2ltcG9ydE1hcFBhdGh9IGNvbnRhaW5zIGludmFsaWQganNvbjogJHtlcnIubWVzc2FnZX1gLAogICAgKTsKICB9CiAgcmV0dXJuIHJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKGpzb24pOwp9Cmdsb2JhbC5ub2RlTG9hZGVyID0gZ2xvYmFsLm5vZGVMb2FkZXIgfHwge307Cmdsb2JhbC5ub2RlTG9hZGVyLnNldEltcG9ydE1hcFByb21pc2UgPSBmdW5jdGlvbiBzZXRJbXBvcnRNYXBQcm9taXNlKHByb21pc2UpIHsKICBpbXBvcnRNYXBQcm9taXNlID0gcHJvbWlzZS50aGVuKChtYXApID0+IHsKICAgIHJldHVybiByZXNvbHZlQW5kQ29tcG9zZUltcG9ydE1hcChtYXApOwogIH0pOwp9OwpmdW5jdGlvbiBlbXB0eU1hcCgpIHsKICByZXR1cm4geyBpbXBvcnRzOiB7fSwgc2NvcGVzOiB7fSB9Owp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi91dGlscy9sb2FkZXItYXMtZGF0YS11cmwuanMKdmFyIHJlc29sdmVyID0KICAnYVcxd2IzSjBJSEJoZEdnZ1puSnZiU0FuY0dGMGFDYzdDbWx0Y0c5eWRDQjFjbXdnWm5KdmJTQW5kWEpzSnpzS2FXMXdiM0owSUhzZ2NISnZiV2x6WlhNZ1lYTWdabk1nZlNCbWNtOXRJQ2RtY3ljN0NncGxlSEJ2Y25RZ1kyOXVjM1FnU1UxUVQxSlVYMDFCVUY5R1NVeEZYMDVCVFVVZ1BTQW5ibTlrWlM1cGJYQnZjblJ0WVhBbk93b0tZMjl1YzNRZ1ltRnpaVlZTVENBOUlIVnliQzV3WVhSb1ZHOUdhV3hsVlZKTUtIQnliMk5sYzNNdVkzZGtLQ2twSUNzZ2NHRjBhQzV6WlhBN0Nnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU51WlhjdGNtVnpiMngyWlMxaGJHZHZjbWwwYUcwS1pYaHdiM0owSUdaMWJtTjBhVzl1SUhKbGMyOXNkbVZUY0dWamFXWnBaWElvYVcxd2IzSjBUV0Z3TENCemNHVmphV1pwWlhJc0lIQmhjbVZ1ZEZWU1RDa2dld29nSUd4bGRDQmpkWEp5Wlc1MFFtRnpaVlZTVERzS0lDQnBaaUFvY0dGeVpXNTBWVkpNS1NCN0NpQWdJQ0JqYjI1emRDQnNZWE4wVTJ4aGMyaEpibVJsZUNBOUlIQmhjbVZ1ZEZWU1RDNXNZWE4wU1c1a1pYaFBaaWh3WVhSb0xuTmxjQ2s3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlIQmhjbVZ1ZEZWU1RDNXpiR2xqWlNnd0xDQnNZWE4wVTJ4aGMyaEpibVJsZUNBcklERXBPd29nSUgwZ1pXeHpaU0I3Q2lBZ0lDQmpkWEp5Wlc1MFFtRnpaVlZTVENBOUlHSmhjMlZWVWt3N0NpQWdmUW9nSUdOdmJuTjBJRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWElnUFFvZ0lDQWdjR0Z5YzJWVlVreE1hV3RsVTNCbFkybG1hV1Z5S0hOd1pXTnBabWxsY2l3Z1kzVnljbVZ1ZEVKaGMyVlZVa3dwSUh4OElITndaV05wWm1sbGNqc0tJQ0JtYjNJZ0tHeGxkQ0J6WTI5d1pWQnlaV1pwZUNCcGJpQnBiWEJ2Y25STllYQXVjMk52Y0dWektTQjdDaUFnSUNCcFppQW9DaUFnSUNBZ0lITmpiM0JsVUhKbFptbDRJRDA5UFNCamRYSnlaVzUwUW1GelpWVlNUQ0I4ZkFvZ0lDQWdJQ0FvYzJOdmNHVlFjbVZtYVhndVpXNWtjMWRwZEdnb0p5OG5LU0FtSmlCamRYSnlaVzUwUW1GelpWVlNUQzV6ZEdGeWRITlhhWFJvS0hOamIzQmxVSEpsWm1sNEtTa0tJQ0FnSUNrZ2V3b2dJQ0FnSUNCamIyNXpkQ0J6WTI5d1pVbHRjRzl5ZEhOTllYUmphQ0E5SUhKbGMyOXNkbVZKYlhCdmNuUnpUV0YwWTJnb0NpQWdJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNpd0tJQ0FnSUNBZ0lDQnBiWEJ2Y25STllYQXVjMk52Y0dWelczTmpiM0JsVUhKbFptbDRYU3dLSUNBZ0lDQWdLVHNLSUNBZ0lDQWdhV1lnS0hOamIzQmxTVzF3YjNKMGMwMWhkR05vS1NCN0NpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhOamIzQmxTVzF3YjNKMGMwMWhkR05vT3dvZ0lDQWdJQ0I5Q2lBZ0lDQjlDaUFnZlFvS0lDQnlaWFIxY200Z2NtVnpiMngyWlVsdGNHOXlkSE5OWVhSamFDaHViM0p0WVd4cGVtVmtVM0JsWTJsbWFXVnlMQ0JwYlhCdmNuUk5ZWEF1YVcxd2IzSjBjeWs3Q24wS0NpOHZJR2gwZEhCek9pOHZkMmxqWnk1bmFYUm9kV0l1YVc4dmFXMXdiM0owTFcxaGNITXZJM0psYzI5c2RtVXRZVzR0YVcxd2IzSjBjeTF0WVhSamFBcG1kVzVqZEdsdmJpQnlaWE52YkhabFNXMXdiM0owYzAxaGRHTm9LRzV2Y20xaGJHbDZaV1JUY0dWamFXWnBaWElzSUhOd1pXTnBabWxsY2sxaGNDa2dld29nSUdadmNpQW9iR1YwSUhOd1pXTnBabWxsY2t0bGVTQnBiaUJ6Y0dWamFXWnBaWEpOWVhBcElIc0tJQ0FnSUdOdmJuTjBJSEpsYzI5c2RYUnBiMjVTWlhOMWJIUWdQU0J6Y0dWamFXWnBaWEpOWVhCYmMzQmxZMmxtYVdWeVMyVjVYVHNLQ2lBZ0lDQnBaaUFvYzNCbFkybG1hV1Z5UzJWNUlEMDlQU0J1YjNKdFlXeHBlbVZrVTNCbFkybG1hV1Z5S1NCN0NpQWdJQ0FnSUdsbUlDaHlaWE52YkhWMGFXOXVVbVZ6ZFd4MElEMDlQU0J1ZFd4c0tTQjdDaUFnSUNBZ0lDQWdkR2h5YjNjZ1ZIbHdaVVZ5Y205eUtBb2dJQ0FnSUNBZ0lDQWdZRlJvWlNCcGJYQnZjblFnYldGd0lISmxjMjlzZFhScGIyNGdiMllnSkh0emNHVmphV1pwWlhKTFpYbDlJR1poYVd4bFpDQmtkV1VnZEc4Z1lTQnVkV3hzSUdWdWRISjVZQ3dLSUNBZ0lDQWdJQ0FwT3dvZ0lDQWdJQ0I5Q2lBZ0lDQWdJSEpsZEhWeWJpQnlaWE52YkhWMGFXOXVVbVZ6ZFd4ME93b2dJQ0FnZlNCbGJITmxJR2xtSUNnS0lDQWdJQ0FnYzNCbFkybG1hV1Z5UzJWNUxtVnVaSE5YYVhSb0tDY3ZKeWtnSmlZS0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2k1emRHRnlkSE5YYVhSb0tITndaV05wWm1sbGNrdGxlU2tLSUNBZ0lDa2dld29nSUNBZ0lDQnBaaUFvY21WemIyeDFkR2x2YmxKbGMzVnNkQ0E5UFQwZ2JuVnNiQ2tnZXdvZ0lDQWdJQ0FnSUhSb2NtOTNJRlI1Y0dWRmNuSnZjaWdLSUNBZ0lDQWdJQ0FnSUdCVWFHVWdhVzF3YjNKMElHMWhjQ0J5WlhOdmJIVjBhVzl1SUc5bUlDUjdjM0JsWTJsbWFXVnlTMlY1ZlNCbVlXbHNaV1FnWkhWbElIUnZJR0VnYm5Wc2JDQmxiblJ5ZVdBc0NpQWdJQ0FnSUNBZ0tUc0tJQ0FnSUNBZ2ZRb2dJQ0FnSUNCamIyNXpkQ0JoWm5SbGNsQnlaV1pwZUNBOUlHNXZjbTFoYkdsNlpXUlRjR1ZqYVdacFpYSXVjMnhwWTJVb2MzQmxZMmxtYVdWeVMyVjVMbXhsYm1kMGFDazdDaUFnSUNBZ0lIUnllU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsZHlCVlVrd29ZV1owWlhKUWNtVm1hWGdzSUhKbGMyOXNkWFJwYjI1U1pYTjFiSFFwTG1oeVpXWTdDaUFnSUNBZ0lIMGdZMkYwWTJnZ2V3b2dJQ0FnSUNBZ0lIUm9jbTkzSUZSNWNHVkZjbkp2Y2lnS0lDQWdJQ0FnSUNBZ0lHQlVhR1VnYVcxd2IzSjBJRzFoY0NCeVpYTnZiSFYwYVc5dUlHOW1JQ1I3YzNCbFkybG1hV1Z5UzJWNWZTQm1ZV2xzWldRZ1pIVmxJSFJ2SUZWU1RDQndZWEp6WlNCbVlXbHNkWEpsWUN3S0lDQWdJQ0FnSUNBcE93b2dJQ0FnSUNCOUNpQWdJQ0I5Q2lBZ2ZRb0tJQ0J5WlhSMWNtNGdiblZzYkRzS2ZRb0tMeThnYUhSMGNITTZMeTkzYVdObkxtZHBkR2gxWWk1cGJ5OXBiWEJ2Y25RdGJXRndjeThqY0dGeWMybHVad3BsZUhCdmNuUWdablZ1WTNScGIyNGdjbVZ6YjJ4MlpVRnVaRU52YlhCdmMyVkpiWEJ2Y25STllYQW9jR0Z5YzJWa0tTQjdDaUFnTHk4Z1UzUmxjQ0F5Q2lBZ2FXWWdLQ0ZwYzFCc1lXbHVUMkpxWldOMEtIQmhjbk5sWkNrcElIc0tJQ0FnSUhSb2NtOTNJRVZ5Y205eUtHQkpiblpoYkdsa0lHbHRjRzl5ZENCdFlYQWdMU0IwYjNBZ2JHVjJaV3dnYlhWemRDQmlaU0JoYmlCdlltcGxZM1JnS1RzS0lDQjlDZ29nSUM4dklGTjBaWEFnTXdvZ0lHeGxkQ0J6YjNKMFpXUkJibVJPYjNKdFlXeHBlbVZrU1cxd2IzSjBjeUE5SUh0OU93b0tJQ0F2THlCVGRHVndJRFFLSUNCcFppQW9UMkpxWldOMExuQnliM1J2ZEhsd1pTNW9ZWE5QZDI1UWNtOXdaWEowZVM1allXeHNLSEJoY25ObFpDd2dKMmx0Y0c5eWRITW5LU2tnZXdvZ0lDQWdMeThnVTNSbGNDQTBMakVLSUNBZ0lHbG1JQ2doYVhOUWJHRnBiazlpYW1WamRDaHdZWEp6WldRdWFXMXdiM0owY3lrcElIc0tJQ0FnSUNBZ2RHaHliM2NnUlhKeWIzSW9ZRWx1ZG1Gc2FXUWdhVzF3YjNKMElHMWhjQ0F0SUNKcGJYQnZjblJ6SWlCd2NtOXdaWEowZVNCdGRYTjBJR0psSUdGdUlHOWlhbVZqZEdBcE93b2dJQ0FnZlFvS0lDQWdJQzh2SUZOMFpYQWdOQzR5Q2lBZ0lDQnpiM0owWldSQmJtUk9iM0p0WVd4cGVtVmtTVzF3YjNKMGN5QTlJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRjR1ZqYVdacFpYSk5ZWEFvQ2lBZ0lDQWdJSEJoY25ObFpDNXBiWEJ2Y25SekxBb2dJQ0FnSUNCaVlYTmxWVkpNTEFvZ0lDQWdLVHNLSUNCOUNnb2dJQzh2SUZOMFpYQWdOUW9nSUd4bGRDQnpiM0owWldSQmJtUk9iM0p0WVd4cGVtVmtVMk52Y0dWeklEMGdlMzA3Q2dvZ0lDOHZJRk4wWlhBZ05nb2dJR2xtSUNoUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG1oaGMwOTNibEJ5YjNCbGNuUjVMbU5oYkd3b2NHRnljMlZrTENBbmMyTnZjR1Z6SnlrcElIc0tJQ0FnSUM4dklGTjBaWEFnTmk0eENpQWdJQ0JwWmlBb0lXbHpVR3hoYVc1UFltcGxZM1FvY0dGeWMyVmtMbk5qYjNCbGN5a3BJSHNLSUNBZ0lDQWdkR2h5YjNjZ1JYSnliM0lvWUVsdWRtRnNhV1FnYVcxd2IzSjBJRzFoY0NBdElDSnpZMjl3WlhNaUlIQnliM0JsY25SNUlHMTFjM1FnWW1VZ1lXNGdiMkpxWldOMFlDazdDaUFnSUNCOUNnb2dJQ0FnTHk4Z1UzUmxjQ0EyTGpJS0lDQWdJSE52Y25SbFpFRnVaRTV2Y20xaGJHbDZaV1JUWTI5d1pYTWdQU0J6YjNKMFFXNWtUbTl5YldGc2FYcGxVMk52Y0dWektIQmhjbk5sWkM1elkyOXdaWE1zSUdKaGMyVlZVa3dwT3dvZ0lIMEtDaUFnTHk4Z1UzUmxjQ0EzQ2lBZ1kyOXVjM1FnYVc1MllXeHBaRXRsZVhNZ1BTQlBZbXBsWTNRdWEyVjVjeWh3WVhKelpXUXBMbVpwYkhSbGNpZ0tJQ0FnSUNoclpYa3BJRDArSUd0bGVTQWhQVDBnSjJsdGNHOXlkSE1uSUNZbUlHdGxlU0FoUFQwZ0ozTmpiM0JsY3ljc0NpQWdLVHNLSUNCcFppQW9hVzUyWVd4cFpFdGxlWE11YkdWdVozUm9JRDRnTUNrZ2V3b2dJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNCZ1NXNTJZV3hwWkNCMGIzQXRiR1YyWld3Z2EyVjVKSHNLSUNBZ0lDQWdJQ0JwYm5aaGJHbGtTMlY1Y3k1c1pXNW5kR2dnUGlBd0lEOGdKM01uSURvZ0p5Y0tJQ0FnSUNBZ2ZTQnBiaUJwYlhCdmNuUWdiV0Z3SUMwZ0pIdHBiblpoYkdsa1MyVjVjeTVxYjJsdUtDY3NJQ2NwZldBc0NpQWdJQ0FwT3dvZ0lIMEtDaUFnTHk4Z1UzUmxjQ0E0Q2lBZ2NtVjBkWEp1SUhzS0lDQWdJR2x0Y0c5eWRITTZJSE52Y25SbFpFRnVaRTV2Y20xaGJHbDZaV1JKYlhCdmNuUnpMQW9nSUNBZ2MyTnZjR1Z6T2lCemIzSjBaV1JCYm1ST2IzSnRZV3hwZW1Wa1UyTnZjR1Z6TEFvZ0lIMDdDbjBLQ2k4dklHaDBkSEJ6T2k4dmQybGpaeTVuYVhSb2RXSXVhVzh2YVcxd2IzSjBMVzFoY0hNdkkzTnZjblF0WVc1a0xXNXZjbTFoYkdsNlpTMWhMWE53WldOcFptbGxjaTF0WVhBS1puVnVZM1JwYjI0Z2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDaHRZWEFzSUdKaGMyVlZVa3dwSUhzS0lDQmpiMjV6ZENCdWIzSnRZV3hwZW1Wa0lEMGdlMzA3Q2dvZ0lHWnZjaUFvYkdWMElITndaV05wWm1sbGNrdGxlU0JwYmlCdFlYQXBJSHNLSUNBZ0lHTnZibk4wSUhaaGJIVmxJRDBnYldGd1czTndaV05wWm1sbGNrdGxlVjA3Q2dvZ0lDQWdZMjl1YzNRZ2JtOXliV0ZzYVhwbFpGTndaV05wWm1sbGNrdGxlU0E5SUc1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2t0bGVTaHpjR1ZqYVdacFpYSkxaWGtzSUdKaGMyVlZVa3dwT3dvZ0lDQWdhV1lnS0c1dmNtMWhiR2w2WldSVGNHVmphV1pwWlhKTFpYa2dQVDA5SUc1MWJHd3BJSHNLSUNBZ0lDQWdZMjl1ZEdsdWRXVTdDaUFnSUNCOUNnb2dJQ0FnYkdWMElHRmtaSEpsYzNOVlVrd2dQU0J3WVhKelpWVlNURXhwYTJWVGNHVmphV1pwWlhJb2RtRnNkV1VzSUdKaGMyVlZVa3dwT3dvZ0lDQWdhV1lnS0dGa1pISmxjM05WVWt3Z1BUMDlJRzUxYkd3cElIc0tJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLQW9nSUNBZ0lDQWdJR0JKYm5aaGJHbGtJRlZTVENCaFpHUnlaWE56SUdadmNpQnBiWEJ2Y25RZ2JXRndJSE53WldOcFptbGxjaUFuSkh0emNHVmphV1pwWlhKTFpYbDlKMkFzQ2lBZ0lDQWdJQ2s3Q2lBZ0lDQWdJRzV2Y20xaGJHbDZaV1JiYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVWMGdQU0J1ZFd4c093b2dJQ0FnSUNCamIyNTBhVzUxWlRzS0lDQWdJSDBLQ2lBZ0lDQnBaaUFvYzNCbFkybG1hV1Z5UzJWNUxtVnVaSE5YYVhSb0tDY3ZKeWtnSmlZZ0lXRmtaSEpsYzNOVlVrd3VaVzVrYzFkcGRHZ29KeThuS1NrZ2V3b2dJQ0FnSUNCamIyNXpiMnhsTG5kaGNtNG9DaUFnSUNBZ0lDQWdZRWx1ZG1Gc2FXUWdWVkpNSUdGa1pISmxjM01nWm05eUlHbHRjRzl5ZENCdFlYQWdjM0JsWTJsbWFXVnlJQ2NrZTNOd1pXTnBabWxsY2t0bGVYMG5JQzBnYzJsdVkyVWdkR2hsSUhOd1pXTnBabWxsY2lCbGJtUnpJR2x1SUhOc1lYTm9MQ0J6YnlCdGRYTjBJSFJvWlNCaFpHUnlaWE56WUN3S0lDQWdJQ0FnS1RzS0lDQWdJQ0FnYm05eWJXRnNhWHBsWkZ0dWIzSnRZV3hwZW1Wa1UzQmxZMmxtYVdWeVMyVjVYU0E5SUc1MWJHdzdDaUFnSUNBZ0lHTnZiblJwYm5WbE93b2dJQ0FnZlFvS0lDQWdJRzV2Y20xaGJHbDZaV1JiYm05eWJXRnNhWHBsWkZOd1pXTnBabWxsY2t0bGVWMGdQU0JoWkdSeVpYTnpWVkpNT3dvZ0lIMEtDaUFnY21WMGRYSnVJRzV2Y20xaGJHbDZaV1E3Q24wS0NpOHZJR2gwZEhCek9pOHZkMmxqWnk1bmFYUm9kV0l1YVc4dmFXMXdiM0owTFcxaGNITXZJMjV2Y20xaGJHbDZaUzFoTFhOd1pXTnBabWxsY2kxclpYa0tablZ1WTNScGIyNGdibTl5YldGc2FYcGxVM0JsWTJsbWFXVnlTMlY1S0d0bGVTa2dld29nSUdsbUlDaHJaWGtnUFQwOUlDY25LU0I3Q2lBZ0lDQmpiMjV6YjJ4bExuZGhjbTRvWUZOd1pXTnBabWxsY2lCclpYbHpJR2x1SUdsdGNHOXlkQ0J0WVhCeklHMWhlU0J1YjNRZ1ltVWdkR2hsSUdWdGNIUjVJSE4wY21sdVoyQXBPd29nSUNBZ2NtVjBkWEp1SUc1MWJHdzdDaUFnZlFvS0lDQnlaWFIxY200Z2NHRnljMlZWVWt4TWFXdGxVM0JsWTJsbWFXVnlLR3RsZVN3Z1ltRnpaVlZTVENrZ2ZId2dhMlY1T3dwOUNnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU53WVhKelpTMWhMWFZ5YkMxc2FXdGxMV2x0Y0c5eWRDMXpjR1ZqYVdacFpYSUtablZ1WTNScGIyNGdjR0Z5YzJWVlVreE1hV3RsVTNCbFkybG1hV1Z5S0hOd1pXTnBabWxsY2l3Z1ltRnpaVlZTVENrZ2V3b2dJR052Ym5OMElIVnpaVUpoYzJWVmNteEJjMUJoY21WdWRDQTlDaUFnSUNCemNHVmphV1pwWlhJdWMzUmhjblJ6VjJsMGFDZ25MeWNwSUh4OENpQWdJQ0J6Y0dWamFXWnBaWEl1YzNSaGNuUnpWMmwwYUNnbkxpOG5LU0I4ZkFvZ0lDQWdjM0JsWTJsbWFXVnlMbk4wWVhKMGMxZHBkR2dvSnk0dUx5Y3BPd29LSUNCMGNua2dld29nSUNBZ2NtVjBkWEp1SUc1bGR5QlZVa3dvYzNCbFkybG1hV1Z5TENCMWMyVkNZWE5sVlhKc1FYTlFZWEpsYm5RZ1B5QmlZWE5sVlZKTUlEb2dkVzVrWldacGJtVmtLUzVvY21WbU93b2dJSDBnWTJGMFkyZ2dld29nSUNBZ2NtVjBkWEp1SUc1MWJHdzdDaUFnZlFwOUNnb3ZMeUJvZEhSd2N6b3ZMM2RwWTJjdVoybDBhSFZpTG1sdkwybHRjRzl5ZEMxdFlYQnpMeU56YjNKMExXRnVaQzF1YjNKdFlXeHBlbVV0YzJOdmNHVnpDbVoxYm1OMGFXOXVJSE52Y25SQmJtUk9iM0p0WVd4cGVtVlRZMjl3WlhNb2JXRndMQ0JpWVhObFZWSk1LU0I3Q2lBZ2JHVjBJRzV2Y20xaGJHbDZaV1FnUFNCN2ZUc0tDaUFnWm05eUlDaHNaWFFnYzJOdmNHVlFjbVZtYVhnZ2FXNGdiV0Z3S1NCN0NpQWdJQ0JqYjI1emRDQndiM1JsYm5ScFlXeFRjR1ZqYVdacFpYSk5ZWEFnUFNCdFlYQmJjMk52Y0dWUWNtVm1hWGhkT3dvZ0lDQWdhV1lnS0NGcGMxQnNZV2x1VDJKcVpXTjBLSEJ2ZEdWdWRHbGhiRk53WldOcFptbGxjazFoY0NrcElIc0tJQ0FnSUNBZ2RHaHliM2NnVkhsd1pVVnljbTl5S0FvZ0lDQWdJQ0FnSUdCVWFHVWdkbUZzZFdVZ2IyWWdjMk52Y0dVZ0pIdHpZMjl3WlZCeVpXWnBlSDBnYlhWemRDQmlaU0JoSUVwVFQwNGdiMkpxWldOMFlDd0tJQ0FnSUNBZ0tUc0tJQ0FnSUgwS0NpQWdJQ0JzWlhRZ2MyTnZjR1ZRY21WbWFYaFZVa3c3Q2lBZ0lDQjBjbmtnZXdvZ0lDQWdJQ0J6WTI5d1pWQnlaV1pwZUZWU1RDQTlJRzVsZHlCVlVrd29jMk52Y0dWUWNtVm1hWGdzSUdKaGMyVlZVa3dwTG1oeVpXWTdDaUFnSUNCOUlHTmhkR05vSUhzS0lDQWdJQ0FnWTI5dWMyOXNaUzUzWVhKdUtBb2dJQ0FnSUNBZ0lHQlRZMjl3WlNCd2NtVm1hWGdnVlZKTUlDY2tlM05qYjNCbFVISmxabWw0ZlNjZ2QyRnpJRzV2ZENCd1lYSnpaV0ZpYkdVZ2FXNGdhVzF3YjNKMElHMWhjR0FzQ2lBZ0lDQWdJQ2s3Q2lBZ0lDQWdJR052Ym5ScGJuVmxPd29nSUNBZ2ZRb0tJQ0FnSUc1dmNtMWhiR2w2WldSYmMyTnZjR1ZRY21WbWFYaFZVa3hkSUQwZ2MyOXlkRUZ1WkU1dmNtMWhiR2w2WlZOd1pXTnBabWxsY2sxaGNDZ0tJQ0FnSUNBZ2NHOTBaVzUwYVdGc1UzQmxZMmxtYVdWeVRXRndMQW9nSUNBZ0lDQmlZWE5sVlZKTUxBb2dJQ0FnS1RzS0lDQjlDZ29nSUhKbGRIVnliaUJ1YjNKdFlXeHBlbVZrT3dwOUNncG1kVzVqZEdsdmJpQnBjMUJzWVdsdVQySnFaV04wS0c5aWFpa2dld29nSUhKbGRIVnliaUJ2WW1vZ1BUMDlJRTlpYW1WamRDaHZZbW9wSUNZbUlDRkJjbkpoZVM1cGMwRnljbUY1S0c5aWFpazdDbjBLQ2k4dklDMHRMUW9LYkdWMElHbHRjRzl5ZEUxaGNGQnliMjFwYzJVZ1BTQm5aWFJKYlhCdmNuUk5ZWEJRY205dGFYTmxLQ2s3Q2dwbGVIQnZjblFnWVhONWJtTWdablZ1WTNScGIyNGdjbVZ6YjJ4MlpTaHpjR1ZqYVdacFpYSXNJR052Ym5SbGVIUXNJR1JsWm1GMWJIUlNaWE52YkhabEtTQjdDaUFnWTI5dWMzUWdleUJ3WVhKbGJuUlZVa3dnUFNCdWRXeHNJSDBnUFNCamIyNTBaWGgwT3dvZ0lHTnZibk4wSUdsdGNHOXlkRTFoY0NBOUlHRjNZV2wwSUdsdGNHOXlkRTFoY0ZCeWIyMXBjMlU3Q2lBZ1kyOXVjM1FnYVcxd2IzSjBUV0Z3VlhKc0lEMGdjbVZ6YjJ4MlpWTndaV05wWm1sbGNpaHBiWEJ2Y25STllYQXNJSE53WldOcFptbGxjaXdnY0dGeVpXNTBWVkpNS1RzS0NpQWdjbVYwZFhKdUlHUmxabUYxYkhSU1pYTnZiSFpsS0dsdGNHOXlkRTFoY0ZWeWJDQS9QeUJ6Y0dWamFXWnBaWElzSUdOdmJuUmxlSFFzSUdSbFptRjFiSFJTWlhOdmJIWmxLVHNLZlFvS1pYaHdiM0owSUdGemVXNWpJR1oxYm1OMGFXOXVJR3h2WVdRb2RYSnNMQ0JqYjI1MFpYaDBMQ0JrWldaaGRXeDBURzloWkNrZ2V3b2dJR2xtSUNoMWNtd3VjM1JoY25SelYybDBhQ2duYUhSMGNEb3ZMeWNwSUh4OElIVnliQzV6ZEdGeWRITlhhWFJvS0Nkb2RIUndjem92THljcEtTQjdDaUFnSUNCamIyNXpkQ0J5WlhNZ1BTQmhkMkZwZENCbVpYUmphQ2gxY213cE93b2dJQ0FnYVdZZ0tDRnlaWE11YjJzcElIc0tJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0dCR1lXbHNaV1FnZEc4Z1ptVjBZMmdnYlc5a2RXeGxJR1p5YjIwZ0pIdDFjbXg5WUNrN0NpQWdJQ0I5Q2lBZ0lDQmpiMjV6ZENCemIzVnlZMlVnUFNCaGQyRnBkQ0J5WlhNdWRHVjRkQ2dwT3dvZ0lDQWdjbVYwZFhKdUlIc0tJQ0FnSUNBZ2MyaHZjblJEYVhKamRXbDBPaUIwY25WbExBb2dJQ0FnSUNCbWIzSnRZWFE2SUNkdGIyUjFiR1VuTEFvZ0lDQWdJQ0J6YjNWeVkyVXNDaUFnSUNCOU93b2dJSDBLQ2lBZ2FXWWdLQ0YxY213dWMzUmhjblJ6VjJsMGFDZ25ibTlrWlRvbktTa2dld29nSUNBZ1kyOXVkR1Y0ZEM1bWIzSnRZWFFnUFNBbmJXOWtkV3hsSnpzS0lDQjlDZ29nSUhKbGRIVnliaUJrWldaaGRXeDBURzloWkNoMWNtd3NJR052Ym5SbGVIUXNJR1JsWm1GMWJIUk1iMkZrS1RzS2ZRb0tZWE41Ym1NZ1puVnVZM1JwYjI0Z1oyVjBTVzF3YjNKMFRXRndVSEp2YldselpTZ3BJSHNLSUNCamIyNXpkQ0J5Wld4aGRHbDJaVkJoZEdnZ1BTQndjbTlqWlhOekxtVnVkaTVKVFZCUFVsUmZUVUZRWDFCQlZFZ2dmSHdnU1UxUVQxSlVYMDFCVUY5R1NVeEZYMDVCVFVVN0NpQWdZMjl1YzNRZ2FXMXdiM0owVFdGd1VHRjBhQ0E5SUhCaGRHZ3VjbVZ6YjJ4MlpTaHdjbTlqWlhOekxtTjNaQ2dwTENCeVpXeGhkR2wyWlZCaGRHZ3BPd29LSUNCc1pYUWdjM1J5T3dvZ0lIUnllU0I3Q2lBZ0lDQnpkSElnUFNCaGQyRnBkQ0JtY3k1eVpXRmtSbWxzWlNocGJYQnZjblJOWVhCUVlYUm9LVHNLSUNCOUlHTmhkR05vSUNobGNuSXBJSHNLSUNBZ0lISmxkSFZ5YmlCbGJYQjBlVTFoY0NncE93b2dJSDBLQ2lBZ2JHVjBJR3B6YjI0N0NpQWdkSEo1SUhzS0lDQWdJR3B6YjI0Z1BTQmhkMkZwZENCS1UwOU9MbkJoY25ObEtITjBjaWs3Q2lBZ2ZTQmpZWFJqYUNBb1pYSnlLU0I3Q2lBZ0lDQjBhSEp2ZHlCRmNuSnZjaWdLSUNBZ0lDQWdZRWx0Y0c5eWRDQnRZWEFnWVhRZ0pIdHBiWEJ2Y25STllYQlFZWFJvZlNCamIyNTBZV2x1Y3lCcGJuWmhiR2xrSUdwemIyNDZJQ1I3WlhKeUxtMWxjM05oWjJWOVlDd0tJQ0FnSUNrN0NpQWdmUW9LSUNCeVpYUjFjbTRnY21WemIyeDJaVUZ1WkVOdmJYQnZjMlZKYlhCdmNuUk5ZWEFvYW5OdmJpazdDbjBLQ21kc2IySmhiQzV1YjJSbFRHOWhaR1Z5SUQwZ1oyeHZZbUZzTG01dlpHVk1iMkZrWlhJZ2ZId2dlMzA3Q2dwbmJHOWlZV3d1Ym05a1pVeHZZV1JsY2k1elpYUkpiWEJ2Y25STllYQlFjbTl0YVhObElEMGdablZ1WTNScGIyNGdjMlYwU1cxd2IzSjBUV0Z3VUhKdmJXbHpaU2h3Y205dGFYTmxLU0I3Q2lBZ2FXMXdiM0owVFdGd1VISnZiV2x6WlNBOUlIQnliMjFwYzJVdWRHaGxiaWdvYldGd0tTQTlQaUI3Q2lBZ0lDQnlaWFIxY200Z2NtVnpiMngyWlVGdVpFTnZiWEJ2YzJWSmJYQnZjblJOWVhBb2JXRndLVHNLSUNCOUtUc0tmVHNLQ21aMWJtTjBhVzl1SUdWdGNIUjVUV0Z3S0NrZ2V3b2dJSEpsZEhWeWJpQjdJR2x0Y0c5eWRITTZJSHQ5TENCelkyOXdaWE02SUh0OUlIMDdDbjBLJzsKCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL25vZGUvaW5pdC1ub2RlLWZlZGVyYXRpb24udHMKdmFyIGRlZmF1bHRPcHRpb25zID0gewogIHJlbW90ZXNPck1hbmlmZXN0VXJsOiB7fSwKICByZWxCdW5kbGVQYXRoOiAnLi4vYnJvd3NlcicsCiAgdGhyb3dJZlJlbW90ZU5vdEZvdW5kOiBmYWxzZSwKfTsKYXN5bmMgZnVuY3Rpb24gaW5pdE5vZGVGZWRlcmF0aW9uKG9wdGlvbnMpIHsKICBjb25zdCBtZXJnZWRPcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9OwogIGNvbnN0IGltcG9ydE1hcCA9IGF3YWl0IGNyZWF0ZU5vZGVJbXBvcnRNYXAobWVyZ2VkT3B0aW9ucyk7CiAgYXdhaXQgd3JpdGVJbXBvcnRNYXAoaW1wb3J0TWFwKTsKICBhd2FpdCB3cml0ZVJlc29sdmVyKCk7CiAgcmVnaXN0ZXIocGF0aFRvRmlsZVVSTCgnLi9mZWRlcmF0aW9uLXJlc29sdmVyLm1qcycpLmhyZWYpOwp9CmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5vZGVJbXBvcnRNYXAob3B0aW9ucykgewogIGNvbnN0IHsgcmVtb3Rlc09yTWFuaWZlc3RVcmwsIHJlbEJ1bmRsZVBhdGggfSA9IG9wdGlvbnM7CiAgY29uc3QgcmVtb3RlcyA9CiAgICB0eXBlb2YgcmVtb3Rlc09yTWFuaWZlc3RVcmwgPT09ICdvYmplY3QnCiAgICAgID8gcmVtb3Rlc09yTWFuaWZlc3RVcmwKICAgICAgOiBhd2FpdCBsb2FkRnNNYW5pZmVzdChyZW1vdGVzT3JNYW5pZmVzdFVybCk7CiAgY29uc3QgaG9zdEluZm8gPSBhd2FpdCBsb2FkRnNGZWRlcmF0aW9uSW5mbyhyZWxCdW5kbGVQYXRoKTsKICBjb25zdCBob3N0SW1wb3J0TWFwID0gYXdhaXQgcHJvY2Vzc0hvc3RJbmZvKGhvc3RJbmZvLCAnLi8nICsgcmVsQnVuZGxlUGF0aCk7CiAgY29uc3QgcmVtb3Rlc0ltcG9ydE1hcCA9IGF3YWl0IHByb2Nlc3NSZW1vdGVJbmZvcyhyZW1vdGVzLCB7CiAgICB0aHJvd0lmUmVtb3RlTm90Rm91bmQ6IG9wdGlvbnMudGhyb3dJZlJlbW90ZU5vdEZvdW5kLAogICAgY2FjaGVUYWc6IG9wdGlvbnMuY2FjaGVUYWcsCiAgfSk7CiAgY29uc3QgaW1wb3J0TWFwID0gbWVyZ2VJbXBvcnRNYXBzKGhvc3RJbXBvcnRNYXAsIHJlbW90ZXNJbXBvcnRNYXApOwogIHJldHVybiBpbXBvcnRNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gbG9hZEZzTWFuaWZlc3QobWFuaWZlc3RVcmwpIHsKICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMyLnJlYWRGaWxlKG1hbmlmZXN0VXJsLCAndXRmLTgnKTsKICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoY29udGVudCk7CiAgcmV0dXJuIG1hbmlmZXN0Owp9CmFzeW5jIGZ1bmN0aW9uIGxvYWRGc0ZlZGVyYXRpb25JbmZvKHJlbEJ1bmRsZVBhdGgpIHsKICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoMi5qb2luKHJlbEJ1bmRsZVBhdGgsICdyZW1vdGVFbnRyeS5qc29uJyk7CiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzMi5yZWFkRmlsZShtYW5pZmVzdFBhdGgsICd1dGYtOCcpOwogIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShjb250ZW50KTsKICByZXR1cm4gbWFuaWZlc3Q7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVJbXBvcnRNYXAobWFwKSB7CiAgYXdhaXQgZnMyLndyaXRlRmlsZSgKICAgIElNUE9SVF9NQVBfRklMRV9OQU1FLAogICAgSlNPTi5zdHJpbmdpZnkobWFwLCBudWxsLCAyKSwKICAgICd1dGYtOCcsCiAgKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZVJlc29sdmVyKCkgewogIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc29sdmVyLCAnYmFzZTY0Jyk7CiAgYXdhaXQgZnMyLndyaXRlRmlsZSgnZmVkZXJhdGlvbi1yZXNvbHZlci5tanMnLCBidWZmZXIsICd1dGYtOCcpOwp9CgovLyBsaWJzL25hdGl2ZS1mZWRlcmF0aW9uLW5vZGUvc3JjL2xpYi91dGlscy9mc3RhcnQtYXJncy1wYXJzZXIudHMKaW1wb3J0ICogYXMgZnMzIGZyb20gJ25vZGU6ZnMnOwp2YXIgZGVmYXVsdEFyZ3MgPSB7CiAgZW50cnk6ICcuL3NlcnZlci5tanMnLAogIHJlbW90ZXNPck1hbmlmZXN0VXJsOiAnLi4vYnJvd3Nlci9mZWRlcmF0aW9uLm1hbmlmZXN0Lmpzb24nLAogIHJlbEJ1bmRsZVBhdGg6ICcuLi9icm93c2VyLycsCn07CmZ1bmN0aW9uIHBhcnNlRlN0YXJ0QXJncygpIHsKICBjb25zdCBhcmdzMiA9IHsKICAgIGVudHJ5OiAnJywKICAgIHJlbW90ZXNPck1hbmlmZXN0VXJsOiAnJywKICAgIHJlbEJ1bmRsZVBhdGg6ICcnLAogIH07CiAgbGV0IGtleSA9ICcnOwogIGZvciAobGV0IGkgPSAyOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBjYW5kID0gcHJvY2Vzcy5hcmd2W2ldOwogICAgaWYgKGNhbmQuc3RhcnRzV2l0aCgnLS0nKSkgewogICAgICBjb25zdCBjYW5kS2V5ID0gY2FuZC5zdWJzdHJpbmcoMik7CiAgICAgIGlmIChkZWZhdWx0QXJnc1tjYW5kS2V5XSkgewogICAgICAgIGtleSA9IGNhbmRLZXk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgc3dpdGNoICR7Y2FuZH0gbm90IHN1cHBvcnRlZCFgKTsKICAgICAgICBleGl0V2l0aFVzYWdlKGRlZmF1bHRBcmdzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChrZXkpIHsKICAgICAgYXJnczJba2V5XSA9IGNhbmQ7CiAgICAgIGtleSA9ICcnOwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS5lcnJvcihgdW5yZWxhZGVkIHZhbHVlICR7Y2FuZH0hYCk7CiAgICAgIGV4aXRXaXRoVXNhZ2UoZGVmYXVsdEFyZ3MpOwogICAgfQogIH0KICBhcHBseURlZmF1bHRBcmdzKGFyZ3MyKTsKICByZXR1cm4gYXJnczI7Cn0KZnVuY3Rpb24gYXBwbHlEZWZhdWx0QXJncyhhcmdzMikgewogIGlmIChhcmdzMi5yZWxCdW5kbGVQYXRoICYmICFhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCkgewogICAgY29uc3QgY2FuZCA9IGRlZmF1bHRBcmdzLnJlbEJ1bmRsZVBhdGggKyAnZmVkZXJhdGlvbi5tYW5pZmVzdC5qc29uJzsKICAgIGlmIChmczMuZXhpc3RzU3luYyhjYW5kKSkgewogICAgICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9IGNhbmQ7CiAgICB9CiAgfQogIGFyZ3MyLmVudHJ5ID0gYXJnczIuZW50cnkgfHwgZGVmYXVsdEFyZ3MuZW50cnk7CiAgYXJnczIucmVsQnVuZGxlUGF0aCA9IGFyZ3MyLnJlbEJ1bmRsZVBhdGggfHwgZGVmYXVsdEFyZ3MucmVsQnVuZGxlUGF0aDsKICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCA9CiAgICBhcmdzMi5yZW1vdGVzT3JNYW5pZmVzdFVybCB8fCBkZWZhdWx0QXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybDsKICBpZiAoIWZzMy5leGlzdHNTeW5jKGFyZ3MyLnJlbW90ZXNPck1hbmlmZXN0VXJsKSkgewogICAgYXJnczIucmVtb3Rlc09yTWFuaWZlc3RVcmwgPSB2b2lkIDA7CiAgfQp9CmZ1bmN0aW9uIGV4aXRXaXRoVXNhZ2UoZGVmYXVsdEFyZ3MyKSB7CiAgbGV0IGFyZ3MyID0gJyc7CiAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdEFyZ3MyKSB7CiAgICBhcmdzMiArPSBgWy0tJHtrZXl9ICR7ZGVmYXVsdEFyZ3MyW2tleV19XSBgOwogIH0KICBjb25zb2xlLmxvZygndXNhZ2U6IG5mc3RhcnQgJyArIGFyZ3MyKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KCi8vIGxpYnMvbmF0aXZlLWZlZGVyYXRpb24tbm9kZS9zcmMvbGliL3V0aWxzL2ZzdGFydC50cwp2YXIgYXJncyA9IHBhcnNlRlN0YXJ0QXJncygpOwooYXN5bmMgKCkgPT4gewogIGF3YWl0IGluaXROb2RlRmVkZXJhdGlvbih7CiAgICAuLi4oYXJncy5yZW1vdGVzT3JNYW5pZmVzdFVybAogICAgICA/IHsgcmVtb3Rlc09yTWFuaWZlc3RVcmw6IGFyZ3MucmVtb3Rlc09yTWFuaWZlc3RVcmwgfQogICAgICA6IHt9KSwKICAgIHJlbEJ1bmRsZVBhdGg6IGFyZ3MucmVsQnVuZGxlUGF0aCwKICB9KTsKICBhd2FpdCBpbXBvcnQoYXJncy5lbnRyeSk7Cn0pKCk7Cg==';