@openai/agents-realtime 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  var U = Object.defineProperty;
2
2
  var j = (t, s, e) => s in t ? U(t, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[s] = e;
3
3
  var o = (t, s, e) => j(t, typeof s != "symbol" ? s + "" : s, e);
4
- import { Capability as _, requireBoundSession as N, UserError as b, tool as m, object as y, string as p, applyPatchTool as K, withSandboxSpan as w, isRecord as L, encodeUint8ArrayToBase64 as H, ApplyPatchOperation as z, number as d, boolean as P, prompt as T, Agent as X, SANDBOX_AGENT_BRAND as q, cloneManifest as G, Manifest as Y, normalizeUser as J } from "./index-DN65-mSr.mjs";
4
+ import { Capability as _, requireBoundSession as N, UserError as b, tool as m, object as y, string as p, applyPatchTool as K, withSandboxSpan as w, isRecord as L, encodeUint8ArrayToBase64 as H, ApplyPatchOperation as z, number as d, boolean as P, prompt as T, Agent as X, SANDBOX_AGENT_BRAND as q, cloneManifest as G, Manifest as Y, normalizeUser as J } from "./index-BV_QRx6B.mjs";
5
5
  function V(t) {
6
6
  return t ? !(typeof t == "object" && t && "constructor" in t && typeof t.constructor == "function" ? t.constructor.name : "").includes("ChatCompletions") : !0;
7
7
  }
@@ -635,4 +635,4 @@ function Ee(t) {
635
635
  export {
636
636
  W as SandboxAgent
637
637
  };
638
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtQ1BWMGNHRFAubWpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL3RyYW5zcG9ydC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL2NvbXBhY3Rpb24ubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9maWxlc3lzdGVtLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3Qvc2FuZGJveC9jYXBhYmlsaXRpZXMvc2hlbGwubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9za2lsbHMubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9pbmRleC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvYWdlbnQubWpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Jlc3BvbnNlc0NvbXBhY3Rpb25UcmFuc3BvcnQobW9kZWxJbnN0YW5jZSkge1xuICAgIGlmICghbW9kZWxJbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQobW9kZWxJbnN0YW5jZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgaWYgKCFtb2RlbEluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNwb3J0Lm1qcy5tYXAiLCJpbXBvcnQgeyBDYXBhYmlsaXR5IH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IHN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydCB9IGZyb20gXCIuL3RyYW5zcG9ydC5tanNcIjtcbmV4cG9ydCBjbGFzcyBDb21wYWN0aW9uUG9saWN5IHtcbn1cbmV4cG9ydCBjbGFzcyBTdGF0aWNDb21wYWN0aW9uUG9saWN5IGV4dGVuZHMgQ29tcGFjdGlvblBvbGljeSB7XG4gICAgdGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhyZXNob2xkO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSBleHRlbmRzIENvbXBhY3Rpb25Qb2xpY3kge1xuICAgIHRocmVzaG9sZFJhdGlvO1xuICAgIGZhbGxiYWNrVGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZFJhdGlvID0gMC45LCBmYWxsYmFja1RocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZFJhdGlvID0gdGhyZXNob2xkUmF0aW87XG4gICAgICAgIHRoaXMuZmFsbGJhY2tUaHJlc2hvbGQgPSBmYWxsYmFja1RocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZChtb2RlbCkge1xuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja1RocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbEluZm8gPSBDb21wYWN0aW9uTW9kZWxJbmZvLmZvck1vZGVsKG1vZGVsKTtcbiAgICAgICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrVGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG1vZGVsSW5mby5jb250ZXh0V2luZG93ICogdGhpcy50aHJlc2hvbGRSYXRpbyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBhY3Rpb25Nb2RlbEluZm8ge1xuICAgIGNvbnRleHRXaW5kb3c7XG4gICAgY29uc3RydWN0b3IoY29udGV4dFdpbmRvdykge1xuICAgICAgICB0aGlzLmNvbnRleHRXaW5kb3cgPSBjb250ZXh0V2luZG93O1xuICAgIH1cbiAgICBzdGF0aWMgZm9yTW9kZWwobW9kZWwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpKSB7XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMU0uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMTA0NzU3Nik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfNDAwSy5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbk1vZGVsSW5mbyg0MDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzIwMEsuaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMjAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xMjhLLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uTW9kZWxJbmZvKDEyODAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5jbGFzcyBDb21wYWN0aW9uQ2FwYWJpbGl0eSBleHRlbmRzIENhcGFiaWxpdHkge1xuICAgIHR5cGUgPSAnY29tcGFjdGlvbic7XG4gICAgcG9saWN5O1xuICAgIGNvbnN0cnVjdG9yKHBvbGljeSA9IG5ldyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSgpKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIH1cbiAgICBzYW1wbGluZ1BhcmFtcyhzYW1wbGluZ1BhcmFtcykge1xuICAgICAgICBpZiAoc2FtcGxpbmdQYXJhbXMubW9kZWxJbnN0YW5jZSAmJlxuICAgICAgICAgICAgIXN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydChzYW1wbGluZ1BhcmFtcy5tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdHlwZW9mIHNhbXBsaW5nUGFyYW1zLm1vZGVsID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBzYW1wbGluZ1BhcmFtcy5tb2RlbFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZXh0X21hbmFnZW1lbnQ6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb21wYWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdF90aHJlc2hvbGQ6IHRoaXMucG9saWN5LmNvbXBhY3RUaHJlc2hvbGQobW9kZWwpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm9jZXNzQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGxldCBsYXN0Q29tcGFjdGlvbkluZGV4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZXh0Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaW5kZXhdLnR5cGUgPT09ICdjb21wYWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxhc3RDb21wYWN0aW9uSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdENvbXBhY3Rpb25JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnNsaWNlKGxhc3RDb21wYWN0aW9uSW5kZXgpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYWN0aW9uKGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkNhcGFiaWxpdHkoYXJncy5wb2xpY3kpO1xufVxuZnVuY3Rpb24gZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbW9kZWwudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHdpdGhvdXRQcm92aWRlclByZWZpeCA9IHRyaW1tZWQuaW5jbHVkZXMoJy8nKVxuICAgICAgICA/IHRyaW1tZWQuc2xpY2UodHJpbW1lZC5sYXN0SW5kZXhPZignLycpICsgMSlcbiAgICAgICAgOiB0cmltbWVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRob3V0UHJvdmlkZXJQcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB3aXRob3V0UGlubmVkRGF0ZSA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvLVxcZHs0fS1cXGR7Mn0tXFxkezJ9JC91LCAnJyk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KFtub3JtYWxpemVkLCB3aXRob3V0UGlubmVkRGF0ZV0pXTtcbn1cbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzFNID0gbmV3IFNldChbXG4gICAgJ2dwdC01LjQnLFxuICAgICdncHQtNS40LTIwMjYtMDMtMDUnLFxuICAgICdncHQtNS40LXBybycsXG4gICAgJ2dwdC01LjQtcHJvLTIwMjYtMDMtMDUnLFxuICAgICdncHQtNC4xJyxcbiAgICAnZ3B0LTQuMS0yMDI1LTA0LTE0JyxcbiAgICAnZ3B0LTQuMS1taW5pJyxcbiAgICAnZ3B0LTQuMS1taW5pLTIwMjUtMDQtMTQnLFxuICAgICdncHQtNC4xLW5hbm8nLFxuICAgICdncHQtNC4xLW5hbm8tMjAyNS0wNC0xNCcsXG5dKTtcbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzQwMEsgPSBuZXcgU2V0KFtcbiAgICAnZ3B0LTUnLFxuICAgICdncHQtNS1jb2RleCcsXG4gICAgJ2dwdC01LW1pbmknLFxuICAgICdncHQtNS1uYW5vJyxcbiAgICAnZ3B0LTUtcHJvJyxcbiAgICAnZ3B0LTUuMScsXG4gICAgJ2dwdC01LjEtY29kZXgnLFxuICAgICdncHQtNS4xLWNvZGV4LW1heCcsXG4gICAgJ2dwdC01LjEtY29kZXgtbWluaScsXG4gICAgJ2dwdC01LjInLFxuICAgICdncHQtNS4yLWNvZGV4JyxcbiAgICAnZ3B0LTUuMi1jb2RleC1jeWJlcicsXG4gICAgJ2dwdC01LjItcHJvJyxcbiAgICAnZ3B0LTUuMy1jb2RleCcsXG4gICAgJ2dwdC01LjMtY29kZXgtc3BhcmsnLFxuICAgICdncHQtNS40LW1pbmknLFxuICAgICdncHQtNS40LW5hbm8nLFxuXSk7XG5jb25zdCBTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18yMDBLID0gbmV3IFNldChbXG4gICAgJ2NvZGV4LW1pbmktbGF0ZXN0JyxcbiAgICAnbzEnLFxuICAgICdvMS0yMDI0LTEyLTE3JyxcbiAgICAnbzEtcHJvJyxcbiAgICAnbzMnLFxuICAgICdvMy0yMDI1LTA0LTE2JyxcbiAgICAnbzMtbWluaScsXG4gICAgJ28zLXBybycsXG4gICAgJ28zLWRlZXAtcmVzZWFyY2gnLFxuICAgICdvNC1taW5pJyxcbiAgICAnbzQtbWluaS0yMDI1LTA0LTE2JyxcbiAgICAnbzQtbWluaS1kZWVwLXJlc2VhcmNoJyxcbl0pO1xuY29uc3QgU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMTI4SyA9IG5ldyBTZXQoW1xuICAgICdncHQtNG8nLFxuICAgICdncHQtNG8tMjAyNC0wOC0wNicsXG4gICAgJ2dwdC00by1taW5pJyxcbiAgICAnZ3B0LTRvLW1pbmktMjAyNC0wNy0xOCcsXG4gICAgJ2dwdC01LWNoYXQtbGF0ZXN0JyxcbiAgICAnZ3B0LTUuMS1jaGF0LWxhdGVzdCcsXG4gICAgJ2dwdC01LjItY2hhdC1sYXRlc3QnLFxuICAgICdncHQtNS4zLWNoYXQtbGF0ZXN0Jyxcbl0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGFjdGlvbi5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgYXBwbHlQYXRjaFRvb2wsIHRvb2wsIH0gZnJvbSBcIi4uLy4uL3Rvb2wubWpzXCI7XG5pbXBvcnQgeyBBcHBseVBhdGNoT3BlcmF0aW9uIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3Byb3RvY29sLm1qc1wiO1xuaW1wb3J0IHsgZW5jb2RlVWludDhBcnJheVRvQmFzZTY0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2U2NC5tanNcIjtcbmltcG9ydCB7IHdpdGhTYW5kYm94U3BhbiB9IGZyb20gXCIuLi9ydW50aW1lL3NwYW5zLm1qc1wiO1xuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVHdWFyZHMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uLCB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBzdXBwb3J0c0FwcGx5UGF0Y2hUcmFuc3BvcnQsIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQsIH0gZnJvbSBcIi4vdHJhbnNwb3J0Lm1qc1wiO1xuY29uc3QgYXBwbHlQYXRjaEZ1bmN0aW9uUGFyYW1ldGVycyA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHBhdGNoOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQSBmcmVlZm9ybSBhcHBseV9wYXRjaCBwYXlsb2FkIHdyYXBwZWQgaW4gKioqIEJlZ2luIFBhdGNoIGFuZCAqKiogRW5kIFBhdGNoLicsXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Egc2luZ2xlIHN0cnVjdHVyZWQgYXBwbHlfcGF0Y2ggb3BlcmF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbnM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBpdGVtczogeyB0eXBlOiAnb2JqZWN0JyB9LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTdHJ1Y3R1cmVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbnMgdG8gYXBwbHkgaW4gb3JkZXIuJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29tbWFuZDoge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW9uYWwgW1wiYXBwbHlfcGF0Y2hcIiwgcGF0Y2hdIGNvbW1hbmQgdHVwbGUgZm9ybS4nLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGVudW06IFsnY3JlYXRlX2ZpbGUnLCAndXBkYXRlX2ZpbGUnLCAnZGVsZXRlX2ZpbGUnXSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBhdGNoIG9wZXJhdGlvbiB0byBhcHBseS4nLFxuICAgICAgICB9LFxuICAgICAgICBwYXRoOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHNhbmRib3ggZmlsZSBwYXRoIHRvIHBhdGNoLicsXG4gICAgICAgIH0sXG4gICAgICAgIGRpZmY6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgVjRBIHBhdGNoIGRpZmYgZm9yIGNyZWF0ZV9maWxlIGFuZCB1cGRhdGVfZmlsZSBvcGVyYXRpb25zLicsXG4gICAgICAgIH0sXG4gICAgICAgIG1vdmVUbzoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIGRlc3RpbmF0aW9uIHBhdGggZm9yIHVwZGF0ZV9maWxlIG1vdmUgb3BlcmF0aW9ucy4nLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFtdLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxufTtcbmNvbnN0IEJFR0lOX1BBVENIID0gJyoqKiBCZWdpbiBQYXRjaCc7XG5jb25zdCBFTkRfUEFUQ0ggPSAnKioqIEVuZCBQYXRjaCc7XG5jb25zdCBBRERfRklMRSA9ICcqKiogQWRkIEZpbGU6ICc7XG5jb25zdCBERUxFVEVfRklMRSA9ICcqKiogRGVsZXRlIEZpbGU6ICc7XG5jb25zdCBVUERBVEVfRklMRSA9ICcqKiogVXBkYXRlIEZpbGU6ICc7XG5jb25zdCBNT1ZFX1RPID0gJyoqKiBNb3ZlIHRvOiAnO1xuZnVuY3Rpb24gdG9FcnJvck1lc3NhZ2UoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCBlcnJvci50b1N0cmluZygpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckltYWdlRm9yVGV4dFRyYW5zcG9ydChvdXRwdXQpIHtcbiAgICBpZiAodHlwZW9mIG91dHB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2UgPSBvdXRwdXQuaW1hZ2U7XG4gICAgaWYgKHR5cGVvZiBpbWFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cbiAgICBpZiAoIWlzUmVjb3JkKGltYWdlKSkge1xuICAgICAgICByZXR1cm4gJ05vIGltYWdlIGRhdGEgd2FzIHJldHVybmVkIGJ5IHRoZSBzYW5kYm94IHNlc3Npb24uJztcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VSZWNvcmQgPSBpbWFnZTtcbiAgICBpZiAodHlwZW9mIGltYWdlUmVjb3JkLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlUmVjb3JkLnVybDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbWFnZVJlY29yZC5maWxlSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBgT3BlbkFJIGZpbGUgcmVmZXJlbmNlOiAke2ltYWdlUmVjb3JkLmZpbGVJZH1gO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGltYWdlUmVjb3JkLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHR5cGVvZiBpbWFnZVJlY29yZC5tZWRpYVR5cGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGltYWdlUmVjb3JkLm1lZGlhVHlwZVxuICAgICAgICAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgcmV0dXJuIGBkYXRhOiR7bWVkaWFUeXBlfTtiYXNlNjQsJHtpbWFnZVJlY29yZC5kYXRhfWA7XG4gICAgfVxuICAgIGlmIChpbWFnZVJlY29yZC5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSB0eXBlb2YgaW1hZ2VSZWNvcmQubWVkaWFUeXBlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBpbWFnZVJlY29yZC5tZWRpYVR5cGVcbiAgICAgICAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgIHJldHVybiBgZGF0YToke21lZGlhVHlwZX07YmFzZTY0LCR7ZW5jb2RlVWludDhBcnJheVRvQmFzZTY0KGltYWdlUmVjb3JkLmRhdGEpfWA7XG4gICAgfVxuICAgIHJldHVybiAnTm8gaW1hZ2UgZGF0YSB3YXMgcmV0dXJuZWQgYnkgdGhlIHNhbmRib3ggc2Vzc2lvbi4nO1xufVxuZnVuY3Rpb24gcmVuZGVyVmlld0ltYWdlRXJyb3IocGF0aCwgZXJyb3IpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdG9FcnJvck1lc3NhZ2UoZXJyb3IpO1xuICAgIGlmICgvbm90IGZvdW5kL2l1LnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIGBpbWFnZSBwYXRoIFxcYCR7cGF0aH1cXGAgd2FzIG5vdCBmb3VuZGA7XG4gICAgfVxuICAgIGlmICgvbm90IGEgZmlsZS9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIGlzIG5vdCBhIGZpbGVgO1xuICAgIH1cbiAgICBpZiAoL2V4Y2VlZHMgdGhlIDEwIE1CIGxpbWl0fGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHNpemUvaXUudGVzdChtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gYGltYWdlIHBhdGggXFxgJHtwYXRofVxcYCBleGNlZWRlZCB0aGUgYWxsb3dlZCBzaXplIG9mIDEwTUI7IHJlc2l6ZSBvciBjb21wcmVzcyB0aGUgaW1hZ2UgYW5kIHRyeSBhZ2FpbmA7XG4gICAgfVxuICAgIGlmICgvdW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0fG5vdCBhIHN1cHBvcnRlZCBpbWFnZS9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIGlzIG5vdCBhIHN1cHBvcnRlZCBpbWFnZSBmaWxlYDtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yO1xuICAgIHJldHVybiBgdW5hYmxlIHRvIHJlYWQgaW1hZ2UgYXQgXFxgJHtwYXRofVxcYDogJHtuYW1lfWA7XG59XG5mdW5jdGlvbiBwYXJzZUFwcGx5UGF0Y2hJbnB1dChyYXdJbnB1dCkge1xuICAgIGNvbnN0IHRyaW1tZWRJbnB1dCA9IHJhd0lucHV0LnRyaW1TdGFydCgpO1xuICAgIGlmICh0cmltbWVkSW5wdXQuc3RhcnRzV2l0aChCRUdJTl9QQVRDSCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRnJlZWZvcm1QYXRjaCh0cmltbWVkSW5wdXQpO1xuICAgIH1cbiAgICBsZXQgcGF5bG9hZDtcbiAgICB0cnkge1xuICAgICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShyYXdJbnB1dCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBJbnZhbGlkIGFwcGx5X3BhdGNoIEpTT046ICR7dG9FcnJvck1lc3NhZ2UoZXJyb3IpfWAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUFwcGx5UGF0Y2hQYXlsb2FkKHBheWxvYWQpO1xufVxuZnVuY3Rpb24gcGFyc2VBcHBseVBhdGNoUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBheWxvYWQpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKCFpc1JlY29yZChwYXlsb2FkKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6ICdhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCBvciBhcnJheS4nLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBheWxvYWQucGF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZyZWVmb3JtUGF0Y2gocGF5bG9hZC5wYXRjaCk7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuY29tbWFuZCkpIHtcbiAgICAgICAgY29uc3QgW2NvbW1hbmROYW1lLCBwYXRjaF0gPSBwYXlsb2FkLmNvbW1hbmQ7XG4gICAgICAgIGlmIChjb21tYW5kTmFtZSA9PT0gJ2FwcGx5X3BhdGNoJyAmJiB0eXBlb2YgcGF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBhdGNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkLm9wZXJhdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zKHBheWxvYWQub3BlcmF0aW9ucyk7XG4gICAgfVxuICAgIGlmIChwYXlsb2FkLm9wZXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zKFtwYXlsb2FkLm9wZXJhdGlvbl0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhbcGF5bG9hZF0pO1xufVxuZnVuY3Rpb24gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2Fkcykge1xuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBheWxvYWQgb2YgcGF5bG9hZHMpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gQXBwbHlQYXRjaE9wZXJhdGlvbi5zYWZlUGFyc2UocGF5bG9hZCk7XG4gICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBvcGVyYXRpb246ICR7cGFyc2VkLmVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKHBhcnNlZC5kYXRhKTtcbiAgICB9XG4gICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICdhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGluY2x1ZGUgYW4gb3BlcmF0aW9uLicgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIG9wZXJhdGlvbnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRnJlZWZvcm1QYXRjaChyYXdQYXRjaCkge1xuICAgIGNvbnN0IGxpbmVzID0gcmF3UGF0Y2guc3BsaXQoL1xccj9cXG4vKTtcbiAgICBpZiAobGluZXMuYXQoLTEpID09PSAnJykge1xuICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG4gICAgaWYgKGxpbmVzWzBdICE9PSBCRUdJTl9QQVRDSCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBhcHBseV9wYXRjaCBpbnB1dCBtdXN0IHN0YXJ0IHdpdGggXCIke0JFR0lOX1BBVENIfVwiLmAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChsaW5lcy5sZW5ndGggPCAyIHx8IGxpbmVzLmF0KC0xKSAhPT0gRU5EX1BBVENIKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogYGFwcGx5X3BhdGNoIGlucHV0IG11c3QgZW5kIHdpdGggXCIke0VORF9QQVRDSH1cIi5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvcGVyYXRpb25zID0gW107XG4gICAgbGV0IGluZGV4ID0gMTtcbiAgICB3aGlsZSAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpbmRleF07XG4gICAgICAgIGxldCBwYXJzZWQ7XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoQUREX0ZJTEUpKSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUFkZEZpbGVQYXRjaChsaW5lcywgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChERUxFVEVfRklMRSkpIHtcbiAgICAgICAgICAgIHBhcnNlZCA9IHBhcnNlRGVsZXRlRmlsZVBhdGNoKGxpbmVzLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFVQREFURV9GSUxFKSkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VVcGRhdGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBmaWxlIG9wZXJhdGlvbiBoZWFkZXI6ICR7bGluZX1gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2Vycm9yJyBpbiBwYXJzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IHBhcnNlZC5lcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIG9wZXJhdGlvbnMucHVzaChwYXJzZWQub3BlcmF0aW9uKTtcbiAgICAgICAgaW5kZXggPSBwYXJzZWQubmV4dEluZGV4O1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiAnYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBmaWxlIG9wZXJhdGlvbi4nLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBvazogdHJ1ZSwgb3BlcmF0aW9ucyB9O1xufVxuZnVuY3Rpb24gcGFyc2VBZGRGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBBRERfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGNvbnN0IGRpZmZMaW5lcyA9IFtdO1xuICAgIHdoaWxlIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpbmRleF07XG4gICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCcrJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBgSW52YWxpZCBBZGQgRmlsZSBsaW5lOiAke2xpbmV9YCB9O1xuICAgICAgICB9XG4gICAgICAgIGRpZmZMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgIH1cbiAgICBpZiAoZGlmZkxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IGBBZGQgRmlsZSBwYXRjaCBmb3IgJHtwYXRofSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lICsgbGluZS5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZGlmZjogam9pbkRpZmYoZGlmZkxpbmVzKSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VEZWxldGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBERUxFVEVfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGlmIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgRGVsZXRlIEZpbGUgcGF0Y2ggZm9yICR7cGF0aH0gbXVzdCBub3QgaW5jbHVkZSBhIGRpZmYuYCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdkZWxldGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICB9LFxuICAgICAgICBuZXh0SW5kZXg6IGluZGV4LFxuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZVVwZGF0ZUZpbGVQYXRjaChsaW5lcywgaW5kZXgpIHtcbiAgICBjb25zdCBwYXRoID0gcGFyc2VQYXRjaEhlYWRlcihsaW5lc1tpbmRleF0sIFVQREFURV9GSUxFKTtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBNaXNzaW5nIHBhdGggaW4gYXBwbHlfcGF0Y2ggaGVhZGVyOiAke2xpbmVzW2luZGV4XX1gIH07XG4gICAgfVxuICAgIGluZGV4ICs9IDE7XG4gICAgbGV0IG1vdmVUbztcbiAgICBpZiAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmVzW2luZGV4XS5zdGFydHNXaXRoKE1PVkVfVE8pKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZE1vdmVUbyA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBNT1ZFX1RPKTtcbiAgICAgICAgaWYgKCFwYXJzZWRNb3ZlVG8pIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgICAgICB9XG4gICAgICAgIG1vdmVUbyA9IHBhcnNlZE1vdmVUbztcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgY29uc3QgZGlmZkxpbmVzID0gW107XG4gICAgd2hpbGUgKGluZGV4IDwgbGluZXMubGVuZ3RoIC0gMSAmJiAhaXNGaWxlT3BlcmF0aW9uSGVhZGVyKGxpbmVzW2luZGV4XSkpIHtcbiAgICAgICAgZGlmZkxpbmVzLnB1c2gobGluZXNbaW5kZXhdKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgaWYgKGRpZmZMaW5lcy5sZW5ndGggPT09IDAgJiYgIW1vdmVUbykge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYFVwZGF0ZSBGaWxlIHBhdGNoIGZvciAke3BhdGh9IG11c3QgaW5jbHVkZSBhIGh1bmsuYCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICd1cGRhdGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZGlmZjogZGlmZkxpbmVzLmxlbmd0aCA+IDAgPyBqb2luRGlmZihkaWZmTGluZXMpIDogJycsXG4gICAgICAgICAgICAuLi4obW92ZVRvID8geyBtb3ZlVG8gfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VQYXRjaEhlYWRlcihsaW5lLCBwcmVmaXgpIHtcbiAgICBjb25zdCBwYXRoID0gbGluZS5zbGljZShwcmVmaXgubGVuZ3RoKS50cmltKCk7XG4gICAgcmV0dXJuIHBhdGggPyBwYXRoIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lKSB7XG4gICAgcmV0dXJuIChsaW5lLnN0YXJ0c1dpdGgoQUREX0ZJTEUpIHx8XG4gICAgICAgIGxpbmUuc3RhcnRzV2l0aChERUxFVEVfRklMRSkgfHxcbiAgICAgICAgbGluZS5zdGFydHNXaXRoKFVQREFURV9GSUxFKSk7XG59XG5mdW5jdGlvbiBqb2luRGlmZihsaW5lcykge1xuICAgIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYXRjaE9wZXJhdGlvbihlZGl0b3IsIG9wZXJhdGlvbiwgcnVuQ29udGV4dCkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgICAgc3dpdGNoIChvcGVyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY3JlYXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci5jcmVhdGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndXBkYXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci51cGRhdGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVsZXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci5kZWxldGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbi4nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gYEZhaWxlZCB0byBhcHBseSBwYXRjaDogJHt0b0Vycm9yTWVzc2FnZShlcnJvcil9YDtcbiAgICB9XG4gICAgaWYgKHJlc3VsdD8uc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm91dHB1dCA/IGBQYXRjaCBmYWlsZWQ6ICR7cmVzdWx0Lm91dHB1dH1gIDogJ1BhdGNoIGZhaWxlZC4nO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0Py5vdXRwdXQgPz8gJ1BhdGNoIGFwcGxpZWQuJztcbn1cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGF0Y2hPcGVyYXRpb25zKGVkaXRvciwgb3BlcmF0aW9ucywgcnVuQ29udGV4dCkge1xuICAgIGNvbnN0IG91dHB1dHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFwcGx5UGF0Y2hPcGVyYXRpb24oZWRpdG9yLCBvcGVyYXRpb24sIHJ1bkNvbnRleHQpO1xuICAgICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2gob3V0cHV0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0cy5qb2luKCdcXG4nKSB8fCAnUGF0Y2ggYXBwbGllZC4nO1xufVxuZnVuY3Rpb24gYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbChlZGl0b3IpIHtcbiAgICBjb25zdCBmYWxsYmFja1Rvb2wgPSB7XG4gICAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgIG5hbWU6ICdhcHBseV9wYXRjaCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbGllcyBhIGNyZWF0ZSwgdXBkYXRlLCBtb3ZlLCBvciBkZWxldGUgZmlsZSBwYXRjaCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UuIEFjY2VwdHMgYSBmcmVlZm9ybSBwYXRjaCBzdHJpbmcgb3Igc3RydWN0dXJlZCBhcHBseV9wYXRjaCBvcGVyYXRpb25zLicsXG4gICAgICAgIHBhcmFtZXRlcnM6IGFwcGx5UGF0Y2hGdW5jdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICAgIGRlZmVyTG9hZGluZzogZmFsc2UsXG4gICAgICAgIG5lZWRzQXBwcm92YWw6IGFzeW5jICgpID0+IGZhbHNlLFxuICAgICAgICBpc0VuYWJsZWQ6IGFzeW5jICgpID0+IHRydWUsXG4gICAgICAgIGludm9rZTogYXN5bmMgKHJ1bkNvbnRleHQsIGlucHV0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUFwcGx5UGF0Y2hJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZC5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBwbHlQYXRjaE9wZXJhdGlvbnMoZWRpdG9yLCBwYXJzZWQub3BlcmF0aW9ucywgcnVuQ29udGV4dCk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gZmFsbGJhY2tUb29sO1xufVxuY2xhc3MgRmlsZXN5c3RlbUNhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ2ZpbGVzeXN0ZW0nO1xuICAgIGNvbmZpZ3VyZVRvb2xzO1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZVRvb2xzID0gYXJncy5jb25maWd1cmVUb29scztcbiAgICB9XG4gICAgdG9vbHMoKSB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSByZXF1aXJlQm91bmRTZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5fc2Vzc2lvbik7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHNlc3Npb24uY3JlYXRlRWRpdG9yPy4odGhpcy5fcnVuQXMpO1xuICAgICAgICBpZiAoIWVkaXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignRmlsZXN5c3RlbSBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBjcmVhdGVFZGl0b3IoKS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b29scyA9IFtdO1xuICAgICAgICBjb25zdCB2aWV3SW1hZ2UgPSBhc3luYyAocGF0aCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzZXNzaW9uLnZpZXdJbWFnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ0ZpbGVzeXN0ZW0gc2FuZGJveCBzZXNzaW9ucyBtdXN0IHByb3ZpZGUgdmlld0ltYWdlKCkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoU2FuZGJveFNwYW4oJ3NhbmRib3gudmlld19pbWFnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcnVuX2FzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9LCBhc3luYyAoKSA9PiBhd2FpdCBzZXNzaW9uLnZpZXdJbWFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyVmlld0ltYWdlRXJyb3IocGF0aCwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydCh0aGlzLl9tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmlld19pbWFnZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGFuIGltYWdlIG91dHB1dCBmcm9tIGEgbG9jYWwgcGF0aCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ0xvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byBhbiBpbWFnZSBmaWxlJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgfSkgPT4gYXdhaXQgdmlld0ltYWdlKHBhdGgpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmlld19pbWFnZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGFuIGltYWdlIGZyb20gYSBsb2NhbCBwYXRoIGluIHRoZSBzYW5kYm94IHdvcmtzcGFjZSBhcyBhIGRhdGEgVVJMIG9yIHJlZmVyZW5jZSBzdHJpbmcuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ0xvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byBhbiBpbWFnZSBmaWxlJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCB9KSA9PiByZW5kZXJJbWFnZUZvclRleHRUcmFuc3BvcnQoYXdhaXQgdmlld0ltYWdlKHBhdGgpKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VwcG9ydHNBcHBseVBhdGNoVHJhbnNwb3J0KHRoaXMuX21vZGVsSW5zdGFuY2UpKSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKGFwcGx5UGF0Y2hUb29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnYXBwbHlfcGF0Y2gnLFxuICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRvb2xzLnB1c2goYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbChlZGl0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmVUb29scyA/IHRoaXMuY29uZmlndXJlVG9vbHMoWy4uLnRvb2xzXSkgOiB0b29scztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsZXN5c3RlbShhcmdzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IEZpbGVzeXN0ZW1DYXBhYmlsaXR5KGFyZ3MpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZXN5c3RlbS5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgdG9vbCB9IGZyb20gXCIuLi8uLi90b29sLm1qc1wiO1xuaW1wb3J0IHsgd2l0aFNhbmRib3hTcGFuIH0gZnJvbSBcIi4uL3J1bnRpbWUvc3BhbnMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uLCB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5jb25zdCBERUZBVUxUX0VYRUNfWUlFTERfVElNRV9NUyA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUyA9IDI1MDtcbmNvbnN0IFNIRUxMX0lOU1RSVUNUSU9OUyA9IFtcbiAgICAnV2hlbiB1c2luZyB0aGUgc2hlbGw6JyxcbiAgICAnLSBVc2UgYGV4ZWNfY29tbWFuZGAgZm9yIHNoZWxsIGV4ZWN1dGlvbi4nLFxuICAgICctIElmIGF2YWlsYWJsZSwgdXNlIGB3cml0ZV9zdGRpbmAgdG8gaW50ZXJhY3Qgd2l0aCBvciBwb2xsIHJ1bm5pbmcgc2Vzc2lvbnMuJyxcbiAgICAnLSBUbyBpbnRlcnJ1cHQgYSBsb25nLXJ1bm5pbmcgcHJvY2VzcyB2aWEgYHdyaXRlX3N0ZGluYCwgc3RhcnQgaXQgd2l0aCBgdHR5PXRydWVgIGFuZCBzZW5kIEN0cmwtQyAoYFxcXFx1MDAwM2ApLicsXG4gICAgJy0gUHJlZmVyIGByZ2AgYW5kIGByZyAtLWZpbGVzYCBmb3IgdGV4dC9maWxlIGRpc2NvdmVyeSB3aGVuIGF2YWlsYWJsZS4nLFxuICAgICctIEF2b2lkIHVzaW5nIFB5dGhvbiBzY3JpcHRzIGp1c3QgdG8gcHJpbnQgbGFyZ2UgZmlsZSBjaHVua3MuJyxcbl0uam9pbignXFxuJyk7XG5jbGFzcyBTaGVsbENhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ3NoZWxsJztcbiAgICBjb25maWd1cmVUb29scztcbiAgICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVUb29scyA9IGFyZ3MuY29uZmlndXJlVG9vbHM7XG4gICAgfVxuICAgIHRvb2xzKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gcmVxdWlyZUJvdW5kU2Vzc2lvbih0aGlzLnR5cGUsIHRoaXMuX3Nlc3Npb24pO1xuICAgICAgICBpZiAoIXNlc3Npb24uZXhlY0NvbW1hbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ1NoZWxsIHNhbmRib3ggc2Vzc2lvbnMgbXVzdCBwcm92aWRlIGV4ZWNDb21tYW5kKCkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbHMgPSBbXG4gICAgICAgICAgICB0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZXhlY19jb21tYW5kJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1J1bnMgYSBjb21tYW5kIGluIGEgUFRZLCByZXR1cm5pbmcgb3V0cHV0IG9yIGEgc2Vzc2lvbiBJRCBmb3Igb25nb2luZyBpbnRlcmFjdGlvbi4nLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHoub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgY21kOiB6LnN0cmluZygpLm1pbigxKS5kZXNjcmliZSgnU2hlbGwgY29tbWFuZCB0byBleGVjdXRlLicpLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZGlyOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ09wdGlvbmFsIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJ1biB0aGUgY29tbWFuZCBpbjsgZGVmYXVsdHMgdG8gdGhlIHR1cm4gY3dkLicpLFxuICAgICAgICAgICAgICAgICAgICBzaGVsbDogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKFwiU2hlbGwgYmluYXJ5IHRvIGxhdW5jaC4gRGVmYXVsdHMgdG8gdGhlIHVzZXIncyBkZWZhdWx0IHNoZWxsLlwiKSxcbiAgICAgICAgICAgICAgICAgICAgbG9naW46IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ1doZXRoZXIgdG8gcnVuIHRoZSBzaGVsbCB3aXRoIC1sLy1pIHNlbWFudGljcy4gRGVmYXVsdHMgdG8gdHJ1ZS4nKSxcbiAgICAgICAgICAgICAgICAgICAgdHR5OiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnV2hldGhlciB0byBhbGxvY2F0ZSBhIFRUWSBmb3IgdGhlIGNvbW1hbmQuIERlZmF1bHRzIHRvIGZhbHNlIChwbGFpbiBwaXBlcyk7IHNldCB0byB0cnVlIHRvIG9wZW4gYSBQVFkgYW5kIGFjY2VzcyBUVFkgcHJvY2Vzcy4nKSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRfdGltZV9tczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KERFRkFVTFRfRVhFQ19ZSUVMRF9USU1FX01TKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdIb3cgbG9uZyB0byB3YWl0IChpbiBtaWxsaXNlY29uZHMpIGZvciBvdXRwdXQgYmVmb3JlIHlpZWxkaW5nLicpLFxuICAgICAgICAgICAgICAgICAgICBtYXhfb3V0cHV0X3Rva2VuczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ01heGltdW0gbnVtYmVyIG9mIHRva2VucyB0byByZXR1cm4uIEV4Y2VzcyBvdXRwdXQgd2lsbCBiZSB0cnVuY2F0ZWQuJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY21kLCB3b3JrZGlyLCBzaGVsbCwgbG9naW4sIHR0eSwgeWllbGRfdGltZV9tcywgbWF4X291dHB1dF90b2tlbnMsIH0pID0+IGF3YWl0IHdpdGhTYW5kYm94U3Bhbignc2FuZGJveC5leGVjJywge1xuICAgICAgICAgICAgICAgICAgICBjbWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtkaXIsXG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2dpbixcbiAgICAgICAgICAgICAgICAgICAgdHR5LFxuICAgICAgICAgICAgICAgICAgICBydW5fYXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0sIGFzeW5jICgpID0+IGF3YWl0IHNlc3Npb24uZXhlY0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICBjbWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtkaXIsXG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2dpbixcbiAgICAgICAgICAgICAgICAgICAgdHR5LFxuICAgICAgICAgICAgICAgICAgICB5aWVsZFRpbWVNczogeWllbGRfdGltZV9tcyxcbiAgICAgICAgICAgICAgICAgICAgbWF4T3V0cHV0VG9rZW5zOiBtYXhfb3V0cHV0X3Rva2VucyxcbiAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zdXBwb3J0c1B0eT8uKCkgJiYgc2Vzc2lvbi53cml0ZVN0ZGluKSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKHRvb2woe1xuICAgICAgICAgICAgICAgIG5hbWU6ICd3cml0ZV9zdGRpbicsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXcml0ZXMgY2hhcmFjdGVycyB0byBhbiBleGlzdGluZyB1bmlmaWVkIGV4ZWMgc2Vzc2lvbiBhbmQgcmV0dXJucyByZWNlbnQgb3V0cHV0LicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdJZGVudGlmaWVyIG9mIHRoZSBydW5uaW5nIHVuaWZpZWQgZXhlYyBzZXNzaW9uLicpLFxuICAgICAgICAgICAgICAgICAgICBjaGFyczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCgnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnQnl0ZXMgdG8gd3JpdGUgdG8gc3RkaW4gKG1heSBiZSBlbXB0eSB0byBwb2xsKS4nKSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRfdGltZV9tczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KERFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnSG93IGxvbmcgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3Igb3V0cHV0IGJlZm9yZSB5aWVsZGluZy4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4X291dHB1dF90b2tlbnM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdNYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gcmV0dXJuLiBFeGNlc3Mgb3V0cHV0IHdpbGwgYmUgdHJ1bmNhdGVkLicpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHNlc3Npb25faWQsIGNoYXJzLCB5aWVsZF90aW1lX21zLCBtYXhfb3V0cHV0X3Rva2VucywgfSkgPT4gYXdhaXQgd2l0aFNhbmRib3hTcGFuKCdzYW5kYm94LndyaXRlX3N0ZGluJywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkLFxuICAgICAgICAgICAgICAgIH0sIGFzeW5jICgpID0+IGF3YWl0IHNlc3Npb24ud3JpdGVTdGRpbih7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgICAgICAgICAgY2hhcnMsXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkVGltZU1zOiB5aWVsZF90aW1lX21zLFxuICAgICAgICAgICAgICAgICAgICBtYXhPdXRwdXRUb2tlbnM6IG1heF9vdXRwdXRfdG9rZW5zLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmVUb29scyA/IHRoaXMuY29uZmlndXJlVG9vbHMoWy4uLnRvb2xzXSkgOiB0b29scztcbiAgICB9XG4gICAgaW5zdHJ1Y3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gU0hFTExfSU5TVFJVQ1RJT05TO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbChhcmdzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFNoZWxsQ2FwYWJpbGl0eShhcmdzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoZWxsLm1qcy5tYXAiLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IHRvb2wgfSBmcm9tIFwiLi4vLi4vdG9vbC5tanNcIjtcbmltcG9ydCB7IGRpciwgZmlsZSwgaXNEaXIsIGlzRGlyZWN0b3J5TGlrZUVudHJ5LCB9IGZyb20gXCIuLi9lbnRyaWVzL2luZGV4Lm1qc1wiO1xuaW1wb3J0IHsgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5tanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCIuLi9tYW5pZmVzdC5tanNcIjtcbmltcG9ydCB7IHByb21wdCB9IGZyb20gXCIuLi9ydW50aW1lL3Byb21wdHMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uIH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmNsYXNzIFNraWxsc0NhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ3NraWxscyc7XG4gICAgc2tpbGxzO1xuICAgIGZyb207XG4gICAgbGF6eUZyb207XG4gICAgaW5kZXg7XG4gICAgc2tpbGxzUGF0aDtcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2tpbGxzID0gYXJncy5za2lsbHMgPz8gW107XG4gICAgICAgIHRoaXMuZnJvbSA9IGFyZ3MuZnJvbTtcbiAgICAgICAgdGhpcy5sYXp5RnJvbSA9IGFyZ3MubGF6eUZyb207XG4gICAgICAgIHRoaXMuaW5kZXggPSBhcmdzLmluZGV4O1xuICAgICAgICB0aGlzLnNraWxsc1BhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgoYXJncy5za2lsbHNQYXRoID8/ICcuYWdlbnRzJyk7XG4gICAgICAgIHZhbGlkYXRlU2tpbGxzQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB9XG4gICAgdG9vbHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXp5RnJvbSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSByZXF1aXJlQm91bmRTZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5fc2Vzc2lvbik7XG4gICAgICAgIGlmICghc2Vzc2lvbi5wYXRoRXhpc3RzIHx8ICFzZXNzaW9uLm1hdGVyaWFsaXplRW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ1NraWxscyBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBwYXRoRXhpc3RzKCkgYW5kIG1hdGVyaWFsaXplRW50cnkoKS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2xvYWRfc2tpbGwnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTG9hZCBhIHNpbmdsZSBsYXppbHkgY29uZmlndXJlZCBza2lsbCBpbnRvIHRoZSBzYW5kYm94IHNvIGl0cyBTS0lMTC5tZCwgc2NyaXB0cywgcmVmZXJlbmNlcywgYW5kIGFzc2V0cyBjYW4gYmUgcmVhZCBmcm9tIHRoZSB3b3Jrc3BhY2UuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHNraWxsX25hbWU6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1pbigxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdOYW1lIG9mIHRoZSBsYXppbHkgY29uZmlndXJlZCBza2lsbCB0byBtYXRlcmlhbGl6ZS4nKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBza2lsbF9uYW1lLCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVzb2x2ZUxhenlTa2lsbE1hdGNoKHRoaXMsIHNraWxsX25hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZVNraWxsUGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChtYXRjaC5wYXRoID8/IG1hdGNoLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhdGggPSBqb2luUmVsYXRpdmVQYXRocyh0aGlzLnNraWxsc1BhdGgsIHJlbGF0aXZlU2tpbGxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbGxNYXJrZG93blBhdGggPSBqb2luUmVsYXRpdmVQYXRocyhkZXN0aW5hdGlvblBhdGgsICdTS0lMTC5tZCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgc2Vzc2lvbi5wYXRoRXhpc3RzKHNraWxsTWFya2Rvd25QYXRoLCB0aGlzLl9ydW5BcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnYWxyZWFkeV9sb2FkZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWxsX25hbWU6IG1hdGNoLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXNzaW9uLm1hdGVyaWFsaXplRW50cnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnk6IHJlc29sdmVMYXp5U2tpbGxFbnRyeSh0aGlzLmxhenlGcm9tLnNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2xvYWRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lsbF9uYW1lOiBtYXRjaC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcHJvY2Vzc01hbmlmZXN0KG1hbmlmZXN0KSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGF0aHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG1hbmlmZXN0LmVudHJpZXMpLm1hcCgocGF0aCkgPT4gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHBhdGgpKSk7XG4gICAgICAgIGlmICh0aGlzLmxhenlGcm9tKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwcyA9IFsuLi5leGlzdGluZ1BhdGhzXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCB0aGlzLnNraWxsc1BhdGgpKVxuICAgICAgICAgICAgICAgIC5zb3J0KCk7XG4gICAgICAgICAgICBpZiAob3ZlcmxhcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYHNraWxscyBsYXp5RnJvbSBwYXRoIG92ZXJsYXBzIGV4aXN0aW5nIG1hbmlmZXN0IGVudHJpZXM6ICR7b3ZlcmxhcHMuam9pbignLCAnKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mcm9tKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwID0gWy4uLmV4aXN0aW5nUGF0aHNdLmZpbmQoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCB0aGlzLnNraWxsc1BhdGgpKTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgc2tpbGxzIHBhdGggb3ZlcmxhcHMgZXhpc3RpbmcgbWFuaWZlc3QgZW50cmllczogJHtvdmVybGFwfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFuaWZlc3QuZW50cmllc1t0aGlzLnNraWxsc1BhdGhdID0gdGhpcy5mcm9tO1xuICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgdGhpcy5za2lsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNraWxsUGF0aCA9IGpvaW5SZWxhdGl2ZVBhdGhzKHRoaXMuc2tpbGxzUGF0aCwgc2tpbGwubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwID0gWy4uLmV4aXN0aW5nUGF0aHNdLmZpbmQoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCBza2lsbFBhdGgpKTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgc2tpbGwgcGF0aCBvdmVybGFwcyBleGlzdGluZyBtYW5pZmVzdCBlbnRyaWVzOiAke3NraWxsUGF0aH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hbmlmZXN0LmVudHJpZXNbc2tpbGxQYXRoXSA9IHJlbmRlclNraWxsRGVzY3JpcHRvcihza2lsbCk7XG4gICAgICAgICAgICBleGlzdGluZ1BhdGhzLmFkZChza2lsbFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICB9XG4gICAgYXN5bmMgaW5zdHJ1Y3Rpb25zKG1hbmlmZXN0KSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcmVzb2x2ZVNraWxsc01ldGFkYXRhKHRoaXMsIGF3YWl0IHRoaXMucmVzb2x2ZVJ1bnRpbWVNZXRhZGF0YShtYW5pZmVzdCkpO1xuICAgICAgICBpZiAobWV0YWRhdGEubGVuZ3RoID09PSAwICYmIHRoaXMuZnJvbSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlclNraWxsc0Rpc2NvdmVyeUluc3RydWN0aW9ucyh0aGlzLnNraWxsc1BhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW5kZXJTa2lsbHNJbnN0cnVjdGlvbnMoe1xuICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICBsYXp5OiBCb29sZWFuKHRoaXMubGF6eUZyb20pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgcmVzb2x2ZVJ1bnRpbWVNZXRhZGF0YShfbWFuaWZlc3QpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZyb20gfHwgIXRoaXMuX3Nlc3Npb24/Lmxpc3REaXIgfHwgIXRoaXMuX3Nlc3Npb24ucmVhZEZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZW50cmllcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMgPSBhd2FpdCB0aGlzLl9zZXNzaW9uLmxpc3REaXIoe1xuICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMuc2tpbGxzUGF0aCxcbiAgICAgICAgICAgICAgICBydW5BczogdGhpcy5fcnVuQXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkudHlwZSAhPT0gJ2RpcicpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb250ZW50O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgdGhpcy5fc2Vzc2lvbi5yZWFkRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGpvaW5SZWxhdGl2ZVBhdGhzKGVudHJ5LnBhdGgsICdTS0lMTC5tZCcpLFxuICAgICAgICAgICAgICAgICAgICBydW5BczogdGhpcy5fcnVuQXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtYXJrZG93biA9IHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gY29udGVudFxuICAgICAgICAgICAgICAgIDogbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQpO1xuICAgICAgICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSBwYXJzZVNraWxsRnJvbnRtYXR0ZXIobWFya2Rvd24pO1xuICAgICAgICAgICAgbWV0YWRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogZnJvbnRtYXR0ZXIubmFtZSA/PyBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmcm9udG1hdHRlci5kZXNjcmlwdGlvbiA/PyAnTm8gZGVzY3JpcHRpb24gcHJvdmlkZWQuJyxcbiAgICAgICAgICAgICAgICBwYXRoOiBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBza2lsbHMoYXJncykge1xuICAgIHJldHVybiBuZXcgU2tpbGxzQ2FwYWJpbGl0eShhcmdzKTtcbn1cbmNvbnN0IFNLSUxMU19TRUNUSU9OX0lOVFJPID0gcHJvbXB0IGBcbkEgc2tpbGwgaXMgYSBzZXQgb2YgbG9jYWwgaW5zdHJ1Y3Rpb25zIHRvIGZvbGxvdyB0aGF0IGlzIHN0b3JlZCBpbiBhIFxcYFNLSUxMLm1kXFxgIGZpbGUuIEJlbG93IGlzIHRoZSBsaXN0IG9mIHNraWxscyB0aGF0IGNhbiBiZSB1c2VkLiBFYWNoIGVudHJ5IGluY2x1ZGVzIGEgbmFtZSwgZGVzY3JpcHRpb24sIGFuZCBmaWxlIHBhdGggc28geW91IGNhbiBvcGVuIHRoZSBzb3VyY2UgZm9yIGZ1bGwgaW5zdHJ1Y3Rpb25zIHdoZW4gdXNpbmcgYSBzcGVjaWZpYyBza2lsbC5cbmA7XG5jb25zdCBIT1dfVE9fVVNFX1NLSUxMU19TRUNUSU9OID0gcHJvbXB0IGBcbiMjIyBIb3cgdG8gdXNlIHNraWxsc1xuLSBEaXNjb3Zlcnk6IFRoZSBsaXN0IGFib3ZlIGlzIHRoZSBza2lsbHMgYXZhaWxhYmxlIGluIHRoaXMgc2Vzc2lvbiAobmFtZSArIGRlc2NyaXB0aW9uICsgZmlsZSBwYXRoKS4gU2tpbGwgYm9kaWVzIGxpdmUgb24gZGlzayBhdCB0aGUgbGlzdGVkIHBhdGhzLlxuLSBUcmlnZ2VyIHJ1bGVzOiBJZiB0aGUgdXNlciBuYW1lcyBhIHNraWxsICh3aXRoIFxcYCRTa2lsbE5hbWVcXGAgb3IgcGxhaW4gdGV4dCkgT1IgdGhlIHRhc2sgY2xlYXJseSBtYXRjaGVzIGEgc2tpbGwncyBkZXNjcmlwdGlvbiBzaG93biBhYm92ZSwgeW91IG11c3QgdXNlIHRoYXQgc2tpbGwgZm9yIHRoYXQgdHVybi4gTXVsdGlwbGUgbWVudGlvbnMgbWVhbiB1c2UgdGhlbSBhbGwuIERvIG5vdCBjYXJyeSBza2lsbHMgYWNyb3NzIHR1cm5zIHVubGVzcyByZS1tZW50aW9uZWQuXG4tIE1pc3NpbmcvYmxvY2tlZDogSWYgYSBuYW1lZCBza2lsbCBpc24ndCBpbiB0aGUgbGlzdCBvciB0aGUgcGF0aCBjYW4ndCBiZSByZWFkLCBzYXkgc28gYnJpZWZseSBhbmQgY29udGludWUgd2l0aCB0aGUgYmVzdCBmYWxsYmFjay5cbi0gSG93IHRvIHVzZSBhIHNraWxsIChwcm9ncmVzc2l2ZSBkaXNjbG9zdXJlKTpcbiAgMSkgQWZ0ZXIgZGVjaWRpbmcgdG8gdXNlIGEgc2tpbGwsIG9wZW4gaXRzIFxcYFNLSUxMLm1kXFxgLiBSZWFkIG9ubHkgZW5vdWdoIHRvIGZvbGxvdyB0aGUgd29ya2Zsb3cuXG4gIDIpIElmIFxcYFNLSUxMLm1kXFxgIHBvaW50cyB0byBleHRyYSBmb2xkZXJzIHN1Y2ggYXMgXFxgcmVmZXJlbmNlcy9cXGAsIGxvYWQgb25seSB0aGUgc3BlY2lmaWMgZmlsZXMgbmVlZGVkIGZvciB0aGUgcmVxdWVzdDsgZG9uJ3QgYnVsay1sb2FkIGV2ZXJ5dGhpbmcuXG4gIDMpIElmIFxcYHNjcmlwdHMvXFxgIGV4aXN0LCBwcmVmZXIgcnVubmluZyBvciBwYXRjaGluZyB0aGVtIGluc3RlYWQgb2YgcmV0eXBpbmcgbGFyZ2UgY29kZSBibG9ja3MuXG4gIDQpIElmIFxcYGFzc2V0cy9cXGAgb3IgdGVtcGxhdGVzIGV4aXN0LCByZXVzZSB0aGVtIGluc3RlYWQgb2YgcmVjcmVhdGluZyBmcm9tIHNjcmF0Y2guXG4tIENvb3JkaW5hdGlvbiBhbmQgc2VxdWVuY2luZzpcbiAgLSBJZiBtdWx0aXBsZSBza2lsbHMgYXBwbHksIGNob29zZSB0aGUgbWluaW1hbCBzZXQgdGhhdCBjb3ZlcnMgdGhlIHJlcXVlc3QgYW5kIHN0YXRlIHRoZSBvcmRlciB5b3UnbGwgdXNlIHRoZW0uXG4gIC0gQW5ub3VuY2Ugd2hpY2ggc2tpbGwocykgeW91J3JlIHVzaW5nIGFuZCB3aHkgKG9uZSBzaG9ydCBsaW5lKS4gSWYgeW91IHNraXAgYW4gb2J2aW91cyBza2lsbCwgc2F5IHdoeS5cbi0gQ29udGV4dCBoeWdpZW5lOlxuICAtIEtlZXAgY29udGV4dCBzbWFsbDogc3VtbWFyaXplIGxvbmcgc2VjdGlvbnMgaW5zdGVhZCBvZiBwYXN0aW5nIHRoZW07IG9ubHkgbG9hZCBleHRyYSBmaWxlcyB3aGVuIG5lZWRlZC5cbiAgLSBBdm9pZCBkZWVwIHJlZmVyZW5jZS1jaGFzaW5nOiBwcmVmZXIgb3BlbmluZyBvbmx5IGZpbGVzIGRpcmVjdGx5IGxpbmtlZCBmcm9tIFxcYFNLSUxMLm1kXFxgIHVubGVzcyB5b3UncmUgYmxvY2tlZC5cbiAgLSBXaGVuIHZhcmlhbnRzIGV4aXN0IChmcmFtZXdvcmtzLCBwcm92aWRlcnMsIGRvbWFpbnMpLCBwaWNrIG9ubHkgdGhlIHJlbGV2YW50IHJlZmVyZW5jZSBmaWxlKHMpIGFuZCBub3RlIHRoYXQgY2hvaWNlLlxuLSBTYWZldHkgYW5kIGZhbGxiYWNrOiBJZiBhIHNraWxsIGNhbid0IGJlIGFwcGxpZWQgY2xlYW5seSAobWlzc2luZyBmaWxlcywgdW5jbGVhciBpbnN0cnVjdGlvbnMpLCBzdGF0ZSB0aGUgaXNzdWUsIHBpY2sgdGhlIG5leHQtYmVzdCBhcHByb2FjaCwgYW5kIGNvbnRpbnVlLlxuYDtcbmNvbnN0IEhPV19UT19VU0VfTEFaWV9TS0lMTFNfU0VDVElPTiA9IHByb21wdCBgXG4jIyMgSG93IHRvIHVzZSBza2lsbHNcbi0gRGlzY292ZXJ5OiBUaGUgbGlzdCBhYm92ZSBpcyB0aGUgc2tpbGwgaW5kZXggYXZhaWxhYmxlIGluIHRoaXMgc2Vzc2lvbiAobmFtZSArIGRlc2NyaXB0aW9uICsgd29ya3NwYWNlIHBhdGgpLiBJbiBsYXp5IG1vZGUsIHRob3NlIHBhdGhzIGFyZSBsb2FkZWQgb24gZGVtYW5kIGluc3RlYWQgb2YgYmVpbmcgcHJlc2VudCB1cCBmcm9udC5cbi0gVHJpZ2dlciBydWxlczogSWYgdGhlIHVzZXIgbmFtZXMgYSBza2lsbCAod2l0aCBcXGAkU2tpbGxOYW1lXFxgIG9yIHBsYWluIHRleHQpIE9SIHRoZSB0YXNrIGNsZWFybHkgbWF0Y2hlcyBhIHNraWxsJ3MgZGVzY3JpcHRpb24gc2hvd24gYWJvdmUsIHlvdSBtdXN0IHVzZSB0aGF0IHNraWxsIGZvciB0aGF0IHR1cm4uIE11bHRpcGxlIG1lbnRpb25zIG1lYW4gdXNlIHRoZW0gYWxsLiBEbyBub3QgY2Fycnkgc2tpbGxzIGFjcm9zcyB0dXJucyB1bmxlc3MgcmUtbWVudGlvbmVkLlxuLSBNaXNzaW5nL2Jsb2NrZWQ6IElmIGEgbmFtZWQgc2tpbGwgaXNuJ3QgaW4gdGhlIGxpc3Qgb3IgdGhlIHBhdGggY2FuJ3QgYmUgcmVhZCwgc2F5IHNvIGJyaWVmbHkgYW5kIGNvbnRpbnVlIHdpdGggdGhlIGJlc3QgZmFsbGJhY2suXG4tIEhvdyB0byB1c2UgYSBza2lsbCAocHJvZ3Jlc3NpdmUgZGlzY2xvc3VyZSk6XG4gIDEpIEFmdGVyIGRlY2lkaW5nIHRvIHVzZSBhIGxhenkgc2tpbGwsIGNhbGwgXFxgbG9hZF9za2lsbFxcYCBmb3IgdGhhdCBza2lsbCBmaXJzdCwgdGhlbiBvcGVuIGl0cyBcXGBTS0lMTC5tZFxcYC5cbiAgMikgSWYgXFxgU0tJTEwubWRcXGAgcG9pbnRzIHRvIGV4dHJhIGZvbGRlcnMgc3VjaCBhcyBcXGByZWZlcmVuY2VzL1xcYCwgbG9hZCBvbmx5IHRoZSBzcGVjaWZpYyBmaWxlcyBuZWVkZWQgZm9yIHRoZSByZXF1ZXN0OyBkb24ndCBidWxrLWxvYWQgZXZlcnl0aGluZy5cbiAgMykgSWYgXFxgc2NyaXB0cy9cXGAgZXhpc3QsIHByZWZlciBydW5uaW5nIG9yIHBhdGNoaW5nIHRoZW0gaW5zdGVhZCBvZiByZXR5cGluZyBsYXJnZSBjb2RlIGJsb2Nrcy5cbiAgNCkgSWYgXFxgYXNzZXRzL1xcYCBvciB0ZW1wbGF0ZXMgZXhpc3QsIHJldXNlIHRoZW0gaW5zdGVhZCBvZiByZWNyZWF0aW5nIGZyb20gc2NyYXRjaC5cbi0gQ29vcmRpbmF0aW9uIGFuZCBzZXF1ZW5jaW5nOlxuICAtIElmIG11bHRpcGxlIHNraWxscyBhcHBseSwgY2hvb3NlIHRoZSBtaW5pbWFsIHNldCB0aGF0IGNvdmVycyB0aGUgcmVxdWVzdCBhbmQgc3RhdGUgdGhlIG9yZGVyIHlvdSdsbCB1c2UgdGhlbS5cbiAgLSBBbm5vdW5jZSB3aGljaCBza2lsbChzKSB5b3UncmUgdXNpbmcgYW5kIHdoeSAob25lIHNob3J0IGxpbmUpLiBJZiB5b3Ugc2tpcCBhbiBvYnZpb3VzIHNraWxsLCBzYXkgd2h5LlxuLSBDb250ZXh0IGh5Z2llbmU6XG4gIC0gS2VlcCBjb250ZXh0IHNtYWxsOiBzdW1tYXJpemUgbG9uZyBzZWN0aW9ucyBpbnN0ZWFkIG9mIHBhc3RpbmcgdGhlbTsgb25seSBsb2FkIGV4dHJhIGZpbGVzIHdoZW4gbmVlZGVkLlxuICAtIEF2b2lkIGRlZXAgcmVmZXJlbmNlLWNoYXNpbmc6IHByZWZlciBvcGVuaW5nIG9ubHkgZmlsZXMgZGlyZWN0bHkgbGlua2VkIGZyb20gXFxgU0tJTEwubWRcXGAgdW5sZXNzIHlvdSdyZSBibG9ja2VkLlxuICAtIFdoZW4gdmFyaWFudHMgZXhpc3QgKGZyYW1ld29ya3MsIHByb3ZpZGVycywgZG9tYWlucyksIHBpY2sgb25seSB0aGUgcmVsZXZhbnQgcmVmZXJlbmNlIGZpbGUocykgYW5kIG5vdGUgdGhhdCBjaG9pY2UuXG4tIFNhZmV0eSBhbmQgZmFsbGJhY2s6IElmIGEgc2tpbGwgY2FuJ3QgYmUgYXBwbGllZCBjbGVhbmx5IChtaXNzaW5nIGZpbGVzLCB1bmNsZWFyIGluc3RydWN0aW9ucyksIHN0YXRlIHRoZSBpc3N1ZSwgcGljayB0aGUgbmV4dC1iZXN0IGFwcHJvYWNoLCBhbmQgY29udGludWUuXG5gO1xuZnVuY3Rpb24gdmFsaWRhdGVTa2lsbHNDYXBhYmlsaXR5KGNhcGFiaWxpdHkpIHtcbiAgICBjb25zdCBjb25maWd1cmVkU291cmNlcyA9IFtcbiAgICAgICAgY2FwYWJpbGl0eS5za2lsbHMubGVuZ3RoID4gMCxcbiAgICAgICAgQm9vbGVhbihjYXBhYmlsaXR5LmZyb20pLFxuICAgICAgICBCb29sZWFuKGNhcGFiaWxpdHkubGF6eUZyb20pLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICBpZiAoY29uZmlndXJlZFNvdXJjZXMgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcignc2tpbGxzIGNhcGFiaWxpdHkgcmVxdWlyZXMgYHNraWxsc2AsIGBmcm9tYCwgb3IgYGxhenlGcm9tYC4nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ3VyZWRTb3VyY2VzID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdza2lsbHMgY2FwYWJpbGl0eSBhY2NlcHRzIG9ubHkgb25lIG9mIGBza2lsbHNgLCBgZnJvbWAsIG9yIGBsYXp5RnJvbWAuJyk7XG4gICAgfVxuICAgIGlmIChjYXBhYmlsaXR5LmZyb20gJiYgIWlzRGlyZWN0b3J5TGlrZUVudHJ5KGNhcGFiaWxpdHkuZnJvbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcignc2tpbGxzIGZyb20gbXVzdCBiZSBhIGRpcmVjdG9yeS1saWtlIGVudHJ5IHN1Y2ggYXMgZGlyLCBnaXRfcmVwbywgb3IgbW91bnQuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlZW5Ta2lsbE5hbWVzID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgY2FwYWJpbGl0eS5za2lsbHMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgoc2tpbGwubmFtZSk7XG4gICAgICAgIGlmIChzZWVuU2tpbGxOYW1lcy5oYXMobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBkdXBsaWNhdGUgc2tpbGwgbmFtZTogJHtza2lsbC5uYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIHNlZW5Ta2lsbE5hbWVzLmFkZChub3JtYWxpemVkTmFtZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVuZGVyU2tpbGxEZXNjcmlwdG9yKHNraWxsKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB7XG4gICAgICAgICdTS0lMTC5tZCc6IG5vcm1hbGl6ZVNraWxsQ29udGVudChza2lsbC5jb250ZW50KSxcbiAgICB9O1xuICAgIGlmIChza2lsbC5zY3JpcHRzICYmIE9iamVjdC5rZXlzKHNraWxsLnNjcmlwdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2hpbGRyZW4uc2NyaXB0cyA9IGRpcih7XG4gICAgICAgICAgICBjaGlsZHJlbjogc2tpbGwuc2NyaXB0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChza2lsbC5yZWZlcmVuY2VzICYmIE9iamVjdC5rZXlzKHNraWxsLnJlZmVyZW5jZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2hpbGRyZW4ucmVmZXJlbmNlcyA9IGRpcih7XG4gICAgICAgICAgICBjaGlsZHJlbjogc2tpbGwucmVmZXJlbmNlcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChza2lsbC5hc3NldHMgJiYgT2JqZWN0LmtleXMoc2tpbGwuYXNzZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNoaWxkcmVuLmFzc2V0cyA9IGRpcih7XG4gICAgICAgICAgICBjaGlsZHJlbjogc2tpbGwuYXNzZXRzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcih7XG4gICAgICAgIGNoaWxkcmVuLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU2tpbGxDb250ZW50KGNvbnRlbnQpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnIHx8IGNvbnRlbnQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiBmaWxlKHtcbiAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVTa2lsbHNNZXRhZGF0YShjYXBhYmlsaXR5LCBydW50aW1lTWV0YWRhdGEgPSBbXSkge1xuICAgIGlmIChjYXBhYmlsaXR5LnNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBjYXBhYmlsaXR5LnNraWxsc1xuICAgICAgICAgICAgLm1hcCgoc2tpbGwpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBza2lsbC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHNraWxsLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcGF0aDogam9pblJlbGF0aXZlUGF0aHMoY2FwYWJpbGl0eS5za2lsbHNQYXRoLCBza2lsbC5uYW1lKSxcbiAgICAgICAgfSkpXG4gICAgICAgICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubmFtZS5sb2NhbGVDb21wYXJlKHJpZ2h0Lm5hbWUpKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJlZEluZGV4ID0gcmVzb2x2ZUxhenlTa2lsbEluZGV4KGNhcGFiaWxpdHkubGF6eUZyb20pID8/XG4gICAgICAgIGNhcGFiaWxpdHkuaW5kZXggPz9cbiAgICAgICAgKHJ1bnRpbWVNZXRhZGF0YS5sZW5ndGggPiAwID8gcnVudGltZU1ldGFkYXRhIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICBkZXJpdmVJbmRleEZyb21EaXJFbnRyeShjYXBhYmlsaXR5LmZyb20pO1xuICAgIHJldHVybiBjb25maWd1cmVkSW5kZXhcbiAgICAgICAgLm1hcCgoc2tpbGwpID0+ICh7XG4gICAgICAgIC4uLnNraWxsLFxuICAgICAgICBwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhjYXBhYmlsaXR5LnNraWxsc1BhdGgsIHNraWxsLnBhdGggPz8gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNraWxsLm5hbWUpKSxcbiAgICB9KSlcbiAgICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm5hbWUubG9jYWxlQ29tcGFyZShyaWdodC5uYW1lKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTa2lsbEZyb250bWF0dGVyKG1hcmtkb3duKSB7XG4gICAgY29uc3QgbGluZXMgPSBtYXJrZG93bi5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGlmIChsaW5lc1swXT8udHJpbSgpICE9PSAnLS0tJykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGVuZEluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lLCBpbmRleCkgPT4gaW5kZXggPiAwICYmIGxpbmUudHJpbSgpID09PSAnLS0tJyk7XG4gICAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IG1ldGFkYXRhID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNsaWNlKDEsIGVuZEluZGV4KSkge1xuICAgICAgICBjb25zdCBzdHJpcHBlZCA9IGxpbmUudHJpbSgpO1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXJJbmRleCA9IHN0cmlwcGVkLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKCFzdHJpcHBlZCB8fCBzdHJpcHBlZC5zdGFydHNXaXRoKCcjJykgfHwgZGVsaW1pdGVySW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBzdHJpcHBlZC5zbGljZSgwLCBkZWxpbWl0ZXJJbmRleCkudHJpbSgpO1xuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHN0cmlwcGVkLnNsaWNlKGRlbGltaXRlckluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWV0YWRhdGFba2V5XSA9IHVucXVvdGVGcm9udG1hdHRlclZhbHVlKHJhd1ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xufVxuZnVuY3Rpb24gdW5xdW90ZUZyb250bWF0dGVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiZcbiAgICAgICAgdmFsdWVbMF0gPT09IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdICYmXG4gICAgICAgICh2YWx1ZVswXSA9PT0gJ1wiJyB8fCB2YWx1ZVswXSA9PT0gXCInXCIpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5U2tpbGxJbmRleChsYXp5U291cmNlKSB7XG4gICAgaWYgKCFsYXp5U291cmNlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChsYXp5U291cmNlLmluZGV4KSB7XG4gICAgICAgIHJldHVybiBsYXp5U291cmNlLmluZGV4O1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmVkSW5kZXggPSBkZXJpdmVJbmRleEZyb21EaXJFbnRyeShsYXp5U291cmNlLnNvdXJjZSk7XG4gICAgcmV0dXJuIGRlcml2ZWRJbmRleC5sZW5ndGggPiAwID8gZGVyaXZlZEluZGV4IDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZGVyaXZlSW5kZXhGcm9tRGlyRW50cnkoZW50cnkpIHtcbiAgICBpZiAoIWVudHJ5IHx8ICFpc0RpcihlbnRyeSkgfHwgIWVudHJ5LmNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGVudHJ5LmNoaWxkcmVuKVxuICAgICAgICAuZmlsdGVyKChbLCBjaGlsZF0pID0+IGNoaWxkLnR5cGUgPT09ICdkaXInKVxuICAgICAgICAubWFwKChbbmFtZSwgY2hpbGRdKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogY2hpbGQuZGVzY3JpcHRpb24gPz8gJ05vIGRlc2NyaXB0aW9uIHByb3ZpZGVkLicsXG4gICAgfSkpO1xufVxuZnVuY3Rpb24gcmVuZGVyU2tpbGxzRGlzY292ZXJ5SW5zdHJ1Y3Rpb25zKHNraWxsc1BhdGgpIHtcbiAgICByZXR1cm4gcHJvbXB0IGBcbiMjIFNraWxsc1xuJHtTS0lMTFNfU0VDVElPTl9JTlRST31cblxuIyMjIFNraWxsIHNvdXJjZVxuLSBTa2lsbHMgYXJlIG1hdGVyaWFsaXplZCB1bmRlciAke3NraWxsc1BhdGh9LiBEaXNjb3ZlciBhdmFpbGFibGUgc2tpbGxzIGJ5IGluc3BlY3RpbmcgY2hpbGQgZGlyZWN0b3JpZXMgYW5kIHRoZWlyIFNLSUxMLm1kIGZpbGVzIGF0IHJ1bnRpbWUuXG5cbiR7SE9XX1RPX1VTRV9TS0lMTFNfU0VDVElPTn1cbmA7XG59XG5mdW5jdGlvbiByZW5kZXJTa2lsbHNJbnN0cnVjdGlvbnMoYXJncykge1xuICAgIGNvbnN0IGF2YWlsYWJsZVNraWxscyA9IGFyZ3MubWV0YWRhdGFcbiAgICAgICAgLm1hcCgoc2tpbGwpID0+IGAtICR7c2tpbGwubmFtZX06ICR7c2tpbGwuZGVzY3JpcHRpb259IChmaWxlOiAke3NraWxsLnBhdGggPz8gc2tpbGwubmFtZX0pYClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IGxhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zID0gYXJncy5sYXp5XG4gICAgICAgID8gcHJvbXB0IGBcbiMjIyBMYXp5IGxvYWRpbmdcbi0gVGhlc2Ugc2tpbGxzIGFyZSBpbmRleGVkIGZvciBwbGFubmluZywgYnV0IHRoZXkgYXJlIG5vdCBtYXRlcmlhbGl6ZWQgaW4gdGhlIHdvcmtzcGFjZSB5ZXQuXG4tIENhbGwgXFxgbG9hZF9za2lsbFxcYCB3aXRoIGEgc2luZ2xlIHNraWxsIG5hbWUgZnJvbSB0aGUgbGlzdCBiZWZvcmUgcmVhZGluZyBpdHMgXFxgU0tJTEwubWRcXGAgb3Igb3RoZXIgZmlsZXMgZnJvbSB0aGUgd29ya3NwYWNlLlxuLSBcXGBsb2FkX3NraWxsXFxgIHN0YWdlcyBleGFjdGx5IG9uZSBza2lsbCB1bmRlciB0aGUgbGlzdGVkIHBhdGguIElmIHlvdSBuZWVkIG1vcmUgdGhhbiBvbmUgc2tpbGwsIGNhbGwgaXQgbXVsdGlwbGUgdGltZXMuXG5gXG4gICAgICAgIDogJyc7XG4gICAgY29uc3QgdXNhZ2VJbnN0cnVjdGlvbnMgPSBhcmdzLmxhenlcbiAgICAgICAgPyBIT1dfVE9fVVNFX0xBWllfU0tJTExTX1NFQ1RJT05cbiAgICAgICAgOiBIT1dfVE9fVVNFX1NLSUxMU19TRUNUSU9OO1xuICAgIGNvbnN0IGxhenlMb2FkaW5nU2VjdGlvbiA9IGxhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zXG4gICAgICAgID8gYCR7bGF6eUxvYWRpbmdJbnN0cnVjdGlvbnN9XFxuXFxuYFxuICAgICAgICA6ICcnO1xuICAgIHJldHVybiBwcm9tcHQgYFxuIyMgU2tpbGxzXG4ke1NLSUxMU19TRUNUSU9OX0lOVFJPfVxuXG4jIyMgQXZhaWxhYmxlIHNraWxsc1xuJHthdmFpbGFibGVTa2lsbHN9XG5cbiR7bGF6eUxvYWRpbmdTZWN0aW9ufSR7dXNhZ2VJbnN0cnVjdGlvbnN9XG5gO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlTa2lsbE1hdGNoKGNhcGFiaWxpdHksIHNraWxsTmFtZSkge1xuICAgIGNvbnN0IGluZGV4ID0gcmVzb2x2ZUxhenlTa2lsbEluZGV4KGNhcGFiaWxpdHkubGF6eUZyb20pID8/IGNhcGFiaWxpdHkuaW5kZXggPz8gW107XG4gICAgY29uc3QgbWF0Y2hlcyA9IGluZGV4LmZpbHRlcigoc2tpbGwpID0+IHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNraWxsLnBhdGggPz8gc2tpbGwubmFtZSk7XG4gICAgICAgIGNvbnN0IHBhdGhCYXNlTmFtZSA9IHJlbGF0aXZlUGF0aC5zcGxpdCgnLycpLnBvcCgpID8/IHJlbGF0aXZlUGF0aDtcbiAgICAgICAgcmV0dXJuIChza2lsbC5uYW1lID09PSBza2lsbE5hbWUgfHxcbiAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9PT0gc2tpbGxOYW1lIHx8XG4gICAgICAgICAgICBwYXRoQmFzZU5hbWUgPT09IHNraWxsTmFtZSk7XG4gICAgfSk7XG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYGxhenkgc2tpbGwgbm90IGZvdW5kOiAke3NraWxsTmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBsYXp5IHNraWxsIG5hbWUgaXMgYW1iaWd1b3VzOiAke3NraWxsTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNbMF07XG59XG5mdW5jdGlvbiBqb2luUmVsYXRpdmVQYXRocyhsZWZ0LCByaWdodCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRMZWZ0ID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKGxlZnQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSaWdodCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChyaWdodCk7XG4gICAgaWYgKCFub3JtYWxpemVkTGVmdCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZFJpZ2h0O1xuICAgIH1cbiAgICBpZiAoIW5vcm1hbGl6ZWRSaWdodCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZExlZnQ7XG4gICAgfVxuICAgIHJldHVybiBgJHtub3JtYWxpemVkTGVmdH0vJHtub3JtYWxpemVkUmlnaHR9YDtcbn1cbmZ1bmN0aW9uIGpvaW5Tb3VyY2VQYXRoKHNvdXJjZVJvb3QsIHJlbGF0aXZlUGF0aCkge1xuICAgIGNvbnN0IHRyaW1tZWRSb290ID0gc291cmNlUm9vdC5yZXBsYWNlKC9bXFxcXC9dKyQvLCAnJyk7XG4gICAgaWYgKCF0cmltbWVkUm9vdCkge1xuICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dHJpbW1lZFJvb3R9LyR7cmVsYXRpdmVQYXRofWA7XG59XG5mdW5jdGlvbiByZXNvbHZlTGF6eVNraWxsRW50cnkoc291cmNlLCByZWxhdGl2ZVNraWxsUGF0aCkge1xuICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ2xvY2FsX2RpcicpIHtcbiAgICAgICAgaWYgKCFzb3VyY2Uuc3JjKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdMYXp5IHNraWxsIGxvY2FsX2RpciBzb3VyY2VzIHJlcXVpcmUgYSBjb25jcmV0ZSBzcmMgdmFsdWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNvdXJjZSxcbiAgICAgICAgICAgIHR5cGU6ICdsb2NhbF9kaXInLFxuICAgICAgICAgICAgc3JjOiBqb2luU291cmNlUGF0aChzb3VyY2Uuc3JjLCByZWxhdGl2ZVNraWxsUGF0aCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ2dpdF9yZXBvJykge1xuICAgICAgICBjb25zdCBiYXNlU3VicGF0aCA9IHNvdXJjZS5zdWJwYXRoXG4gICAgICAgICAgICA/IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChzb3VyY2Uuc3VicGF0aClcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zb3VyY2UsXG4gICAgICAgICAgICB0eXBlOiAnZ2l0X3JlcG8nLFxuICAgICAgICAgICAgc3VicGF0aDogam9pblJlbGF0aXZlUGF0aHMoYmFzZVN1YnBhdGgsIHJlbGF0aXZlU2tpbGxQYXRoKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHNvdXJjZS50eXBlID09PSAnZGlyJykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHJlYWREaXJDaGlsZChzb3VyY2UsIHJlbGF0aXZlU2tpbGxQYXRoKTtcbiAgICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgbGF6eSBza2lsbCBzb3VyY2UgcGF0aCBub3QgZm91bmQ6ICR7cmVsYXRpdmVTa2lsbFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBMYXp5IHNraWxsIHNvdXJjZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0OiAke3NvdXJjZS50eXBlfWApO1xufVxuZnVuY3Rpb24gcmVhZERpckNoaWxkKHNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpIHtcbiAgICBsZXQgY3VycmVudCA9IHNvdXJjZTtcbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygbm9ybWFsaXplUmVsYXRpdmVQYXRoKHJlbGF0aXZlU2tpbGxQYXRoKS5zcGxpdCgnLycpKSB7XG4gICAgICAgIGlmICghc2VnbWVudCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjdXJyZW50IHx8ICFpc0RpcihjdXJyZW50KSB8fCAhY3VycmVudC5jaGlsZHJlbikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbltzZWdtZW50XTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5mdW5jdGlvbiBwYXRoc092ZXJsYXAobGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gKGxlZnQgPT09IHJpZ2h0IHx8XG4gICAgICAgIGxlZnQuc3RhcnRzV2l0aChgJHtyaWdodH0vYCkgfHxcbiAgICAgICAgcmlnaHQuc3RhcnRzV2l0aChgJHtsZWZ0fS9gKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1za2lsbHMubWpzLm1hcCIsImltcG9ydCB7IGNvbXBhY3Rpb24gfSBmcm9tIFwiLi9jb21wYWN0aW9uLm1qc1wiO1xuaW1wb3J0IHsgZmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0ubWpzXCI7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gXCIuL3NoZWxsLm1qc1wiO1xuZXhwb3J0IHsgQ2FwYWJpbGl0eSB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5leHBvcnQgeyBDb21wYWN0aW9uTW9kZWxJbmZvLCBDb21wYWN0aW9uUG9saWN5LCBEeW5hbWljQ29tcGFjdGlvblBvbGljeSwgU3RhdGljQ29tcGFjdGlvblBvbGljeSwgY29tcGFjdGlvbiwgfSBmcm9tIFwiLi9jb21wYWN0aW9uLm1qc1wiO1xuZXhwb3J0IHsgZmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0ubWpzXCI7XG5leHBvcnQgeyBtZW1vcnkgfSBmcm9tIFwiLi9tZW1vcnkubWpzXCI7XG5leHBvcnQgeyBJbk1lbW9yeU1lbW9yeVN0b3JlIH0gZnJvbSBcIi4uL21lbW9yeS9zdG9yYWdlLm1qc1wiO1xuZXhwb3J0IHsgc2hlbGwgfSBmcm9tIFwiLi9zaGVsbC5tanNcIjtcbmV4cG9ydCB7IHNraWxscyB9IGZyb20gXCIuL3NraWxscy5tanNcIjtcbmZ1bmN0aW9uIGRlZmF1bHRDYXBhYmlsaXRpZXMoKSB7XG4gICAgcmV0dXJuIFtmaWxlc3lzdGVtKCksIHNoZWxsKCksIGNvbXBhY3Rpb24oKV07XG59XG5leHBvcnQgY29uc3QgQ2FwYWJpbGl0aWVzID0ge1xuICAgIGRlZmF1bHQ6IGRlZmF1bHRDYXBhYmlsaXRpZXMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcCIsImltcG9ydCB7IEFnZW50IH0gZnJvbSBcIi4uL2FnZW50Lm1qc1wiO1xuaW1wb3J0IHsgU0FOREJPWF9BR0VOVF9CUkFORCB9IGZyb20gXCIuL2JyYW5kLm1qc1wiO1xuaW1wb3J0IHsgQ2FwYWJpbGl0aWVzIH0gZnJvbSBcIi4vY2FwYWJpbGl0aWVzL2luZGV4Lm1qc1wiO1xuaW1wb3J0IHsgY2xvbmVNYW5pZmVzdCwgTWFuaWZlc3QgfSBmcm9tIFwiLi9tYW5pZmVzdC5tanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVVzZXIgfSBmcm9tIFwiLi91c2Vycy5tanNcIjtcbmV4cG9ydCBjbGFzcyBTYW5kYm94QWdlbnQgZXh0ZW5kcyBBZ2VudCB7XG4gICAgW1NBTkRCT1hfQUdFTlRfQlJBTkRdID0gdHJ1ZTtcbiAgICBkZWZhdWx0TWFuaWZlc3Q7XG4gICAgYmFzZUluc3RydWN0aW9ucztcbiAgICBjYXBhYmlsaXRpZXM7XG4gICAgcnVuQXM7XG4gICAgcnVudGltZU1hbmlmZXN0O1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLmJhc2VJbnN0cnVjdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTYW5kYm94QWdlbnQgYmFzZUluc3RydWN0aW9ucyBtdXN0IGJlIGEgc3RyaW5nIG9yIGZ1bmN0aW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVmYXVsdE1hbmlmZXN0ID0gY29uZmlnLmRlZmF1bHRNYW5pZmVzdFxuICAgICAgICAgICAgPyBjbG9uZU1hbmlmZXN0KGNvbmZpZy5kZWZhdWx0TWFuaWZlc3QpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5iYXNlSW5zdHJ1Y3Rpb25zID0gY29uZmlnLmJhc2VJbnN0cnVjdGlvbnM7XG4gICAgICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gY29uZmlnLmNhcGFiaWxpdGllcyA/PyBDYXBhYmlsaXRpZXMuZGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnJ1bkFzID0gbm9ybWFsaXplUnVuQXMoY29uZmlnLnJ1bkFzKTtcbiAgICAgICAgdGhpcy5ydW50aW1lTWFuaWZlc3QgPSB0aGlzLmRlZmF1bHRNYW5pZmVzdCA/PyBuZXcgTWFuaWZlc3QoKTtcbiAgICB9XG4gICAgY2xvbmUoY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEFnZW50KHtcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lID8/IHRoaXMubmFtZSxcbiAgICAgICAgICAgIGluc3RydWN0aW9uczogY29uZmlnLmluc3RydWN0aW9ucyA/PyB0aGlzLmluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIHByb21wdDogY29uZmlnLnByb21wdCA/PyB0aGlzLnByb21wdCxcbiAgICAgICAgICAgIGhhbmRvZmZEZXNjcmlwdGlvbjogY29uZmlnLmhhbmRvZmZEZXNjcmlwdGlvbiA/PyB0aGlzLmhhbmRvZmZEZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGhhbmRvZmZzOiBjb25maWcuaGFuZG9mZnMgPz8gdGhpcy5oYW5kb2ZmcyxcbiAgICAgICAgICAgIG1vZGVsOiBjb25maWcubW9kZWwgPz8gdGhpcy5tb2RlbCxcbiAgICAgICAgICAgIG1vZGVsU2V0dGluZ3M6IGNvbmZpZy5tb2RlbFNldHRpbmdzID8/IHRoaXMubW9kZWxTZXR0aW5ncyxcbiAgICAgICAgICAgIHRvb2xzOiBjb25maWcudG9vbHMgPz8gdGhpcy50b29scyxcbiAgICAgICAgICAgIG1jcFNlcnZlcnM6IGNvbmZpZy5tY3BTZXJ2ZXJzID8/IHRoaXMubWNwU2VydmVycyxcbiAgICAgICAgICAgIG1jcENvbmZpZzogY29uZmlnLm1jcENvbmZpZyA/PyB0aGlzLm1jcENvbmZpZyxcbiAgICAgICAgICAgIGlucHV0R3VhcmRyYWlsczogY29uZmlnLmlucHV0R3VhcmRyYWlscyA/PyB0aGlzLmlucHV0R3VhcmRyYWlscyxcbiAgICAgICAgICAgIG91dHB1dEd1YXJkcmFpbHM6IGNvbmZpZy5vdXRwdXRHdWFyZHJhaWxzID8/IHRoaXMub3V0cHV0R3VhcmRyYWlscyxcbiAgICAgICAgICAgIG91dHB1dFR5cGU6IGNvbmZpZy5vdXRwdXRUeXBlID8/IHRoaXMub3V0cHV0VHlwZSxcbiAgICAgICAgICAgIHRvb2xVc2VCZWhhdmlvcjogY29uZmlnLnRvb2xVc2VCZWhhdmlvciA/PyB0aGlzLnRvb2xVc2VCZWhhdmlvcixcbiAgICAgICAgICAgIHJlc2V0VG9vbENob2ljZTogY29uZmlnLnJlc2V0VG9vbENob2ljZSA/PyB0aGlzLnJlc2V0VG9vbENob2ljZSxcbiAgICAgICAgICAgIGRlZmF1bHRNYW5pZmVzdDogY29uZmlnLmRlZmF1bHRNYW5pZmVzdCA/PyB0aGlzLmRlZmF1bHRNYW5pZmVzdCxcbiAgICAgICAgICAgIGJhc2VJbnN0cnVjdGlvbnM6IGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zID8/IHRoaXMuYmFzZUluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogY29uZmlnLmNhcGFiaWxpdGllcyA/PyB0aGlzLmNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIHJ1bkFzOiBjb25maWcucnVuQXMgPz8gdGhpcy5ydW5BcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplUnVuQXMocnVuQXMpIHtcbiAgICBpZiAocnVuQXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJ1bkFzID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gcnVuQXMudHJpbSgpO1xuICAgICAgICBpZiAoIXRyaW1tZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NhbmRib3hBZ2VudCBydW5BcyBtdXN0IGJlIG5vbi1lbXB0eS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJpbW1lZDtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVVzZXIocnVuQXMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWdlbnQubWpzLm1hcCJdLCJuYW1lcyI6WyJzdXBwb3J0c1Jlc3BvbnNlc0NvbXBhY3Rpb25UcmFuc3BvcnQiLCJtb2RlbEluc3RhbmNlIiwic3VwcG9ydHNBcHBseVBhdGNoVHJhbnNwb3J0Iiwic3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydCIsIkNvbXBhY3Rpb25Qb2xpY3kiLCJEeW5hbWljQ29tcGFjdGlvblBvbGljeSIsInRocmVzaG9sZFJhdGlvIiwiZmFsbGJhY2tUaHJlc2hvbGQiLCJfX3B1YmxpY0ZpZWxkIiwibW9kZWwiLCJtb2RlbEluZm8iLCJDb21wYWN0aW9uTW9kZWxJbmZvIiwiY29udGV4dFdpbmRvdyIsImNhbmRpZGF0ZSIsImdldFNhbmRib3hDb21wYWN0aW9uTW9kZWxDYW5kaWRhdGVzIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMU0iLCJTQU5EQk9YX0NPTlRFWFRfV0lORE9XU180MDBLIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMjAwSyIsIlNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzEyOEsiLCJDb21wYWN0aW9uQ2FwYWJpbGl0eSIsIkNhcGFiaWxpdHkiLCJwb2xpY3kiLCJzYW1wbGluZ1BhcmFtcyIsImNvbnRleHQiLCJsYXN0Q29tcGFjdGlvbkluZGV4IiwiaW5kZXgiLCJjb21wYWN0aW9uIiwiYXJncyIsInRyaW1tZWQiLCJub3JtYWxpemVkIiwid2l0aG91dFBpbm5lZERhdGUiLCJhcHBseVBhdGNoRnVuY3Rpb25QYXJhbWV0ZXJzIiwiQkVHSU5fUEFUQ0giLCJFTkRfUEFUQ0giLCJBRERfRklMRSIsIkRFTEVURV9GSUxFIiwiVVBEQVRFX0ZJTEUiLCJNT1ZFX1RPIiwidG9FcnJvck1lc3NhZ2UiLCJlcnJvciIsInJlbmRlckltYWdlRm9yVGV4dFRyYW5zcG9ydCIsIm91dHB1dCIsImltYWdlIiwiaXNSZWNvcmQiLCJpbWFnZVJlY29yZCIsImVuY29kZVVpbnQ4QXJyYXlUb0Jhc2U2NCIsInJlbmRlclZpZXdJbWFnZUVycm9yIiwicGF0aCIsIm1lc3NhZ2UiLCJuYW1lIiwicGFyc2VBcHBseVBhdGNoSW5wdXQiLCJyYXdJbnB1dCIsInRyaW1tZWRJbnB1dCIsInBhcnNlRnJlZWZvcm1QYXRjaCIsInBheWxvYWQiLCJwYXJzZUFwcGx5UGF0Y2hQYXlsb2FkIiwicGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyIsImNvbW1hbmROYW1lIiwicGF0Y2giLCJwYXlsb2FkcyIsIm9wZXJhdGlvbnMiLCJwYXJzZWQiLCJBcHBseVBhdGNoT3BlcmF0aW9uIiwicmF3UGF0Y2giLCJsaW5lcyIsImxpbmUiLCJwYXJzZUFkZEZpbGVQYXRjaCIsInBhcnNlRGVsZXRlRmlsZVBhdGNoIiwicGFyc2VVcGRhdGVGaWxlUGF0Y2giLCJwYXJzZVBhdGNoSGVhZGVyIiwiZGlmZkxpbmVzIiwiaXNGaWxlT3BlcmF0aW9uSGVhZGVyIiwiam9pbkRpZmYiLCJtb3ZlVG8iLCJwYXJzZWRNb3ZlVG8iLCJwcmVmaXgiLCJhcHBseVBhdGNoT3BlcmF0aW9uIiwiZWRpdG9yIiwib3BlcmF0aW9uIiwicnVuQ29udGV4dCIsInJlc3VsdCIsImFwcGx5UGF0Y2hPcGVyYXRpb25zIiwib3V0cHV0cyIsImFwcGx5UGF0Y2hGdW5jdGlvblRvb2wiLCJpbnB1dCIsIkZpbGVzeXN0ZW1DYXBhYmlsaXR5Iiwic2Vzc2lvbiIsInJlcXVpcmVCb3VuZFNlc3Npb24iLCJfYSIsIlVzZXJFcnJvciIsInRvb2xzIiwidmlld0ltYWdlIiwid2l0aFNhbmRib3hTcGFuIiwidG9vbCIsInoub2JqZWN0Iiwiei5zdHJpbmciLCJhcHBseVBhdGNoVG9vbCIsImZpbGVzeXN0ZW0iLCJERUZBVUxUX0VYRUNfWUlFTERfVElNRV9NUyIsIkRFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUyIsIlNIRUxMX0lOU1RSVUNUSU9OUyIsIlNoZWxsQ2FwYWJpbGl0eSIsInpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmciLCJ6XG4gICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhbiIsInpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIiLCJjbWQiLCJ3b3JrZGlyIiwic2hlbGwiLCJsb2dpbiIsInR0eSIsInlpZWxkX3RpbWVfbXMiLCJtYXhfb3V0cHV0X3Rva2VucyIsInNlc3Npb25faWQiLCJjaGFycyIsInByb21wdCIsImRlZmF1bHRDYXBhYmlsaXRpZXMiLCJDYXBhYmlsaXRpZXMiLCJTYW5kYm94QWdlbnQiLCJfYiIsIkFnZW50IiwiU0FOREJPWF9BR0VOVF9CUkFORCIsImNvbmZpZyIsImNsb25lTWFuaWZlc3QiLCJub3JtYWxpemVSdW5BcyIsIk1hbmlmZXN0IiwicnVuQXMiLCJub3JtYWxpemVVc2VyIl0sIm1hcHBpbmdzIjoiOzs7O0FBQU8sU0FBU0EsRUFBcUNDLEdBQWU7QUFDaEUsU0FBS0EsSUFTRSxFQU5pQixPQUFPQSxLQUFrQixZQUM3Q0EsS0FDQSxpQkFBaUJBLEtBQ2pCLE9BQU9BLEVBQWMsZUFBZ0IsYUFDbkNBLEVBQWMsWUFBWSxPQUMxQixJQUNrQixTQUFTLGlCQUFpQixJQVJ2QztBQVNmO0FBQ08sU0FBU0MsRUFBNEJELEdBQWU7QUFDdkQsU0FBT0UsRUFBc0NGLENBQWE7QUFDOUQ7QUFDTyxTQUFTRSxFQUFzQ0YsR0FBZTtBQUNqRSxTQUFLQSxJQVNFLEVBTmlCLE9BQU9BLEtBQWtCLFlBQzdDQSxLQUNBLGlCQUFpQkEsS0FDakIsT0FBT0EsRUFBYyxlQUFnQixhQUNuQ0EsRUFBYyxZQUFZLE9BQzFCLElBQ2tCLFNBQVMsaUJBQWlCLElBUnZDO0FBU2Y7QUN4Qk8sTUFBTUcsRUFBaUI7QUFDOUI7QUFXTyxNQUFNQyxXQUFnQ0QsRUFBaUI7QUFBQSxFQUcxRCxZQUFZRSxJQUFpQixLQUFLQyxJQUFvQixNQUFRO0FBQzFELFVBQUs7QUFIVCxJQUFBQyxFQUFBO0FBQ0EsSUFBQUEsRUFBQTtBQUdJLFNBQUssaUJBQWlCRixHQUN0QixLQUFLLG9CQUFvQkM7QUFBQSxFQUM3QjtBQUFBLEVBQ0EsaUJBQWlCRSxHQUFPO0FBQ3BCLFFBQUksQ0FBQ0E7QUFDRCxhQUFPLEtBQUs7QUFFaEIsVUFBTUMsSUFBWUMsRUFBb0IsU0FBU0YsQ0FBSztBQUNwRCxXQUFL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
638
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtREJkZHZjSXIubWpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL3RyYW5zcG9ydC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL2NvbXBhY3Rpb24ubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9maWxlc3lzdGVtLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3Qvc2FuZGJveC9jYXBhYmlsaXRpZXMvc2hlbGwubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9za2lsbHMubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9pbmRleC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvYWdlbnQubWpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Jlc3BvbnNlc0NvbXBhY3Rpb25UcmFuc3BvcnQobW9kZWxJbnN0YW5jZSkge1xuICAgIGlmICghbW9kZWxJbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQobW9kZWxJbnN0YW5jZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgaWYgKCFtb2RlbEluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNwb3J0Lm1qcy5tYXAiLCJpbXBvcnQgeyBDYXBhYmlsaXR5IH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IHN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydCB9IGZyb20gXCIuL3RyYW5zcG9ydC5tanNcIjtcbmV4cG9ydCBjbGFzcyBDb21wYWN0aW9uUG9saWN5IHtcbn1cbmV4cG9ydCBjbGFzcyBTdGF0aWNDb21wYWN0aW9uUG9saWN5IGV4dGVuZHMgQ29tcGFjdGlvblBvbGljeSB7XG4gICAgdGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhyZXNob2xkO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSBleHRlbmRzIENvbXBhY3Rpb25Qb2xpY3kge1xuICAgIHRocmVzaG9sZFJhdGlvO1xuICAgIGZhbGxiYWNrVGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZFJhdGlvID0gMC45LCBmYWxsYmFja1RocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZFJhdGlvID0gdGhyZXNob2xkUmF0aW87XG4gICAgICAgIHRoaXMuZmFsbGJhY2tUaHJlc2hvbGQgPSBmYWxsYmFja1RocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZChtb2RlbCkge1xuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja1RocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbEluZm8gPSBDb21wYWN0aW9uTW9kZWxJbmZvLmZvck1vZGVsKG1vZGVsKTtcbiAgICAgICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrVGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG1vZGVsSW5mby5jb250ZXh0V2luZG93ICogdGhpcy50aHJlc2hvbGRSYXRpbyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBhY3Rpb25Nb2RlbEluZm8ge1xuICAgIGNvbnRleHRXaW5kb3c7XG4gICAgY29uc3RydWN0b3IoY29udGV4dFdpbmRvdykge1xuICAgICAgICB0aGlzLmNvbnRleHRXaW5kb3cgPSBjb250ZXh0V2luZG93O1xuICAgIH1cbiAgICBzdGF0aWMgZm9yTW9kZWwobW9kZWwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpKSB7XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMU0uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMTA0NzU3Nik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfNDAwSy5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbk1vZGVsSW5mbyg0MDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzIwMEsuaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMjAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xMjhLLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uTW9kZWxJbmZvKDEyODAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5jbGFzcyBDb21wYWN0aW9uQ2FwYWJpbGl0eSBleHRlbmRzIENhcGFiaWxpdHkge1xuICAgIHR5cGUgPSAnY29tcGFjdGlvbic7XG4gICAgcG9saWN5O1xuICAgIGNvbnN0cnVjdG9yKHBvbGljeSA9IG5ldyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSgpKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIH1cbiAgICBzYW1wbGluZ1BhcmFtcyhzYW1wbGluZ1BhcmFtcykge1xuICAgICAgICBpZiAoc2FtcGxpbmdQYXJhbXMubW9kZWxJbnN0YW5jZSAmJlxuICAgICAgICAgICAgIXN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydChzYW1wbGluZ1BhcmFtcy5tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdHlwZW9mIHNhbXBsaW5nUGFyYW1zLm1vZGVsID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBzYW1wbGluZ1BhcmFtcy5tb2RlbFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZXh0X21hbmFnZW1lbnQ6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb21wYWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdF90aHJlc2hvbGQ6IHRoaXMucG9saWN5LmNvbXBhY3RUaHJlc2hvbGQobW9kZWwpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm9jZXNzQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGxldCBsYXN0Q29tcGFjdGlvbkluZGV4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZXh0Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaW5kZXhdLnR5cGUgPT09ICdjb21wYWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxhc3RDb21wYWN0aW9uSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdENvbXBhY3Rpb25JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnNsaWNlKGxhc3RDb21wYWN0aW9uSW5kZXgpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYWN0aW9uKGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkNhcGFiaWxpdHkoYXJncy5wb2xpY3kpO1xufVxuZnVuY3Rpb24gZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbW9kZWwudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHdpdGhvdXRQcm92aWRlclByZWZpeCA9IHRyaW1tZWQuaW5jbHVkZXMoJy8nKVxuICAgICAgICA/IHRyaW1tZWQuc2xpY2UodHJpbW1lZC5sYXN0SW5kZXhPZignLycpICsgMSlcbiAgICAgICAgOiB0cmltbWVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRob3V0UHJvdmlkZXJQcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB3aXRob3V0UGlubmVkRGF0ZSA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvLVxcZHs0fS1cXGR7Mn0tXFxkezJ9JC91LCAnJyk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KFtub3JtYWxpemVkLCB3aXRob3V0UGlubmVkRGF0ZV0pXTtcbn1cbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzFNID0gbmV3IFNldChbXG4gICAgJ2dwdC01LjQnLFxuICAgICdncHQtNS40LTIwMjYtMDMtMDUnLFxuICAgICdncHQtNS40LXBybycsXG4gICAgJ2dwdC01LjQtcHJvLTIwMjYtMDMtMDUnLFxuICAgICdncHQtNC4xJyxcbiAgICAnZ3B0LTQuMS0yMDI1LTA0LTE0JyxcbiAgICAnZ3B0LTQuMS1taW5pJyxcbiAgICAnZ3B0LTQuMS1taW5pLTIwMjUtMDQtMTQnLFxuICAgICdncHQtNC4xLW5hbm8nLFxuICAgICdncHQtNC4xLW5hbm8tMjAyNS0wNC0xNCcsXG5dKTtcbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzQwMEsgPSBuZXcgU2V0KFtcbiAgICAnZ3B0LTUnLFxuICAgICdncHQtNS1jb2RleCcsXG4gICAgJ2dwdC01LW1pbmknLFxuICAgICdncHQtNS1uYW5vJyxcbiAgICAnZ3B0LTUtcHJvJyxcbiAgICAnZ3B0LTUuMScsXG4gICAgJ2dwdC01LjEtY29kZXgnLFxuICAgICdncHQtNS4xLWNvZGV4LW1heCcsXG4gICAgJ2dwdC01LjEtY29kZXgtbWluaScsXG4gICAgJ2dwdC01LjInLFxuICAgICdncHQtNS4yLWNvZGV4JyxcbiAgICAnZ3B0LTUuMi1jb2RleC1jeWJlcicsXG4gICAgJ2dwdC01LjItcHJvJyxcbiAgICAnZ3B0LTUuMy1jb2RleCcsXG4gICAgJ2dwdC01LjMtY29kZXgtc3BhcmsnLFxuICAgICdncHQtNS40LW1pbmknLFxuICAgICdncHQtNS40LW5hbm8nLFxuXSk7XG5jb25zdCBTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18yMDBLID0gbmV3IFNldChbXG4gICAgJ2NvZGV4LW1pbmktbGF0ZXN0JyxcbiAgICAnbzEnLFxuICAgICdvMS0yMDI0LTEyLTE3JyxcbiAgICAnbzEtcHJvJyxcbiAgICAnbzMnLFxuICAgICdvMy0yMDI1LTA0LTE2JyxcbiAgICAnbzMtbWluaScsXG4gICAgJ28zLXBybycsXG4gICAgJ28zLWRlZXAtcmVzZWFyY2gnLFxuICAgICdvNC1taW5pJyxcbiAgICAnbzQtbWluaS0yMDI1LTA0LTE2JyxcbiAgICAnbzQtbWluaS1kZWVwLXJlc2VhcmNoJyxcbl0pO1xuY29uc3QgU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMTI4SyA9IG5ldyBTZXQoW1xuICAgICdncHQtNG8nLFxuICAgICdncHQtNG8tMjAyNC0wOC0wNicsXG4gICAgJ2dwdC00by1taW5pJyxcbiAgICAnZ3B0LTRvLW1pbmktMjAyNC0wNy0xOCcsXG4gICAgJ2dwdC01LWNoYXQtbGF0ZXN0JyxcbiAgICAnZ3B0LTUuMS1jaGF0LWxhdGVzdCcsXG4gICAgJ2dwdC01LjItY2hhdC1sYXRlc3QnLFxuICAgICdncHQtNS4zLWNoYXQtbGF0ZXN0Jyxcbl0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGFjdGlvbi5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgYXBwbHlQYXRjaFRvb2wsIHRvb2wsIH0gZnJvbSBcIi4uLy4uL3Rvb2wubWpzXCI7XG5pbXBvcnQgeyBBcHBseVBhdGNoT3BlcmF0aW9uIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3Byb3RvY29sLm1qc1wiO1xuaW1wb3J0IHsgZW5jb2RlVWludDhBcnJheVRvQmFzZTY0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2U2NC5tanNcIjtcbmltcG9ydCB7IHdpdGhTYW5kYm94U3BhbiB9IGZyb20gXCIuLi9ydW50aW1lL3NwYW5zLm1qc1wiO1xuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVHdWFyZHMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uLCB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBzdXBwb3J0c0FwcGx5UGF0Y2hUcmFuc3BvcnQsIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQsIH0gZnJvbSBcIi4vdHJhbnNwb3J0Lm1qc1wiO1xuY29uc3QgYXBwbHlQYXRjaEZ1bmN0aW9uUGFyYW1ldGVycyA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHBhdGNoOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQSBmcmVlZm9ybSBhcHBseV9wYXRjaCBwYXlsb2FkIHdyYXBwZWQgaW4gKioqIEJlZ2luIFBhdGNoIGFuZCAqKiogRW5kIFBhdGNoLicsXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Egc2luZ2xlIHN0cnVjdHVyZWQgYXBwbHlfcGF0Y2ggb3BlcmF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbnM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBpdGVtczogeyB0eXBlOiAnb2JqZWN0JyB9LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTdHJ1Y3R1cmVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbnMgdG8gYXBwbHkgaW4gb3JkZXIuJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29tbWFuZDoge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW9uYWwgW1wiYXBwbHlfcGF0Y2hcIiwgcGF0Y2hdIGNvbW1hbmQgdHVwbGUgZm9ybS4nLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGVudW06IFsnY3JlYXRlX2ZpbGUnLCAndXBkYXRlX2ZpbGUnLCAnZGVsZXRlX2ZpbGUnXSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBhdGNoIG9wZXJhdGlvbiB0byBhcHBseS4nLFxuICAgICAgICB9LFxuICAgICAgICBwYXRoOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHNhbmRib3ggZmlsZSBwYXRoIHRvIHBhdGNoLicsXG4gICAgICAgIH0sXG4gICAgICAgIGRpZmY6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgVjRBIHBhdGNoIGRpZmYgZm9yIGNyZWF0ZV9maWxlIGFuZCB1cGRhdGVfZmlsZSBvcGVyYXRpb25zLicsXG4gICAgICAgIH0sXG4gICAgICAgIG1vdmVUbzoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIGRlc3RpbmF0aW9uIHBhdGggZm9yIHVwZGF0ZV9maWxlIG1vdmUgb3BlcmF0aW9ucy4nLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFtdLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxufTtcbmNvbnN0IEJFR0lOX1BBVENIID0gJyoqKiBCZWdpbiBQYXRjaCc7XG5jb25zdCBFTkRfUEFUQ0ggPSAnKioqIEVuZCBQYXRjaCc7XG5jb25zdCBBRERfRklMRSA9ICcqKiogQWRkIEZpbGU6ICc7XG5jb25zdCBERUxFVEVfRklMRSA9ICcqKiogRGVsZXRlIEZpbGU6ICc7XG5jb25zdCBVUERBVEVfRklMRSA9ICcqKiogVXBkYXRlIEZpbGU6ICc7XG5jb25zdCBNT1ZFX1RPID0gJyoqKiBNb3ZlIHRvOiAnO1xuZnVuY3Rpb24gdG9FcnJvck1lc3NhZ2UoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCBlcnJvci50b1N0cmluZygpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckltYWdlRm9yVGV4dFRyYW5zcG9ydChvdXRwdXQpIHtcbiAgICBpZiAodHlwZW9mIG91dHB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2UgPSBvdXRwdXQuaW1hZ2U7XG4gICAgaWYgKHR5cGVvZiBpbWFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cbiAgICBpZiAoIWlzUmVjb3JkKGltYWdlKSkge1xuICAgICAgICByZXR1cm4gJ05vIGltYWdlIGRhdGEgd2FzIHJldHVybmVkIGJ5IHRoZSBzYW5kYm94IHNlc3Npb24uJztcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VSZWNvcmQgPSBpbWFnZTtcbiAgICBpZiAodHlwZW9mIGltYWdlUmVjb3JkLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlUmVjb3JkLnVybDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbWFnZVJlY29yZC5maWxlSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBgT3BlbkFJIGZpbGUgcmVmZXJlbmNlOiAke2ltYWdlUmVjb3JkLmZpbGVJZH1gO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGltYWdlUmVjb3JkLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHR5cGVvZiBpbWFnZVJlY29yZC5tZWRpYVR5cGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGltYWdlUmVjb3JkLm1lZGlhVHlwZVxuICAgICAgICAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgcmV0dXJuIGBkYXRhOiR7bWVkaWFUeXBlfTtiYXNlNjQsJHtpbWFnZVJlY29yZC5kYXRhfWA7XG4gICAgfVxuICAgIGlmIChpbWFnZVJlY29yZC5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSB0eXBlb2YgaW1hZ2VSZWNvcmQubWVkaWFUeXBlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBpbWFnZVJlY29yZC5tZWRpYVR5cGVcbiAgICAgICAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgIHJldHVybiBgZGF0YToke21lZGlhVHlwZX07YmFzZTY0LCR7ZW5jb2RlVWludDhBcnJheVRvQmFzZTY0KGltYWdlUmVjb3JkLmRhdGEpfWA7XG4gICAgfVxuICAgIHJldHVybiAnTm8gaW1hZ2UgZGF0YSB3YXMgcmV0dXJuZWQgYnkgdGhlIHNhbmRib3ggc2Vzc2lvbi4nO1xufVxuZnVuY3Rpb24gcmVuZGVyVmlld0ltYWdlRXJyb3IocGF0aCwgZXJyb3IpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdG9FcnJvck1lc3NhZ2UoZXJyb3IpO1xuICAgIGlmICgvbm90IGZvdW5kL2l1LnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIGBpbWFnZSBwYXRoIFxcYCR7cGF0aH1cXGAgd2FzIG5vdCBmb3VuZGA7XG4gICAgfVxuICAgIGlmICgvbm90IGEgZmlsZS9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIGlzIG5vdCBhIGZpbGVgO1xuICAgIH1cbiAgICBpZiAoL2V4Y2VlZHMgdGhlIDEwIE1CIGxpbWl0fGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHNpemUvaXUudGVzdChtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gYGltYWdlIHBhdGggXFxgJHtwYXRofVxcYCBleGNlZWRlZCB0aGUgYWxsb3dlZCBzaXplIG9mIDEwTUI7IHJlc2l6ZSBvciBjb21wcmVzcyB0aGUgaW1hZ2UgYW5kIHRyeSBhZ2FpbmA7XG4gICAgfVxuICAgIGlmICgvdW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0fG5vdCBhIHN1cHBvcnRlZCBpbWFnZS9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIGlzIG5vdCBhIHN1cHBvcnRlZCBpbWFnZSBmaWxlYDtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yO1xuICAgIHJldHVybiBgdW5hYmxlIHRvIHJlYWQgaW1hZ2UgYXQgXFxgJHtwYXRofVxcYDogJHtuYW1lfWA7XG59XG5mdW5jdGlvbiBwYXJzZUFwcGx5UGF0Y2hJbnB1dChyYXdJbnB1dCkge1xuICAgIGNvbnN0IHRyaW1tZWRJbnB1dCA9IHJhd0lucHV0LnRyaW1TdGFydCgpO1xuICAgIGlmICh0cmltbWVkSW5wdXQuc3RhcnRzV2l0aChCRUdJTl9QQVRDSCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRnJlZWZvcm1QYXRjaCh0cmltbWVkSW5wdXQpO1xuICAgIH1cbiAgICBsZXQgcGF5bG9hZDtcbiAgICB0cnkge1xuICAgICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShyYXdJbnB1dCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBJbnZhbGlkIGFwcGx5X3BhdGNoIEpTT046ICR7dG9FcnJvck1lc3NhZ2UoZXJyb3IpfWAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUFwcGx5UGF0Y2hQYXlsb2FkKHBheWxvYWQpO1xufVxuZnVuY3Rpb24gcGFyc2VBcHBseVBhdGNoUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBheWxvYWQpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKCFpc1JlY29yZChwYXlsb2FkKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6ICdhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCBvciBhcnJheS4nLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBheWxvYWQucGF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZyZWVmb3JtUGF0Y2gocGF5bG9hZC5wYXRjaCk7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuY29tbWFuZCkpIHtcbiAgICAgICAgY29uc3QgW2NvbW1hbmROYW1lLCBwYXRjaF0gPSBwYXlsb2FkLmNvbW1hbmQ7XG4gICAgICAgIGlmIChjb21tYW5kTmFtZSA9PT0gJ2FwcGx5X3BhdGNoJyAmJiB0eXBlb2YgcGF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBhdGNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkLm9wZXJhdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zKHBheWxvYWQub3BlcmF0aW9ucyk7XG4gICAgfVxuICAgIGlmIChwYXlsb2FkLm9wZXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zKFtwYXlsb2FkLm9wZXJhdGlvbl0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhbcGF5bG9hZF0pO1xufVxuZnVuY3Rpb24gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2Fkcykge1xuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBheWxvYWQgb2YgcGF5bG9hZHMpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gQXBwbHlQYXRjaE9wZXJhdGlvbi5zYWZlUGFyc2UocGF5bG9hZCk7XG4gICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBvcGVyYXRpb246ICR7cGFyc2VkLmVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKHBhcnNlZC5kYXRhKTtcbiAgICB9XG4gICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICdhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGluY2x1ZGUgYW4gb3BlcmF0aW9uLicgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIG9wZXJhdGlvbnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRnJlZWZvcm1QYXRjaChyYXdQYXRjaCkge1xuICAgIGNvbnN0IGxpbmVzID0gcmF3UGF0Y2guc3BsaXQoL1xccj9cXG4vKTtcbiAgICBpZiAobGluZXMuYXQoLTEpID09PSAnJykge1xuICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG4gICAgaWYgKGxpbmVzWzBdICE9PSBCRUdJTl9QQVRDSCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBhcHBseV9wYXRjaCBpbnB1dCBtdXN0IHN0YXJ0IHdpdGggXCIke0JFR0lOX1BBVENIfVwiLmAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChsaW5lcy5sZW5ndGggPCAyIHx8IGxpbmVzLmF0KC0xKSAhPT0gRU5EX1BBVENIKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogYGFwcGx5X3BhdGNoIGlucHV0IG11c3QgZW5kIHdpdGggXCIke0VORF9QQVRDSH1cIi5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvcGVyYXRpb25zID0gW107XG4gICAgbGV0IGluZGV4ID0gMTtcbiAgICB3aGlsZSAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpbmRleF07XG4gICAgICAgIGxldCBwYXJzZWQ7XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoQUREX0ZJTEUpKSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUFkZEZpbGVQYXRjaChsaW5lcywgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChERUxFVEVfRklMRSkpIHtcbiAgICAgICAgICAgIHBhcnNlZCA9IHBhcnNlRGVsZXRlRmlsZVBhdGNoKGxpbmVzLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFVQREFURV9GSUxFKSkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VVcGRhdGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBmaWxlIG9wZXJhdGlvbiBoZWFkZXI6ICR7bGluZX1gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2Vycm9yJyBpbiBwYXJzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IHBhcnNlZC5lcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIG9wZXJhdGlvbnMucHVzaChwYXJzZWQub3BlcmF0aW9uKTtcbiAgICAgICAgaW5kZXggPSBwYXJzZWQubmV4dEluZGV4O1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiAnYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBmaWxlIG9wZXJhdGlvbi4nLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBvazogdHJ1ZSwgb3BlcmF0aW9ucyB9O1xufVxuZnVuY3Rpb24gcGFyc2VBZGRGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBBRERfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGNvbnN0IGRpZmZMaW5lcyA9IFtdO1xuICAgIHdoaWxlIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpbmRleF07XG4gICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCcrJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBgSW52YWxpZCBBZGQgRmlsZSBsaW5lOiAke2xpbmV9YCB9O1xuICAgICAgICB9XG4gICAgICAgIGRpZmZMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgIH1cbiAgICBpZiAoZGlmZkxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IGBBZGQgRmlsZSBwYXRjaCBmb3IgJHtwYXRofSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lICsgbGluZS5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZGlmZjogam9pbkRpZmYoZGlmZkxpbmVzKSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VEZWxldGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBERUxFVEVfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGlmIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgRGVsZXRlIEZpbGUgcGF0Y2ggZm9yICR7cGF0aH0gbXVzdCBub3QgaW5jbHVkZSBhIGRpZmYuYCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdkZWxldGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICB9LFxuICAgICAgICBuZXh0SW5kZXg6IGluZGV4LFxuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZVVwZGF0ZUZpbGVQYXRjaChsaW5lcywgaW5kZXgpIHtcbiAgICBjb25zdCBwYXRoID0gcGFyc2VQYXRjaEhlYWRlcihsaW5lc1tpbmRleF0sIFVQREFURV9GSUxFKTtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBNaXNzaW5nIHBhdGggaW4gYXBwbHlfcGF0Y2ggaGVhZGVyOiAke2xpbmVzW2luZGV4XX1gIH07XG4gICAgfVxuICAgIGluZGV4ICs9IDE7XG4gICAgbGV0IG1vdmVUbztcbiAgICBpZiAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmVzW2luZGV4XS5zdGFydHNXaXRoKE1PVkVfVE8pKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZE1vdmVUbyA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBNT1ZFX1RPKTtcbiAgICAgICAgaWYgKCFwYXJzZWRNb3ZlVG8pIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgICAgICB9XG4gICAgICAgIG1vdmVUbyA9IHBhcnNlZE1vdmVUbztcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgY29uc3QgZGlmZkxpbmVzID0gW107XG4gICAgd2hpbGUgKGluZGV4IDwgbGluZXMubGVuZ3RoIC0gMSAmJiAhaXNGaWxlT3BlcmF0aW9uSGVhZGVyKGxpbmVzW2luZGV4XSkpIHtcbiAgICAgICAgZGlmZkxpbmVzLnB1c2gobGluZXNbaW5kZXhdKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgaWYgKGRpZmZMaW5lcy5sZW5ndGggPT09IDAgJiYgIW1vdmVUbykge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYFVwZGF0ZSBGaWxlIHBhdGNoIGZvciAke3BhdGh9IG11c3QgaW5jbHVkZSBhIGh1bmsuYCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICd1cGRhdGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZGlmZjogZGlmZkxpbmVzLmxlbmd0aCA+IDAgPyBqb2luRGlmZihkaWZmTGluZXMpIDogJycsXG4gICAgICAgICAgICAuLi4obW92ZVRvID8geyBtb3ZlVG8gfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VQYXRjaEhlYWRlcihsaW5lLCBwcmVmaXgpIHtcbiAgICBjb25zdCBwYXRoID0gbGluZS5zbGljZShwcmVmaXgubGVuZ3RoKS50cmltKCk7XG4gICAgcmV0dXJuIHBhdGggPyBwYXRoIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lKSB7XG4gICAgcmV0dXJuIChsaW5lLnN0YXJ0c1dpdGgoQUREX0ZJTEUpIHx8XG4gICAgICAgIGxpbmUuc3RhcnRzV2l0aChERUxFVEVfRklMRSkgfHxcbiAgICAgICAgbGluZS5zdGFydHNXaXRoKFVQREFURV9GSUxFKSk7XG59XG5mdW5jdGlvbiBqb2luRGlmZihsaW5lcykge1xuICAgIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYXRjaE9wZXJhdGlvbihlZGl0b3IsIG9wZXJhdGlvbiwgcnVuQ29udGV4dCkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgICAgc3dpdGNoIChvcGVyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY3JlYXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci5jcmVhdGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndXBkYXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci51cGRhdGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVsZXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci5kZWxldGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbi4nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gYEZhaWxlZCB0byBhcHBseSBwYXRjaDogJHt0b0Vycm9yTWVzc2FnZShlcnJvcil9YDtcbiAgICB9XG4gICAgaWYgKHJlc3VsdD8uc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm91dHB1dCA/IGBQYXRjaCBmYWlsZWQ6ICR7cmVzdWx0Lm91dHB1dH1gIDogJ1BhdGNoIGZhaWxlZC4nO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0Py5vdXRwdXQgPz8gJ1BhdGNoIGFwcGxpZWQuJztcbn1cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGF0Y2hPcGVyYXRpb25zKGVkaXRvciwgb3BlcmF0aW9ucywgcnVuQ29udGV4dCkge1xuICAgIGNvbnN0IG91dHB1dHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFwcGx5UGF0Y2hPcGVyYXRpb24oZWRpdG9yLCBvcGVyYXRpb24sIHJ1bkNvbnRleHQpO1xuICAgICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2gob3V0cHV0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0cy5qb2luKCdcXG4nKSB8fCAnUGF0Y2ggYXBwbGllZC4nO1xufVxuZnVuY3Rpb24gYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbChlZGl0b3IpIHtcbiAgICBjb25zdCBmYWxsYmFja1Rvb2wgPSB7XG4gICAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgIG5hbWU6ICdhcHBseV9wYXRjaCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbGllcyBhIGNyZWF0ZSwgdXBkYXRlLCBtb3ZlLCBvciBkZWxldGUgZmlsZSBwYXRjaCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UuIEFjY2VwdHMgYSBmcmVlZm9ybSBwYXRjaCBzdHJpbmcgb3Igc3RydWN0dXJlZCBhcHBseV9wYXRjaCBvcGVyYXRpb25zLicsXG4gICAgICAgIHBhcmFtZXRlcnM6IGFwcGx5UGF0Y2hGdW5jdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICAgIGRlZmVyTG9hZGluZzogZmFsc2UsXG4gICAgICAgIG5lZWRzQXBwcm92YWw6IGFzeW5jICgpID0+IGZhbHNlLFxuICAgICAgICBpc0VuYWJsZWQ6IGFzeW5jICgpID0+IHRydWUsXG4gICAgICAgIGludm9rZTogYXN5bmMgKHJ1bkNvbnRleHQsIGlucHV0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUFwcGx5UGF0Y2hJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZC5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBwbHlQYXRjaE9wZXJhdGlvbnMoZWRpdG9yLCBwYXJzZWQub3BlcmF0aW9ucywgcnVuQ29udGV4dCk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gZmFsbGJhY2tUb29sO1xufVxuY2xhc3MgRmlsZXN5c3RlbUNhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ2ZpbGVzeXN0ZW0nO1xuICAgIGNvbmZpZ3VyZVRvb2xzO1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZVRvb2xzID0gYXJncy5jb25maWd1cmVUb29scztcbiAgICB9XG4gICAgdG9vbHMoKSB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSByZXF1aXJlQm91bmRTZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5fc2Vzc2lvbik7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHNlc3Npb24uY3JlYXRlRWRpdG9yPy4odGhpcy5fcnVuQXMpO1xuICAgICAgICBpZiAoIWVkaXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignRmlsZXN5c3RlbSBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBjcmVhdGVFZGl0b3IoKS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b29scyA9IFtdO1xuICAgICAgICBjb25zdCB2aWV3SW1hZ2UgPSBhc3luYyAocGF0aCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzZXNzaW9uLnZpZXdJbWFnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ0ZpbGVzeXN0ZW0gc2FuZGJveCBzZXNzaW9ucyBtdXN0IHByb3ZpZGUgdmlld0ltYWdlKCkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoU2FuZGJveFNwYW4oJ3NhbmRib3gudmlld19pbWFnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcnVuX2FzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9LCBhc3luYyAoKSA9PiBhd2FpdCBzZXNzaW9uLnZpZXdJbWFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyVmlld0ltYWdlRXJyb3IocGF0aCwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydCh0aGlzLl9tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmlld19pbWFnZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGFuIGltYWdlIG91dHB1dCBmcm9tIGEgbG9jYWwgcGF0aCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ0xvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byBhbiBpbWFnZSBmaWxlJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgfSkgPT4gYXdhaXQgdmlld0ltYWdlKHBhdGgpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmlld19pbWFnZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGFuIGltYWdlIGZyb20gYSBsb2NhbCBwYXRoIGluIHRoZSBzYW5kYm94IHdvcmtzcGFjZSBhcyBhIGRhdGEgVVJMIG9yIHJlZmVyZW5jZSBzdHJpbmcuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ0xvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byBhbiBpbWFnZSBmaWxlJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCB9KSA9PiByZW5kZXJJbWFnZUZvclRleHRUcmFuc3BvcnQoYXdhaXQgdmlld0ltYWdlKHBhdGgpKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VwcG9ydHNBcHBseVBhdGNoVHJhbnNwb3J0KHRoaXMuX21vZGVsSW5zdGFuY2UpKSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKGFwcGx5UGF0Y2hUb29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnYXBwbHlfcGF0Y2gnLFxuICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRvb2xzLnB1c2goYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbChlZGl0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmVUb29scyA/IHRoaXMuY29uZmlndXJlVG9vbHMoWy4uLnRvb2xzXSkgOiB0b29scztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsZXN5c3RlbShhcmdzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IEZpbGVzeXN0ZW1DYXBhYmlsaXR5KGFyZ3MpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZXN5c3RlbS5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgdG9vbCB9IGZyb20gXCIuLi8uLi90b29sLm1qc1wiO1xuaW1wb3J0IHsgd2l0aFNhbmRib3hTcGFuIH0gZnJvbSBcIi4uL3J1bnRpbWUvc3BhbnMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uLCB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5jb25zdCBERUZBVUxUX0VYRUNfWUlFTERfVElNRV9NUyA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUyA9IDI1MDtcbmNvbnN0IFNIRUxMX0lOU1RSVUNUSU9OUyA9IFtcbiAgICAnV2hlbiB1c2luZyB0aGUgc2hlbGw6JyxcbiAgICAnLSBVc2UgYGV4ZWNfY29tbWFuZGAgZm9yIHNoZWxsIGV4ZWN1dGlvbi4nLFxuICAgICctIElmIGF2YWlsYWJsZSwgdXNlIGB3cml0ZV9zdGRpbmAgdG8gaW50ZXJhY3Qgd2l0aCBvciBwb2xsIHJ1bm5pbmcgc2Vzc2lvbnMuJyxcbiAgICAnLSBUbyBpbnRlcnJ1cHQgYSBsb25nLXJ1bm5pbmcgcHJvY2VzcyB2aWEgYHdyaXRlX3N0ZGluYCwgc3RhcnQgaXQgd2l0aCBgdHR5PXRydWVgIGFuZCBzZW5kIEN0cmwtQyAoYFxcXFx1MDAwM2ApLicsXG4gICAgJy0gUHJlZmVyIGByZ2AgYW5kIGByZyAtLWZpbGVzYCBmb3IgdGV4dC9maWxlIGRpc2NvdmVyeSB3aGVuIGF2YWlsYWJsZS4nLFxuICAgICctIEF2b2lkIHVzaW5nIFB5dGhvbiBzY3JpcHRzIGp1c3QgdG8gcHJpbnQgbGFyZ2UgZmlsZSBjaHVua3MuJyxcbl0uam9pbignXFxuJyk7XG5jbGFzcyBTaGVsbENhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ3NoZWxsJztcbiAgICBjb25maWd1cmVUb29scztcbiAgICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVUb29scyA9IGFyZ3MuY29uZmlndXJlVG9vbHM7XG4gICAgfVxuICAgIHRvb2xzKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gcmVxdWlyZUJvdW5kU2Vzc2lvbih0aGlzLnR5cGUsIHRoaXMuX3Nlc3Npb24pO1xuICAgICAgICBpZiAoIXNlc3Npb24uZXhlY0NvbW1hbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ1NoZWxsIHNhbmRib3ggc2Vzc2lvbnMgbXVzdCBwcm92aWRlIGV4ZWNDb21tYW5kKCkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbHMgPSBbXG4gICAgICAgICAgICB0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZXhlY19jb21tYW5kJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1J1bnMgYSBjb21tYW5kIGluIGEgUFRZLCByZXR1cm5pbmcgb3V0cHV0IG9yIGEgc2Vzc2lvbiBJRCBmb3Igb25nb2luZyBpbnRlcmFjdGlvbi4nLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHoub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgY21kOiB6LnN0cmluZygpLm1pbigxKS5kZXNjcmliZSgnU2hlbGwgY29tbWFuZCB0byBleGVjdXRlLicpLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZGlyOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ09wdGlvbmFsIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJ1biB0aGUgY29tbWFuZCBpbjsgZGVmYXVsdHMgdG8gdGhlIHR1cm4gY3dkLicpLFxuICAgICAgICAgICAgICAgICAgICBzaGVsbDogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKFwiU2hlbGwgYmluYXJ5IHRvIGxhdW5jaC4gRGVmYXVsdHMgdG8gdGhlIHVzZXIncyBkZWZhdWx0IHNoZWxsLlwiKSxcbiAgICAgICAgICAgICAgICAgICAgbG9naW46IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ1doZXRoZXIgdG8gcnVuIHRoZSBzaGVsbCB3aXRoIC1sLy1pIHNlbWFudGljcy4gRGVmYXVsdHMgdG8gdHJ1ZS4nKSxcbiAgICAgICAgICAgICAgICAgICAgdHR5OiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnV2hldGhlciB0byBhbGxvY2F0ZSBhIFRUWSBmb3IgdGhlIGNvbW1hbmQuIERlZmF1bHRzIHRvIGZhbHNlIChwbGFpbiBwaXBlcyk7IHNldCB0byB0cnVlIHRvIG9wZW4gYSBQVFkgYW5kIGFjY2VzcyBUVFkgcHJvY2Vzcy4nKSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRfdGltZV9tczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KERFRkFVTFRfRVhFQ19ZSUVMRF9USU1FX01TKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdIb3cgbG9uZyB0byB3YWl0IChpbiBtaWxsaXNlY29uZHMpIGZvciBvdXRwdXQgYmVmb3JlIHlpZWxkaW5nLicpLFxuICAgICAgICAgICAgICAgICAgICBtYXhfb3V0cHV0X3Rva2VuczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ01heGltdW0gbnVtYmVyIG9mIHRva2VucyB0byByZXR1cm4uIEV4Y2VzcyBvdXRwdXQgd2lsbCBiZSB0cnVuY2F0ZWQuJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY21kLCB3b3JrZGlyLCBzaGVsbCwgbG9naW4sIHR0eSwgeWllbGRfdGltZV9tcywgbWF4X291dHB1dF90b2tlbnMsIH0pID0+IGF3YWl0IHdpdGhTYW5kYm94U3Bhbignc2FuZGJveC5leGVjJywge1xuICAgICAgICAgICAgICAgICAgICBjbWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtkaXIsXG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2dpbixcbiAgICAgICAgICAgICAgICAgICAgdHR5LFxuICAgICAgICAgICAgICAgICAgICBydW5fYXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0sIGFzeW5jICgpID0+IGF3YWl0IHNlc3Npb24uZXhlY0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICBjbWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtkaXIsXG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2dpbixcbiAgICAgICAgICAgICAgICAgICAgdHR5LFxuICAgICAgICAgICAgICAgICAgICB5aWVsZFRpbWVNczogeWllbGRfdGltZV9tcyxcbiAgICAgICAgICAgICAgICAgICAgbWF4T3V0cHV0VG9rZW5zOiBtYXhfb3V0cHV0X3Rva2VucyxcbiAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zdXBwb3J0c1B0eT8uKCkgJiYgc2Vzc2lvbi53cml0ZVN0ZGluKSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKHRvb2woe1xuICAgICAgICAgICAgICAgIG5hbWU6ICd3cml0ZV9zdGRpbicsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXcml0ZXMgY2hhcmFjdGVycyB0byBhbiBleGlzdGluZyB1bmlmaWVkIGV4ZWMgc2Vzc2lvbiBhbmQgcmV0dXJucyByZWNlbnQgb3V0cHV0LicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdJZGVudGlmaWVyIG9mIHRoZSBydW5uaW5nIHVuaWZpZWQgZXhlYyBzZXNzaW9uLicpLFxuICAgICAgICAgICAgICAgICAgICBjaGFyczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCgnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnQnl0ZXMgdG8gd3JpdGUgdG8gc3RkaW4gKG1heSBiZSBlbXB0eSB0byBwb2xsKS4nKSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRfdGltZV9tczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KERFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnSG93IGxvbmcgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3Igb3V0cHV0IGJlZm9yZSB5aWVsZGluZy4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4X291dHB1dF90b2tlbnM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdNYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gcmV0dXJuLiBFeGNlc3Mgb3V0cHV0IHdpbGwgYmUgdHJ1bmNhdGVkLicpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHNlc3Npb25faWQsIGNoYXJzLCB5aWVsZF90aW1lX21zLCBtYXhfb3V0cHV0X3Rva2VucywgfSkgPT4gYXdhaXQgd2l0aFNhbmRib3hTcGFuKCdzYW5kYm94LndyaXRlX3N0ZGluJywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkLFxuICAgICAgICAgICAgICAgIH0sIGFzeW5jICgpID0+IGF3YWl0IHNlc3Npb24ud3JpdGVTdGRpbih7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgICAgICAgICAgY2hhcnMsXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkVGltZU1zOiB5aWVsZF90aW1lX21zLFxuICAgICAgICAgICAgICAgICAgICBtYXhPdXRwdXRUb2tlbnM6IG1heF9vdXRwdXRfdG9rZW5zLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmVUb29scyA/IHRoaXMuY29uZmlndXJlVG9vbHMoWy4uLnRvb2xzXSkgOiB0b29scztcbiAgICB9XG4gICAgaW5zdHJ1Y3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gU0hFTExfSU5TVFJVQ1RJT05TO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbChhcmdzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFNoZWxsQ2FwYWJpbGl0eShhcmdzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoZWxsLm1qcy5tYXAiLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IHRvb2wgfSBmcm9tIFwiLi4vLi4vdG9vbC5tanNcIjtcbmltcG9ydCB7IGRpciwgZmlsZSwgaXNEaXIsIGlzRGlyZWN0b3J5TGlrZUVudHJ5LCB9IGZyb20gXCIuLi9lbnRyaWVzL2luZGV4Lm1qc1wiO1xuaW1wb3J0IHsgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5tanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCIuLi9tYW5pZmVzdC5tanNcIjtcbmltcG9ydCB7IHByb21wdCB9IGZyb20gXCIuLi9ydW50aW1lL3Byb21wdHMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uIH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmNsYXNzIFNraWxsc0NhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ3NraWxscyc7XG4gICAgc2tpbGxzO1xuICAgIGZyb207XG4gICAgbGF6eUZyb207XG4gICAgaW5kZXg7XG4gICAgc2tpbGxzUGF0aDtcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2tpbGxzID0gYXJncy5za2lsbHMgPz8gW107XG4gICAgICAgIHRoaXMuZnJvbSA9IGFyZ3MuZnJvbTtcbiAgICAgICAgdGhpcy5sYXp5RnJvbSA9IGFyZ3MubGF6eUZyb207XG4gICAgICAgIHRoaXMuaW5kZXggPSBhcmdzLmluZGV4O1xuICAgICAgICB0aGlzLnNraWxsc1BhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgoYXJncy5za2lsbHNQYXRoID8/ICcuYWdlbnRzJyk7XG4gICAgICAgIHZhbGlkYXRlU2tpbGxzQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB9XG4gICAgdG9vbHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXp5RnJvbSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSByZXF1aXJlQm91bmRTZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5fc2Vzc2lvbik7XG4gICAgICAgIGlmICghc2Vzc2lvbi5wYXRoRXhpc3RzIHx8ICFzZXNzaW9uLm1hdGVyaWFsaXplRW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ1NraWxscyBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBwYXRoRXhpc3RzKCkgYW5kIG1hdGVyaWFsaXplRW50cnkoKS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2xvYWRfc2tpbGwnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTG9hZCBhIHNpbmdsZSBsYXppbHkgY29uZmlndXJlZCBza2lsbCBpbnRvIHRoZSBzYW5kYm94IHNvIGl0cyBTS0lMTC5tZCwgc2NyaXB0cywgcmVmZXJlbmNlcywgYW5kIGFzc2V0cyBjYW4gYmUgcmVhZCBmcm9tIHRoZSB3b3Jrc3BhY2UuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHNraWxsX25hbWU6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1pbigxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdOYW1lIG9mIHRoZSBsYXppbHkgY29uZmlndXJlZCBza2lsbCB0byBtYXRlcmlhbGl6ZS4nKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBza2lsbF9uYW1lLCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVzb2x2ZUxhenlTa2lsbE1hdGNoKHRoaXMsIHNraWxsX25hbWUsIHNlc3Npb24uc3RhdGUubWFuaWZlc3QpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZVNraWxsUGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChtYXRjaC5wYXRoID8/IG1hdGNoLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhdGggPSBqb2luUmVsYXRpdmVQYXRocyh0aGlzLnNraWxsc1BhdGgsIHJlbGF0aXZlU2tpbGxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbGxNYXJrZG93blBhdGggPSBqb2luUmVsYXRpdmVQYXRocyhkZXN0aW5hdGlvblBhdGgsICdTS0lMTC5tZCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgc2Vzc2lvbi5wYXRoRXhpc3RzKHNraWxsTWFya2Rvd25QYXRoLCB0aGlzLl9ydW5BcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnYWxyZWFkeV9sb2FkZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWxsX25hbWU6IG1hdGNoLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXNzaW9uLm1hdGVyaWFsaXplRW50cnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnk6IHJlc29sdmVMYXp5U2tpbGxFbnRyeSh0aGlzLmxhenlGcm9tLnNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2xvYWRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lsbF9uYW1lOiBtYXRjaC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcHJvY2Vzc01hbmlmZXN0KG1hbmlmZXN0KSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGF0aHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG1hbmlmZXN0LmVudHJpZXMpLm1hcCgocGF0aCkgPT4gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHBhdGgpKSk7XG4gICAgICAgIGlmICh0aGlzLmxhenlGcm9tKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwcyA9IFsuLi5leGlzdGluZ1BhdGhzXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCB0aGlzLnNraWxsc1BhdGgpKVxuICAgICAgICAgICAgICAgIC5zb3J0KCk7XG4gICAgICAgICAgICBpZiAob3ZlcmxhcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYHNraWxscyBsYXp5RnJvbSBwYXRoIG92ZXJsYXBzIGV4aXN0aW5nIG1hbmlmZXN0IGVudHJpZXM6ICR7b3ZlcmxhcHMuam9pbignLCAnKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mcm9tKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwID0gWy4uLmV4aXN0aW5nUGF0aHNdLmZpbmQoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCB0aGlzLnNraWxsc1BhdGgpKTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgc2tpbGxzIHBhdGggb3ZlcmxhcHMgZXhpc3RpbmcgbWFuaWZlc3QgZW50cmllczogJHtvdmVybGFwfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFuaWZlc3QuZW50cmllc1t0aGlzLnNraWxsc1BhdGhdID0gdGhpcy5mcm9tO1xuICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgdGhpcy5za2lsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNraWxsUGF0aCA9IGpvaW5SZWxhdGl2ZVBhdGhzKHRoaXMuc2tpbGxzUGF0aCwgc2tpbGwubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwID0gWy4uLmV4aXN0aW5nUGF0aHNdLmZpbmQoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCBza2lsbFBhdGgpKTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgc2tpbGwgcGF0aCBvdmVybGFwcyBleGlzdGluZyBtYW5pZmVzdCBlbnRyaWVzOiAke3NraWxsUGF0aH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hbmlmZXN0LmVudHJpZXNbc2tpbGxQYXRoXSA9IHJlbmRlclNraWxsRGVzY3JpcHRvcihza2lsbCk7XG4gICAgICAgICAgICBleGlzdGluZ1BhdGhzLmFkZChza2lsbFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICB9XG4gICAgYXN5bmMgaW5zdHJ1Y3Rpb25zKG1hbmlmZXN0KSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcmVzb2x2ZVNraWxsc01ldGFkYXRhKHRoaXMsIGF3YWl0IHRoaXMucmVzb2x2ZVJ1bnRpbWVNZXRhZGF0YShtYW5pZmVzdCksIG1hbmlmZXN0KTtcbiAgICAgICAgaWYgKG1ldGFkYXRhLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmZyb20pIHtcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJTa2lsbHNEaXNjb3ZlcnlJbnN0cnVjdGlvbnModGhpcy5za2lsbHNQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVuZGVyU2tpbGxzSW5zdHJ1Y3Rpb25zKHtcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgbGF6eTogQm9vbGVhbih0aGlzLmxhenlGcm9tKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHJlc29sdmVSdW50aW1lTWV0YWRhdGEoX21hbmlmZXN0KSB7XG4gICAgICAgIGlmICghdGhpcy5mcm9tIHx8ICF0aGlzLl9zZXNzaW9uPy5saXN0RGlyIHx8ICF0aGlzLl9zZXNzaW9uLnJlYWRGaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVudHJpZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnRyaWVzID0gYXdhaXQgdGhpcy5fc2Vzc2lvbi5saXN0RGlyKHtcbiAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnNraWxsc1BhdGgsXG4gICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgIT09ICdkaXInKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29udGVudDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IHRoaXMuX3Nlc3Npb24ucmVhZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhlbnRyeS5wYXRoLCAnU0tJTEwubWQnKSxcbiAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWFya2Rvd24gPSB0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGNvbnRlbnRcbiAgICAgICAgICAgICAgICA6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb250ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGZyb250bWF0dGVyID0gcGFyc2VTa2lsbEZyb250bWF0dGVyKG1hcmtkb3duKTtcbiAgICAgICAgICAgIG1ldGFkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGZyb250bWF0dGVyLm5hbWUgPz8gZW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZnJvbnRtYXR0ZXIuZGVzY3JpcHRpb24gPz8gJ05vIGRlc2NyaXB0aW9uIHByb3ZpZGVkLicsXG4gICAgICAgICAgICAgICAgcGF0aDogZW50cnkubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2tpbGxzKGFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IFNraWxsc0NhcGFiaWxpdHkoYXJncyk7XG59XG5jb25zdCBTS0lMTFNfU0VDVElPTl9JTlRSTyA9IHByb21wdCBgXG5BIHNraWxsIGlzIGEgc2V0IG9mIGxvY2FsIGluc3RydWN0aW9ucyB0byBmb2xsb3cgdGhhdCBpcyBzdG9yZWQgaW4gYSBcXGBTS0lMTC5tZFxcYCBmaWxlLiBCZWxvdyBpcyB0aGUgbGlzdCBvZiBza2lsbHMgdGhhdCBjYW4gYmUgdXNlZC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBhIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgZmlsZSBwYXRoIHNvIHlvdSBjYW4gb3BlbiB0aGUgc291cmNlIGZvciBmdWxsIGluc3RydWN0aW9ucyB3aGVuIHVzaW5nIGEgc3BlY2lmaWMgc2tpbGwuXG5gO1xuY29uc3QgSE9XX1RPX1VTRV9TS0lMTFNfU0VDVElPTiA9IHByb21wdCBgXG4jIyMgSG93IHRvIHVzZSBza2lsbHNcbi0gRGlzY292ZXJ5OiBUaGUgbGlzdCBhYm92ZSBpcyB0aGUgc2tpbGxzIGF2YWlsYWJsZSBpbiB0aGlzIHNlc3Npb24gKG5hbWUgKyBkZXNjcmlwdGlvbiArIGZpbGUgcGF0aCkuIFNraWxsIGJvZGllcyBsaXZlIG9uIGRpc2sgYXQgdGhlIGxpc3RlZCBwYXRocy5cbi0gVHJpZ2dlciBydWxlczogSWYgdGhlIHVzZXIgbmFtZXMgYSBza2lsbCAod2l0aCBcXGAkU2tpbGxOYW1lXFxgIG9yIHBsYWluIHRleHQpIE9SIHRoZSB0YXNrIGNsZWFybHkgbWF0Y2hlcyBhIHNraWxsJ3MgZGVzY3JpcHRpb24gc2hvd24gYWJvdmUsIHlvdSBtdXN0IHVzZSB0aGF0IHNraWxsIGZvciB0aGF0IHR1cm4uIE11bHRpcGxlIG1lbnRpb25zIG1lYW4gdXNlIHRoZW0gYWxsLiBEbyBub3QgY2Fycnkgc2tpbGxzIGFjcm9zcyB0dXJucyB1bmxlc3MgcmUtbWVudGlvbmVkLlxuLSBNaXNzaW5nL2Jsb2NrZWQ6IElmIGEgbmFtZWQgc2tpbGwgaXNuJ3QgaW4gdGhlIGxpc3Qgb3IgdGhlIHBhdGggY2FuJ3QgYmUgcmVhZCwgc2F5IHNvIGJyaWVmbHkgYW5kIGNvbnRpbnVlIHdpdGggdGhlIGJlc3QgZmFsbGJhY2suXG4tIEhvdyB0byB1c2UgYSBza2lsbCAocHJvZ3Jlc3NpdmUgZGlzY2xvc3VyZSk6XG4gIDEpIEFmdGVyIGRlY2lkaW5nIHRvIHVzZSBhIHNraWxsLCBvcGVuIGl0cyBcXGBTS0lMTC5tZFxcYC4gUmVhZCBvbmx5IGVub3VnaCB0byBmb2xsb3cgdGhlIHdvcmtmbG93LlxuICAyKSBJZiBcXGBTS0lMTC5tZFxcYCBwb2ludHMgdG8gZXh0cmEgZm9sZGVycyBzdWNoIGFzIFxcYHJlZmVyZW5jZXMvXFxgLCBsb2FkIG9ubHkgdGhlIHNwZWNpZmljIGZpbGVzIG5lZWRlZCBmb3IgdGhlIHJlcXVlc3Q7IGRvbid0IGJ1bGstbG9hZCBldmVyeXRoaW5nLlxuICAzKSBJZiBcXGBzY3JpcHRzL1xcYCBleGlzdCwgcHJlZmVyIHJ1bm5pbmcgb3IgcGF0Y2hpbmcgdGhlbSBpbnN0ZWFkIG9mIHJldHlwaW5nIGxhcmdlIGNvZGUgYmxvY2tzLlxuICA0KSBJZiBcXGBhc3NldHMvXFxgIG9yIHRlbXBsYXRlcyBleGlzdCwgcmV1c2UgdGhlbSBpbnN0ZWFkIG9mIHJlY3JlYXRpbmcgZnJvbSBzY3JhdGNoLlxuLSBDb29yZGluYXRpb24gYW5kIHNlcXVlbmNpbmc6XG4gIC0gSWYgbXVsdGlwbGUgc2tpbGxzIGFwcGx5LCBjaG9vc2UgdGhlIG1pbmltYWwgc2V0IHRoYXQgY292ZXJzIHRoZSByZXF1ZXN0IGFuZCBzdGF0ZSB0aGUgb3JkZXIgeW91J2xsIHVzZSB0aGVtLlxuICAtIEFubm91bmNlIHdoaWNoIHNraWxsKHMpIHlvdSdyZSB1c2luZyBhbmQgd2h5IChvbmUgc2hvcnQgbGluZSkuIElmIHlvdSBza2lwIGFuIG9idmlvdXMgc2tpbGwsIHNheSB3aHkuXG4tIENvbnRleHQgaHlnaWVuZTpcbiAgLSBLZWVwIGNvbnRleHQgc21hbGw6IHN1bW1hcml6ZSBsb25nIHNlY3Rpb25zIGluc3RlYWQgb2YgcGFzdGluZyB0aGVtOyBvbmx5IGxvYWQgZXh0cmEgZmlsZXMgd2hlbiBuZWVkZWQuXG4gIC0gQXZvaWQgZGVlcCByZWZlcmVuY2UtY2hhc2luZzogcHJlZmVyIG9wZW5pbmcgb25seSBmaWxlcyBkaXJlY3RseSBsaW5rZWQgZnJvbSBcXGBTS0lMTC5tZFxcYCB1bmxlc3MgeW91J3JlIGJsb2NrZWQuXG4gIC0gV2hlbiB2YXJpYW50cyBleGlzdCAoZnJhbWV3b3JrcywgcHJvdmlkZXJzLCBkb21haW5zKSwgcGljayBvbmx5IHRoZSByZWxldmFudCByZWZlcmVuY2UgZmlsZShzKSBhbmQgbm90ZSB0aGF0IGNob2ljZS5cbi0gU2FmZXR5IGFuZCBmYWxsYmFjazogSWYgYSBza2lsbCBjYW4ndCBiZSBhcHBsaWVkIGNsZWFubHkgKG1pc3NpbmcgZmlsZXMsIHVuY2xlYXIgaW5zdHJ1Y3Rpb25zKSwgc3RhdGUgdGhlIGlzc3VlLCBwaWNrIHRoZSBuZXh0LWJlc3QgYXBwcm9hY2gsIGFuZCBjb250aW51ZS5cbmA7XG5jb25zdCBIT1dfVE9fVVNFX0xBWllfU0tJTExTX1NFQ1RJT04gPSBwcm9tcHQgYFxuIyMjIEhvdyB0byB1c2Ugc2tpbGxzXG4tIERpc2NvdmVyeTogVGhlIGxpc3QgYWJvdmUgaXMgdGhlIHNraWxsIGluZGV4IGF2YWlsYWJsZSBpbiB0aGlzIHNlc3Npb24gKG5hbWUgKyBkZXNjcmlwdGlvbiArIHdvcmtzcGFjZSBwYXRoKS4gSW4gbGF6eSBtb2RlLCB0aG9zZSBwYXRocyBhcmUgbG9hZGVkIG9uIGRlbWFuZCBpbnN0ZWFkIG9mIGJlaW5nIHByZXNlbnQgdXAgZnJvbnQuXG4tIFRyaWdnZXIgcnVsZXM6IElmIHRoZSB1c2VyIG5hbWVzIGEgc2tpbGwgKHdpdGggXFxgJFNraWxsTmFtZVxcYCBvciBwbGFpbiB0ZXh0KSBPUiB0aGUgdGFzayBjbGVhcmx5IG1hdGNoZXMgYSBza2lsbCdzIGRlc2NyaXB0aW9uIHNob3duIGFib3ZlLCB5b3UgbXVzdCB1c2UgdGhhdCBza2lsbCBmb3IgdGhhdCB0dXJuLiBNdWx0aXBsZSBtZW50aW9ucyBtZWFuIHVzZSB0aGVtIGFsbC4gRG8gbm90IGNhcnJ5IHNraWxscyBhY3Jvc3MgdHVybnMgdW5sZXNzIHJlLW1lbnRpb25lZC5cbi0gTWlzc2luZy9ibG9ja2VkOiBJZiBhIG5hbWVkIHNraWxsIGlzbid0IGluIHRoZSBsaXN0IG9yIHRoZSBwYXRoIGNhbid0IGJlIHJlYWQsIHNheSBzbyBicmllZmx5IGFuZCBjb250aW51ZSB3aXRoIHRoZSBiZXN0IGZhbGxiYWNrLlxuLSBIb3cgdG8gdXNlIGEgc2tpbGwgKHByb2dyZXNzaXZlIGRpc2Nsb3N1cmUpOlxuICAxKSBBZnRlciBkZWNpZGluZyB0byB1c2UgYSBsYXp5IHNraWxsLCBjYWxsIFxcYGxvYWRfc2tpbGxcXGAgZm9yIHRoYXQgc2tpbGwgZmlyc3QsIHRoZW4gb3BlbiBpdHMgXFxgU0tJTEwubWRcXGAuXG4gIDIpIElmIFxcYFNLSUxMLm1kXFxgIHBvaW50cyB0byBleHRyYSBmb2xkZXJzIHN1Y2ggYXMgXFxgcmVmZXJlbmNlcy9cXGAsIGxvYWQgb25seSB0aGUgc3BlY2lmaWMgZmlsZXMgbmVlZGVkIGZvciB0aGUgcmVxdWVzdDsgZG9uJ3QgYnVsay1sb2FkIGV2ZXJ5dGhpbmcuXG4gIDMpIElmIFxcYHNjcmlwdHMvXFxgIGV4aXN0LCBwcmVmZXIgcnVubmluZyBvciBwYXRjaGluZyB0aGVtIGluc3RlYWQgb2YgcmV0eXBpbmcgbGFyZ2UgY29kZSBibG9ja3MuXG4gIDQpIElmIFxcYGFzc2V0cy9cXGAgb3IgdGVtcGxhdGVzIGV4aXN0LCByZXVzZSB0aGVtIGluc3RlYWQgb2YgcmVjcmVhdGluZyBmcm9tIHNjcmF0Y2guXG4tIENvb3JkaW5hdGlvbiBhbmQgc2VxdWVuY2luZzpcbiAgLSBJZiBtdWx0aXBsZSBza2lsbHMgYXBwbHksIGNob29zZSB0aGUgbWluaW1hbCBzZXQgdGhhdCBjb3ZlcnMgdGhlIHJlcXVlc3QgYW5kIHN0YXRlIHRoZSBvcmRlciB5b3UnbGwgdXNlIHRoZW0uXG4gIC0gQW5ub3VuY2Ugd2hpY2ggc2tpbGwocykgeW91J3JlIHVzaW5nIGFuZCB3aHkgKG9uZSBzaG9ydCBsaW5lKS4gSWYgeW91IHNraXAgYW4gb2J2aW91cyBza2lsbCwgc2F5IHdoeS5cbi0gQ29udGV4dCBoeWdpZW5lOlxuICAtIEtlZXAgY29udGV4dCBzbWFsbDogc3VtbWFyaXplIGxvbmcgc2VjdGlvbnMgaW5zdGVhZCBvZiBwYXN0aW5nIHRoZW07IG9ubHkgbG9hZCBleHRyYSBmaWxlcyB3aGVuIG5lZWRlZC5cbiAgLSBBdm9pZCBkZWVwIHJlZmVyZW5jZS1jaGFzaW5nOiBwcmVmZXIgb3BlbmluZyBvbmx5IGZpbGVzIGRpcmVjdGx5IGxpbmtlZCBmcm9tIFxcYFNLSUxMLm1kXFxgIHVubGVzcyB5b3UncmUgYmxvY2tlZC5cbiAgLSBXaGVuIHZhcmlhbnRzIGV4aXN0IChmcmFtZXdvcmtzLCBwcm92aWRlcnMsIGRvbWFpbnMpLCBwaWNrIG9ubHkgdGhlIHJlbGV2YW50IHJlZmVyZW5jZSBmaWxlKHMpIGFuZCBub3RlIHRoYXQgY2hvaWNlLlxuLSBTYWZldHkgYW5kIGZhbGxiYWNrOiBJZiBhIHNraWxsIGNhbid0IGJlIGFwcGxpZWQgY2xlYW5seSAobWlzc2luZyBmaWxlcywgdW5jbGVhciBpbnN0cnVjdGlvbnMpLCBzdGF0ZSB0aGUgaXNzdWUsIHBpY2sgdGhlIG5leHQtYmVzdCBhcHByb2FjaCwgYW5kIGNvbnRpbnVlLlxuYDtcbmZ1bmN0aW9uIHZhbGlkYXRlU2tpbGxzQ2FwYWJpbGl0eShjYXBhYmlsaXR5KSB7XG4gICAgY29uc3QgY29uZmlndXJlZFNvdXJjZXMgPSBbXG4gICAgICAgIGNhcGFiaWxpdHkuc2tpbGxzLmxlbmd0aCA+IDAsXG4gICAgICAgIEJvb2xlYW4oY2FwYWJpbGl0eS5mcm9tKSxcbiAgICAgICAgQm9vbGVhbihjYXBhYmlsaXR5LmxhenlGcm9tKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gICAgaWYgKGNvbmZpZ3VyZWRTb3VyY2VzID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ3NraWxscyBjYXBhYmlsaXR5IHJlcXVpcmVzIGBza2lsbHNgLCBgZnJvbWAsIG9yIGBsYXp5RnJvbWAuJyk7XG4gICAgfVxuICAgIGlmIChjb25maWd1cmVkU291cmNlcyA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcignc2tpbGxzIGNhcGFiaWxpdHkgYWNjZXB0cyBvbmx5IG9uZSBvZiBgc2tpbGxzYCwgYGZyb21gLCBvciBgbGF6eUZyb21gLicpO1xuICAgIH1cbiAgICBpZiAoY2FwYWJpbGl0eS5mcm9tICYmICFpc0RpcmVjdG9yeUxpa2VFbnRyeShjYXBhYmlsaXR5LmZyb20pKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ3NraWxscyBmcm9tIG11c3QgYmUgYSBkaXJlY3RvcnktbGlrZSBlbnRyeSBzdWNoIGFzIGRpciwgZ2l0X3JlcG8sIG9yIG1vdW50LicpO1xuICAgIH1cbiAgICBjb25zdCBzZWVuU2tpbGxOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IHNraWxsIG9mIGNhcGFiaWxpdHkuc2tpbGxzKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNraWxsLm5hbWUpO1xuICAgICAgICBpZiAoc2VlblNraWxsTmFtZXMuaGFzKG5vcm1hbGl6ZWROYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgZHVwbGljYXRlIHNraWxsIG5hbWU6ICR7c2tpbGwubmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuU2tpbGxOYW1lcy5hZGQobm9ybWFsaXplZE5hbWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlclNraWxsRGVzY3JpcHRvcihza2lsbCkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0ge1xuICAgICAgICAnU0tJTEwubWQnOiBub3JtYWxpemVTa2lsbENvbnRlbnQoc2tpbGwuY29udGVudCksXG4gICAgfTtcbiAgICBpZiAoc2tpbGwuc2NyaXB0cyAmJiBPYmplY3Qua2V5cyhza2lsbC5zY3JpcHRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNoaWxkcmVuLnNjcmlwdHMgPSBkaXIoe1xuICAgICAgICAgICAgY2hpbGRyZW46IHNraWxsLnNjcmlwdHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2tpbGwucmVmZXJlbmNlcyAmJiBPYmplY3Qua2V5cyhza2lsbC5yZWZlcmVuY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNoaWxkcmVuLnJlZmVyZW5jZXMgPSBkaXIoe1xuICAgICAgICAgICAgY2hpbGRyZW46IHNraWxsLnJlZmVyZW5jZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2tpbGwuYXNzZXRzICYmIE9iamVjdC5rZXlzKHNraWxsLmFzc2V0cykubGVuZ3RoID4gMCkge1xuICAgICAgICBjaGlsZHJlbi5hc3NldHMgPSBkaXIoe1xuICAgICAgICAgICAgY2hpbGRyZW46IHNraWxsLmFzc2V0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXIoe1xuICAgICAgICBjaGlsZHJlbixcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNraWxsQ29udGVudChjb250ZW50KSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyB8fCBjb250ZW50IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gZmlsZSh7XG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5mdW5jdGlvbiByZXNvbHZlU2tpbGxzTWV0YWRhdGEoY2FwYWJpbGl0eSwgcnVudGltZU1ldGFkYXRhID0gW10sIG1hbmlmZXN0KSB7XG4gICAgaWYgKGNhcGFiaWxpdHkuc2tpbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHkuc2tpbGxzXG4gICAgICAgICAgICAubWFwKChza2lsbCkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IHNraWxsLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogc2tpbGwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhjYXBhYmlsaXR5LnNraWxsc1BhdGgsIHNraWxsLm5hbWUpLFxuICAgICAgICB9KSlcbiAgICAgICAgICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5uYW1lLmxvY2FsZUNvbXBhcmUocmlnaHQubmFtZSkpO1xuICAgIH1cbiAgICBjb25zdCBjb25maWd1cmVkSW5kZXggPSByZXNvbHZlTGF6eVNraWxsSW5kZXgoY2FwYWJpbGl0eS5sYXp5RnJvbSwgbWFuaWZlc3QsIGNhcGFiaWxpdHkuc2tpbGxzUGF0aCkgPz9cbiAgICAgICAgY2FwYWJpbGl0eS5pbmRleCA/P1xuICAgICAgICAocnVudGltZU1ldGFkYXRhLmxlbmd0aCA+IDAgPyBydW50aW1lTWV0YWRhdGEgOiB1bmRlZmluZWQpID8/XG4gICAgICAgIGRlcml2ZUluZGV4RnJvbURpckVudHJ5KGNhcGFiaWxpdHkuZnJvbSk7XG4gICAgcmV0dXJuIGNvbmZpZ3VyZWRJbmRleFxuICAgICAgICAubWFwKChza2lsbCkgPT4gKHtcbiAgICAgICAgLi4uc2tpbGwsXG4gICAgICAgIHBhdGg6IGpvaW5SZWxhdGl2ZVBhdGhzKGNhcGFiaWxpdHkuc2tpbGxzUGF0aCwgc2tpbGwucGF0aCA/PyBub3JtYWxpemVSZWxhdGl2ZVBhdGgoc2tpbGwubmFtZSkpLFxuICAgIH0pKVxuICAgICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubmFtZS5sb2NhbGVDb21wYXJlKHJpZ2h0Lm5hbWUpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNraWxsRnJvbnRtYXR0ZXIobWFya2Rvd24pIHtcbiAgICBjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgaWYgKGxpbmVzWzBdPy50cmltKCkgIT09ICctLS0nKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgZW5kSW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUsIGluZGV4KSA9PiBpbmRleCA+IDAgJiYgbGluZS50cmltKCkgPT09ICctLS0nKTtcbiAgICBpZiAoZW5kSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgbWV0YWRhdGEgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc2xpY2UoMSwgZW5kSW5kZXgpKSB7XG4gICAgICAgIGNvbnN0IHN0cmlwcGVkID0gbGluZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGRlbGltaXRlckluZGV4ID0gc3RyaXBwZWQuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoIXN0cmlwcGVkIHx8IHN0cmlwcGVkLnN0YXJ0c1dpdGgoJyMnKSB8fCBkZWxpbWl0ZXJJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IHN0cmlwcGVkLnNsaWNlKDAsIGRlbGltaXRlckluZGV4KS50cmltKCk7XG4gICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gc3RyaXBwZWQuc2xpY2UoZGVsaW1pdGVySW5kZXggKyAxKS50cmltKCk7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtZXRhZGF0YVtrZXldID0gdW5xdW90ZUZyb250bWF0dGVyVmFsdWUocmF3VmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YWRhdGE7XG59XG5mdW5jdGlvbiB1bnF1b3RlRnJvbnRtYXR0ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJlxuICAgICAgICB2YWx1ZVswXSA9PT0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV0gJiZcbiAgICAgICAgKHZhbHVlWzBdID09PSAnXCInIHx8IHZhbHVlWzBdID09PSBcIidcIikpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlTa2lsbEluZGV4KGxhenlTb3VyY2UsIG1hbmlmZXN0LCBza2lsbHNQYXRoID0gJy5hZ2VudHMnKSB7XG4gICAgaWYgKCFsYXp5U291cmNlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChsYXp5U291cmNlLmluZGV4KSB7XG4gICAgICAgIHJldHVybiBsYXp5U291cmNlLmluZGV4O1xuICAgIH1cbiAgICBpZiAobGF6eVNvdXJjZS5nZXRJbmRleCAmJiBtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBkZXJpdmVkSW5kZXggPSBsYXp5U291cmNlLmdldEluZGV4KG1hbmlmZXN0LCBza2lsbHNQYXRoKTtcbiAgICAgICAgcmV0dXJuIGRlcml2ZWRJbmRleC5sZW5ndGggPiAwID8gZGVyaXZlZEluZGV4IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmVkSW5kZXggPSBkZXJpdmVJbmRleEZyb21EaXJFbnRyeShsYXp5U291cmNlLnNvdXJjZSk7XG4gICAgcmV0dXJuIGRlcml2ZWRJbmRleC5sZW5ndGggPiAwID8gZGVyaXZlZEluZGV4IDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZGVyaXZlSW5kZXhGcm9tRGlyRW50cnkoZW50cnkpIHtcbiAgICBpZiAoIWVudHJ5IHx8ICFpc0RpcihlbnRyeSkgfHwgIWVudHJ5LmNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGVudHJ5LmNoaWxkcmVuKVxuICAgICAgICAuZmlsdGVyKChbLCBjaGlsZF0pID0+IGNoaWxkLnR5cGUgPT09ICdkaXInKVxuICAgICAgICAubWFwKChbbmFtZSwgY2hpbGRdKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogY2hpbGQuZGVzY3JpcHRpb24gPz8gJ05vIGRlc2NyaXB0aW9uIHByb3ZpZGVkLicsXG4gICAgfSkpO1xufVxuZnVuY3Rpb24gcmVuZGVyU2tpbGxzRGlzY292ZXJ5SW5zdHJ1Y3Rpb25zKHNraWxsc1BhdGgpIHtcbiAgICByZXR1cm4gcHJvbXB0IGBcbiMjIFNraWxsc1xuJHtTS0lMTFNfU0VDVElPTl9JTlRST31cblxuIyMjIFNraWxsIHNvdXJjZVxuLSBTa2lsbHMgYXJlIG1hdGVyaWFsaXplZCB1bmRlciAke3NraWxsc1BhdGh9LiBEaXNjb3ZlciBhdmFpbGFibGUgc2tpbGxzIGJ5IGluc3BlY3RpbmcgY2hpbGQgZGlyZWN0b3JpZXMgYW5kIHRoZWlyIFNLSUxMLm1kIGZpbGVzIGF0IHJ1bnRpbWUuXG5cbiR7SE9XX1RPX1VTRV9TS0lMTFNfU0VDVElPTn1cbmA7XG59XG5mdW5jdGlvbiByZW5kZXJTa2lsbHNJbnN0cnVjdGlvbnMoYXJncykge1xuICAgIGNvbnN0IGF2YWlsYWJsZVNraWxscyA9IGFyZ3MubWV0YWRhdGFcbiAgICAgICAgLm1hcCgoc2tpbGwpID0+IGAtICR7c2tpbGwubmFtZX06ICR7c2tpbGwuZGVzY3JpcHRpb259IChmaWxlOiAke3NraWxsLnBhdGggPz8gc2tpbGwubmFtZX0pYClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IGxhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zID0gYXJncy5sYXp5XG4gICAgICAgID8gcHJvbXB0IGBcbiMjIyBMYXp5IGxvYWRpbmdcbi0gVGhlc2Ugc2tpbGxzIGFyZSBpbmRleGVkIGZvciBwbGFubmluZywgYnV0IHRoZXkgYXJlIG5vdCBtYXRlcmlhbGl6ZWQgaW4gdGhlIHdvcmtzcGFjZSB5ZXQuXG4tIENhbGwgXFxgbG9hZF9za2lsbFxcYCB3aXRoIGEgc2luZ2xlIHNraWxsIG5hbWUgZnJvbSB0aGUgbGlzdCBiZWZvcmUgcmVhZGluZyBpdHMgXFxgU0tJTEwubWRcXGAgb3Igb3RoZXIgZmlsZXMgZnJvbSB0aGUgd29ya3NwYWNlLlxuLSBcXGBsb2FkX3NraWxsXFxgIHN0YWdlcyBleGFjdGx5IG9uZSBza2lsbCB1bmRlciB0aGUgbGlzdGVkIHBhdGguIElmIHlvdSBuZWVkIG1vcmUgdGhhbiBvbmUgc2tpbGwsIGNhbGwgaXQgbXVsdGlwbGUgdGltZXMuXG5gXG4gICAgICAgIDogJyc7XG4gICAgY29uc3QgdXNhZ2VJbnN0cnVjdGlvbnMgPSBhcmdzLmxhenlcbiAgICAgICAgPyBIT1dfVE9fVVNFX0xBWllfU0tJTExTX1NFQ1RJT05cbiAgICAgICAgOiBIT1dfVE9fVVNFX1NLSUxMU19TRUNUSU9OO1xuICAgIGNvbnN0IGxhenlMb2FkaW5nU2VjdGlvbiA9IGxhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zXG4gICAgICAgID8gYCR7bGF6eUxvYWRpbmdJbnN0cnVjdGlvbnN9XFxuXFxuYFxuICAgICAgICA6ICcnO1xuICAgIHJldHVybiBwcm9tcHQgYFxuIyMgU2tpbGxzXG4ke1NLSUxMU19TRUNUSU9OX0lOVFJPfVxuXG4jIyMgQXZhaWxhYmxlIHNraWxsc1xuJHthdmFpbGFibGVTa2lsbHN9XG5cbiR7bGF6eUxvYWRpbmdTZWN0aW9ufSR7dXNhZ2VJbnN0cnVjdGlvbnN9XG5gO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlTa2lsbE1hdGNoKGNhcGFiaWxpdHksIHNraWxsTmFtZSwgbWFuaWZlc3QpIHtcbiAgICBjb25zdCBpbmRleCA9IHJlc29sdmVMYXp5U2tpbGxJbmRleChjYXBhYmlsaXR5LmxhenlGcm9tLCBtYW5pZmVzdCwgY2FwYWJpbGl0eS5za2lsbHNQYXRoKSA/P1xuICAgICAgICBjYXBhYmlsaXR5LmluZGV4ID8/XG4gICAgICAgIFtdO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBpbmRleC5maWx0ZXIoKHNraWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChza2lsbC5wYXRoID8/IHNraWxsLm5hbWUpO1xuICAgICAgICBjb25zdCBwYXRoQmFzZU5hbWUgPSByZWxhdGl2ZVBhdGguc3BsaXQoJy8nKS5wb3AoKSA/PyByZWxhdGl2ZVBhdGg7XG4gICAgICAgIHJldHVybiAoc2tpbGwubmFtZSA9PT0gc2tpbGxOYW1lIHx8XG4gICAgICAgICAgICByZWxhdGl2ZVBhdGggPT09IHNraWxsTmFtZSB8fFxuICAgICAgICAgICAgcGF0aEJhc2VOYW1lID09PSBza2lsbE5hbWUpO1xuICAgIH0pO1xuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBsYXp5IHNraWxsIG5vdCBmb3VuZDogJHtza2lsbE5hbWV9YCk7XG4gICAgfVxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgbGF6eSBza2lsbCBuYW1lIGlzIGFtYmlndW91czogJHtza2lsbE5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzWzBdO1xufVxuZnVuY3Rpb24gam9pblJlbGF0aXZlUGF0aHMobGVmdCwgcmlnaHQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkTGVmdCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChsZWZ0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUmlnaHQgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgocmlnaHQpO1xuICAgIGlmICghbm9ybWFsaXplZExlZnQpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRSaWdodDtcbiAgICB9XG4gICAgaWYgKCFub3JtYWxpemVkUmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRMZWZ0O1xuICAgIH1cbiAgICByZXR1cm4gYCR7bm9ybWFsaXplZExlZnR9LyR7bm9ybWFsaXplZFJpZ2h0fWA7XG59XG5mdW5jdGlvbiBqb2luU291cmNlUGF0aChzb3VyY2VSb290LCByZWxhdGl2ZVBhdGgpIHtcbiAgICBjb25zdCB0cmltbWVkUm9vdCA9IHNvdXJjZVJvb3QucmVwbGFjZSgvW1xcXFwvXSskLywgJycpO1xuICAgIGlmICghdHJpbW1lZFJvb3QpIHtcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RyaW1tZWRSb290fS8ke3JlbGF0aXZlUGF0aH1gO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlTa2lsbEVudHJ5KHNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpIHtcbiAgICBpZiAoc291cmNlLnR5cGUgPT09ICdsb2NhbF9kaXInKSB7XG4gICAgICAgIGlmICghc291cmNlLnNyYykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcignTGF6eSBza2lsbCBsb2NhbF9kaXIgc291cmNlcyByZXF1aXJlIGEgY29uY3JldGUgc3JjIHZhbHVlLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zb3VyY2UsXG4gICAgICAgICAgICB0eXBlOiAnbG9jYWxfZGlyJyxcbiAgICAgICAgICAgIHNyYzogam9pblNvdXJjZVBhdGgoc291cmNlLnNyYywgcmVsYXRpdmVTa2lsbFBhdGgpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoc291cmNlLnR5cGUgPT09ICdnaXRfcmVwbycpIHtcbiAgICAgICAgY29uc3QgYmFzZVN1YnBhdGggPSBzb3VyY2Uuc3VicGF0aFxuICAgICAgICAgICAgPyBub3JtYWxpemVSZWxhdGl2ZVBhdGgoc291cmNlLnN1YnBhdGgpXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc291cmNlLFxuICAgICAgICAgICAgdHlwZTogJ2dpdF9yZXBvJyxcbiAgICAgICAgICAgIHN1YnBhdGg6IGpvaW5SZWxhdGl2ZVBhdGhzKGJhc2VTdWJwYXRoLCByZWxhdGl2ZVNraWxsUGF0aCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ2RpcicpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSByZWFkRGlyQ2hpbGQoc291cmNlLCByZWxhdGl2ZVNraWxsUGF0aCk7XG4gICAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYGxhenkgc2tpbGwgc291cmNlIHBhdGggbm90IGZvdW5kOiAke3JlbGF0aXZlU2tpbGxQYXRofWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgTGF6eSBza2lsbCBzb3VyY2UgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHlldDogJHtzb3VyY2UudHlwZX1gKTtcbn1cbmZ1bmN0aW9uIHJlYWREaXJDaGlsZChzb3VyY2UsIHJlbGF0aXZlU2tpbGxQYXRoKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBzb3VyY2U7XG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChyZWxhdGl2ZVNraWxsUGF0aCkuc3BsaXQoJy8nKSkge1xuICAgICAgICBpZiAoIXNlZ21lbnQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudCB8fCAhaXNEaXIoY3VycmVudCkgfHwgIWN1cnJlbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGRyZW5bc2VnbWVudF07XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xufVxuZnVuY3Rpb24gcGF0aHNPdmVybGFwKGxlZnQsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIChsZWZ0ID09PSByaWdodCB8fFxuICAgICAgICBsZWZ0LnN0YXJ0c1dpdGgoYCR7cmlnaHR9L2ApIHx8XG4gICAgICAgIHJpZ2h0LnN0YXJ0c1dpdGgoYCR7bGVmdH0vYCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2tpbGxzLm1qcy5tYXAiLCJpbXBvcnQgeyBjb21wYWN0aW9uIH0gZnJvbSBcIi4vY29tcGFjdGlvbi5tanNcIjtcbmltcG9ydCB7IGZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9maWxlc3lzdGVtLm1qc1wiO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tIFwiLi9zaGVsbC5tanNcIjtcbmV4cG9ydCB7IENhcGFiaWxpdHkgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuZXhwb3J0IHsgQ29tcGFjdGlvbk1vZGVsSW5mbywgQ29tcGFjdGlvblBvbGljeSwgRHluYW1pY0NvbXBhY3Rpb25Qb2xpY3ksIFN0YXRpY0NvbXBhY3Rpb25Qb2xpY3ksIGNvbXBhY3Rpb24sIH0gZnJvbSBcIi4vY29tcGFjdGlvbi5tanNcIjtcbmV4cG9ydCB7IGZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9maWxlc3lzdGVtLm1qc1wiO1xuZXhwb3J0IHsgbWVtb3J5IH0gZnJvbSBcIi4vbWVtb3J5Lm1qc1wiO1xuZXhwb3J0IHsgSW5NZW1vcnlNZW1vcnlTdG9yZSB9IGZyb20gXCIuLi9tZW1vcnkvc3RvcmFnZS5tanNcIjtcbmV4cG9ydCB7IHNoZWxsIH0gZnJvbSBcIi4vc2hlbGwubWpzXCI7XG5leHBvcnQgeyBza2lsbHMgfSBmcm9tIFwiLi9za2lsbHMubWpzXCI7XG5mdW5jdGlvbiBkZWZhdWx0Q2FwYWJpbGl0aWVzKCkge1xuICAgIHJldHVybiBbZmlsZXN5c3RlbSgpLCBzaGVsbCgpLCBjb21wYWN0aW9uKCldO1xufVxuZXhwb3J0IGNvbnN0IENhcGFiaWxpdGllcyA9IHtcbiAgICBkZWZhdWx0OiBkZWZhdWx0Q2FwYWJpbGl0aWVzLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiLCJpbXBvcnQgeyBBZ2VudCB9IGZyb20gXCIuLi9hZ2VudC5tanNcIjtcbmltcG9ydCB7IFNBTkRCT1hfQUdFTlRfQlJBTkQgfSBmcm9tIFwiLi9icmFuZC5tanNcIjtcbmltcG9ydCB7IENhcGFiaWxpdGllcyB9IGZyb20gXCIuL2NhcGFiaWxpdGllcy9pbmRleC5tanNcIjtcbmltcG9ydCB7IGNsb25lTWFuaWZlc3QsIE1hbmlmZXN0IH0gZnJvbSBcIi4vbWFuaWZlc3QubWpzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVVc2VyIH0gZnJvbSBcIi4vdXNlcnMubWpzXCI7XG5leHBvcnQgY2xhc3MgU2FuZGJveEFnZW50IGV4dGVuZHMgQWdlbnQge1xuICAgIFtTQU5EQk9YX0FHRU5UX0JSQU5EXSA9IHRydWU7XG4gICAgZGVmYXVsdE1hbmlmZXN0O1xuICAgIGJhc2VJbnN0cnVjdGlvbnM7XG4gICAgY2FwYWJpbGl0aWVzO1xuICAgIHJ1bkFzO1xuICAgIHJ1bnRpbWVNYW5pZmVzdDtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcuYmFzZUluc3RydWN0aW9ucyAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcuYmFzZUluc3RydWN0aW9ucyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU2FuZGJveEFnZW50IGJhc2VJbnN0cnVjdGlvbnMgbXVzdCBiZSBhIHN0cmluZyBvciBmdW5jdGlvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlZmF1bHRNYW5pZmVzdCA9IGNvbmZpZy5kZWZhdWx0TWFuaWZlc3RcbiAgICAgICAgICAgID8gY2xvbmVNYW5pZmVzdChjb25maWcuZGVmYXVsdE1hbmlmZXN0KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYmFzZUluc3RydWN0aW9ucyA9IGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zO1xuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IGNvbmZpZy5jYXBhYmlsaXRpZXMgPz8gQ2FwYWJpbGl0aWVzLmRlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5ydW5BcyA9IG5vcm1hbGl6ZVJ1bkFzKGNvbmZpZy5ydW5Bcyk7XG4gICAgICAgIHRoaXMucnVudGltZU1hbmlmZXN0ID0gdGhpcy5kZWZhdWx0TWFuaWZlc3QgPz8gbmV3IE1hbmlmZXN0KCk7XG4gICAgfVxuICAgIGNsb25lKGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hBZ2VudCh7XG4gICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSA/PyB0aGlzLm5hbWUsXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnM6IGNvbmZpZy5pbnN0cnVjdGlvbnMgPz8gdGhpcy5pbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICBwcm9tcHQ6IGNvbmZpZy5wcm9tcHQgPz8gdGhpcy5wcm9tcHQsXG4gICAgICAgICAgICBoYW5kb2ZmRGVzY3JpcHRpb246IGNvbmZpZy5oYW5kb2ZmRGVzY3JpcHRpb24gPz8gdGhpcy5oYW5kb2ZmRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBoYW5kb2ZmczogY29uZmlnLmhhbmRvZmZzID8/IHRoaXMuaGFuZG9mZnMsXG4gICAgICAgICAgICBtb2RlbDogY29uZmlnLm1vZGVsID8/IHRoaXMubW9kZWwsXG4gICAgICAgICAgICBtb2RlbFNldHRpbmdzOiBjb25maWcubW9kZWxTZXR0aW5ncyA/PyB0aGlzLm1vZGVsU2V0dGluZ3MsXG4gICAgICAgICAgICB0b29sczogY29uZmlnLnRvb2xzID8/IHRoaXMudG9vbHMsXG4gICAgICAgICAgICBtY3BTZXJ2ZXJzOiBjb25maWcubWNwU2VydmVycyA/PyB0aGlzLm1jcFNlcnZlcnMsXG4gICAgICAgICAgICBtY3BDb25maWc6IGNvbmZpZy5tY3BDb25maWcgPz8gdGhpcy5tY3BDb25maWcsXG4gICAgICAgICAgICBpbnB1dEd1YXJkcmFpbHM6IGNvbmZpZy5pbnB1dEd1YXJkcmFpbHMgPz8gdGhpcy5pbnB1dEd1YXJkcmFpbHMsXG4gICAgICAgICAgICBvdXRwdXRHdWFyZHJhaWxzOiBjb25maWcub3V0cHV0R3VhcmRyYWlscyA/PyB0aGlzLm91dHB1dEd1YXJkcmFpbHMsXG4gICAgICAgICAgICBvdXRwdXRUeXBlOiBjb25maWcub3V0cHV0VHlwZSA/PyB0aGlzLm91dHB1dFR5cGUsXG4gICAgICAgICAgICB0b29sVXNlQmVoYXZpb3I6IGNvbmZpZy50b29sVXNlQmVoYXZpb3IgPz8gdGhpcy50b29sVXNlQmVoYXZpb3IsXG4gICAgICAgICAgICByZXNldFRvb2xDaG9pY2U6IGNvbmZpZy5yZXNldFRvb2xDaG9pY2UgPz8gdGhpcy5yZXNldFRvb2xDaG9pY2UsXG4gICAgICAgICAgICBkZWZhdWx0TWFuaWZlc3Q6IGNvbmZpZy5kZWZhdWx0TWFuaWZlc3QgPz8gdGhpcy5kZWZhdWx0TWFuaWZlc3QsXG4gICAgICAgICAgICBiYXNlSW5zdHJ1Y3Rpb25zOiBjb25maWcuYmFzZUluc3RydWN0aW9ucyA/PyB0aGlzLmJhc2VJbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGNvbmZpZy5jYXBhYmlsaXRpZXMgPz8gdGhpcy5jYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBydW5BczogY29uZmlnLnJ1bkFzID8/IHRoaXMucnVuQXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJ1bkFzKHJ1bkFzKSB7XG4gICAgaWYgKHJ1bkFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBydW5BcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IHJ1bkFzLnRyaW0oKTtcbiAgICAgICAgaWYgKCF0cmltbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTYW5kYm94QWdlbnQgcnVuQXMgbXVzdCBiZSBub24tZW1wdHkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyaW1tZWQ7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVVc2VyKHJ1bkFzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFnZW50Lm1qcy5tYXAiXSwibmFtZXMiOlsic3VwcG9ydHNSZXNwb25zZXNDb21wYWN0aW9uVHJhbnNwb3J0IiwibW9kZWxJbnN0YW5jZSIsInN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydCIsInN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQiLCJDb21wYWN0aW9uUG9saWN5IiwiRHluYW1pY0NvbXBhY3Rpb25Qb2xpY3kiLCJ0aHJlc2hvbGRSYXRpbyIsImZhbGxiYWNrVGhyZXNob2xkIiwiX19wdWJsaWNGaWVsZCIsIm1vZGVsIiwibW9kZWxJbmZvIiwiQ29tcGFjdGlvbk1vZGVsSW5mbyIsImNvbnRleHRXaW5kb3ciLCJjYW5kaWRhdGUiLCJnZXRTYW5kYm94Q29tcGFjdGlvbk1vZGVsQ2FuZGlkYXRlcyIsIlNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzFNIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfNDAwSyIsIlNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzIwMEsiLCJTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xMjhLIiwiQ29tcGFjdGlvbkNhcGFiaWxpdHkiLCJDYXBhYmlsaXR5IiwicG9saWN5Iiwic2FtcGxpbmdQYXJhbXMiLCJjb250ZXh0IiwibGFzdENvbXBhY3Rpb25JbmRleCIsImluZGV4IiwiY29tcGFjdGlvbiIsImFyZ3MiLCJ0cmltbWVkIiwibm9ybWFsaXplZCIsIndpdGhvdXRQaW5uZWREYXRlIiwiYXBwbHlQYXRjaEZ1bmN0aW9uUGFyYW1ldGVycyIsIkJFR0lOX1BBVENIIiwiRU5EX1BBVENIIiwiQUREX0ZJTEUiLCJERUxFVEVfRklMRSIsIlVQREFURV9GSUxFIiwiTU9WRV9UTyIsInRvRXJyb3JNZXNzYWdlIiwiZXJyb3IiLCJyZW5kZXJJbWFnZUZvclRleHRUcmFuc3BvcnQiLCJvdXRwdXQiLCJpbWFnZSIsImlzUmVjb3JkIiwiaW1hZ2VSZWNvcmQiLCJlbmNvZGVVaW50OEFycmF5VG9CYXNlNjQiLCJyZW5kZXJWaWV3SW1hZ2VFcnJvciIsInBhdGgiLCJtZXNzYWdlIiwibmFtZSIsInBhcnNlQXBwbHlQYXRjaElucHV0IiwicmF3SW5wdXQiLCJ0cmltbWVkSW5wdXQiLCJwYXJzZUZyZWVmb3JtUGF0Y2giLCJwYXlsb2FkIiwicGFyc2VBcHBseVBhdGNoUGF5bG9hZCIsInBhcnNlU3RydWN0dXJlZE9wZXJhdGlvbnMiLCJjb21tYW5kTmFtZSIsInBhdGNoIiwicGF5bG9hZHMiLCJvcGVyYXRpb25zIiwicGFyc2VkIiwiQXBwbHlQYXRjaE9wZXJhdGlvbiIsInJhd1BhdGNoIiwibGluZXMiLCJsaW5lIiwicGFyc2VBZGRGaWxlUGF0Y2giLCJwYXJzZURlbGV0ZUZpbGVQYXRjaCIsInBhcnNlVXBkYXRlRmlsZVBhdGNoIiwicGFyc2VQYXRjaEhlYWRlciIsImRpZmZMaW5lcyIsImlzRmlsZU9wZXJhdGlvbkhlYWRlciIsImpvaW5EaWZmIiwibW92ZVRvIiwicGFyc2VkTW92ZVRvIiwicHJlZml4IiwiYXBwbHlQYXRjaE9wZXJhdGlvbiIsImVkaXRvciIsIm9wZXJhdGlvbiIsInJ1bkNvbnRleHQiLCJyZXN1bHQiLCJhcHBseVBhdGNoT3BlcmF0aW9ucyIsIm91dHB1dHMiLCJhcHBseVBhdGNoRnVuY3Rpb25Ub29sIiwiaW5wdXQiLCJGaWxlc3lzdGVtQ2FwYWJpbGl0eSIsInNlc3Npb24iLCJyZXF1aXJlQm91bmRTZXNzaW9uIiwiX2EiLCJVc2VyRXJyb3IiLCJ0b29scyIsInZpZXdJbWFnZSIsIndpdGhTYW5kYm94U3BhbiIsInRvb2wiLCJ6Lm9iamVjdCIsInouc3RyaW5nIiwiYXBwbHlQYXRjaFRvb2wiLCJmaWxlc3lzdGVtIiwiREVGQVVMVF9FWEVDX1lJRUxEX1RJTUVfTVMiLCJERUZBVUxUX1dSSVRFX1NURElOX1lJRUxEX1RJTUVfTVMiLCJTSEVMTF9JTlNUUlVDVElPTlMiLCJTaGVsbENhcGFiaWxpdHkiLCJ6XG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RyaW5nIiwielxuICAgICAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW4iLCJ6XG4gICAgICAgICAgICAgICAgICAgICAgICAubnVtYmVyIiwiY21kIiwid29ya2RpciIsInNoZWxsIiwibG9naW4iLCJ0dHkiLCJ5aWVsZF90aW1lX21zIiwibWF4X291dHB1dF90b2tlbnMiLCJzZXNzaW9uX2lkIiwiY2hhcnMiLCJwcm9tcHQiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwiQ2FwYWJpbGl0aWVzIiwiU2FuZGJveEFnZW50IiwiX2IiLCJBZ2VudCIsIlNBTkRCT1hfQUdFTlRfQlJBTkQiLCJjb25maWciLCJjbG9uZU1hbmlmZXN0Iiwibm9ybWFsaXplUnVuQXMiLCJNYW5pZmVzdCIsInJ1bkFzIiwibm9ybWFsaXplVXNlciJdLCJtYXBwaW5ncyI6Ijs7OztBQUFPLFNBQVNBLEVBQXFDQyxHQUFlO0FBQ2hFLFNBQUtBLElBU0UsRUFOaUIsT0FBT0EsS0FBa0IsWUFDN0NBLEtBQ0EsaUJBQWlCQSxLQUNqQixPQUFPQSxFQUFjLGVBQWdCLGFBQ25DQSxFQUFjLFlBQVksT0FDMUIsSUFDa0IsU0FBUyxpQkFBaUIsSUFSdkM7QUFTZjtBQUNPLFNBQVNDLEVBQTRCRCxHQUFlO0FBQ3ZELFNBQU9FLEVBQXNDRixDQUFhO0FBQzlEO0FBQ08sU0FBU0UsRUFBc0NGLEdBQWU7QUFDakUsU0FBS0EsSUFTRSxFQU5pQixPQUFPQSxLQUFrQixZQUM3Q0EsS0FD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