@media-quest/engine 0.0.10 → 0.0.11

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.
@@ -2159,7 +2159,7 @@ var isID = (idName, id) => {
2159
2159
  return false;
2160
2160
  return id.length >= MIN_LENGTH;
2161
2161
  };
2162
- var createID = (idName) => {
2162
+ var createIDByName = (idName) => {
2163
2163
  const letters = "abcdefghijklmnopqrstuvyz";
2164
2164
  const all = letters + letters.toUpperCase();
2165
2165
  let result = "";
@@ -2170,7 +2170,7 @@ var createID = (idName) => {
2170
2170
  return result;
2171
2171
  };
2172
2172
  var createTypedIdSingleton = (idName) => {
2173
- const create = () => createID(idName);
2173
+ const create = () => createIDByName(idName);
2174
2174
  const is = (id) => isID(idName, id);
2175
2175
  const validateOrThrow = (id) => {
2176
2176
  if (!is(id)) {
@@ -2202,4 +2202,4 @@ export {
2202
2202
  SchemaID,
2203
2203
  createTypedIdSingleton
2204
2204
  };
2205
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2R0by9TY2hlbWFEdG8udHMiLCAiLi4vc3JjL2NvbW1vbi9EVGltZXN0YW1wLnRzIiwgIi4uL3NyYy91dGlscy9EVXRpbC50cyIsICIuLi9zcmMvRGVsZW1lbnQvY3NzLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EU3R5bGUudHMiLCAiLi4vc3JjL0RlbGVtZW50L1ZpZGVvQ29udGFpbmVyLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9BdWRpb0NvbnRhaW5lci50cyIsICIuLi9zcmMvc2VydmljZXMvRE1lZGlhLW1hbmFnZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL0RDb21tYW5kQnVzLnRzIiwgIi4uL3NyYy9ldmVudHMvZXZlbnQtYnVzLnRzIiwgIi4uL3NyYy9wbGF5ZXIvaGlzdG9yeS1xdWUudHMiLCAiLi4vc3JjL3J1bGVzL2NvbmRpdGlvbi50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS1lbmdpbmUudHMiLCAiLi4vc3JjL3BsYXllci9uZXh0LXF1ZS50cyIsICIuLi9zcmMvcGxheWVyL2RwbGF5ZXIudHMiLCAiLi4vc3JjL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXIudHMiLCAiLi4vc3JjL0RlbGVtZW50L0RFbGVtZW50LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EZGl2LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9ESW1nLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EVGV4dC50cyIsICIuLi9zcmMvZW5naW5lL2VsZW1lbnQtZmFjdG9yeS50cyIsICIuLi9zcmMvZW5naW5lL0RQYWdlLnRzIiwgIi4uL3NyYy9lbmdpbmUvc2NhbGUudHMiLCAiLi4vc3JjL3NlcnZpY2VzL3Jlc291cmNlLXByb3ZpZGVyLnRzIiwgIi4uL3NyYy9jb21tb24vcmVzdWx0LnRzIiwgIi4uL3NyYy9zdGF0ZS9Ec3RhdGUudHMiLCAiLi4vc3JjL3N0YXRlL3N0YXRlLXNlcnZpY2UudHMiLCAiLi4vc3JjL2VuZ2luZS9TY2hlbWFFbmdpbmUudHMiLCAiLi4vc3JjL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHkudHMiLCAiLi4vc3JjL3V0aWxzL0lELnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBEQXV0b1BsYXlTZXF1ZW5jZSB9IGZyb20gXCIuLi9EZWxlbWVudC9EQXV0by1wbGF5XCI7XG5pbXBvcnQgeyBEQXVkaW9EdG8sIERFbGVtZW50RHRvLCBESW1nRHRvLCBEVmlkZW9EdG8gfSBmcm9tIFwiLi9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IFJ1bGUgfSBmcm9tIFwiLi4vcnVsZXMvcnVsZVwiO1xuaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBQYWdlUXVlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFN0YXRlIH0gZnJvbSBcIi4uL3N0YXRlL0RzdGF0ZVwiO1xuaW1wb3J0IHsgUGFnZUlELCBTY2hlbWFJRCB9IGZyb20gXCIuLi91dGlscy9JRFwiO1xuXG5leHBvcnQgdHlwZSBQYWdlUXVlUnVsZXMgPSBSdWxlPFBhZ2VRdWVDb21tYW5kLCBuZXZlcj47XG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VEdG8ge1xuICByZWFkb25seSBpZDogUGFnZUlEO1xuICByZWFkb25seSBlbGVtZW50czogQXJyYXk8REVsZW1lbnREdG8+O1xuICByZWFkb25seSB0YWdzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IG1haW5WaWRlb0lkPzogc3RyaW5nO1xuICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZpZGVvPzogQXJyYXk8RFZpZGVvRHRvPjtcbiAgcmVhZG9ubHkgYXVkaW8/OiBBcnJheTxEQXVkaW9EdG8+O1xuICByZWFkb25seSBhdXRvUGxheVNlcXVlbmNlPzogREF1dG9QbGF5U2VxdWVuY2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVNlcXVlbmNlRHRvIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZXM6IEFycmF5PFBhZ2VRdWVSdWxlcz47XG4gIHJlYWRvbmx5IHBhZ2VzOiBBcnJheTxQYWdlRHRvPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFEdG8ge1xuICByZWFkb25seSBpZDogU2NoZW1hSUQ7XG4gIHJlYWRvbmx5IGJhc2VIZWlnaHQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgYmFzZVdpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICByZWFkb25seSBwYWdlczogUGFnZUR0b1tdO1xuICByZWFkb25seSBydWxlczogQXJyYXk8UGFnZVF1ZVJ1bGVzPjtcbiAgcmVhZG9ubHkgc3RhdGVQcm9wcz86IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlByb3A+O1xuICByZWFkb25seSBzdGF0ZVF1ZXJpZXM/OiBSZWFkb25seUFycmF5PERTdGF0ZS5TdGF0ZVF1ZXJ5PjtcbiAgcmVhZG9ubHkgc3RhdGVGcm9tRXZlbnQ6IFJlYWRvbmx5QXJyYXk8RFN0YXRlLmZyb21FdmVudEhhbmRsZXI+O1xuICByZWFkb25seSBwYWdlU2VxdWVuY2VzPzogQXJyYXk8UGFnZVNlcXVlbmNlRHRvPjtcbiAgcmVhZG9ubHkgcHJlZGVmaW5lZEZhY3RzPzogUmVhZG9ubHlBcnJheTxGYWN0Pjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTY2hlbWFEdG8ge1xuICBleHBvcnQgY29uc3QgZ2V0UmVzb3VyY2VzID0gKFxuICAgIHNjaGVtYTogU2NoZW1hRHRvLFxuICApOiB7XG4gICAgdmlkZW9MaXN0OiBSZWFkb25seUFycmF5PERWaWRlb0R0bz47XG4gICAgYXVkaW9MaXN0OiBSZWFkb25seUFycmF5PERBdWRpb0R0bz47XG4gICAgaW1hZ2VMaXN0OiBSZWFkb25seUFycmF5PERJbWdEdG8+O1xuICB9ID0+IHtcbiAgICBjb25zdCB7IHBhZ2VzIH0gPSBzY2hlbWE7XG4gICAgY29uc3QgdmlkZW9MaXN0ID0gcGFnZXMucmVkdWNlPEFycmF5PERWaWRlb0R0bz4+KChhY2MsIGN1cnIpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnIudmlkZW8pKSB7XG4gICAgICAgIGFjYy5wdXNoKC4uLmN1cnIudmlkZW8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgYXVkaW9MaXN0OiBBcnJheTxEQXVkaW9EdG8+ID0gcGFnZXMucmVkdWNlPEFycmF5PERBdWRpb0R0bz4+KChhY2MsIGN1cnIpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnIuYXVkaW8pKSB7XG4gICAgICAgIGFjYy5wdXNoKC4uLmN1cnIuYXVkaW8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4geyB2aWRlb0xpc3QsIGF1ZGlvTGlzdCwgaW1hZ2VMaXN0OiBbXSB9O1xuICB9O1xufVxuIiwgImV4cG9ydCB0eXBlIERUaW1lc3RhbXAgPSBudW1iZXIgJiB7IF9fdGltZXN0YW1wX186IHRydWUgfTtcbmV4cG9ydCBuYW1lc3BhY2UgRFRpbWVzdGFtcCB7XG4gICAgZXhwb3J0IGNvbnN0IG5vdyA9ICgpID0+IERhdGUubm93KCkgYXMgRFRpbWVzdGFtcDtcbiAgICBleHBvcnQgdHlwZSBEaWZmID0gbnVtYmVyICYgeyBfX2RpZmZfXzogdHJ1ZSB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGFkZE1pbGxzID0gKHQ6IERUaW1lc3RhbXAsIG1zOiBudW1iZXIpOiBEVGltZXN0YW1wID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gdCArIE1hdGguYWJzKG1zKTtcbiAgICAgICAgcmV0dXJuIHJlcyBhcyBEVGltZXN0YW1wO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgZGlmZiA9ICh0MTogRFRpbWVzdGFtcCwgdDI6IERUaW1lc3RhbXApOiBEaWZmID0+IHtcbiAgICAgICAgY29uc3QgdDFBYnMgPSBNYXRoLmFicyh0MSk7XG4gICAgICAgIGNvbnN0IHQyQWJzID0gTWF0aC5hYnModDIpO1xuICAgICAgICByZXR1cm4gTWF0aC5hYnModDFBYnMgLSB0MkFicykgYXMgRGlmZjtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGRpZmZOb3cgPSAodDogRFRpbWVzdGFtcCk6IERpZmYgPT4ge1xuICAgICAgICByZXR1cm4gZGlmZih0LCBub3coKSk7XG4gICAgfTtcbn1cbiIsICJleHBvcnQgdHlwZSBSYW5kb21PYmplY3RJZCA9IHN0cmluZyAmIHsgcmFuZG9tT2JqZWN0SWQ6IHRydWUgfTtcbmV4cG9ydCBuYW1lc3BhY2UgRFV0aWwge1xuICAgIGV4cG9ydCBjb25zdCByYW5kb21TdHJpbmcgPSAobGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBsZXR0ZXJzID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2eHl6XCI7XG4gICAgICAgIGNvbnN0IHVwcGVyY2FzZSA9IGxldHRlcnMudG9VcHBlckNhc2UoKTtcbiAgICAgICAgY29uc3QgYWxsID0gbGV0dGVycyArIHVwcGVyY2FzZTtcbiAgICAgICAgY29uc3QgYWJzID0gTWF0aC5hYnMobGVuZ3RoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhYnM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGFsbC5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsLmxlbmd0aCkpO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IHJhbmRvbU9iamVjdElkID0gKCkgPT4gcmFuZG9tU3RyaW5nKDMyKSBhcyBSYW5kb21PYmplY3RJZDtcblxuICAgIGV4cG9ydCBjb25zdCBkZWxldGVQcm9wID0gPE9iaiwgS2V5IGV4dGVuZHMga2V5b2YgT2JqPihvYmo6IE9iaiwga2V5OiBLZXkpOiBPbWl0PE9iaiwgS2V5PiA9PiB7XG4gICAgICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzSW5SYW5nZSA9IChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4O1xuICAgIH07XG4gICAgZXhwb3J0IGNvbnN0IGlzSW5maW5pdHkgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8IG51bWJlciA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIHx8IG51bWJlciA9PT0gSW5maW5pdHk7XG4gICAgfTtcbiAgICBleHBvcnQgdHlwZSBOb25FbXB0eUFycmF5PFQ+ID0gW1QsIC4uLlRbXV07XG4gICAgZXhwb3J0IGNvbnN0IGlzTm9uRW1wdHlBcnJheSA9IDxUPihhcnJheTogQXJyYXk8VD4pOiBhcnJheSBpcyBOb25FbXB0eUFycmF5PFQ+ID0+IHtcbiAgICAgICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDA7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBuZXZlckNoZWNrID0gKGFyZ3M6IG5ldmVyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiT09QUzogVGhpcyB2YWx1ZSBzbGlwcGVkIHRocm91Z2ggdGhlIG5ldmVyLWNoZWNrXCIsIGFyZ3MpO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNTdHJpbmcgPSAoc3RyOiB1bmtub3duKTogc3RyIGlzIHN0cmluZyA9PiB0eXBlb2Ygc3RyID09PSBcInN0cmluZ1wiO1xuXG4gICAgZXhwb3J0IGNvbnN0IGhhc0tleSA9IDxUIGV4dGVuZHMgc3RyaW5nPihvYmo6IHVua25vd24sIGtleTogVCk6IG9iaiBpcyBSZWNvcmQ8dHlwZW9mIGtleSwgdW5rbm93bj4gPT4ge1xuICAgICAgICBpZiAoIWlzUmVjb3JkKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzUmVjb3JkID0gKG9iajogdW5rbm93bik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNCb29sID0gKG9iajogYm9vbGVhbik6IG9iaiBpcyBib29sZWFuID0+IHR5cGVvZiBvYmogPT09IFwiYm9vbGVhblwiO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzVHJ1ZSA9IChib29sOiBib29sZWFuKTogYm9vbCBpcyB0cnVlID0+IGJvb2wgPT09IHRydWU7XG5cbiAgICBleHBvcnQgY29uc3QgaXNGYWxzZSA9IChib29sOiBib29sZWFuKTogYm9vbCBpcyBmYWxzZSA9PiBib29sID09PSBmYWxzZTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0RlZmluZWQgPSAob2JqOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IG5vdE51bGwgPSBvYmogIT09IG51bGw7XG4gICAgICAgIGNvbnN0IG5vdFVuZGVmaW5lZCA9IG9iaiAhPT0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbm90TnVsbCAmJiBub3RVbmRlZmluZWQ7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBoYXNLaW5kID0gKG9iajogdW5rbm93bik6IG9iaiBpcyB7IHJlYWRvbmx5IGtpbmQ6IHN0cmluZyB9ID0+IHtcbiAgICAgICAgaWYgKCFoYXNLZXkob2JqLCBcImtpbmRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9iai5raW5kICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iai5raW5kLmxlbmd0aCA+IDA7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBoYXNWYWx1ZSA9IChvYmo6IHVua25vd24pOiBvYmogaXMgeyB2YWx1ZTogdW5rbm93biB9ID0+IHtcbiAgICAgICAgcmV0dXJuIGhhc0tleShvYmosIFwidmFsdWVcIik7XG4gICAgfTtcbiAgICBleHBvcnQgY29uc3QgaXNOdW1iZXIgPSAodmFsdWU/OiBudW1iZXIpOiB2YWx1ZSBpcyBudW1iZXIgPT4ge1xuICAgICAgICBjb25zdCBpc051bWJlciA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcbiAgICAgICAgY29uc3Qgbm90TmFOID0gIU51bWJlci5pc05hTih2YWx1ZSk7XG4gICAgICAgIHJldHVybiBpc051bWJlciAmJiBub3ROYU47XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBtYXhGbiA9ICh1cHBlckxpbWl0OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odmFsdWUsIHVwcGVyTGltaXQpO1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgbWluRm4gPSAobG93ZXJMaW1pdDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlLCBsb3dlckxpbWl0KTtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgRENzcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBQeCB7XG4gICAgICAgIHJlYWRvbmx5IF91bml0OiBcInB4XCI7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgTGVuZ3RoU3RyaW5nID0gYCR7bnVtYmVyfXB4YCB8IGAke251bWJlcn0lYDtcbiAgICBleHBvcnQgaW50ZXJmYWNlIFBlcmNlbnQge1xuICAgICAgICByZWFkb25seSBfdW5pdDogXCJwZXJjZW50XCI7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgTGVuZ3RoVW5pdCA9IFB4IHwgUGVyY2VudDtcblxuICAgIC8qKlxuICAgICAqIFdpbGwgc2NhbGUgdG8gMyUgb2YgYmFzZVNjYWxlXG4gICAgICogQHBhcmFtIHVuaXRcbiAgICAgKiBAcGFyYW0gc2NhbGVcbiAgICAgKi9cbiAgICBleHBvcnQgY29uc3QgdG9TdHJpbmcgPSAodW5pdDogUmVhZG9ubHk8TGVuZ3RoVW5pdD4sIHNjYWxlOiBudW1iZXIpOiBMZW5ndGhTdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBjbGFtcGVkU2NhbGUgPSBNYXRoLm1heChzY2FsZSwgMC4wMyk7XG4gICAgICAgIGlmICh1bml0Ll91bml0ID09PSBcInB4XCIpIHtcbiAgICAgICAgICAgIGlmICh1bml0LnZhbHVlIDwgMC4xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiMHB4XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvdW5kZWQgPSBNYXRoLnJvdW5kKHVuaXQudmFsdWUgKiBjbGFtcGVkU2NhbGUpO1xuICAgICAgICAgICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KHJvdW5kZWQsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIChjbGFtcGVkICsgXCJweFwiKSBhcyBMZW5ndGhTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh1bml0LnZhbHVlICsgXCIlXCIpIGFzIExlbmd0aFN0cmluZztcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzTGVuZ3RoVW5pdCA9ICh1bml0PzogTGVuZ3RoVW5pdCk6IHVuaXQgaXMgTGVuZ3RoVW5pdCA9PiB7XG4gICAgICAgIGlmICghdW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVuaXRLZXk6IGtleW9mIExlbmd0aFVuaXQgPSBcIl91bml0XCI7XG4gICAgICAgIGNvbnN0IHZhbHVlS2V5OiBrZXlvZiBMZW5ndGhVbml0ID0gXCJ2YWx1ZVwiO1xuICAgICAgICBjb25zdCBoYXNVbml0S2V5ID0gRFV0aWwuaGFzS2V5KHVuaXQsIHVuaXRLZXkpO1xuICAgICAgICBjb25zdCBoYXNWYWx1ZUtleSA9IERVdGlsLmhhc0tleSh1bml0LCB2YWx1ZUtleSk7XG4gICAgICAgIHJldHVybiBoYXNVbml0S2V5ICYmIGhhc1ZhbHVlS2V5O1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgRENzcyB9IGZyb20gXCIuL2Nzc1wiO1xuaW1wb3J0IHsgRWxlbWVudEtleU5hbWVzIH0gZnJvbSBcIi4vRFN0eWxlLXV0aWxzXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG50eXBlIERTdHlsZTIgPSBDU1NTdHlsZURlY2xhcmF0aW9uO1xuZXhwb3J0IGludGVyZmFjZSBEU3R5bGUge1xuICAgIG9wYWNpdHk6IG51bWJlcjtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICB2aXNpYmlsaXR5OiBcInZpc2libGVcIiB8IFwiaGlkZGVuXCI7XG4gICAgY3Vyc29yOlxuICAgICAgICB8IFwicG9pbnRlclwiXG4gICAgICAgIHwgXCJoZWxwXCJcbiAgICAgICAgfCBcImNvcHlcIlxuICAgICAgICB8IFwid2FpdFwiXG4gICAgICAgIHwgXCJub3QtYWxsb3dlZFwiXG4gICAgICAgIHwgXCJjb250ZXh0LW1lbnVcIlxuICAgICAgICB8IFwibW92ZVwiXG4gICAgICAgIHwgXCJncmFiYmluZ1wiXG4gICAgICAgIHwgXCJncmFiXCJcbiAgICAgICAgfCBcInpvb20taW5cIlxuICAgICAgICB8IFwiem9vbS1vdXRcIlxuICAgICAgICB8IFwibm9uZVwiXG4gICAgICAgIHwgXCJhdXRvXCJcbiAgICAgICAgfCBcImRlZmF1bHRcIjtcblxuICAgIC8vIFBPU0lUSU9OXG4gICAgaDogbnVtYmVyO1xuICAgIHc6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuXG4gICAgLy8gQk9SREVSU1xuICAgIGJvcmRlclN0eWxlOiBcInNvbGlkXCIgfCBcIm5vbmVcIiB8IFwiZG90dGVkXCIgfCBcImRhc2hlZFwiO1xuICAgIGJvcmRlclJhZGl1czogRENzcy5QeCB8IERDc3MuUGVyY2VudDtcbiAgICBib3JkZXJXaWR0aDogRENzcy5QeDtcbiAgICBib3JkZXJDb2xvcjogc3RyaW5nO1xuXG4gICAgbWFyZ2luOiBEQ3NzLlB4IHwgRENzcy5QZXJjZW50O1xuICAgIHBhZGRpbmc6IERDc3MuUHggfCBEQ3NzLlBlcmNlbnQ7XG5cbiAgICAvLyBUcmFuc2xhdGVcbiAgICB0cmFuc2Zvcm06IHN0cmluZztcbiAgICB0cmFuc2xhdGU6IHN0cmluZztcblxuICAgIC8vIFRFWFRcbiAgICBmb250U2l6ZTogRENzcy5QeDtcbiAgICB0ZXh0Q29sb3I6IHN0cmluZztcbiAgICBmb250V2VpZ2h0OiAxMDAgfCAyMDAgfCAzMDAgfCA0MDAgfCA1MDAgfCA2MDAgfCA3MDAgfCA4MDAgfCA5MDA7XG4gICAgdGV4dEFsaWduOiBcInJpZ2h0XCIgfCBcImxlZnRcIiB8IFwiY2VudGVyXCI7XG4gICAgbGV0dGVyU3BhY2luZzogRENzcy5QeDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBEU3R5bGUge1xuICAgIGV4cG9ydCBjb25zdCBub3JtYWxpemUgPSA8VCBleHRlbmRzIEhUTUxFbGVtZW50PihlbDogVCk6IFQgPT4ge1xuICAgICAgICBlbC5zdHlsZS5wYWRkaW5nID0gXCIwXCI7XG4gICAgICAgIGVsLnN0eWxlLm1hcmdpbiA9IFwiMFwiO1xuICAgICAgICBlbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgZWwuc3R5bGUuYm94U2l6aW5nID0gXCJib3JkZXItYm94XCI7XG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzID0gPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oZWw6IFQsIHN0eWxlOiBQYXJ0aWFsPERTdHlsZT4sIHNjYWxlOiBudW1iZXIpOiBUID0+IHtcbiAgICAgICAgLy8gY29uc3Qgc2NhbGVQeCA9IERDc3MudG9TdHJpbmdDcmUodGhpcy5zY2FsZSk7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aCxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1cyxcbiAgICAgICAgICAgIGJvcmRlclN0eWxlLFxuICAgICAgICAgICAgdyxcbiAgICAgICAgICAgIG9wYWNpdHksXG4gICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQsXG4gICAgICAgICAgICB0ZXh0Q29sb3IsXG4gICAgICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgICAgICB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtYXJnaW4sXG4gICAgICAgICAgICBwYWRkaW5nLFxuICAgICAgICAgICAgbGV0dGVyU3BhY2luZyxcbiAgICAgICAgICAgIGgsXG4gICAgICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgICAgICB2aXNpYmlsaXR5LFxuICAgICAgICB9ID0gc3R5bGU7XG5cbiAgICAgICAgLy8gdGhpcy5lbC5zdHlsZS5mb250V2VpZ2h0ID0gJzkwMCc7XG4gICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmNvbG9yID0gdGV4dENvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0QWxpZ24pIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnRleHRBbGlnbiA9IHRleHRBbGlnbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3JkZXJDb2xvcikge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyQ29sb3IgPSBib3JkZXJDb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3JkZXJXaWR0aCkge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyV2lkdGggPSBEQ3NzLnRvU3RyaW5nKGJvcmRlcldpZHRoLCBzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvbnRXZWlnaHQpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmZvbnRXZWlnaHQgPSBmb250V2VpZ2h0ICsgXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm9yZGVyU3R5bGUpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlclN0eWxlID0gYm9yZGVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvbnRTaXplKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5mb250U2l6ZSA9IERDc3MudG9TdHJpbmcoZm9udFNpemUsIHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcih4KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUubGVmdCA9IHggKyBcIiVcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIoeSkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvdHRvbSA9IHkgKyBcIiVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcihoKSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gaCArIFwiJVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcih3KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUud2lkdGggPSB3ICsgXCIlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRENzcy5pc0xlbmd0aFVuaXQoYm9yZGVyUmFkaXVzKSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyUmFkaXVzID0gRENzcy50b1N0cmluZyhib3JkZXJSYWRpdXMsIHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZXR0ZXJTcGFjaW5nKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5sZXR0ZXJTcGFjaW5nID0gRENzcy50b1N0cmluZyhsZXR0ZXJTcGFjaW5nLCBzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcmdpbikge1xuICAgICAgICAgICAgZWwuc3R5bGUubWFyZ2luID0gRENzcy50b1N0cmluZyhtYXJnaW4sIHNjYWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGluZykge1xuICAgICAgICAgICAgZWwuc3R5bGUucGFkZGluZyA9IERDc3MudG9TdHJpbmcocGFkZGluZywgc2NhbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERVdGlsLmlzTnVtYmVyKG9wYWNpdHkpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eSArIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgZWwuc3R5bGUudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcbiAgICAvLyBjb25zdCBwcm9wTmFtZXMgPSBuZXcgU2V0KC4uLkVsZW1lbnRLZXlOYW1lcyk7XG4gICAgLy8gZXhwb3J0IGNvbnN0IHZhbGlkS2V5ID0gKGtleU5hbWU6IHN0cmluZykgPT4gcHJvcE5hbWVzLmhhcyhrZXlOYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBEVmlkZW9EdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgREV2ZW50RGlzcGF0Y2hlciB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBEU3R5bGUgfSBmcm9tIFwiLi9EU3R5bGVcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmNvbnN0IEFCT1JUX1BMQVlfVE9fRU5EID0gXCJBQk9SVF9QTEFZX1RPX0VORFwiO1xuZXhwb3J0IGludGVyZmFjZSBDYW5QbGF5VG9FbmQge1xuICAgIHBsYXlUb0VuZCgpOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG5leHBvcnQgY2xhc3MgVmlkZW9Db250YWluZXIgaW1wbGVtZW50cyBDYW5QbGF5VG9FbmQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkdG8/OiBEVmlkZW9EdG87XG4gICAgcHJpdmF0ZSBkZWZhdWx0U3R5bGVzOiBQYXJ0aWFsPERTdHlsZT4gPSB7IGg6IDQ1LCB3OiAxMDAsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIHk6IDU1IH07XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fUEFVU0VEX0VWRU5UXCIsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWwucGF1c2UoKTtcbiAgICB9XG5cbiAgICBwbGF5KHVybDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmVsLnNyYyAhPT0gdXJsKSB7XG4gICAgICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9kdWNlcklkID0gdGhpcy5kdG8/LmlkID8/IFwiRFZpZGVvXCI7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIlZJREVPX1BMQVlfRVZFTlRcIixcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFZpZGVvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgLnBsYXkoKVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYodGhpcy5lbC5zcmMgIT09IHVybCkge1xuICAgICAgICAvLyAgICAgdGhpcy5cbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIGFzeW5jIHBsYXlUb0VuZCgpIHtcbiAgICAgICAgdGhpcy5lbC52b2x1bWUgPSAxO1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmR0bz8udXJsO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVuZGVkT3JFcnJvcmVkID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxuICAgICAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIEFCT1JUX1BMQVlfVE9fRU5ELFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNBVENIRUQgQUJCT1JULlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChcIkFib3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQTEFZXCIpO1xuICAgICAgICAgICAgdGhpcy5wbGF5KHVybCk7XG4gICAgICAgICAgICBhd2FpdCBlbmRlZE9yRXJyb3JlZDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCIgZmluYWxseSBibG9jayBwbGF5VG9FbmQoKSBjb21wbGV0ZWQgdmlkZW9JZDogXCIgKyB0aGlzLmR0bz8uaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZWw6IEhUTUxWaWRlb0VsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IERFdmVudERpc3BhdGNoZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IFNjYWxlU2VydmljZSAvLyBkdG8/OiBEVmlkZW9EdG9cbiAgICApIHtcbiAgICAgICAgdGhpcy5UQUcgPSBcIlsgRF9WaWRlbyBdIDogXCI7XG4gICAgICAgIHRoaXMuZWwuY29udHJvbHMgPSBmYWxzZTtcbiAgICAgICAgRFN0eWxlLm5vcm1hbGl6ZSh0aGlzLmVsKTtcbiAgICAgICAgRFN0eWxlLmFwcGx5U3R5bGVzKHRoaXMuZWwsIHRoaXMuZGVmYXVsdFN0eWxlcywgdGhpcy5zY2FsZS5zY2FsZSk7XG5cbiAgICAgICAgdGhpcy5lbC5vbmVuZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlZJREVPX0VOREVEX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbC5vbnBsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBUT0RPIExPR0cgSU5URVJOQUwgU1RBVEVfQ0hBTkdFUy5cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmVsLm9ucGF1c2UgPSAoKSA9PiB7fTtcbiAgICAgICAgdGhpcy5lbC5vbmVycm9yID0gKCkgPT4ge307XG4gICAgICAgIHRoaXMuZWwub25jYW5wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cENvbGxhcHNlZCh0aGlzLlRBRyArIFwiUkVBRFkgVE8gUExBWVwiKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRHVyYXRpb246IFwiICsgdGhpcy5lbC5kdXJhdGlvbik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIklkOiBcIiArIHRoaXMuaWQpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDdXJyZW50IFRpbWU6IFwiICsgdGhpcy5lbC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkF1ZG9QbGF5OiBcIiArIHRoaXMuZWwuYXV0b3BsYXkpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVsLm9ubG9hZGVkbWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgICAgICBjb25zdCBpc0luZmluaXR5ID0gRFV0aWwuaXNJbmZpbml0eShkdXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fTE9BREVEX01FVEFEQVRBX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBkdXJhdGlvbiwgaXNJbmZpbml0eSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRPRE8gVVNFIFRISVMgU1lOVEFYP1xuICAgICAgICB0aGlzLmVsLm9uZHVyYXRpb25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgICAgICBjb25zdCBpc0luZmluaXR5ID0gRFV0aWwuaXNJbmZpbml0eShkdXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fRFVSQVRJT05fQ0hBTkdFX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFZpZGVvXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgZGF0YTogeyBkdXJhdGlvbiwgaXNJbmZpbml0eSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U3RhdHMoKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5lbC5kdXJhdGlvbjtcbiAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLmVsLmN1cnJlbnRUaW1lO1xuICAgICAgICBjb25zdCB2b2x1bWUgPSB0aGlzLmVsLnZvbHVtZTtcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQgPSB0aGlzLmVsLmlzQ29ubmVjdGVkO1xuICAgICAgICBjb25zdCBwbGF5YmFja1F1YWxpdHkgPSB0aGlzLmVsLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5KCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQbGF5YmFja1JhdGUgPSB0aGlzLmVsLmRlZmF1bHRQbGF5YmFja1JhdGU7XG4gICAgICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMuZWwucGF1c2VkO1xuICAgICAgICBjb25zdCBwbGF5ZWQgPSB0aGlzLmVsLnBsYXllZDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBwYXVzZWQsXG4gICAgICAgICAgICBwbGF5ZWQsXG4gICAgICAgICAgICBjdXJyZW50VGltZSxcbiAgICAgICAgICAgIHZvbHVtZSxcbiAgICAgICAgICAgIGlzQ29ubmVjdGVkLFxuICAgICAgICAgICAgcGxheWJhY2tRdWFsaXR5LFxuICAgICAgICAgICAgZGVmYXVsdFBsYXliYWNrUmF0ZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXREdG8oZHRvOiBEVmlkZW9EdG8pIHtcbiAgICAgICAgdGhpcy5kdG8gPSBkdG87XG4gICAgICAgIHRoaXMuZWwudm9sdW1lID0gMTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShkdG8uc3R5bGUpO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IGR0by51cmw7XG4gICAgICAgIHRoaXMuZWwubG9hZCgpO1xuICAgIH1cblxuICAgIGdldEN1cnJlbnREdG8oKTogRFZpZGVvRHRvIHwgZmFsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5kdG8gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGVzOiBQYXJ0aWFsPERTdHlsZT4pIHtcbiAgICAgICAgRFN0eWxlLmFwcGx5U3R5bGVzKHRoaXMuZWwsIHN0eWxlcywgdGhpcy5zY2FsZS5zY2FsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmR0bz8uaWQgPz8gXCJEVmlkZW9cIjtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge31cbn1cbiIsICJpbXBvcnQgeyBDYW5QbGF5VG9FbmQgfSBmcm9tIFwiLi9WaWRlb0NvbnRhaW5lclwiO1xuaW1wb3J0IHsgREF1ZGlvRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9Db250YWluZXIgaW1wbGVtZW50cyBDYW5QbGF5VG9FbmQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIERBdWRpbyBdOiBcIjtcbiAgICBwcm90ZWN0ZWQgZHRvOiBEQXVkaW9EdG8gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGVsOiBIVE1MQXVkaW9FbGVtZW50O1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IERFdmVudERpc3BhdGNoZXIpIHtcbiAgICAgICAgdGhpcy5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhdWRpb1wiKTtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgLy8gdGhpcy5lbC5vblxuICAgICAgICB0aGlzLm9uTG9hZCA9IHRoaXMub25Mb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25sb2FkID0gdGhpcy5vbkxvYWQ7XG4gICAgICAgIHRoaXMub25Mb2FkZWRNZXRhZGF0YSA9IHRoaXMub25Mb2FkZWRNZXRhZGF0YS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubG9hZGVkbWV0YWRhdGEgPSB0aGlzLm9uTG9hZGVkTWV0YWRhdGE7XG4gICAgICAgIHRoaXMuZWwub25wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uQ2FuUGxheVRocm91Z2ggPSB0aGlzLm9uQ2FuUGxheVRocm91Z2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmNhbnBsYXl0aHJvdWdoID0gdGhpcy5vbkNhblBsYXlUaHJvdWdoO1xuICAgICAgICB0aGlzLmVsLm9uZW5kZWQgPSAoXykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5lbC5zcmM7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fRU5ERURfRVZFTlRcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7IHVybCB9LFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWwub25kdXJhdGlvbmNoYW5nZSA9IChfOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNJbmZpbml0eSA9IGR1cmF0aW9uID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fRFVSQVRJT05fQ0hBTkdFX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBkdXJhdGlvbjogdGhpcy5lbC5kdXJhdGlvbiwgaXNJbmZpbml0eSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0QXVkaW8oZHRvOiBEQXVkaW9EdG8pIHtcbiAgICAgICAgdGhpcy5kdG8gPSBkdG87XG4gICAgICAgIHRoaXMuZWwuc3JjID0gZHRvLnVybDtcbiAgICAgICAgdGhpcy5lbC5sb2FkKCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZWwucGF1c2UoKTtcbiAgICAgICAgICAgIHRoaXMuZWwuc3JjID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuZWwubG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhdXNlKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lbC5wYXVzZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBUT0RPIEVNSVQgRVJST1IgRVZFTlQuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBsYXkodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuZWwuc3JjICE9PSB1cmwpIHtcbiAgICAgICAgICAgIHRoaXMuZWwuc3JjID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX1BMQVlfRVZFTlRcIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgLnBsYXkoKVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkxvYWRlZE1ldGFkYXRhKF86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX01FVEFEQVRBX0xPQURFRF9FVkVOVFwiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uTG9hZChfOiBFdmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19MT0FEX0VWRU5UXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgZXZlbnQudHlwZSk7XG4gICAgfVxuXG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kdG8/LmlkID8/IFwiREF1ZGlvXCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNhblBsYXlUaHJvdWdoKF86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX0NBTl9QTEFZX1RIUk9VR0hfRVZFTlRcIixcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIG9uUGxheShfOiBFdmVudCkge31cblxuICAgIGFzeW5jIHBsYXlUb0VuZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5kZWRPckVycm9yZWQgPSBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgIFwiZW5kZWRcIixcbiAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBsYXkodGhpcy5lbC5zcmMpO1xuICAgICAgICAgICAgYXdhaXQgZW5kZWRPckVycm9yZWQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVE9ETyBMRVQgUEFSRU5UIERFQUwgV0lUSCBFUlJPUlM/IFRIRSBNQU5BR0VSPz8gTUFOQUdFUlMgQ0FMTCBBQk9SVC5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIkFVRElPX0VSUk9SX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBlcnJvcjogZSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUGFnZUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5pbXBvcnQgeyBWaWRlb0NvbnRhaW5lciB9IGZyb20gXCIuLi9EZWxlbWVudC9WaWRlb0NvbnRhaW5lclwiO1xuaW1wb3J0IHsgQXVkaW9Db250YWluZXIgfSBmcm9tIFwiLi4vRGVsZW1lbnQvQXVkaW9Db250YWluZXJcIjtcbmltcG9ydCB7IEF1dG9QbGF5RWxlbWVudCwgREF1dG9QbGF5U2VxdWVuY2UgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREF1dG8tcGxheVwiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IERDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVByb3ZpZGVyIH0gZnJvbSBcIi4vcmVzb3VyY2UtcHJvdmlkZXJcIjtcbmltcG9ydCB7IEF1dG9wbGF5VGFzaywgU2VxdWVuY2VNYW5hZ2VyIH0gZnJvbSBcIi4vc2VxdWVuY2UtbWFuYWdlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNZWRpYU1hbmFnZXIge1xuICBzZXRQYWdlKHBhZ2U6IFBhZ2VEdG8pOiB2b2lkO1xuICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBETWVkaWFNYW5hZ2VyIGltcGxlbWVudHMgSU1lZGlhTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIElOU1RBTkNFX0NPVU5UID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZU51bWJlcjogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBNRURJQV9NQU5BR0VSIF0gOiBcIjtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWRlb0NvbnRhaW5lcjogVmlkZW9Db250YWluZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXVkaW9Db250YWluZXI6IEF1ZGlvQ29udGFpbmVyO1xuICBwcml2YXRlIHBhZ2VFbnRlcjogRFRpbWVzdGFtcDtcbiAgcHJpdmF0ZSBzaW5jZVBhZ2VFbnRlcjogRFRpbWVzdGFtcC5EaWZmO1xuICBwcml2YXRlIGN1cnJlbnRQYWdlOiBQYWdlRHRvIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmVDb21tYW5kczogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSB0aWNrZXJSZWY6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXF1ZW5jZU1hbmFnZXI6IFNlcXVlbmNlTWFuYWdlciB8IGZhbHNlID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaG9zdEVsOiBIVE1MRGl2RWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VQcm92aWRlcjogUmVzb3VyY2VQcm92aWRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2UsXG4gICkge1xuICAgIERNZWRpYU1hbmFnZXIuSU5TVEFOQ0VfQ09VTlQgPSBETWVkaWFNYW5hZ2VyLklOU1RBTkNFX0NPVU5UICsgMTtcbiAgICB0aGlzLmluc3RhbmNlTnVtYmVyID0gRE1lZGlhTWFuYWdlci5JTlNUQU5DRV9DT1VOVDtcbiAgICBjb25zdCB2aWRlb0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO1xuICAgIHRoaXMuaG9zdEVsLmFwcGVuZCh2aWRlb0VsKTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyID0gbmV3IFZpZGVvQ29udGFpbmVyKHZpZGVvRWwsIGV2ZW50QnVzLCB0aGlzLnNjYWxlKTtcbiAgICB0aGlzLmF1ZGlvQ29udGFpbmVyID0gbmV3IEF1ZGlvQ29udGFpbmVyKHRoaXMuZXZlbnRCdXMpO1xuICAgIHRoaXMudGljayA9IHRoaXMudGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0U3R5bGUoeyB2aXNpYmlsaXR5OiBcImhpZGRlblwiIH0pO1xuICAgIGNvbnN0IG5vdyA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgdGhpcy5wYWdlRW50ZXIgPSBub3c7XG4gICAgdGhpcy5zaW5jZVBhZ2VFbnRlciA9IERUaW1lc3RhbXAuZGlmZihub3csIG5vdyk7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvbW1hbmRzID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoYWN0aW9uKSA9PiB7XG4gICAgICB0aGlzLmNvbW1hbmRIYW5kbGVyKGFjdGlvbik7XG4gICAgfSwgdGhpcy5UQUcpO1xuXG4gICAgdGhpcy50aWNrZXJSZWYgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge30sIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYWxsIG1lZGlhIHRoYXQgaXMgcGxheWluZ1xuICAgKi9cbiAgY2xlYXJBbGxNZWRpYSgpIHtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnBhdXNlKCk7XG4gICAgdGhpcy5hdWRpb0NvbnRhaW5lci5wYXVzZSgpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgY29uc29sZS5sb2coXCJUT0RPIERFU1RST1kgQUxMIE1FRElBXCIpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcygpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudGlja2VyUmVmKTtcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnRpY2tlclJlZik7XG4gICAgdGhpcy5hdWRpb0NvbnRhaW5lci5kZXN0cm95KCk7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lci5kZXN0cm95KCk7XG4gIH1cblxuICBzZXRQYWdlKHBhZ2U6IFBhZ2VEdG8pIHtcbiAgICAvLyBUT0RPIFNUT1AgVklERU8vQVVESU8gVEhBVCBNSUdIVCBCRSBQTEFZSU5HIElOIFRIRSBET00/P1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIucGF1c2UoKTtcbiAgICB0aGlzLnBhZ2VFbnRlciA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgLy8gVE9ETyBUSGlzIG1pZ2h0IGJlIGEgYnVnIGlmIHNvbWVvbmVcblxuICAgIGNvbnN0IHNlcSA9IHBhZ2UuYXV0b1BsYXlTZXF1ZW5jZTtcbiAgICAvLyB0aGlzLnNlcXVlbmNlID0gc2VxID8gWy4uLnNlcS5pdGVtc10gOiBbXTtcbiAgICBjb25zdCB7IG1haW5WaWRlb0lkLCBhdWRpbyB9ID0gcGFnZTtcbiAgICBjb25zdCBhdWRpb0VsZW1lbnRzID0gcGFnZS5hdWRpbztcblxuICAgIGlmIChtYWluVmlkZW9JZCkge1xuICAgICAgY29uc3QgZHRvID0gdGhpcy5yZXNvdXJjZVByb3ZpZGVyLmdldFZpZGVvQnlJZChtYWluVmlkZW9JZCk7XG4gICAgICBpZiAoZHRvKSB7XG4gICAgICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0RHRvKGR0byk7XG4gICAgICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0U3R5bGUoeyAuLi5kdG8uc3R5bGUsIHZpc2liaWxpdHk6IFwidmlzaWJsZVwiIH0pO1xuICAgICAgfVxuICAgICAgLy8gdGhpcy52aWRlb0NvbnRhaW5lci5wbGF5VG9FbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5zZXRTdHlsZSh7IHZpc2liaWxpdHk6IFwiaGlkZGVuXCIgfSk7XG4gICAgICAvLyBISURFP1xuICAgIH1cbiAgICBpZiAoYXVkaW9FbGVtZW50cykge1xuICAgICAgY29uc3QgZmlyc3QgPSBhdWRpb0VsZW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgIHRoaXMuYXVkaW9Db250YWluZXIuc2V0QXVkaW8oZmlyc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VxKSB7XG4gICAgICB0aGlzLnBsYXlTZXF1ZW5jZShzZXEpO1xuICAgIH1cbiAgICAvLyBjb25zdCBoYXNWaWRlbyA9XG4gIH1cblxuICBwcml2YXRlIGNvbW1hbmRIYW5kbGVyKGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJWSURFT19QTEFZX0NPTU1BTkRcIikge1xuICAgICAgY29uc3QgdmlkZW8gPSBjb21tYW5kLnRhcmdldElkO1xuICAgICAgY29uc3QgZHRvID0gdGhpcy52aWRlb0NvbnRhaW5lci5nZXRDdXJyZW50RHRvKCk7XG5cbiAgICAgIGlmIChkdG8gJiYgZHRvLmlkID09PSBjb21tYW5kLnRhcmdldElkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHZpZGVvKTtcbiAgICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5wbGF5KGR0by51cmwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIlZJREVPX1BBVVNFX0NPTU1BTkRcIikge1xuICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5wYXVzZSgpO1xuICAgIH1cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIkFVRElPX1BMQVlfQ09NTUFORFwiKSB7XG4gICAgICB0aGlzLmF1ZGlvQ29udGFpbmVyXG4gICAgICAgIC5wbGF5VG9FbmQoKVxuICAgICAgICAudGhlbigoKSA9PiB7fSlcbiAgICAgICAgLmNhdGNoKClcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge30pO1xuICAgIH1cblxuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiQVVESU9fUEFVU0VfQ09NTUFORFwiKSB7XG4gICAgICAvLyB0aGlzLmF1ZGlvQ29udGFpbmVyLlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGxheVNlcXVlbmNlKHNlcTogREF1dG9QbGF5U2VxdWVuY2UpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiU0VRVUVOQ0UgU1RBUlRFRCAtLSBUT0RPIEVWRU5UIEZPUiBUSElTPz9cIik7XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IHNlcS5pdGVtcztcbiAgICBjb25zdCB0ZXN0Q2xvbmUgPSBbLi4uZWxlbWVudHNdO1xuICAgIGNvbnN0IGZpcnN0ID0gdGVzdENsb25lLnBvcCgpO1xuXG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIHNlcS5zdGFydENvbW1hbmRzLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGMpO1xuICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoYyk7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmVtaXQoRFN0YXRlUHJvcHMubWVkaWFCbG9ja2VkQnlTZXF1ZW5jZS5zZXRUcnVlQ29tbWFuZCk7XG4gICAgLy8gaWYgKHNlcS5ibG9ja1VzZXJJbnB1dCkge1xuICAgIC8vICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChEU3RhdGVQcm9wcy5pbnB1dEJsb2NraW5nQnlTZXF1ZW5jZS5nZXRTZXRUcnVlQ29tbWFuZCgpKTtcbiAgICAvLyB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJhdXRvcGxheS12aWRlb1wiKSB7XG4gICAgICAgIGNvbnN0IGR0byA9IHRoaXMucmVzb3VyY2VQcm92aWRlci5nZXRWaWRlb0J5SWQoaXRlbS52aWRlb0lkKTtcbiAgICAgICAgaWYgKGR0bykgdGhpcy52aWRlb0NvbnRhaW5lci5zZXREdG8oZHRvKTtcbiAgICAgICAgYXdhaXQgdGhpcy52aWRlb0NvbnRhaW5lci5wbGF5VG9FbmQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmtpbmQgPT09IFwiYXV0b3BsYXktYXVkaW9cIikge1xuICAgICAgICBjb25zb2xlLmxvZyhpdGVtKTtcbiAgICAgICAgY29uc3QgZHRvID0gdGhpcy5yZXNvdXJjZVByb3ZpZGVyLmdldEF1ZGlvQnlJZChpdGVtLmF1ZGlvSWQpO1xuICAgICAgICBpZiAoZHRvKSB0aGlzLmF1ZGlvQ29udGFpbmVyLnNldEF1ZGlvKGR0byk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXVkaW9Db250YWluZXIucGxheVRvRW5kKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHNlcS5lbmRDb21tYW5kcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjKTtcbiAgICB9KTtcbiAgICAvLyB0aGlzLmFjdGlvblNlcnZpY2UuZW1pdChEU3RhdGVQcm9wcy5tZWRpYUJsb2NrZWRCeVNlcXVlbmNlLnNldEZhbHNlQ29tbWFuZCk7XG4gICAgLy8gdGhpcy5hY3Rpb25TZXJ2aWNlLmVtaXQoRFN0YXRlUHJvcHMuaW5wdXRCbG9ja2luZ0J5U2VxdWVuY2Uuc2V0RmFsc2VDb21tYW5kKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiU0VRVUVOQ0UgRU5ERURcIik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBzZXRQYWdlKClcblxuICBwcml2YXRlIHRpY2soKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy52aWRlbzEuZ2V0U3RhdHMoKSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBEQ29tbWFuZCB9IGZyb20gXCIuL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRENvbW1hbmRTdG9yZSB7XG4gIHN1YnNjcmliZShjYWxsYmFjazogKCkgPT4gdm9pZCwgc3Vic2NyaWJlcklkOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERDb21tYW5kRGlzcGF0Y2hlciB7XG4gIGVtaXQoY29tbWFuZDogRENvbW1hbmQpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgQ29tbWFuZFN1YnNjcmliZXJEYXRhIHtcbiAgcmVhZG9ubHkgc3Vic2NyaWJlcklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNhbGxiYWNrOiAoY29tbWFuZDogRENvbW1hbmQpID0+IHZvaWQ7XG59XG5leHBvcnQgY2xhc3MgRENvbW1hbmRCdXMgaW1wbGVtZW50cyBEQ29tbWFuZFN0b3JlLCBEQ29tbWFuZERpc3BhdGNoZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBDT01NQU5EX0JVUyBdIFwiO1xuICBsb2dDb21tYW5kcyA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRMb2c6IEFycmF5PERDb21tYW5kICYgeyB0aW1lc3RhbXA6IERUaW1lc3RhbXAgfT4gPSBbXTtcbiAgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PENvbW1hbmRTdWJzY3JpYmVyRGF0YT4oKTtcbiAgLy8gcmVhZG9ubHkgc3ViXG5cbiAgc3Vic2NyaWJlKGNiOiAoY29tbWFuZDogRENvbW1hbmQpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ViOiBDb21tYW5kU3Vic2NyaWJlckRhdGEgPSB7XG4gICAgICBzdWJzY3JpYmVySWQsXG4gICAgICBjYWxsYmFjazogY2IsXG4gICAgfTtcblxuICAgIHRoaXMuc3Vic2NyaWJlcnMuYWRkKHN1Yik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZGVsZXRlKHN1Yik7XG4gICAgfTtcbiAgfVxuXG4gIGVtaXQoY29tbWFuZDogRENvbW1hbmQpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIHRoaXMuY29tbWFuZExvZy5wdXNoKHsgLi4uY29tbWFuZCwgdGltZXN0YW1wIH0pO1xuICAgIGlmICh0aGlzLmxvZ0NvbW1hbmRzKSB7XG4gICAgICB0aGlzLmxvZ0NvbW1hbmQoY29tbWFuZCk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgc3Vic2NyaWJlci5jYWxsYmFjayhjb21tYW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFN0YXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb21tYW5kczogWy4uLnRoaXMuY29tbWFuZExvZ10sXG4gICAgICBzdWJzY3JpYmVyczogWy4uLnRoaXMuc3Vic2NyaWJlcnNdLFxuICAgICAgc3Vic2NyaWJlcnNDb3VudDogdGhpcy5zdWJzY3JpYmVycy5zaXplLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxvZ0NvbW1hbmQoY29tbWFuZDogRENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKHRoaXMuVEFHICsgXCIgXCIgKyBjb21tYW5kLmtpbmQpO1xuICAgIGNvbnNvbGUubG9nKFwiVGFyZ2V0SUQgOiBcIiArIGNvbW1hbmQudGFyZ2V0SWQpO1xuICAgIGNvbnNvbGUubG9nKGNvbW1hbmQucGF5bG9hZCk7XG4gICAgY29uc29sZS5ncm91cEVuZCgpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgREV2ZW50IH0gZnJvbSBcIi4vREV2ZW50c1wiO1xuXG5pbnRlcmZhY2UgU3Vic2NyaWJlckRhdGEge1xuICAgIHJlYWRvbmx5IHN1YnNjcmliZXJJZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNiOiAoZXZlbnQ6IERFdmVudCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBERXZlbnRTdG9yZSB7XG4gICAgc3Vic2NyaWJlKGNiOiAoZXZlbnQ6IERFdmVudCkgPT4gdm9pZCwgc3Vic2NyaWJlcklkOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERFdmVudERpc3BhdGNoZXIge1xuICAgIGVtaXQoZXZlbnQ6IERFdmVudCk6IHZvaWQ7XG59XG5leHBvcnQgY2xhc3MgRXZlbnRCdXMgaW1wbGVtZW50cyBERXZlbnRTdG9yZSwgREV2ZW50RGlzcGF0Y2hlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgIEVWRU5UX0JVUyAgXSA6XCI7XG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8KGV2ZW50OiBERXZlbnQpID0+IHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8U3Vic2NyaWJlckRhdGE+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IG9uIG1vZHVsZSBlbmQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TG9nOiBERXZlbnRbXSA9IFtdO1xuICAgIGNvbnNvbGVMb2dFdmVudHMgPSBmYWxzZTtcbiAgICAvLyByZWFkb25seSBzdWJcblxuICAgIHN1YnNjcmliZShjYjogKGV2ZW50OiBERXZlbnQpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIC8vIHRoaXMuc3Vic2NyaWJlcnMuYWRkKGNiKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlckRhdGE6IFN1YnNjcmliZXJEYXRhID0ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcklkLFxuICAgICAgICAgICAgY2IsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuYWRkKHN1YnNjcmliZXJEYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuY29uc29sZUxvZ0V2ZW50cykge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiBhZGRlZDogXCIgKyBzdWJzY3JpYmVySWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiBjb3VudDogXCIgKyB0aGlzLnN1YnNjcmliZXJzLnNpemUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25zb2xlTG9nRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiByZW1vdmVkOiBcIiArIHN1YnNjcmliZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiBjb3VudCAgOiBcIiArIHRoaXMuc3Vic2NyaWJlcnMuc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShjYik7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShzdWJzY3JpYmVyRGF0YSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U3RhdHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyc0NvdW50OiB0aGlzLnN1YnNjcmliZXJzLnNpemUsXG4gICAgICAgICAgICBldmVudExvZzogWy4uLnRoaXMuZXZlbnRMb2ddLFxuICAgICAgICAgICAgc3Vic2NyaWJlcnM6IFsuLi50aGlzLnN1YnNjcmliZXJzXSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBlbWl0KGV2ZW50OiBERXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uc29sZUxvZ0V2ZW50cykge1xuICAgICAgICAgICAgdGhpcy5sb2dFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudExvZy5wdXNoKGV2ZW50KTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQ0FMTElORyBFTUlUJyk7XG4gICAgICAgICAgICBkYXRhLmNiKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRoaXMubG9nRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dFdmVudChldmVudDogREV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQodGhpcy5UQUcgKyBcIiBcIiArIGV2ZW50LmtpbmQpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlByb2R1Y2VySWQ6IFwiICsgZXZlbnQucHJvZHVjZXJJZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LmRhdGEpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dFdmVudHMoKSB7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXAodGhpcy5UQUcgKyBcIkxPR0dcIik7XG4gICAgICAgIGNvbnNvbGUudGFibGUodGhpcy5ldmVudExvZyk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW5zd2VyZWRRdWVzdGlvbiB7XG4gICAgcmVhZG9ubHkgdGltZXN0YW1wOiBEVGltZXN0YW1wO1xuICAgIHJlYWRvbmx5IGZhY3Q6IEZhY3Q7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQW5zd2VyZWRRdWVzdGlvbiB7XG4gICAgZXhwb3J0IGNvbnN0IGVxID0gKGE6IEFuc3dlcmVkUXVlc3Rpb24sIGI6IEFuc3dlcmVkUXVlc3Rpb24pOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIGEuZmFjdCA9PT0gYi5mYWN0O1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUhpc3Rvcnkge1xuICAgIHJlYWRvbmx5IHBhZ2VJZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGFuc3dlcmVkUXVlc3Rpb25zOiBBbnN3ZXJlZFF1ZXN0aW9uW107XG59XG5cbmV4cG9ydCBjbGFzcyBIaXN0b3J5UXVlIHtcbiAgICBwcml2YXRlIGhpc3Rvcnk6IFBhZ2VIaXN0b3J5W10gPSBbXTtcblxuICAgIGdldEZhY3RzKCk6IEFycmF5PEZhY3Q+IHtcbiAgICAgICAgY29uc3QgYW5zd2VycyA9IHRoaXMuaGlzdG9yeS5tYXAoKGgpID0+IGguYW5zd2VyZWRRdWVzdGlvbnMpLmZsYXQoMSk7XG4gICAgICAgIGNvbnN0IGZhY3RzID0gYW5zd2Vycy5tYXAoKGEpID0+IGEuZmFjdCk7XG4gICAgICAgIC8vIFRPRE8gRklORCBMQVRFU1QgRkFDVCAoYW5zd2VyKSBpZiBoYXZlIG11bHRpcGxlLlxuICAgICAgICByZXR1cm4gZmFjdHM7XG4gICAgfVxuXG4gICAgZ2V0QW5zd2VycygpOiBBcnJheTxBbnN3ZXJlZFF1ZXN0aW9uPiB7XG4gICAgICAgIGNvbnN0IGFuc3dlcnMgPSB0aGlzLmhpc3RvcnkubWFwKChoKSA9PiBoLmFuc3dlcmVkUXVlc3Rpb25zKS5mbGF0KDEpO1xuICAgICAgICByZXR1cm4gYW5zd2VycztcbiAgICB9XG5cbiAgICBhZGRUb0hpc3RvcnkocGFnZTogUGFnZUhpc3RvcnkpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocGFnZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi9mYWN0XCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuZXhwb3J0IHR5cGUgQ29uZGl0aW9uID0gQ29uZGl0aW9uLlN0cmluZyB8IENvbmRpdGlvbi5OdW1lcmljIHwgQ29uZGl0aW9uLkNvbXBsZXg7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29uZGl0aW9uIHtcbiAgICBleHBvcnQgdHlwZSBTdHJpbmdPcGVyYXRvciA9IFwiZXFcIiB8IFwibm90LWVxXCIgfCBcImxvbmdlci10aGVuXCIgfCBcInNob3J0ZXItdGhlblwiO1xuXG4gICAgZXhwb3J0IHR5cGUgTnVtZXJpY09wZXJhdG9yID1cbiAgICAgICAgfCBcImVxXCJcbiAgICAgICAgfCBcIm5vdC1lcVwiXG4gICAgICAgIHwgXCJncmVhdGVyLXRoZW5cIlxuICAgICAgICB8IFwibGVzcy10aGVuXCJcbiAgICAgICAgfCBcImdyZWF0ZXItdGhlbi1pbmNsdXNpdmVcIlxuICAgICAgICB8IFwibGVzcy10aGVuLWluY2x1c2l2ZVwiO1xuXG4gICAgZXhwb3J0IGludGVyZmFjZSBOdW1lcmljIHtcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlSWQ6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWVMYWJlbDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBraW5kOiBcIm51bWVyaWMtY29uZGl0aW9uXCI7XG4gICAgICAgIHJlYWRvbmx5IG9wZXJhdG9yOiBOdW1lcmljT3BlcmF0b3I7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nIHtcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlSWQ6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWVMYWJlbDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBraW5kOiBcInN0cmluZy1jb25kaXRpb25cIjtcbiAgICAgICAgcmVhZG9ubHkgb3BlcmF0b3I6IFN0cmluZ09wZXJhdG9yO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcGxleCB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwiY29tcGxleC1jb25kaXRpb25cIjtcbiAgICAgICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBhbGw6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT47XG4gICAgICAgIHJlYWRvbmx5IHNvbWU6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT47XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgU2ltcGxlID0gQ29uZGl0aW9uLlN0cmluZyB8IENvbmRpdGlvbi5OdW1lcmljO1xuXG4gICAgLyoqXG4gICAgICogQW4gZW1wdHkgY29uZGl0aW9uIHdpbGwgZXZhbHVhdGUgdG8gZmFsc2UsXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbjogQ29uZGl0aW9uLkFueVxuICAgICAqIEBwYXJhbSBmYWN0c1xuICAgICAqL1xuICAgIGV4cG9ydCBjb25zdCBldmFsdWF0ZSA9IChjb25kaXRpb246IENvbmRpdGlvbiwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm51bWVyaWMtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY29tcGxleC1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBldmFsdWF0ZUNvbXBsZXgoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZUNvbXBsZXggPSAoY29uZGl0aW9uOiBDb25kaXRpb24uQ29tcGxleCwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbi5zb21lLmxlbmd0aCA9PT0gMCAmJiBjb25kaXRpb24uYWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbFNvbHZlZCA9IGNvbmRpdGlvbi5hbGwubWFwKChjb25kaXRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZVNpbXBsZShjb25kaXRpb24sIGZhY3RzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc29tZUV2YWx1YXRlZCA9IGNvbmRpdGlvbi5zb21lLm1hcCgoY29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBhbGxSZXN1bHQgPSBhbGxTb2x2ZWQuZXZlcnkoRFV0aWwuaXNUcnVlKTtcbiAgICAgICAgY29uc3Qgc29tZVJlc3VsdCA9IHNvbWVFdmFsdWF0ZWQubGVuZ3RoID09PSAwIHx8IHNvbWVFdmFsdWF0ZWQuc29tZShEVXRpbC5pc1RydWUpO1xuICAgICAgICByZXR1cm4gc29tZVJlc3VsdCAmJiBhbGxSZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGV2YWx1YXRlU2ltcGxlID0gKGNvbmRpdGlvbjogQ29uZGl0aW9uLlNpbXBsZSwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgZmFjdCA9IGZhY3RzLmZpbmQoKGYpID0+IGYucmVmZXJlbmNlSWQgPT09IGNvbmRpdGlvbi5yZWZlcmVuY2VJZCk7XG4gICAgICAgIGlmICghZmFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChjb25kaXRpb24ua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcIm51bWVyaWMtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgaWYgKGZhY3Qua2luZCA9PT0gXCJudW1lcmljLWZhY3RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBldmFsdWF0ZU51bWVyaWMoY29uZGl0aW9uLCBmYWN0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIGlmIChmYWN0LmtpbmQgPT09IFwic3RyaW5nLWZhY3RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBldmFsdWF0ZVN0cmluZyhjb25kaXRpb24sIGZhY3QudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gY29uZGl0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKGNvbXBsZXg6IENvbXBsZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXguYWxsLmxlbmd0aCA9PT0gMCAmJiBjb21wbGV4LnNvbWUubGVuZ3RoID09PSAwO1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZVN0cmluZyA9IChjb25kaXRpb246IFJlYWRvbmx5PENvbmRpdGlvbi5TdHJpbmc+LCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IG9wZXJhdG9yID0gY29uZGl0aW9uLm9wZXJhdG9yO1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgXCJlcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibm90LWVxXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlICE9PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzaG9ydGVyLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udmFsdWUgIT09IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxvbmdlci10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlICE9PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gb3BlcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVOdW1lcmljID0gKGNvbmRpdGlvbjogTnVtZXJpYywgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBvcCA9IGNvbmRpdGlvbi5vcGVyYXRvcjtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSBjb25kaXRpb24udmFsdWU7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgICAgICAgY2FzZSBcImVxXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPT09IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm5vdC1lcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlICE9PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJncmVhdGVyLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA+IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImdyZWF0ZXItdGhlbi1pbmNsdXNpdmVcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA+PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsZXNzLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA8IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxlc3MtdGhlbi1pbmNsdXNpdmVcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA8PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgX2dldEFsbFNpbXBsZSA9IChjb25kaXRpb246IENvbmRpdGlvbik6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPT4ge1xuICAgICAgICBjb25zdCBzaW1wbGU6IEFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0gW107XG4gICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJjb21wbGV4LWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLmNvbmRpdGlvbi5hbGwpO1xuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLmNvbmRpdGlvbi5zb21lKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJudW1lcmljLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIERVdGlsLm5ldmVyQ2hlY2soY29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgZ2V0QWxsU2ltcGxlQ29uZGl0aW9ucyA9IChcbiAgICAgICAgY29uZGl0aW9uOiBDb25kaXRpb24gfCBBcnJheTxDb25kaXRpb24+XG4gICAgKTogUmVhZG9ubHlBcnJheTxDb25kaXRpb24uU2ltcGxlPiA9PiB7XG4gICAgICAgIGNvbnN0IHNpbXBsZTogQXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPSBbXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSkge1xuICAgICAgICAgICAgY29uZGl0aW9uLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaCguLi5fZ2V0QWxsU2ltcGxlKGMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2ltcGxlLnB1c2goLi4uX2dldEFsbFNpbXBsZShjb25kaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlO1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4vZmFjdFwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSdWxlPE9uU3VjY2Vzc0FjdGlvbiwgT25GYWlsdXJlQWN0aW9uPiB7XG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBhbGw6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uPjtcbiAgcmVhZG9ubHkgc29tZTogUmVhZG9ubHlBcnJheTxDb25kaXRpb24+O1xuICByZWFkb25seSBvblN1Y2Nlc3M6IFJlYWRvbmx5QXJyYXk8T25TdWNjZXNzQWN0aW9uPjtcbiAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWFkb25seUFycmF5PE9uRmFpbHVyZUFjdGlvbj47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVsZSB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgcnVsZSBpcyB2YWxpZC5cbiAgICogQHBhcmFtIHJ1bGVcbiAgICovXG5cbiAgZXhwb3J0IGNvbnN0IGlzRW1wdHkgPSAocnVsZTogUnVsZTxhbnksIGFueT4pOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBlbXB0eUNvbmRpdGlvbnMgPSBydWxlLmFsbC5sZW5ndGggPT09IDAgJiYgcnVsZS5zb21lLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBlbXB0eUFjdGlvbnMgPSBydWxlLm9uU3VjY2Vzcy5sZW5ndGggPT09IDAgJiYgcnVsZS5vbkZhaWx1cmUubGVuZ3RoID09PSAwO1xuICAgIHJldHVybiBlbXB0eUNvbmRpdGlvbnMgfHwgZW1wdHlBY3Rpb25zO1xuICB9O1xuXG4gIGV4cG9ydCBjb25zdCBzb2x2ZSA9IChydWxlOiBSdWxlPGFueSwgYW55PiwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pOiBib29sZWFuID0+IHtcbiAgICBpZiAocnVsZS5zb21lLmxlbmd0aCA9PT0gMCAmJiBydWxlLmFsbC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFRPRE8gUkVUVVJOIFdBUk5JTkc/IE9SIExPR0dJTkcgP1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvbWVTb2x2ZWQgPSBydWxlLnNvbWUubWFwKChjb25kaXRpb24pID0+IENvbmRpdGlvbi5ldmFsdWF0ZShjb25kaXRpb24sIGZhY3RzKSk7XG5cbiAgICBjb25zdCBzb21lUmVzdWx0ID0gc29tZVNvbHZlZC5sZW5ndGggPT09IDAgfHwgc29tZVNvbHZlZC5zb21lKERVdGlsLmlzVHJ1ZSk7XG5cbiAgICBjb25zdCBhbGxTb2x2ZWQgPSBydWxlLmFsbC5tYXAoKGNvbmRpdGlvbikgPT4gQ29uZGl0aW9uLmV2YWx1YXRlKGNvbmRpdGlvbiwgZmFjdHMpKS5ldmVyeShEVXRpbC5pc1RydWUpO1xuXG4gICAgcmV0dXJuIGFsbFNvbHZlZCAmJiBzb21lUmVzdWx0O1xuICB9O1xufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi9mYWN0XCI7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSBcIi4vcnVsZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvbHZlUmVzdWx0PFMsIEY+IHtcbiAgbWF0Y2hpbmc6IFJlYWRvbmx5QXJyYXk8TWF0Y2g8UywgRj4+O1xuICBlcnJvcnM6IFJlYWRvbmx5QXJyYXk8UnVsZUVuZ2luZUVycm9yPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRjaDxTLCBGPiB7XG4gIHJlYWRvbmx5IG1hdGNoaW5nUnVsZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVEZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBhY3Rpb25MaXN0OiBSZWFkb25seUFycmF5PFM+IHwgUmVhZG9ubHlBcnJheTxGPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBraW5kPzogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBSdWxlRW5naW5lPFMsIEY+IHtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHNvbHZlQWxsKHJ1bGVzOiBSdWxlPFMsIEY+W10sIGZhY3RzOiBGYWN0W10pOiBTb2x2ZVJlc3VsdDxTLCBGPiB7XG4gICAgY29uc3QgZXJyb3JzOiBSdWxlRW5naW5lRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IG1hdGNoaW5nOiBNYXRjaDxTLCBGPltdID0gW107XG4gICAgcnVsZXMuZm9yRWFjaCgocnVsZSkgPT4ge1xuICAgICAgaWYgKFJ1bGUuaXNFbXB0eShydWxlKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6IFwiRW1wdHkgcnVsZTogXCIgKyBydWxlLmlkIH0pO1xuICAgICAgfSBlbHNlIGlmIChSdWxlLnNvbHZlKHJ1bGUsIGZhY3RzKSkge1xuICAgICAgICBjb25zdCBtYXRjaDogTWF0Y2g8UywgRj4gPSB7XG4gICAgICAgICAgcnVsZURlc2NyaXB0aW9uOiBydWxlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIG1hdGNoaW5nUnVsZUlkOiBydWxlLmlkID8/IFwibm8taWQtZ2l2ZW5cIixcbiAgICAgICAgICBhY3Rpb25MaXN0OiBbLi4ucnVsZS5vblN1Y2Nlc3NdLFxuICAgICAgICB9O1xuICAgICAgICBtYXRjaGluZy5wdXNoKG1hdGNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBtYXRjaGluZywgZXJyb3JzIH07XG4gIH1cblxuICBzb2x2ZShydWxlOiBSdWxlPFMsIEY+LCBmYWN0czogRmFjdFtdKTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyBWYWxpZGF0ZSwgYW5kIFJldHVybiByZXN1bHRcbiAgICByZXR1cm4gUnVsZS5zb2x2ZShydWxlLCBmYWN0cyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQYWdlRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcblxuZXhwb3J0IGNsYXNzIE5leHRRdWUge1xuICAgIHByaXZhdGUgb3JpZ2luYWxPcmRlcjogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBhbGxQYWdlczogUGFnZUR0b1tdID0gW107XG4gICAgcHJpdmF0ZSBleGNsdWRlZFRhZ3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGV4Y2x1ZGVkQnlQYWdlSWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIHJlbWFpbmluZzogUGFnZUR0b1tdID0gW107XG4gICAgY29uc3RydWN0b3IocGFnZXM6IFBhZ2VEdG9bXSA9IFtdKSB7XG4gICAgICAgIHRoaXMucmVzZXRRdWUocGFnZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdpbGwgcmVzZXQgcXVlIHdpdGggdGhlIG5ldyBwYWdlcy5cbiAgICAgKiBAcGFyYW0gcGFnZXNcbiAgICAgKi9cbiAgICByZXNldFF1ZShwYWdlczogUGFnZUR0b1tdKSB7XG4gICAgICAgIHRoaXMuYWxsUGFnZXMgPSBbLi4ucGFnZXNdO1xuICAgICAgICB0aGlzLnJlbWFpbmluZyA9IFsuLi5wYWdlc107XG4gICAgICAgIHRoaXMuZXhjbHVkZWRUYWdzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMub3JpZ2luYWxPcmRlciA9IHRoaXMuYWxsUGFnZXMubWFwKChwKSA9PiBwLmlkKTtcbiAgICB9XG5cbiAgICBwb3AoKTogUGFnZUR0byB8IGZhbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMucmVtYWluaW5nLnNoaWZ0KCk7XG4gICAgICAgIC8vIFRPRE8gQ0xPTkU/P1xuICAgICAgICByZXR1cm4gbmV4dCA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBwZWVrKCk6IFBhZ2VEdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnJlbWFpbmluZ1swXTtcbiAgICAgICAgcmV0dXJuIG5leHQgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAganVtcFRvUGFnZUJ5SWQocGFnZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlbWFpbmluZy5maW5kSW5kZXgoKHApID0+IHAuaWQgPT09IHBhZ2VJZCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMucmVtYWluaW5nLnNsaWNlKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlUYWcodGFnOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWcpKSB7XG4gICAgICAgICAgICB0YWcuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlZFRhZ3MuYWRkKHRhZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRUYWdzLmFkZCh0YWcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyUmVtYWluaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2lsbCBub3QgYmUgaW5jbHVkZWRcbiAgICAgKiBAcGFyYW0gcGFnZXNcbiAgICAgKi9cbiAgICBpbnNlcnRBc05leHRCeUZvcmNlKHBhZ2VzOiBQYWdlRHRvW10pIHtcbiAgICAgICAgdGhpcy5yZW1haW5pbmcudW5zaGlmdCguLi5wYWdlcyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlQYWdlSWQocGFnZUlkOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYWdlSWQpKSB7XG4gICAgICAgICAgICBwYWdlSWQuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQuYWRkKGlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmFkZChwYWdlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyUmVtYWluaW5nKCk7XG4gICAgICAgIC8vIHRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5hZGQocGFnZUlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlclJlbWFpbmluZygpIHtcbiAgICAgICAgdGhpcy5yZW1haW5pbmcgPSB0aGlzLnJlbWFpbmluZy5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBwLnRhZ3MgPz8gW107XG4gICAgICAgICAgICBjb25zdCBpc0luY2x1ZWRlZEJ5VGFnID0gIXRhZ3Muc29tZSgodGFnKSA9PiB0aGlzLmV4Y2x1ZGVkVGFncy5oYXModGFnKSk7XG4gICAgICAgICAgICBjb25zdCBpc0luY2x1ZGVkQnlQYWdlSWQgPSAhdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmhhcyhwLmlkKTtcbiAgICAgICAgICAgIHJldHVybiBpc0luY2x1ZGVkQnlQYWdlSWQgJiYgaXNJbmNsdWVkZWRCeVRhZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcubGVuZ3RoO1xuICAgIH1cbiAgICBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsT3JkZXIubGVuZ3RoO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBbnN3ZXJlZFF1ZXN0aW9uLCBIaXN0b3J5UXVlLCBQYWdlSGlzdG9yeSB9IGZyb20gXCIuL2hpc3RvcnktcXVlXCI7XG5pbXBvcnQgeyBSdWxlRW5naW5lIH0gZnJvbSBcIi4uL3J1bGVzL3J1bGUtZW5naW5lXCI7XG5pbXBvcnQgeyBOZXh0UXVlIH0gZnJvbSBcIi4vbmV4dC1xdWVcIjtcbmltcG9ydCB7IFBhZ2VEdG8sIFNjaGVtYUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uQ29tbWFuZCwgUGFnZVF1ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmV4cG9ydCB0eXBlIERQbGF5ZXJEYXRhID0gUGljazxTY2hlbWFEdG8sIFwicGFnZXNcIiB8IFwicGFnZVNlcXVlbmNlc1wiIHwgXCJydWxlc1wiPjtcbmV4cG9ydCBjbGFzcyBEUGxheWVyIHtcbiAgcHJpdmF0ZSBoaXN0b3J5ID0gbmV3IEhpc3RvcnlRdWUoKTtcbiAgcHJpdmF0ZSBydWxlRW5naW5lID0gbmV3IFJ1bGVFbmdpbmU8UGFnZVF1ZUNvbW1hbmQsIFBhZ2VRdWVDb21tYW5kPigpO1xuICBwcml2YXRlIG5leHRRdWUgPSBuZXcgTmV4dFF1ZSgpO1xuICBwcml2YXRlIGRhdGE6IERQbGF5ZXJEYXRhO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IERQbGF5ZXJEYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLm5leHRRdWUucmVzZXRRdWUoZGF0YS5wYWdlcyk7XG4gIH1cblxuICBzYXZlSGlzdG9yeShwYWdlSGlzdG9yeTogUGFnZUhpc3RvcnkpIHtcbiAgICBjb25zb2xlLmxvZyhcIlNBVkUgSElTVE9SWVwiLCBwYWdlSGlzdG9yeSk7XG4gICAgdGhpcy5oaXN0b3J5LmFkZFRvSGlzdG9yeShwYWdlSGlzdG9yeSk7XG4gICAgY29uc3QgZmFjdHMgPSB0aGlzLmhpc3RvcnkuZ2V0RmFjdHMoKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJ1bGVFbmdpbmUuc29sdmVBbGwodGhpcy5kYXRhLnJ1bGVzLCBmYWN0cyk7XG4gICAgY29uc3QgbWF0Y2hpbmdSdWxlcyA9IHJlc3VsdC5tYXRjaGluZztcbiAgICBjb25zdCBhY3Rpb25zID0gbWF0Y2hpbmdSdWxlcy5tYXAoKHIpID0+IHIuYWN0aW9uTGlzdCkuZmxhdCgxKTtcbiAgICBhY3Rpb25zLmZvckVhY2goKGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGEucGF5bG9hZCk7XG4gICAgICBzd2l0Y2ggKGEua2luZCkge1xuICAgICAgICBjYXNlIFwiUEFHRV9RVUVfSlVNUF9UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAgICAgICB0aGlzLm5leHRRdWUuanVtcFRvUGFnZUJ5SWQoYS5wYXlsb2FkLnBhZ2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1BBR0VfSURfQ09NTUFORFwiOlxuICAgICAgICAgIHRoaXMubmV4dFF1ZS5yZW1vdmVCeVBhZ2VJZChhLnBheWxvYWQucGFnZUlkcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1RBR19DT01NQU5EXCI6XG4gICAgICAgICAgdGhpcy5uZXh0UXVlLnJlbW92ZUJ5VGFnKGEucGF5bG9hZC50YWdJZHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiVU5LTk9XTiBBQ1RJT05cIiwgYSk7XG4gICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gYTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhhY3Rpb25zKTtcbiAgfVxuXG4gIGdldFJlc3VsdHMoKTogQW5zd2VyZWRRdWVzdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5oaXN0b3J5LmdldEFuc3dlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ29Ub1BhZ2VCeUlkKHBhZ2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5uZXh0UXVlLmp1bXBUb1BhZ2VCeUlkKHBhZ2VJZCk7XG4gIH1cblxuICBoYW5kbGVOYXZpZ2F0aW9uQ29tbWFuZChjb21tYW5kOiBOYXZpZ2F0aW9uQ29tbWFuZCkge1xuICAgIHN3aXRjaCAoY29tbWFuZC5raW5kKSB7XG4gICAgICBjYXNlIFwiUEFHRV9RVUVfTkVYVF9QQUdFX0NPTU1BTkRcIjpcbiAgICAgICAgLy8gTk8gTkVFRCBUTyBETyBBTllUSElOR1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAgICAgdGhpcy5nb1RvUGFnZUJ5SWQoY29tbWFuZC5wYXlsb2FkLnBhZ2VJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlBBR0VfUVVFX0dPX1RPX1NFUVVFTkNFX0NPTU1BTkRcIjpcbiAgICAgICAgdGhpcy5pbnNlcnRTZXF1ZW5jZUJ5SWQoY29tbWFuZC5wYXlsb2FkLnNlcXVlbmNlSWQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgRFV0aWwubmV2ZXJDaGVjayhjb21tYW5kKTtcbiAgICB9XG4gIH1cblxuICBnZXROZXh0UGFnZSgpOiBQYWdlRHRvIHwgZmFsc2Uge1xuICAgIC8vIFRPRE8gSEFORExFIFJVTEVTISFcbiAgICByZXR1cm4gdGhpcy5uZXh0UXVlLnBvcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRTZXF1ZW5jZUJ5SWQoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlcSA9IHRoaXMuZGF0YS5wYWdlU2VxdWVuY2VzPy5maW5kKChzKSA9PiBzLmlkID09PSBpZCk7XG4gICAgaWYgKHNlcSkge1xuICAgICAgdGhpcy5uZXh0UXVlLmluc2VydEFzTmV4dEJ5Rm9yY2UoWy4uLnNlcS5wYWdlc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIT1cgVE8gSEFORExFIElOVkFMSUQgSURfUkVGUz8/IExPR0dFUj8/XG4gICAgICAvLyBMT0cgSU5WQUxJRCBDT01NQU5ELlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgcGFnZXMuXG4gICAqL1xuICBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubmV4dFF1ZS5wYWdlQ291bnQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBEQ29tbWFuZCwgRWxlbWVudENvbW1hbmQsIFN0YXRlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgREV2ZW50IH0gZnJvbSBcIi4uL2V2ZW50cy9ERXZlbnRzXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgREV2ZW50SGFuZGxlcjxFIGV4dGVuZHMgREV2ZW50ID0gREV2ZW50PiB7XG4gICAgcmVhZG9ubHkgb25FdmVudDogRVtcImtpbmRcIl07XG4gICAgcmVhZG9ubHkgd2hlbj86IHsgcHJvZHVjZXJJZD86IHN0cmluZzsgY29uZGl0aW9uPzogQ29uZGl0aW9uIH07XG4gICAgcmVhZG9ubHkgdGhlbkV4ZWN1dGU6IFJlYWRvbmx5QXJyYXk8RENvbW1hbmQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2hhbmdlZEhhbmRsZXIge1xuICAgIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHdoZW5UcnVlOiBSZWFkb25seUFycmF5PEVsZW1lbnRDb21tYW5kPjtcbiAgICByZWFkb25seSB3aGVuRmFsc2U6IFJlYWRvbmx5QXJyYXk8RWxlbWVudENvbW1hbmQ+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIERFdmVudEhhbmRsZXIge1xuICAgIGV4cG9ydCB0eXBlIExvb2tVcCA9IE1hcDxERXZlbnRIYW5kbGVyW1wib25FdmVudFwiXSwgQXJyYXk8REV2ZW50SGFuZGxlcj4+O1xuICAgIGV4cG9ydCBjb25zdCBjcmVhdGVMb29rVXAgPSAoaGFuZGxlcnM/OiBSZWFkb25seUFycmF5PERFdmVudEhhbmRsZXI+KTogTG9va1VwID0+IHtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxERXZlbnRIYW5kbGVyW1wib25FdmVudFwiXSwgQXJyYXk8REV2ZW50SGFuZGxlcj4+KCk7XG4gICAgICAgIGhhbmRsZXJzPy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBraW5kID0gaC5vbkV2ZW50O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IG1hcC5nZXQoa2luZCk7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gY3VycmVudCA/IFsuLi5jdXJyZW50LCBoXSA6IFtoXTtcbiAgICAgICAgICAgIG1hcC5zZXQoa2luZCwgYWN0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgRFN0eWxlIH0gZnJvbSBcIi4vRFN0eWxlXCI7XG5pbXBvcnQgeyBERWxlbWVudEJhc2VEdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmQsIEVsZW1lbnRDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgREV2ZW50SGFuZGxlciB9IGZyb20gXCIuLi9ldmVudC1oYW5kbGVycy9ERXZlbnRIYW5kbGVyXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgQW5pbWF0aW9uRHRvIH0gZnJvbSBcIi4uL2R0by9BbmltYXRpb25EdG9cIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcbmltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuLi9zdGF0ZS9Ec3RhdGVcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERFbGVtZW50PFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBlbDogVDtcbiAgICBwcml2YXRlIGNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IHRydWU7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICBwcml2YXRlIGlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBjdXJyU3R5bGU6IFBhcnRpYWw8RFN0eWxlPiA9IHtcbiAgICAgICAgZm9udFNpemU6IHsgX3VuaXQ6IFwicHhcIiwgdmFsdWU6IDEwMCB9LFxuICAgICAgICBmb250V2VpZ2h0OiA1MDAsXG4gICAgICAgIHRleHRDb2xvcjogXCJibGFja1wiLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgIH07XG5cbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IG9uUXVlcnlDaGFuZ2VkSGFuZGxlcnMgPVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyczogREV2ZW50SGFuZGxlci5Mb29rVXA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbW1hbmRCdXM6IERDb21tYW5kQnVzO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudEJ1czogRXZlbnRCdXM7XG4gICAgcHJvdGVjdGVkIHNjYWxlOiBTY2FsZVNlcnZpY2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBiYXNlRHRvOiBERWxlbWVudEJhc2VEdG87XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU2V0PCgpID0+IHZvaWQ+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIGVsOiBULFxuICAgICAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgICAgIGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgICAgICBkdG86IERFbGVtZW50QmFzZUR0byxcbiAgICAgICAgc2NhbGU6IFNjYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIHRoaXMuaWQgPSBkdG8uaWQ7XG4gICAgICAgIHRoaXMuYmFzZUR0byA9IGR0bztcbiAgICAgICAgLy8gdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5jb21tYW5kQnVzID0gY29tbWFuZEJ1cztcbiAgICAgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlcnMgPSBERXZlbnRIYW5kbGVyLmNyZWF0ZUxvb2tVcChkdG8uZXZlbnRIYW5kbGVycyk7XG4gICAgICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgLy8gQ0xJQ0tcbiAgICAgICAgdGhpcy5vbkNsaWNrSGFuZGxlciA9IHRoaXMub25DbGlja0hhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmNsaWNrID0gdGhpcy5vbkNsaWNrSGFuZGxlcjtcblxuICAgICAgICAvLyBIT1ZFUlxuICAgICAgICB0aGlzLm9uTW91c2VPdmVyID0gdGhpcy5vbk1vdXNlT3Zlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubW91c2VvdmVyID0gdGhpcy5vbk1vdXNlT3ZlcjtcblxuICAgICAgICBpZiAoZHRvKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhkdG8/LnN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21tYW5kU3Vic2NyaXB0aW9uID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX1NUWUxFX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdHlsZShjLnBheWxvYWQuY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5raW5kID09PSBcIkVMRU1FTlRfRElTQUJMRV9DTElDS19DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5raW5kID09PSBcIkVMRU1FTlRfRU5BQkxFX0NMSUNLX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja0hhbmRsZXJJc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX0FOSU1BVEVfQ09NTUFORFwiICYmIGMudGFyZ2V0SWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRPRE8gSU1QTEVNRU5UIEFOSU1BVElPTl9IQU5ETEVSIElOIERFbGVtZW50LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5pZCk7XG4gICAgICAgIC8vIFRPRE8gTUVNT1JZIExFQUtcbiAgICAgICAgY29uc3QgZXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50QnVzLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5ldmVudEhhbmRsZXJzLmdldChldmVudC5raW5kKSA/PyBbXTtcbiAgICAgICAgICAgIC8vIFRPRE8gQXBwbHkgQ29uZGl0aW9ucyBpbiBXSEVOLlxuICAgICAgICAgICAgY29uc3QgY29tbWFuZHMgPSBoYW5kbGVycy5tYXAoKGgpID0+IGgudGhlbkV4ZWN1dGUpLmZsYXQoMSk7XG4gICAgICAgICAgICBjb21tYW5kcy5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5kb0FjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gXCJIT1NUX1NDQUxFX0NIQU5HRURfRVZFTlRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSEFORExFIFRISVMgU0NBTEUgQ0hBTkdFISFcIik7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoe30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gXCJTVEFURV9RVUVSWV9SRVNVTFRfQ0hBTkdFRF9FVkVOVFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeUNoYW5nZWRIYW5kbGVyKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBcIkVMRU1FTlQ6IFwiKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemUoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChjb21tYW5kU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChldmVudFN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZGVzdHJveSgpOiB2b2lkO1xuXG4gICAgLy8gYWJzdHJhY3Qgc2V0U2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQ7XG5cbiAgICAvLyAvKipcbiAgICAvLyAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHJlLWVtaXQgY29tbWFuZHMgZnJvbSBldmVudC1oYW5kbGVycz9cbiAgICAvLyAgKiBAcGFyYW0gY29tbWFuZFxuICAgIC8vICAqIEBwcml2YXRlXG4gICAgLy8gICovXG4gICAgLy8gcHJpdmF0ZSBoYW5kbGVDb21tYW5kc0VtaXR0ZWRCeVByaXZhdGVFdmVudEhhbmRsZXJzKGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKGNvbW1hbmQpO1xuICAgIC8vICAgICBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfU1RZTEVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIGlmIChjb21tYW5kLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKGNvbW1hbmQucGF5bG9hZC5jaGFuZ2VzKTtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9BTklNQVRFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICAvLyBUT0RPIENIRUNLIEZPUiBUQVJHRVQgSURcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmhhbmRsZUFuaW1hdGVTZWxmQWN0aW9uKGNvbW1hbmQucGF5bG9hZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9FTkFCTEVfQ0xJQ0tfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gdHJ1ZTtcbiAgICAvLyAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZVN0eWxlcyhjb21tYW5kLnBheWxvYWQuY2hhbmdlcyk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9ESVNBQkxFX0NMSUNLX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IGZhbHNlO1xuICAgIC8vICAgICAgICAgICAgIC8vIHRoaXMuaGFuZGxlQW5pbWF0ZVNlbGZBY3Rpb24oY29tbWFuZC5wYXlsb2FkKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19QTEFZX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19QQVVTRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRU5HSU5FX0xFQVZFX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlZJREVPX0pVTVBfVE9fQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlZJREVPX1NFVF9WT0xVTUVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkFVRElPX1BMQVlfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkFVRElPX1BBVVNFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJBVURJT19TRVRfVk9MVU1FX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9ORVhUX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0dPX1RPX1NFUVVFTkNFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1BBR0VfSURfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0pVTVBfVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9UQUdfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlNUQVRFX01VVEFURV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBkZWZhdWx0OlxuICAgIC8vICAgICAgICAgICAgIERVdGlsLm5ldmVyQ2hlY2soY29tbWFuZCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIHF1ZXJ5Q2hhbmdlZEhhbmRsZXIocmVzdWx0OiBEU3RhdGUuU3RhdGVRdWVyeVJlc3VsdCkge1xuICAgICAgICBjb25zdCBtYXliZUhhbmRsZXJzID0gdGhpcy5iYXNlRHRvLm9uU3RhdGVDaGFuZ2U7XG4gICAgICAgIGlmICghbWF5YmVIYW5kbGVycykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHF1ZXJ5SGFuZGxlcnMgPSBtYXliZUhhbmRsZXJzLmZpbHRlcigoaCkgPT4gaC5xdWVyeU5hbWUgPT09IHJlc3VsdC5xdWVyeU5hbWUpO1xuICAgICAgICBxdWVyeUhhbmRsZXJzLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY3Vycikge1xuICAgICAgICAgICAgICAgIGgud2hlblRydWUuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRvQWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaC53aGVuRmFsc2UuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRvQWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGZpbmRCeVF1ZXJ5LCB2YWx1ZSk7XG4gICAgICAgIC8vIGNvbnN0IGFsbCA9IHRoaXMuYmFzZUR0by5zdGF0ZVF1ZXJ5Q2hhbmdlID8/IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DbGlja0hhbmRsZXIoXzogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygpO1xuICAgICAgICBpZiAoIXRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmlkICsgXCJDbGljayBkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGlja0FjdGlvbiA9IHRoaXMuYmFzZUR0by5vbkNsaWNrO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5BVElWRSBDTElDSyBFTEVNRU5UOiBIYW5kbGVycyBcIiArIGNsaWNrQWN0aW9uPy5sZW5ndGgpO1xuICAgICAgICBpZiAoY2xpY2tBY3Rpb24gJiYgY2xpY2tBY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUQVJHRVRJRDogXCIgKyBjbGlja0FjdGlvblswXS50YXJnZXRJZCArIFwiIFwiICsgdGhpcy5pZCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVVNFUl9DTElDS0VEX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFVzZXJcIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZWxlbWVudElkOiB0aGlzLmlkIH0sXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjbGlja0FjdGlvbi5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Nb3VzZU92ZXIoXzogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhldik7XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGU6IFBhcnRpYWw8RFN0eWxlPikge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhzdHlsZSk7XG4gICAgfVxuXG4gICAgYXBwZW5kWW91cnNlbGYocGFyZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBwYXJlbnQuYXBwZW5kKHRoaXMuZWwpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhwYXJlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQW5pbWF0ZVNlbGZBY3Rpb24oZHRvOiBBbmltYXRpb25EdG8pIHtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZ1NlbGYgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IGtleWZyYW1lcywgb3B0aW9ucyB9ID0gZHRvO1xuXG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuZWwuYW5pbWF0ZShrZXlmcmFtZXMsIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgICBhbmltYXRpb24ub25maW5pc2ggPSAoZTogQW5pbWF0aW9uUGxheWJhY2tFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZS50eXBlKTtcbiAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGFuaW1hdGlvbi5vbnJlbW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkFOSU1BVElPTiBSRU1PVkVEOiBcIiArIGFuaW1hdGlvbi5pZCk7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBhbmltYXRpb24ub25jYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJBTklNQVRJT04gQ0FOQ0VMRUQ6IFwiICsgYW5pbWF0aW9uLmlkKTtcbiAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemUoKSB7XG4gICAgICAgIERTdHlsZS5ub3JtYWxpemUodGhpcy5lbCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVN0eWxlcyhzdHlsZTogUGFydGlhbDxEU3R5bGU+KSB7XG4gICAgICAgIHRoaXMuY3VyclN0eWxlID0gT2JqZWN0LmFzc2lnbih0aGlzLmN1cnJTdHlsZSwgc3R5bGUpO1xuICAgICAgICBEU3R5bGUuYXBwbHlTdHlsZXModGhpcy5lbCwgdGhpcy5jdXJyU3R5bGUsIHRoaXMuc2NhbGUuc2NhbGUpO1xuICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi9ERWxlbWVudFwiO1xuaW1wb3J0IHsgRERpdkR0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEVGV4dCB9IGZyb20gXCIuL0RUZXh0XCI7XG5pbXBvcnQgeyBESW1nIH0gZnJvbSBcIi4vREltZ1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcblxuZXhwb3J0IGNsYXNzIEREaXYgZXh0ZW5kcyBERWxlbWVudDxIVE1MRGl2RWxlbWVudD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIEREaXYgXTogXCI7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRTdHlsZSA9IHsgeDogMjIsIHk6IDQgfTtcbiAgICBwcml2YXRlIGNoaWxkcmVuOiBBcnJheTxEVGV4dCB8IERJbWc+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZHRvOiBERGl2RHRvLFxuICAgICAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgICAgIGFjdGlvblNlcnZpY2U6IERDb21tYW5kQnVzLFxuICAgICAgICBzY2FsZTogU2NhbGVTZXJ2aWNlLFxuICAgICAgICBjaGlsZHJlbjogQXJyYXk8RFRleHQgfCBESW1nPlxuICAgICkge1xuICAgICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgc3VwZXIoZCwgZXZlbnRCdXMsIGFjdGlvblNlcnZpY2UsIGR0bywgc2NhbGUpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgY2hpbGQuYXBwZW5kWW91cnNlbGYodGhpcy5lbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4vREVsZW1lbnRcIjtcbmltcG9ydCB7IERJbWdEdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcblxuZXhwb3J0IGNsYXNzIERJbWcgZXh0ZW5kcyBERWxlbWVudDxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgSU1BR0VfQ09VTlQgPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW1hZ2VDb3VudDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IFRBRzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IFRJTUlOR19UQUc6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvYWRTdGFydDogRFRpbWVzdGFtcDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGR0bzogREltZ0R0byxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25TdWJqZWN0OiBEQ29tbWFuZEJ1cyxcbiAgICAgICAgcmVhZG9ubHkgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgICAgICByZWFkb25seSBzY2FsZVNlcnZpY2U6IFNjYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLCBldmVudEJ1cywgYWN0aW9uU3ViamVjdCwgZHRvLCBzY2FsZVNlcnZpY2UpO1xuICAgICAgICBESW1nLklNQUdFX0NPVU5UICs9IDE7XG4gICAgICAgIHRoaXMuaW1hZ2VDb3VudCA9IERJbWcuSU1BR0VfQ09VTlQ7XG4gICAgICAgIHRoaXMuVEFHID0gXCJbRF9JTUcgXCIgKyBESW1nLklNQUdFX0NPVU5UICsgXCIgXTogXCI7XG4gICAgICAgIHRoaXMuVElNSU5HX1RBRyA9IFwibG9hZC10aW1lIChcIiArIERJbWcuSU1BR0VfQ09VTlQgKyBcIikgXCI7XG4gICAgICAgIHRoaXMuZWwubG9hZGluZyA9IFwiZWFnZXJcIjtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShkdG8uc3R5bGUpO1xuICAgICAgICB0aGlzLmxvYWRTdGFydCA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgICAgIC8vIEJpbmQgSGFuZGxlcnNcbiAgICAgICAgdGhpcy5vbkVycm9yID0gdGhpcy5vbkVycm9yLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Mb2FkID0gdGhpcy5vbkxvYWQuYmluZCh0aGlzKTtcbiAgICAgICAgLy8gdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25sb2FkID0gdGhpcy5vbkxvYWQ7XG4gICAgICAgIHRoaXMuZWwub25lcnJvciA9IHRoaXMub25FcnJvcjtcbiAgICAgICAgLy8gdGhpcy5lbC5vbmNsaWNrID0gdGhpcy5vbkNsaWNrO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IGR0by51cmw7XG4gICAgICAgIGNvbnNvbGUudGltZSh0aGlzLlRJTUlOR19UQUcpO1xuICAgIH1cblxuICAgIGxvZygpOiB2b2lkIHt9XG5cbiAgICBzZXRTY2FsZShzY2FsZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHNjYWxlKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLmN1cnJTdHlsZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkVycm9yKGV2OiBFdmVudCB8IHN0cmluZykge1xuICAgICAgICBpZiAoZXYgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBcIiArIGV2LnR5cGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBldik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTG9hZChfOiBFdmVudCkge1xuICAgICAgICBjb25zdCBsb2FkVGltZSA9IERUaW1lc3RhbXAuZGlmZk5vdyh0aGlzLmxvYWRTdGFydCk7XG5cbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiSU1BR0VfTE9BREVEX0VWRU5UXCIsXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJESW1hZ2VcIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgbG9hZFRpbWUsXG4gICAgICAgICAgICAgICAgbmF0dXJhbEhlaWdodDogdGhpcy5lbC5uYXR1cmFsSGVpZ2h0LFxuICAgICAgICAgICAgICAgIG5hdHVyYWxXaWR0aDogdGhpcy5lbC5uYXR1cmFsV2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmVsLmhlaWdodCxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5lbC53aWR0aCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuL0RFbGVtZW50XCI7XG5pbXBvcnQgeyBEVGV4dER0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuXG5leHBvcnQgY2xhc3MgRFRleHQgZXh0ZW5kcyBERWxlbWVudDxIVE1MUGFyYWdyYXBoRWxlbWVudD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIERQYXJhZ3JhcGggXTogXCI7XG4gICAgcHJvdGVjdGVkIGRlZmF1bHRTdHlsZSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoZHRvOiBEVGV4dER0bywgZXZlbnRCdXM6IEV2ZW50QnVzLCBhY3Rpb25TZXJ2aWNlOiBEQ29tbWFuZEJ1cywgc2NhbGU6IFNjYWxlU2VydmljZSkge1xuICAgICAgICBzdXBlcihkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSwgZXZlbnRCdXMsIGFjdGlvblNlcnZpY2UsIGR0bywgc2NhbGUpO1xuICAgICAgICB0aGlzLmVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB0aGlzLmVsLmlubmVyVGV4dCA9IFwiXCIgKyBkdG8udGV4dDtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShkdG8uc3R5bGUpO1xuICAgIH1cblxuICAgIHNldFNjYWxlKHNjYWxlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLmN1cnJTdHlsZSk7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5lbC5zdHlsZS5mb250U2l6ZTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInNjYWxlOiBcIiArIHNjYWxlICsgXCIgRm9udHNpemU6IFwiICsgZm9udFNpemUpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RFbGVtZW50XCI7XG5pbXBvcnQgeyBERGl2IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RkaXZcIjtcbmltcG9ydCB7IERJbWcgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREltZ1wiO1xuaW1wb3J0IHsgRFRleHQgfSBmcm9tIFwiLi4vRGVsZW1lbnQvRFRleHRcIjtcbmltcG9ydCB7IEREaXZEdG8sIERFbGVtZW50RHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi9zY2FsZVwiO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlREVsZW1lbnQgPSAoXG4gICAgZHRvOiBERWxlbWVudER0byxcbiAgICBhY3Rpb25CdXM6IERDb21tYW5kQnVzLFxuICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBzY2FsZTogU2NhbGVTZXJ2aWNlXG4pOiBERWxlbWVudDxhbnk+ID0+IHtcbiAgICBzd2l0Y2ggKGR0by5fdGFnKSB7XG4gICAgICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkRWxzID0gY3JlYXRlQ2hpbGRyZW5Gb3JEaXYoZHRvLCBhY3Rpb25CdXMsIGV2ZW50QnVzLCBzY2FsZSk7XG4gICAgICAgICAgICBjb25zdCBuZXdEaXYgPSBuZXcgRERpdihkdG8sIGV2ZW50QnVzLCBhY3Rpb25CdXMsIHNjYWxlLCBjaGlsZEVscyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3RGl2O1xuICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IERJbWcoZHRvLCBhY3Rpb25CdXMsIGV2ZW50QnVzLCBzY2FsZSk7XG4gICAgICAgIGNhc2UgXCJwXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IERUZXh0KGR0bywgZXZlbnRCdXMsIGFjdGlvbkJ1cywgc2NhbGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gZHRvO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBkdG8gZ2l2ZW4gdG8gdGhlIGNyZWF0ZURFbGVtZW50IGZ1bmN0aW9uLlwiKTtcbiAgICAgICAgLy8gVE9ETyBMT0dHSU5HIG9yIGNyZWF0ZSBhbnkgSFRNTC1FTEVNRU5UPz9cbiAgICB9XG59O1xuXG5jb25zdCBjcmVhdGVDaGlsZHJlbkZvckRpdiA9IChcbiAgICBkdG86IEREaXZEdG8sXG4gICAgYWN0aW9uU3ViamVjdDogRENvbW1hbmRCdXMsXG4gICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgIHNjYWxlOiBTY2FsZVNlcnZpY2Vcbik6IEREaXZbXCJjaGlsZHJlblwiXSA9PiB7XG4gICAgY29uc3QgY2hpbGREdG8gPSBkdG8uY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGRFbHM6IEFycmF5PERJbWcgfCBEVGV4dD4gPSBbXTtcbiAgICAvLyBjb25zb2xlLmxvZyhjaGlsZEVsZW1lbnRzKTtcbiAgICBjaGlsZER0by5mb3JFYWNoKChkdG8pID0+IHtcbiAgICAgICAgaWYgKGR0by5fdGFnID09PSBcInBcIikge1xuICAgICAgICAgICAgY29uc3QgbmV3VGV4dCA9IG5ldyBEVGV4dChkdG8sIGV2ZW50QnVzLCBhY3Rpb25TdWJqZWN0LCBzY2FsZSk7XG4gICAgICAgICAgICBjaGlsZEVscy5wdXNoKG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdG8uX3RhZyA9PT0gXCJpbWdcIikge1xuICAgICAgICAgICAgY29uc3QgbmV3SW1hZ2UgPSBuZXcgREltZyhkdG8sIGFjdGlvblN1YmplY3QsIGV2ZW50QnVzLCBzY2FsZSk7XG4gICAgICAgICAgICBjaGlsZEVscy5wdXNoKG5ld0ltYWdlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjaGlsZEVscztcbn07XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREVsZW1lbnRcIjtcbmltcG9ydCB7IFBhZ2VEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgY3JlYXRlREVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50LWZhY3RvcnlcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi9zY2FsZVwiO1xuXG5leHBvcnQgY2xhc3MgRFBhZ2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBEUGFnZSBdOiBcIjtcbiAgcHJpdmF0ZSBlbGVtZW50czogREVsZW1lbnQ8SFRNTEVsZW1lbnQ+W10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1cztcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2U7XG4gIC8vIFRvZG8gR0xPQkFMIEVWRU5UX0JVU1MgQU5EIFBBR0UgRVZFTlRTOlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZHRvOiBQYWdlRHRvLFxuICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBzY2FsZTogU2NhbGVTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7XG4gICAgdGhpcy5jb21tYW5kQnVzID0gY29tbWFuZEJ1cztcbiAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5lbGVtZW50cyA9IGR0by5lbGVtZW50cy5tYXAoKGR0bykgPT4gY3JlYXRlREVsZW1lbnQoZHRvLCB0aGlzLmNvbW1hbmRCdXMsIHRoaXMuZXZlbnRCdXMsIHRoaXMuc2NhbGUpKTtcbiAgfVxuXG4gIGFwcGVuZFlvdXJzZWxmKHBhcmVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIEFQUEVORElORyBUTyBQQVJFTlRcIik7XG4gICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuYXBwZW5kWW91cnNlbGYocGFyZW50KTtcbiAgICAgIC8vIHBhcmVudC5hcHBlbmRDaGlsZChlbC5lbCk7XG4gICAgfSk7XG5cbiAgICAvLyBpZiAoIXByZWxvYWRNb2RlKSB7XG4gICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgIGtpbmQ6IFwiUEFHRV9FTlRFUl9FVkVOVFwiLFxuICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgcHJvZHVjZXI6IFwiRFBhZ2VcIixcbiAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICBkYXRhOiB7IHBhZ2VJZDogdGhpcy5pZCB9LFxuICAgIH0pO1xuICAgIC8vIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9nKCk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgJ3NjYWxlIC0gJyArIHRoaXMuc2NhbGUpO1xuICB9XG5cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmR0by5pZDtcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBTY2FsZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VIZWlnaHQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVdpZHRoO1xuICBwcml2YXRlIGNvbnRhaW5lckhlaWdodCA9IDEzMDA7XG4gIHByaXZhdGUgY29udGFpbmVyV2lkdGggPSAxMzAwO1xuXG4gIGdldCBzY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NhbGU7XG4gIH1cblxuICBnZXQgcGFnZUhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlSGVpZ2h0ICogdGhpcy5zY2FsZTtcbiAgfVxuICBnZXQgcGFnZVdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLmJhc2VXaWR0aCAqIHRoaXMuX3NjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2NhbGUgPSAxO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PChzY2FsZTogbnVtYmVyKSA9PiB2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogeyBiYXNlSGVpZ2h0OiBudW1iZXI7IGJhc2VXaWR0aDogbnVtYmVyOyBjb250YWluZXJIZWlnaHQ6IG51bWJlcjsgY29udGFpbmVyV2lkdGg6IG51bWJlciB9KSB7XG4gICAgdGhpcy5iYXNlSGVpZ2h0ID0gY29uZmlnLmJhc2VIZWlnaHQ7XG4gICAgdGhpcy5iYXNlV2lkdGggPSBjb25maWcuYmFzZVdpZHRoO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gY29uZmlnLmNvbnRhaW5lckhlaWdodDtcbiAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gY29uZmlnLmNvbnRhaW5lcldpZHRoO1xuICAgIHRoaXMudXBkYXRlU2NhbGUoKTtcbiAgfVxuXG4gIHNldENvbnRhaW5lckJvdW5kcyhib3VuZHM6IHsgaGVpZ2h0OiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfSkge1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBib3VuZHMud2lkdGg7XG4gICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0O1xuICAgIHRoaXMudXBkYXRlU2NhbGUoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVNjYWxlKCkge1xuICAgIGNvbnN0IHNjYWxlRm4gPSBTY2FsZS5jYWxjKHRoaXMuYmFzZUhlaWdodCwgdGhpcy5iYXNlV2lkdGgpO1xuICAgIGNvbnN0IHNjYWxlID0gc2NhbGVGbih7IGhlaWdodDogdGhpcy5jb250YWluZXJIZWlnaHQsIHdpZHRoOiB0aGlzLmNvbnRhaW5lcldpZHRoIH0pO1xuICAgIGNvbnN0IGhhc0NoYW5nZWQgPSB0aGlzLnNjYWxlICE9PSBzY2FsZTtcbiAgICB0aGlzLl9zY2FsZSA9IHNjYWxlO1xuICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKGZuKSA9PiB7XG4gICAgICAgIGZuKHRoaXMuX3NjYWxlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlKHNjYWxlQ2hhbmdlSGFuZGxlcjogKHNjYWxlOiBudW1iZXIpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKSB7XG4gICAgLy8gY29uc29sZS5sb2coc3Vic2NyaWJlcklkKTtcbiAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChzY2FsZUNoYW5nZUhhbmRsZXIpO1xuICAgIHNjYWxlQ2hhbmdlSGFuZGxlcih0aGlzLl9zY2FsZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZGVsZXRlKHNjYWxlQ2hhbmdlSGFuZGxlcik7XG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG5hbWVzcGFjZSBTY2FsZSB7XG4gIGV4cG9ydCBjb25zdCBjYWxjID0gKGJhc2VIZWlnaHQ6IG51bWJlciwgYmFzZVdpZHRoOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gKGNvbnRhaW5lcjogeyBoZWlnaHQ6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9KSA9PiB7XG4gICAgICBjb25zdCBoZWlnaHRSYXRpbyA9IGNvbnRhaW5lci5oZWlnaHQgLyBiYXNlSGVpZ2h0O1xuICAgICAgY29uc3Qgd2lkdGhSYXRpbyA9IGNvbnRhaW5lci53aWR0aCAvIGJhc2VXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLm1pbihoZWlnaHRSYXRpbywgd2lkdGhSYXRpbyk7XG4gICAgfTtcbiAgfTtcblxuICB0eXBlIFNjYWxlUG9zSW5wdXQgPSB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBoOiBudW1iZXI7IHc6IG51bWJlciB9O1xuXG4gIGV4cG9ydCBjb25zdCBzY2FsZUZ1bmN0aW9uQ3JlYXRvciA9IChzY2FsZTogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB2YWx1ZSAqIHNjYWxlO1xuICB9O1xufVxuIiwgImltcG9ydCB7IERBdWRpb0R0bywgREltZ0R0bywgRFZpZGVvRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlUHJvdmlkZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIFJFU09VUkNFX1BST1ZJREVSIF06IFwiO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlkZW9NYXAgPSBuZXcgTWFwPHN0cmluZywgRFZpZGVvRHRvPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXVkaW9NYXAgPSBuZXcgTWFwPHN0cmluZywgREF1ZGlvRHRvPigpO1xuICAgIGNvbnN0cnVjdG9yKGRhdGE6IHsgdmlkZW9zOiBSZWFkb25seUFycmF5PERWaWRlb0R0bz47IGF1ZGlvOiBSZWFkb25seUFycmF5PERBdWRpb0R0bz4gfSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiVklERU9fQ09VTlQgXCIgKyBkYXRhLnZpZGVvcy5sZW5ndGgpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiQVVESU9fQ09VTlQgXCIgKyBkYXRhLmF1ZGlvLmxlbmd0aCk7XG4gICAgICAgIGRhdGEudmlkZW9zLmZvckVhY2goKHZpZGVvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvTWFwLnNldCh2aWRlby5pZCwgdmlkZW8pO1xuICAgICAgICB9KTtcbiAgICAgICAgZGF0YS5hdWRpby5mb3JFYWNoKChhdWRpbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5hdWRpb01hcC5zZXQoYXVkaW8uaWQsIGF1ZGlvKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QXVkaW9CeUlkKGlkOiBzdHJpbmcpOiBEQXVkaW9EdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG1heWJlQXVkaW8gPSB0aGlzLmF1ZGlvTWFwLmdldChpZCk7XG4gICAgICAgIGlmICghbWF5YmVBdWRpbykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLlRBRyArIFwiQXVkaW8gYnkgaWQgXCIgKyBpZCArIFwiIGRvbnQgZXhpc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heWJlQXVkaW8gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0VmlkZW9CeUlkKGlkOiBzdHJpbmcpOiBEVmlkZW9EdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG1heWJlVmlkZW8gPSB0aGlzLnZpZGVvTWFwLmdldChpZCk7XG4gICAgICAgIGlmICghbWF5YmVWaWRlbykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLlRBRyArIFwiVmlkZW8gYnkgaWQgXCIgKyBpZCArIFwiIGRvbnQgZXhpc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heWJlVmlkZW8gPz8gZmFsc2U7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBPazxUPiBpbXBsZW1lbnRzIElSZXN1bHQ8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHZhbHVlOiBUKSB7fVxuICAgIGlzT2soKTogdGhpcyBpcyBPazxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG1hcDxBPihmOiAodDogVCkgPT4gQSk6IElSZXN1bHQ8QT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGYodGhpcy52YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgT2s8QT4odmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZhaWx1cmU8VD4gaW1wbGVtZW50cyBJUmVzdWx0PFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSBtZXNzYWdlOiBzdHJpbmcpIHt9XG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlzT2soKTogdGhpcyBpcyBPazxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXA8QT4oX2Y6ICh0OiBUKSA9PiBBKTogSVJlc3VsdDxBPiB7XG4gICAgICAgIHJldHVybiBuZXcgRmFpbHVyZTxBPih0aGlzLm1lc3NhZ2UpO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIElSZXN1bHQ8VD4ge1xuICAgIGlzT2soKTogdGhpcyBpcyBPazxUPjtcbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+O1xuICAgIG1hcDxBPihmOiAodDogVCkgPT4gQSk6IElSZXN1bHQ8QT47XG59XG5cbmV4cG9ydCB0eXBlIFJlc3VsdDxUPiA9IEZhaWx1cmU8VD4gfCBPazxUPjtcbmV4cG9ydCBuYW1lc3BhY2UgUmVzdWx0IHtcbiAgICBleHBvcnQgY29uc3Qgb2sgPSA8VD4odmFsdWU6IFQpID0+IG5ldyBPazxUPih2YWx1ZSk7XG4gICAgZXhwb3J0IGNvbnN0IGZhaWx1cmUgPSA8VD4obWVzc2FnZTogc3RyaW5nKSA9PiBuZXcgRmFpbHVyZTxUPihtZXNzYWdlKTtcbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4uL3J1bGVzL2ZhY3RcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9ydWxlcy9jb25kaXRpb25cIjtcbmltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuaW1wb3J0IHsgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgRFN0YXRlIHtcbiAgICBpbnRlcmZhY2UgUHJvcERlZmluaXRpb248VHlwZU5hbWUsIFR5cGUgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXI+IHtcbiAgICAgICAgcmVhZG9ubHkgX3R5cGU6IFR5cGVOYW1lO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBwcm9wRGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgaW5pdGlhbFZhbHVlPzogVHlwZTtcbiAgICAgICAgcmVhZG9ubHkgb3B0aW9ucz86IFJlYWRvbmx5QXJyYXk8UHJvcFZhbHVlPFR5cGU+PjtcbiAgICB9XG5cbiAgICBleHBvcnQgdHlwZSBOdW1lcmljUHJvcCA9IFByb3BEZWZpbml0aW9uPFwibnVtYmVyXCIsIG51bWJlcj47XG4gICAgZXhwb3J0IHR5cGUgU3RyaW5nUHJvcCA9IFByb3BEZWZpbml0aW9uPFwic3RyaW5nXCIsIHN0cmluZz47XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIGZyb21FdmVudEhhbmRsZXIge1xuICAgICAgICByZWFkb25seSBvbkV2ZW50OiBERXZlbnRbXCJraW5kXCJdO1xuICAgICAgICByZWFkb25seSB0aGVuRXhlY3V0ZTogUmVhZG9ubHlBcnJheTxTdGF0ZUNvbW1hbmQ+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgUHJvcFZhbHVlPFQ+IHtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IFQ7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlTGFiZWw6IHN0cmluZztcbiAgICB9XG4gICAgZXhwb3J0IHR5cGUgUHJvcCA9IE51bWVyaWNQcm9wIHwgU3RyaW5nUHJvcDtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0U3RyaW5nTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcInNldC1zdHJpbmdcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEluY3JlbWVudE51bWJlck11dGF0aW9uIHtcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJpbmNyZW1lbnQtbnVtYmVyXCI7XG4gICAgICAgIHJlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHN0ZXBTaXplOiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGlmTm90RXhpc3RUaGVuU2V0VG86IG51bWJlcjtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBEZWNyZW1lbnROdW1iZXJNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwiZGVjcmVtZW50LW51bWJlclwiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBzdGVwU2l6ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBpZk5vdEV4aXN0VGhlblNldFRvOiBudW1iZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBTZXROdW1iZXJNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwic2V0LW51bWJlclwiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cbiAgICBleHBvcnQgdHlwZSBOdW1iZXJNdXRhdGlvbnMgPSBJbmNyZW1lbnROdW1iZXJNdXRhdGlvbiB8IERlY3JlbWVudE51bWJlck11dGF0aW9uIHwgU2V0TnVtYmVyTXV0YXRpb247XG5cbiAgICBleHBvcnQgdHlwZSBTdGF0ZU11dGF0aW9uID0gU2V0U3RyaW5nTXV0YXRpb24gfCBOdW1iZXJNdXRhdGlvbnM7XG5cbiAgICBleHBvcnQgY29uc3QgaXNOdW1iZXJNdXRhdGlvbiA9IChtdXRhdGlvbnM6IFN0YXRlTXV0YXRpb24pOiBtdXRhdGlvbnMgaXMgTnVtYmVyTXV0YXRpb25zID0+IHtcbiAgICAgICAgaWYgKCFtdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBtdXRhdGlvbnMua2luZCA9PT0gXCJzZXQtbnVtYmVyXCIgfHxcbiAgICAgICAgICAgIG11dGF0aW9ucy5raW5kID09PSBcImRlY3JlbWVudC1udW1iZXJcIiB8fFxuICAgICAgICAgICAgbXV0YXRpb25zLmtpbmQgPT09IFwiaW5jcmVtZW50LW51bWJlclwiXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc1N0cmluZ011dGF0aW9uID0gKG11dGF0aW9uOiBTdGF0ZU11dGF0aW9uKTogbXV0YXRpb24gaXMgU2V0U3RyaW5nTXV0YXRpb24gPT4ge1xuICAgICAgICByZXR1cm4gbXV0YXRpb24gJiYgbXV0YXRpb24ua2luZCA9PT0gXCJzZXQtc3RyaW5nXCI7XG4gICAgfTtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3RhdGVRdWVyeSB7XG4gICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgY29uZGl0aW9uOiBDb25kaXRpb247XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBTdGF0ZVF1ZXJ5UmVzdWx0IHtcbiAgICAgICAgcmVhZG9ubHkgcXVlcnlOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHByZXY6IGJvb2xlYW47XG4gICAgICAgIHJlYWRvbmx5IGN1cnI6IGJvb2xlYW47XG4gICAgfVxuXG4gICAgZXhwb3J0IGNvbnN0IG51bWVyaWNQcm9wVG9GYWN0ID0gKHByb3A6IE51bWVyaWNQcm9wLCB2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3Q6IEZhY3QuTnVtZXJpYyA9IHtcbiAgICAgICAgICAgIGtpbmQ6IFwibnVtZXJpYy1mYWN0XCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiBwcm9wLnByb3BEZXNjcmlwdGlvbiA/PyBcIiBbU1RBVEVfUFJPUEVSVFldIDogXCIgKyBwcm9wLnByb3BOYW1lLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBsYWJlbDogXCIgW1ZBTFVFXSA6IFwiICsgdmFsdWUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmYWN0O1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3Qgc3RyaW5nUHJvcFRvRmFjdCA9IChwcm9wOiBTdHJpbmdQcm9wLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3Q6IEZhY3QuU3RyaW5nID0ge1xuICAgICAgICAgICAga2luZDogXCJzdHJpbmctZmFjdFwiLFxuICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICByZWZlcmVuY2VMYWJlbDogXCIgW1NUQVRFX1BST1BFUlRZXSA6IFwiICsgcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IFwiIFtWQUxVRV0gOiBcIiArIHZhbHVlLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZmFjdDtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSBcIi4uL2NvbW1vbi9yZXN1bHRcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9ydWxlcy9jb25kaXRpb25cIjtcbmltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuL0RzdGF0ZVwiO1xuaW1wb3J0IHsgREV2ZW50RGlzcGF0Y2hlciB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBRdWVyeUNoYW5nZWRFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcblxuZXhwb3J0IGNsYXNzIFN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCIgWyBTVEFURV9TRVJWSUNFIF0gOlwiO1xuICBwcml2YXRlIHJlYWRvbmx5IGZhY3RzU3RyaW5nID0gbmV3IE1hcDxzdHJpbmcsIEZhY3QuU3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZhY3RzTnVtZXJpYyA9IG5ldyBNYXA8c3RyaW5nLCBGYWN0Lk51bWVyaWM+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcERlZmluaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIERTdGF0ZS5Qcm9wPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJpZXMgPSBuZXcgTWFwPHN0cmluZywgeyBxdWVyeTogRFN0YXRlLlN0YXRlUXVlcnk7IGxhc3RSZXN1bHQ6IGJvb2xlYW4gfT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZUNvbW1hbmRzOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBERXZlbnREaXNwYXRjaGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZEJ1czogRENvbW1hbmRCdXMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogUmVhZG9ubHlBcnJheTxEU3RhdGUuUHJvcD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBxdWVyeUxpc3Q6IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlN0YXRlUXVlcnk+ID0gW10sXG4gICkge1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIHRoaXMucmVnaXN0ZXJQcm9wZXJ0eShwcm9wKTtcbiAgICB9KTtcbiAgICBjb25zdCBmYWN0cyA9IHRoaXMuZ2V0QWxsRmFjdHMoKTtcbiAgICBxdWVyeUxpc3QuZm9yRWFjaCgoZGVmaW5pdGlvbikgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RlclF1ZXJ5KGRlZmluaXRpb24sIGZhY3RzKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZhbHVhdGVRdWVyaWVzKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvbW1hbmRzID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoY29tbWFuZCkgPT4ge1xuICAgICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiKSB7XG4gICAgICAgIHRoaXMubXV0YXRpb24oY29tbWFuZC5wYXlsb2FkLm11dGF0aW9uKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLlRBRyk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclF1ZXJ5KHF1ZXJ5OiBEU3RhdGUuU3RhdGVRdWVyeSwgY3VycmVudEZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gQ29uZGl0aW9uLmV2YWx1YXRlKHF1ZXJ5LmNvbmRpdGlvbiwgY3VycmVudEZhY3RzKTtcbiAgICB0aGlzLnF1ZXJpZXMuc2V0KHF1ZXJ5Lm5hbWUsIHsgcXVlcnk6IHF1ZXJ5LCBsYXN0UmVzdWx0OiByZXN1bHQgfSk7XG4gICAgdGhpcy5lbWl0UXVlcnlDaGFuZ2VkRXZlbnQoeyBxdWVyeU5hbWU6IHF1ZXJ5Lm5hbWUsIHByZXY6IHJlc3VsdCwgY3VycjogcmVzdWx0IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclByb3BlcnR5KHByb3A6IERTdGF0ZS5Qcm9wKSB7XG4gICAgaWYgKHRoaXMucHJvcERlZmluaXRpb25zLmhhcyhwcm9wLnByb3BOYW1lKSkge1xuICAgICAgLy8gTE9HR0lOR1xuICAgICAgY29uc29sZS53YXJuKFwiUHJvcCBleGNpc3RzIGFscmVhZHkuXCIsIHByb3AucHJvcE5hbWUpO1xuICAgIH1cblxuICAgIHRoaXMucHJvcERlZmluaXRpb25zLnNldChwcm9wLnByb3BOYW1lLCBwcm9wKTtcblxuICAgIGlmIChwcm9wLmluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3AuX3R5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGZhY3QgPSBEU3RhdGUuc3RyaW5nUHJvcFRvRmFjdChwcm9wLCBwcm9wLmluaXRpYWxWYWx1ZSk7XG4gICAgICB0aGlzLmZhY3RzU3RyaW5nLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICB9XG4gICAgaWYgKHByb3AuX3R5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGNvbnN0IGZhY3QgPSBEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgcHJvcC5pbml0aWFsVmFsdWUpO1xuICAgICAgdGhpcy5mYWN0c051bWVyaWMuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbXV0YXRlU3RyaW5nKHByb3A6IERTdGF0ZS5TdHJpbmdQcm9wLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VyciA9IHRoaXMuZmFjdHNTdHJpbmcuZ2V0KHByb3AucHJvcE5hbWUpO1xuICAgIGlmIChjdXJyKSB7XG4gICAgICBjb25zdCB1cGRhdGVkOiBGYWN0LlN0cmluZyA9IHsgLi4uY3VyciwgdmFsdWUgfTtcbiAgICAgIHRoaXMuc2V0RmFjdCh1cGRhdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3JlYXRlZDogRmFjdC5TdHJpbmcgPSB7XG4gICAgICAgIGtpbmQ6IFwic3RyaW5nLWZhY3RcIixcbiAgICAgICAgcmVmZXJlbmNlSWQ6IHByb3AucHJvcE5hbWUsXG4gICAgICAgIHJlZmVyZW5jZUxhYmVsOiBcImxhYmVsIGZvcjogXCIgKyBwcm9wLnByb3BOYW1lLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbGFiZWw6IFwiVmFsdWU6IFwiICsgdmFsdWUsXG4gICAgICB9O1xuICAgICAgdGhpcy5zZXRGYWN0KGNyZWF0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbXV0YXRlTnVtYmVyKHByb3A6IERTdGF0ZS5OdW1lcmljUHJvcCwgbXV0YXRpb246IERTdGF0ZS5OdW1iZXJNdXRhdGlvbnMpIHtcbiAgICBjb25zdCBjdXJyID0gdGhpcy5mYWN0c051bWVyaWMuZ2V0KHByb3AucHJvcE5hbWUpO1xuICAgIGlmICghY3Vycikge1xuICAgICAgc3dpdGNoIChtdXRhdGlvbi5raW5kKSB7XG4gICAgICAgIGNhc2UgXCJzZXQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KERTdGF0ZS5udW1lcmljUHJvcFRvRmFjdChwcm9wLCBtdXRhdGlvbi52YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGVjcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdChEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgbXV0YXRpb24uaWZOb3RFeGlzdFRoZW5TZXRUbykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5jcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdChEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgbXV0YXRpb24uaWZOb3RFeGlzdFRoZW5TZXRUbykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG11dGF0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3Vycikge1xuICAgICAgc3dpdGNoIChtdXRhdGlvbi5raW5kKSB7XG4gICAgICAgIGNhc2UgXCJzZXQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KHsgLi4uY3VyciwgdmFsdWU6IG11dGF0aW9uLnZhbHVlIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGVjcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdCh7IC4uLmN1cnIsIHZhbHVlOiBjdXJyLnZhbHVlIC0gbXV0YXRpb24uc3RlcFNpemUgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpbmNyZW1lbnQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KHsgLi4uY3VyciwgdmFsdWU6IGN1cnIudmFsdWUgKyBtdXRhdGlvbi5zdGVwU2l6ZSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBtdXRhdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlUXVlcmllcygpOiBSZWFkb25seUFycmF5PHsgcXVlcnlOYW1lOiBzdHJpbmc7IHByZXY6IGJvb2xlYW47IGN1cnI6IGJvb2xlYW47IGRpZENoYW5nZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZmFjdHMgPSB0aGlzLmdldEFsbEZhY3RzKCk7XG4gICAgY29uc3QgYWxsOiBBcnJheTx7IHF1ZXJ5TmFtZTogc3RyaW5nOyBwcmV2OiBib29sZWFuOyBjdXJyOiBib29sZWFuOyBkaWRDaGFuZ2U6IGJvb2xlYW4gfT4gPSBbXTtcbiAgICB0aGlzLnF1ZXJpZXMuZm9yRWFjaCgocSkgPT4ge1xuICAgICAgY29uc3QgcHJldiA9IHEubGFzdFJlc3VsdDtcblxuICAgICAgY29uc3QgY3VyciA9IENvbmRpdGlvbi5ldmFsdWF0ZShxLnF1ZXJ5LmNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gcHJldiAhPT0gY3VycjtcbiAgICAgIHEubGFzdFJlc3VsdCA9IGN1cnI7XG4gICAgICBhbGwucHVzaCh7IHF1ZXJ5TmFtZTogcS5xdWVyeS5uYW1lLCBwcmV2LCBjdXJyLCBkaWRDaGFuZ2UgfSk7XG4gICAgICAvLyBkZWYudmFsdWUgPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBtdXRhdGlvbihtdXRhdGlvbjogRFN0YXRlLlN0YXRlTXV0YXRpb24pOiB7IHN1Y2Nlc3M6IGJvb2xlYW4gfSB7XG4gICAgY29uc3QgcHJvcERlZiA9IHRoaXMucHJvcERlZmluaXRpb25zLmdldChtdXRhdGlvbi5wcm9wTmFtZSk7XG4gICAgaWYgKCFwcm9wRGVmKSB7XG4gICAgICAvLyBUT0RPIExPR0dJTkdcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3BEZWYuX3R5cGUgPT09IFwic3RyaW5nXCIgJiYgRFN0YXRlLmlzU3RyaW5nTXV0YXRpb24obXV0YXRpb24pKSB7XG4gICAgICB0aGlzLm11dGF0ZVN0cmluZyhwcm9wRGVmLCBtdXRhdGlvbi52YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BEZWYuX3R5cGUgPT09IFwibnVtYmVyXCIgJiYgRFN0YXRlLmlzTnVtYmVyTXV0YXRpb24obXV0YXRpb24pKSB7XG4gICAgICB0aGlzLm11dGF0ZU51bWJlcihwcm9wRGVmLCBtdXRhdGlvbik7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5UmVzdWx0cyA9IHRoaXMuZXZhbHVhdGVRdWVyaWVzKCk7XG4gICAgY29uc3QgY2hhbmdlZFJlc3VsdCA9IHF1ZXJ5UmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuZGlkQ2hhbmdlKTtcbiAgICBjaGFuZ2VkUmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgdGhpcy5lbWl0UXVlcnlDaGFuZ2VkRXZlbnQoeyBxdWVyeU5hbWU6IHJlcy5xdWVyeU5hbWUsIHByZXY6IHJlcy5wcmV2LCBjdXJyOiByZXMuY3VyciB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFF1ZXJ5Q2hhbmdlZEV2ZW50KGRhdGE6IHsgcXVlcnlOYW1lOiBzdHJpbmc7IHByZXY6IGJvb2xlYW47IGN1cnI6IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IHF1ZXJ5Q2hhbmdlZEV2ZW50OiBRdWVyeUNoYW5nZWRFdmVudCA9IHtcbiAgICAgIGtpbmQ6IFwiU1RBVEVfUVVFUllfUkVTVUxUX0NIQU5HRURfRVZFTlRcIixcbiAgICAgIHByb2R1Y2VyOiBcIlNUQVRFLVNFUlZJQ0VcIixcbiAgICAgIHByb2R1Y2VySWQ6IFwiU1RBVEUtU0VSVklDRVwiLFxuICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgZGF0YSxcbiAgICB9O1xuICAgIGNvbnN0IHsgcXVlcnlOYW1lLCBjdXJyLCBwcmV2IH0gPSBxdWVyeUNoYW5nZWRFdmVudC5kYXRhO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiWyBRVUVSWV9DSEFOR0VEIFwiICsgcXVlcnlOYW1lICsgXCJdIDogXCIgKyBwcmV2ICsgXCIgLT4gXCIgKyBjdXJyKTtcbiAgICB0aGlzLmV2ZW50QnVzLmVtaXQocXVlcnlDaGFuZ2VkRXZlbnQpO1xuICB9XG5cbiAgZ2V0UHJvcEFzRmFjdChwcm9wTmFtZTogc3RyaW5nKTogUmVzdWx0PEZhY3Q+IHtcbiAgICBjb25zdCBwcm9wRGVmID0gdGhpcy5wcm9wRGVmaW5pdGlvbnMuZ2V0KHByb3BOYW1lKTtcbiAgICBpZiAoIXByb3BEZWYpIHtcbiAgICAgIHJldHVybiBSZXN1bHQuZmFpbHVyZShcbiAgICAgICAgXCJObyBkZWZpbml0aW9uIGZvcm0gcHJvcGVydHkgbnkgbmFtZSBcIiArIHByb3BOYW1lICsgXCIgaXMgcmVnaXN0ZXJlZC4gKFBhc3MgaW4gY29uc3RydWN0b3IuKVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZhY3RzU3RyaW5nLmdldChwcm9wTmFtZSkgPz8gdGhpcy5mYWN0c051bWVyaWMuZ2V0KHByb3BOYW1lKTtcblxuICAgIHJldHVybiB2YWx1ZSA/IFJlc3VsdC5vayh2YWx1ZSkgOiBSZXN1bHQuZmFpbHVyZShcIlByb3BlcnR5IFwiICsgcHJvcE5hbWUgKyBcIiBoYXMgbm8gdmFsdWUuXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGYWN0KGZhY3Q6IEZhY3QpIHtcbiAgICBzd2l0Y2ggKGZhY3Qua2luZCkge1xuICAgICAgY2FzZSBcIm51bWVyaWMtZmFjdFwiOlxuICAgICAgICB0aGlzLmZhY3RzTnVtZXJpYy5zZXQoZmFjdC5yZWZlcmVuY2VJZCwgZmFjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInN0cmluZy1mYWN0XCI6XG4gICAgICAgIHRoaXMuZmFjdHNTdHJpbmcuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGZhY3Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdGUoKSB7XG4gICAgY29uc3QgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IG51bGwgfCBib29sZWFuPiA9IHt9O1xuICAgIHRoaXMucHJvcERlZmluaXRpb25zLmZvckVhY2goKGRlZikgPT4ge1xuICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IG1heWJlRmFjdCA9IHRoaXMuZ2V0QW55RmFjdChkZWYucHJvcE5hbWUpO1xuICAgICAgaWYgKG1heWJlRmFjdCkge1xuICAgICAgICB2YWx1ZSA9IG1heWJlRmFjdC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHByb3BzW2RlZi5wcm9wTmFtZV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXJpZXMuZm9yRWFjaCgocXVlcnkpID0+IHtcbiAgICAgIHByb3BzW3F1ZXJ5LnF1ZXJ5Lm5hbWVdID0gcXVlcnkubGFzdFJlc3VsdDtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICBjb25zdCBwcm9wQ291bnQgPSBwcm9wTmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IHByb3BBcnJheSA9IFsuLi50aGlzLnByb3BEZWZpbml0aW9ucy52YWx1ZXMoKV07XG5cbiAgICByZXR1cm4geyBwcm9wQ291bnQsIHByb3BOYW1lcywgcHJvcEFycmF5LCBzdGF0ZTogcHJvcHMgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QW55RmFjdChwcm9wTmFtZTogc3RyaW5nKTogRmFjdCB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5mYWN0c1N0cmluZy5nZXQocHJvcE5hbWUpID8/IHRoaXMuZmFjdHNOdW1lcmljLmdldChwcm9wTmFtZSkgPz8gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdldEFsbEZhY3RzKCk6IFJlYWRvbmx5QXJyYXk8RmFjdD4ge1xuICAgIHJldHVybiBbLi4udGhpcy5mYWN0c051bWVyaWMudmFsdWVzKCksIC4uLnRoaXMuZmFjdHNTdHJpbmcudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgY2hlY2sgdGhhdCBhbGwgcmVmZXJlbmNlSWRzIHVzZWQgaW4gQ29uZGl0aW9uIGlzIHJlZ2lzdGVyZWQgYXMgYSB2YWxpZCBwcm9wZXJ0eSBpbiBzdGF0ZS5cbiAgICogQHBhcmFtIGNvbmRpdGlvblxuICAgKi9cbiAgY2FuQmVNYXRjaGVkKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2ltcGxlQ29uZGl0aW9ucyA9IENvbmRpdGlvbi5nZXRBbGxTaW1wbGVDb25kaXRpb25zKGNvbmRpdGlvbik7XG4gICAgbGV0IGhhc0FsbCA9IHRydWU7XG5cbiAgICBjb25zdCBhbGxJZHMgPSBzaW1wbGVDb25kaXRpb25zLm1hcCgoYykgPT4gYy5yZWZlcmVuY2VJZCk7XG5cbiAgICBjb25zdCBtaXNzaW5nSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGFsbElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnByb3BEZWZpbml0aW9ucy5oYXMoaWQpKSB7XG4gICAgICAgIGhhc0FsbCA9IGZhbHNlO1xuICAgICAgICBtaXNzaW5nSWRzLnB1c2goaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHLCBtaXNzaW5nSWRzKTtcblxuICAgIHJldHVybiBoYXNBbGw7XG4gIH1cbiAgaXNNYXRjaGVkKGNvbmRpdGlvbjogQ29uZGl0aW9uKSB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ldmFsdWF0ZShjb25kaXRpb24sIHRoaXMuZ2V0QWxsRmFjdHMoKSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBTY2hlbWFEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgRE1lZGlhTWFuYWdlciB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ETWVkaWEtbWFuYWdlclwiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERQbGF5ZXIgfSBmcm9tIFwiLi4vcGxheWVyL2RwbGF5ZXJcIjtcbmltcG9ydCB7IEFuc3dlcmVkUXVlc3Rpb24gfSBmcm9tIFwiLi4vcGxheWVyL2hpc3RvcnktcXVlXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBEUGFnZSB9IGZyb20gXCIuL0RQYWdlXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi9zY2FsZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VQcm92aWRlciB9IGZyb20gXCIuLi9zZXJ2aWNlcy9yZXNvdXJjZS1wcm92aWRlclwiO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3N0YXRlL3N0YXRlLXNlcnZpY2VcIjtcbmltcG9ydCB7IERDb21tYW5kLCBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuZ2luZUxvZ2dlciB7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAgYXBwRXZlbnQoZXZlbnQ6IERFdmVudCk6IHZvaWQ7XG4gIGFwcENvbW1hbmQoY29tbWFuZDogRENvbW1hbmQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYVJlc3VsdCB7XG4gIHJlYWRvbmx5IGV2ZW50TG9nOiBSZWFkb25seUFycmF5PERFdmVudD47XG4gIHJlYWRvbmx5IGNvbW1hbmRMb2c6IFJlYWRvbmx5QXJyYXk8RENvbW1hbmQ+O1xuICByZWFkb25seSBhbnN3ZXJzOiBSZWFkb25seUFycmF5PGFueT47XG59XG5leHBvcnQgaW50ZXJmYWNlIElTY2hlbWFFbmdpbmUge1xuICBvbkNvbXBsZXRlKGhhbmRsZXI6IChyZXN1bHQ6IFNjaGVtYVJlc3VsdCkgPT4gdm9pZCk6IHZvaWQ7XG4gIG9uQ29tbWFuZE9yRXZlbnQoaXRlbTogREV2ZW50IHwgRENvbW1hbmQpOiB2b2lkO1xuICBzZXRTY2hlbWEoc2NoZW1hOiBTY2hlbWFEdG8pOiB2b2lkO1xuICBvbkZhdGFsRXJyb3IoaGFuZGxlcjogKGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYUVuZ2luZSBpbXBsZW1lbnRzIElTY2hlbWFFbmdpbmUge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBTQ0hFTUFfRU5HSU5FIF0gOlwiO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXMgPSBuZXcgRENvbW1hbmRCdXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1cyA9IG5ldyBFdmVudEJ1cygpO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lZGlhTWFuYWdlcjogRE1lZGlhTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSB1aUNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lZGlhQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VQcm92aWRlcjogUmVzb3VyY2VQcm92aWRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxFdmVudFRvU3RhdGVIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seUFycmF5PFN0YXRlQ29tbWFuZD4+KCk7XG4gIHByaXZhdGUgcGxheWVyOiBEUGxheWVyO1xuICBwcml2YXRlIGN1cnJlbnRQYWdlOiBEUGFnZSB8IGZhbHNlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0RWw6IEhUTUxEaXZFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3aWR0aDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBTY2hlbWFEdG8sXG4gICkge1xuICAgIHRoaXMuaG9zdEVsZW1lbnQgPSBob3N0RWw7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnVpQ29udGFpbmVyKTtcbiAgICB0aGlzLmhvc3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMubWVkaWFDb250YWluZXIpO1xuICAgIGNvbnN0IHN0YXRlUHJvcHMgPSB0aGlzLnNjaGVtYS5zdGF0ZVByb3BzID8/IFtdO1xuICAgIGNvbnN0IHN0YXRlUXVlcmllcyA9IHRoaXMuc2NoZW1hLnN0YXRlUXVlcmllcyA/PyBbXTtcbiAgICB0aGlzLnN0YXRlU2VydmljZSA9IG5ldyBTdGF0ZVNlcnZpY2UodGhpcy5ldmVudEJ1cywgdGhpcy5jb21tYW5kQnVzLCBzdGF0ZVByb3BzLCBzdGF0ZVF1ZXJpZXMpO1xuICAgIHRoaXMuc2NhbGUgPSBuZXcgU2NhbGVTZXJ2aWNlKHtcbiAgICAgIGJhc2VIZWlnaHQ6IHNjaGVtYS5iYXNlSGVpZ2h0LFxuICAgICAgYmFzZVdpZHRoOiBzY2hlbWEuYmFzZVdpZHRoLFxuICAgICAgY29udGFpbmVyV2lkdGg6IHdpZHRoLFxuICAgICAgY29udGFpbmVySGVpZ2h0OiBoZWlnaHQsXG4gICAgfSk7XG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmxvZ0NvbW1hbmRzID0gdHJ1ZTtcbiAgICBjb25zdCBnbG9iYWxFdmVudEhhbmRsZXJzID0gc2NoZW1hLnN0YXRlRnJvbUV2ZW50ID8/IFtdO1xuXG4gICAgZ2xvYmFsRXZlbnRIYW5kbGVycy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICB0aGlzLmdsb2JhbEV2ZW50VG9TdGF0ZUhhbmRsZXJzLnNldChoLm9uRXZlbnQsIGgudGhlbkV4ZWN1dGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VzID0gU2NoZW1hRHRvLmdldFJlc291cmNlcyh0aGlzLnNjaGVtYSk7XG4gICAgdGhpcy5yZXNvdXJjZVByb3ZpZGVyID0gbmV3IFJlc291cmNlUHJvdmlkZXIoeyB2aWRlb3M6IHJlc291cmNlcy52aWRlb0xpc3QsIGF1ZGlvOiByZXNvdXJjZXMuYXVkaW9MaXN0IH0pO1xuICAgIHRoaXMubWVkaWFNYW5hZ2VyID0gbmV3IERNZWRpYU1hbmFnZXIoXG4gICAgICB0aGlzLm1lZGlhQ29udGFpbmVyLFxuICAgICAgdGhpcy5jb21tYW5kQnVzLFxuICAgICAgdGhpcy5ldmVudEJ1cyxcbiAgICAgIHRoaXMucmVzb3VyY2VQcm92aWRlcixcbiAgICAgIHRoaXMuc2NhbGUsXG4gICAgKTtcbiAgICB0aGlzLnBsYXllciA9IG5ldyBEUGxheWVyKHRoaXMuc2NoZW1hKTtcbiAgICB0aGlzLnN0eWxlU2VsZigpO1xuICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICB0aGlzLmhvb2tVcExpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBob29rVXBMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50QnVzLnN1YnNjcmliZSgoZXYpID0+IHtcbiAgICAgIHRoaXMub25Db21tYW5kT3JFdmVudChldik7XG4gICAgICBjb25zdCBnbG9iYWxIYW5kbGVycyA9IHRoaXMuZ2xvYmFsRXZlbnRUb1N0YXRlSGFuZGxlcnMuZ2V0KGV2LmtpbmQpID8/IFtdO1xuICAgICAgZ2xvYmFsSGFuZGxlcnMuZm9yRWFjaCgoc3RhdGVDb21tYW5kKSA9PiB7XG4gICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KHN0YXRlQ29tbWFuZCk7XG4gICAgICB9KTtcbiAgICB9LCB0aGlzLlRBRyArIFwiSE9PS19VUF9MSVNURU5FUlNcIik7XG4gICAgY29uc3QgY29tbWFuZFN1YnNjcmlwdGlvbiA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGNvbW1hbmQpID0+IHtcbiAgICAgIC8vIHN3aXRjaCAoY29tbWFuZC5raW5kKSB7XG4gICAgICAvL1xuICAgICAgLy8gfVxuICAgICAgdGhpcy5vbkNvbW1hbmRPckV2ZW50KGNvbW1hbmQpO1xuICAgICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJQQUdFX1FVRV9ORVhUX1BBR0VfQ09NTUFORFwiKSB7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJFTkdJTkVfTEVBVkVfUEFHRV9DT01NQU5EXCIpIHtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlNFUVVFTkNFIFNUQVJURUQgLS0gVE9ETyBFVkVOVCBGT1IgVEhJUz8/XCIpO1xuICAgICAgICBjb25zb2xlLmxvZyhjb21tYW5kKTtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gY29tbWFuZC5wYXlsb2FkLnBhZ2VJZDtcbiAgICAgICAgY29uc3QgZmFjdHMgPSBjb21tYW5kLnBheWxvYWQuZmFjdHNDb2xsZWN0ZWQ7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgICAgIGNvbnN0IGFuczogQW5zd2VyZWRRdWVzdGlvbltdID0gZmFjdHMubWFwKChmKSA9PiAoe1xuICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgICBmYWN0OiBmLFxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMucGxheWVyLnNhdmVIaXN0b3J5KHtcbiAgICAgICAgICBhbnN3ZXJlZFF1ZXN0aW9uczogYW5zLFxuICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgICAvLyBjb25zdCBoaXN0b3J5OiBQYWdlSGlzdG9yeSA9IHsgcGFnZToge30sIGFuc3dlcmVkUXVlc3Rpb25zOiBbXSB9O1xuICAgICAgfVxuICAgIH0sIHRoaXMuVEFHKTtcblxuICAgIHRoaXMuc3Vicy5wdXNoKGNvbW1hbmRTdWJzY3JpcHRpb24pO1xuICAgIHRoaXMuc3Vicy5wdXNoKGV2ZW50U3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgc3R5bGVTZWxmKCkge1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zY2FsZS5wYWdlSGVpZ2h0ICsgXCJweFwiO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLnNjYWxlLnBhZ2VXaWR0aCArIFwicHhcIjtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2NoZW1hLmJhY2tncm91bmRDb2xvciA/PyBcIndoaXRlXCI7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICAvLyB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICBjb25zdCBtYWtlU3RhdGljID0gKGRpdjogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBcIjBweFwiO1xuICAgICAgZGl2LnN0eWxlLndpZHRoID0gXCIwcHhcIjtcbiAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwic3RhdGljXCI7XG4gICAgfTtcblxuICAgIG1ha2VTdGF0aWModGhpcy51aUNvbnRhaW5lcik7XG4gICAgbWFrZVN0YXRpYyh0aGlzLm1lZGlhQ29udGFpbmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dFBhZ2UoKSB7XG4gICAgLy8gVE9ETyBTSE9VTEQgVEhJUyBCRSBQQVJUIE9GIFRIRSBTQ0hFTUE/PyBUSElTIElTIENMRUFOVVAgTE9HSUNcbiAgICAvLyB0aGlzLmNvbW1hbmRCdXMuZW1pdCh7IGtpbmQ6IFwiVklERU9fUEFVU0VfQ09NTUFORFwiLCB0YXJnZXQ6IFwiVklERU9cIiwgdGFyZ2V0SWQ6IFwiVklERU9cIiwgcGF5bG9hZDoge30gfSk7XG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmVtaXQoeyBraW5kOiBcIkFVRElPX1BBVVNFX0NPTU1BTkRcIiwgdGFyZ2V0OiBcIkFVRElPXCIsIHRhcmdldElkOiBcIkFVRElPXCIsIHBheWxvYWQ6IHt9IH0pO1xuICAgIC8vIGNvbnN0IGN1cnJQYWdlSWQgPSB0aGlzLmN1cnJlbnRQYWdlID8gdGhpcy5jdXJyZW50UGFnZS5pZCA6IFwiTk9fUEFHRVwiO1xuICAgIC8vIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXCJORVhUX1BBR0UgRlJPTTogXCIgKyBjdXJyUGFnZUlkKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIE5FWFRfUEFHRSBTVEFSVEVEIEFUOiBcIiArIGN1cnJQYWdlSWQpO1xuICAgIHRoaXMubWVkaWFNYW5hZ2VyLmNsZWFyQWxsTWVkaWEoKTtcbiAgICBjb25zdCBuZXh0UGFnZSA9IHRoaXMucGxheWVyLmdldE5leHRQYWdlKCk7XG4gICAgLy8gY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlU2VydmljZS5nZXRTdGF0ZSgpO1xuICAgIC8vIGNvbnNvbGUubG9nKHN0YXRlKTtcbiAgICAvLyBUT0RPIENMRUFOIFVQIFBBR0UgQ09NUE9ORU5UUyB0aGlzLnBhZ2UuQ2xlYW5VcCgpXG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy51aUNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgICBpZiAoIW5leHRQYWdlKSB7XG4gICAgICAvLyBUT0RPIEZJR1VSRSBPVVQgV0hBUVQgVE8gRE8gQVQgRU5EIE9GIFRFU1QhISBTdGFydCBvdmVyPz9cbiAgICAgIHRoaXMucGxheWVyID0gbmV3IERQbGF5ZXIodGhpcy5zY2hlbWEpO1xuICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBuZXdQYWdlID0gbmV3IERQYWdlKG5leHRQYWdlLCB0aGlzLmV2ZW50QnVzLCB0aGlzLmNvbW1hbmRCdXMsIHRoaXMuc2NhbGUpO1xuXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IG5ld1BhZ2U7XG4gICAgbmV3UGFnZS5hcHBlbmRZb3Vyc2VsZih0aGlzLnVpQ29udGFpbmVyKTtcblxuICAgIHRoaXMubWVkaWFNYW5hZ2VyLnNldFBhZ2UobmV4dFBhZ2UpO1xuICAgIGNvbnN0IHMxID0gdGhpcy5zdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICAvLyBjb25zb2xlLmxvZyhzMSk7XG4gICAgLy8gY29uc29sZS5sb2coXCJOZXh0LXBhZ2U6IFwiICsgbmV3UGFnZS5pZCk7XG4gICAgLy8gY29uc29sZS5ncm91cEVuZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLnVpQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICAgIHRoaXMubWVkaWFNYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5kZXN0cm95KCk7XG4gICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YikgPT4ge1xuICAgICAgc3ViKCk7XG4gICAgfSk7XG4gICAgY29uc3QgZXZTdGF0cyA9IHRoaXMuZXZlbnRCdXMuZ2V0U3RhdHMoKTtcbiAgICBjb25zdCBjbWRTdGF0cyA9IHRoaXMuY29tbWFuZEJ1cy5nZXRTdGF0cygpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KGV2U3RhdHMuc3Vic2NyaWJlcnNDb3VudCA9PT0gMCwgdGhpcy5UQUcgKyBcIiBFdmVudGJ1cyBzaG91bGQgaGF2ZSBubyBzdWJzY3JpYmVycyBcIiwgZXZTdGF0cyk7XG4gICAgY29uc29sZS5hc3NlcnQoY21kU3RhdHMuc3Vic2NyaWJlcnNDb3VudCA9PT0gMCwgdGhpcy5UQUcgKyBcIkNvbW1hbmRidXMgc2hvdWxkIGhhdmUgbm8gc3Vic2NyaWJlcnNcIiwgY21kU3RhdHMpO1xuICB9XG4gIG9uQ29tcGxldGUoaGFuZGxlcjogKHJlc3VsdDogU2NoZW1hUmVzdWx0KSA9PiB2b2lkKSB7XG4gICAgY29uc29sZS5sb2coaGFuZGxlcik7XG4gIH1cblxuICBvbkZhdGFsRXJyb3IoaGFuZGxlcjogKGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coaGFuZGxlcik7XG4gIH1cblxuICBvbkNvbW1hbmRPckV2ZW50KF9ldmVudF9vcl9jb21tYW5kOiBERXZlbnQgfCBEQ29tbWFuZCkge31cblxuICBzZXRTY2hlbWEoc2NoZW1hOiBTY2hlbWFEdG8pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhzY2hlbWEpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRFN0YXRlIH0gZnJvbSBcIi4vRHN0YXRlXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5TdGF0ZVByb3BlcnR5PFByb3BOYW1lIGV4dGVuZHMgc3RyaW5nPiB7XG4gICAgcmVhZG9ubHkgcHJvcE5hbWU6IFByb3BOYW1lO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRSVUUgPSB7IHZhbHVlOiAxLCBsYWJlbDogXCJUUlVFXCIgfTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGQUxTRSA9IHsgdmFsdWU6IDAsIGxhYmVsOiBcIkZBTFNFXCIgfTtcbiAgICByZWFkb25seSBwcm9wRGVmaW5pdGlvbjogRFN0YXRlLk51bWVyaWNQcm9wO1xuXG4gICAgZ2V0SXNUcnVlQ29uZGl0aW9uKCk6IENvbmRpdGlvbi5OdW1lcmljIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwibnVtZXJpYy1jb25kaXRpb25cIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiB0aGlzLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IHRoaXMucHJvcE5hbWUgKyBcIlsgQk9PTEVBTiBdXCIsXG4gICAgICAgICAgICB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LlRSVUUudmFsdWUsXG4gICAgICAgICAgICBvcGVyYXRvcjogXCJlcVwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRJc0ZhbHNlQ29uZGl0aW9uKCk6IENvbmRpdGlvbi5OdW1lcmljIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwibnVtZXJpYy1jb25kaXRpb25cIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiB0aGlzLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IHRoaXMucHJvcE5hbWUgKyBcIlsgQk9PTEVBTiBdXCIsXG4gICAgICAgICAgICB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS52YWx1ZSxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcImVxXCIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U2V0VHJ1ZUNvbW1hbmQoKTogU3RhdGVDb21tYW5kIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIixcbiAgICAgICAgICAgIHRhcmdldDogXCJTVEFURVwiLFxuICAgICAgICAgICAgdGFyZ2V0SWQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogeyBwcm9wTmFtZTogdGhpcy5wcm9wTmFtZSwga2luZDogXCJzZXQtbnVtYmVyXCIsIHZhbHVlOiAxIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFNldEZhbHNlQ29tbWFuZCgpOiBTdGF0ZUNvbW1hbmQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiLFxuICAgICAgICAgICAgdGFyZ2V0OiBcIlNUQVRFXCIsXG4gICAgICAgICAgICB0YXJnZXRJZDogXCJTVEFURVwiLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIG11dGF0aW9uOiB7IHByb3BOYW1lOiB0aGlzLnByb3BOYW1lLCBraW5kOiBcInNldC1udW1iZXJcIiwgdmFsdWU6IDAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJvcE5hbWU6IFByb3BOYW1lLCBwcml2YXRlIHJlYWRvbmx5IGluaXRpYWxWYWx1ZTogYm9vbGVhbiwgZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7XG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBpbml0aWFsVmFsdWUgPyAxIDogMDtcbiAgICAgICAgY29uc3QgcHJvcERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPyBkZXNjcmlwdGlvbiA6IFwiTm8gZGVzY3JpcHRpb24gZ2l2ZW5cIjtcbiAgICAgICAgdGhpcy5wcm9wRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgIHByb3BEZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wTmFtZSxcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZTogaW5pdGlhbCxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS52YWx1ZSwgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UubGFiZWwgfSxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLnZhbHVlLCB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLmxhYmVsIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgX3R5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhbiBJRFxuY29uc3QgSURfTEVOR1RIID0gMzI7XG5cbi8vIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiBhbiBJRFxuY29uc3QgTUlOX0xFTkdUSCA9IDEwO1xuXG5leHBvcnQgdHlwZSBJRDxCIGV4dGVuZHMgc3RyaW5nPiA9IHN0cmluZyAmIHsgX19JRF9fOiBCIH07XG5cbmNvbnN0IGlzSUQgPSA8Y29uc3QgQiBleHRlbmRzIHN0cmluZz4oaWROYW1lOiBCLCBpZD86IHN0cmluZyk6IGlkIGlzIElEPEI+ID0+IHtcbiAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaWQubGVuZ3RoID49IE1JTl9MRU5HVEg7XG59O1xuXG5jb25zdCBjcmVhdGVJRCA9IDxjb25zdCBCIGV4dGVuZHMgc3RyaW5nPihpZE5hbWU6IEIpOiBJRDxCPiA9PiB7XG4gIGNvbnN0IGxldHRlcnMgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ5elwiO1xuICBjb25zdCBhbGwgPSBsZXR0ZXJzICsgbGV0dGVycy50b1VwcGVyQ2FzZSgpO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBJRF9MRU5HVEg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBhbGwuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbC5sZW5ndGgpKTtcbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0IGFzIElEPEI+O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgb2JqZWN0IHdpdGggaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzcGVjaWZpYyBJRCB0eXBlXG4gKiBAcGFyYW0gaWROYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVUeXBlZElkU2luZ2xldG9uID0gPGNvbnN0IEIgZXh0ZW5kcyBzdHJpbmc+KGlkTmFtZTogQikgPT4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBJRCBvZiB0aGUgY29ycmVjdCB0eXBlXG4gICAqL1xuICBjb25zdCBjcmVhdGUgPSAoKTogSUQ8Qj4gPT4gY3JlYXRlSUQoaWROYW1lKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlXG4gICAqIEBwYXJhbSBpZFxuICAgKi9cbiAgY29uc3QgaXMgPSAoaWQ6IHN0cmluZyk6IGlkIGlzIElEPEI+ID0+IGlzSUQoaWROYW1lLCBpZCk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaWQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSwgaWYgbm90IGl0IHRocm93cyBhbiBlcnJvclxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlT3JUaHJvdyA9IChpZDogc3RyaW5nKTogSUQ8Qj4gPT4ge1xuICAgIGlmICghaXMoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWQ6ICR7aWR9YCk7XG4gICAgfVxuICAgIHJldHVybiBpZDtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIGxvd2VyY2FzZSBuYW1lIG9mIHRoZSBpZCAoU0NIRU1BLCBQQUdFLCBldGMpXG4gICAqL1xuICBjb25zdCBuYW1lOiBCID0gaWROYW1lO1xuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgdGhlIGlkIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUsIGlmIG5vdCBpdCBjcmVhdGVzIGEgbmV3IG9uZVxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIGNvbnN0IGVuc3VyZSA9IChpZDogc3RyaW5nKTogSUQ8Qj4gPT4ge1xuICAgIHJldHVybiBpcyhpZCkgPyBpZCA6IGNyZWF0ZSgpO1xuICB9O1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgY3JlYXRlLCBpcywgZW5zdXJlLCB2YWxpZGF0ZU9yVGhyb3csIG5hbWUgfSk7XG59O1xuXG5leHBvcnQgdHlwZSBTY2hlbWFJRCA9IElEPFwiU0NIRU1BXCI+O1xuZXhwb3J0IGNvbnN0IFNjaGVtYUlEID0gY3JlYXRlVHlwZWRJZFNpbmdsZXRvbihcIlNDSEVNQVwiKTtcbmV4cG9ydCB0eXBlIFBhZ2VJRCA9IElEPFwiUEFHRVwiPjtcbmV4cG9ydCBjb25zdCBQYWdlSUQgPSBjcmVhdGVUeXBlZElkU2luZ2xldG9uKFwiUEFHRVwiKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUF3Q08sSUFBVTtBQUFBLENBQVYsQ0FBVUEsZUFBVjtBQUNFLEVBQU1BLFdBQUEsZUFBZSxDQUMxQixXQUtHO0FBQ0gsVUFBTSxFQUFFLE1BQU0sSUFBSTtBQUNsQixVQUFNLFlBQVksTUFBTSxPQUF5QixDQUFDLEtBQUssU0FBUztBQUM5RCxVQUFJLE1BQU0sUUFBUSxLQUFLLEtBQUssR0FBRztBQUM3QixZQUFJLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBQSxNQUN4QjtBQUNBLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBQ0wsVUFBTSxZQUE4QixNQUFNLE9BQXlCLENBQUMsS0FBSyxTQUFTO0FBQ2hGLFVBQUksTUFBTSxRQUFRLEtBQUssS0FBSyxHQUFHO0FBQzdCLFlBQUksS0FBSyxHQUFHLEtBQUssS0FBSztBQUFBLE1BQ3hCO0FBQ0EsYUFBTztBQUFBLElBQ1QsR0FBRyxDQUFDLENBQUM7QUFFTCxXQUFPLEVBQUUsV0FBVyxXQUFXLFdBQVcsQ0FBQyxFQUFFO0FBQUEsRUFDL0M7QUFBQSxHQXZCZTs7O0FDdkNWLElBQVU7QUFBQSxDQUFWLENBQVVDLGdCQUFWO0FBQ0ksRUFBTUEsWUFBQSxNQUFNLE1BQU0sS0FBSyxJQUFJO0FBRzNCLEVBQU1BLFlBQUEsV0FBVyxDQUFDLEdBQWUsT0FBMkI7QUFDL0QsVUFBTSxNQUFNLElBQUksS0FBSyxJQUFJLEVBQUU7QUFDM0IsV0FBTztBQUFBLEVBQ1g7QUFFTyxFQUFNQSxZQUFBLE9BQU8sQ0FBQyxJQUFnQixPQUF5QjtBQUMxRCxVQUFNLFFBQVEsS0FBSyxJQUFJLEVBQUU7QUFDekIsVUFBTSxRQUFRLEtBQUssSUFBSSxFQUFFO0FBQ3pCLFdBQU8sS0FBSyxJQUFJLFFBQVEsS0FBSztBQUFBLEVBQ2pDO0FBRU8sRUFBTUEsWUFBQSxVQUFVLENBQUMsTUFBd0I7QUFDNUMsZUFBT0EsWUFBQSxNQUFLLE9BQUdBLFlBQUEsS0FBSSxDQUFDO0FBQUEsRUFDeEI7QUFBQSxHQWpCYTs7O0FDQVYsSUFBVTtBQUFBLENBQVYsQ0FBVUMsV0FBVjtBQUNJLEVBQU1BLE9BQUEsZUFBZSxDQUFDLFdBQTJCO0FBQ3BELFVBQU0sVUFBVTtBQUNoQixVQUFNLFlBQVksUUFBUSxZQUFZO0FBQ3RDLFVBQU0sTUFBTSxVQUFVO0FBQ3RCLFVBQU0sTUFBTSxLQUFLLElBQUksTUFBTTtBQUMzQixRQUFJLFNBQVM7QUFFYixhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssS0FBSztBQUMxQixZQUFNLE9BQU8sSUFBSSxPQUFPLEtBQUssTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLE1BQU0sQ0FBQztBQUM5RCxnQkFBVTtBQUFBLElBQ2Q7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVPLEVBQU1BLE9BQUEsaUJBQWlCLFVBQU1BLE9BQUEsY0FBYSxFQUFFO0FBRTVDLEVBQU1BLE9BQUEsYUFBYSxDQUE2QixLQUFVLFFBQTZCO0FBQzFGLFdBQU8sSUFBSSxHQUFHO0FBQ2QsV0FBTztBQUFBLEVBQ1g7QUFFTyxFQUFNQSxPQUFBLFlBQVksQ0FBQyxLQUFhLFFBQWdCO0FBQ25ELFdBQU8sQ0FBQyxVQUFrQixTQUFTLE9BQU8sU0FBUztBQUFBLEVBQ3ZEO0FBQ08sRUFBTUEsT0FBQSxhQUFhLENBQUMsV0FBbUI7QUFDMUMsV0FBTyxXQUFXLE9BQU8scUJBQXFCLFdBQVcsT0FBTyxxQkFBcUIsV0FBVztBQUFBLEVBQ3BHO0FBRU8sRUFBTUEsT0FBQSxrQkFBa0IsQ0FBSSxVQUErQztBQUM5RSxXQUFPLE1BQU0sU0FBUztBQUFBLEVBQzFCO0FBRU8sRUFBTUEsT0FBQSxhQUFhLENBQUMsU0FBZ0I7QUFDdkMsWUFBUSxJQUFJLG9EQUFvRCxJQUFJO0FBQUEsRUFDeEU7QUFFTyxFQUFNQSxPQUFBLFdBQVcsQ0FBQyxRQUFnQyxPQUFPLFFBQVE7QUFFakUsRUFBTUEsT0FBQSxTQUFTLENBQW1CLEtBQWMsUUFBK0M7QUFDbEcsUUFBSSxLQUFDQSxPQUFBLFVBQVMsR0FBRyxHQUFHO0FBQ2hCLGFBQU87QUFBQSxJQUNYO0FBQ0EsV0FBTyxPQUFPLFVBQVUsZUFBZSxLQUFLLEtBQUssR0FBRztBQUFBLEVBQ3hEO0FBRU8sRUFBTUEsT0FBQSxXQUFXLENBQUMsUUFBaUQ7QUFDdEUsUUFBSSxDQUFDLEtBQUs7QUFDTixhQUFPO0FBQUEsSUFDWDtBQUVBLFFBQUksTUFBTSxRQUFRLEdBQUcsR0FBRztBQUNwQixhQUFPO0FBQUEsSUFDWDtBQUVBLFFBQUksT0FBTyxRQUFRLFVBQVU7QUFDekIsYUFBTztBQUFBLElBQ1g7QUFFQSxRQUFJLFFBQVEsTUFBTTtBQUNkLGFBQU87QUFBQSxJQUNYO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFFTyxFQUFNQSxPQUFBLFNBQVMsQ0FBQyxRQUFpQyxPQUFPLFFBQVE7QUFFaEUsRUFBTUEsT0FBQSxTQUFTLENBQUMsU0FBZ0MsU0FBUztBQUV6RCxFQUFNQSxPQUFBLFVBQVUsQ0FBQyxTQUFpQyxTQUFTO0FBRTNELEVBQU1BLE9BQUEsWUFBWSxDQUFDLFFBQTBCO0FBQ2hELFVBQU0sVUFBVSxRQUFRO0FBQ3hCLFVBQU0sZUFBZSxRQUFRO0FBQzdCLFdBQU8sV0FBVztBQUFBLEVBQ3RCO0FBRU8sRUFBTUEsT0FBQSxVQUFVLENBQUMsUUFBbUQ7QUFDdkUsUUFBSSxLQUFDQSxPQUFBLFFBQU8sS0FBSyxNQUFNLEdBQUc7QUFDdEIsYUFBTztBQUFBLElBQ1g7QUFDQSxRQUFJLE9BQU8sSUFBSSxTQUFTLFVBQVU7QUFDOUIsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPLElBQUksS0FBSyxTQUFTO0FBQUEsRUFDN0I7QUFFTyxFQUFNQSxPQUFBLFdBQVcsQ0FBQyxRQUE0QztBQUNqRSxlQUFPQSxPQUFBLFFBQU8sS0FBSyxPQUFPO0FBQUEsRUFDOUI7QUFDTyxFQUFNQSxPQUFBLFdBQVcsQ0FBQyxVQUFvQztBQUN6RCxVQUFNQyxZQUFXLE9BQU8sVUFBVTtBQUNsQyxVQUFNLFNBQVMsQ0FBQyxPQUFPLE1BQU0sS0FBSztBQUNsQyxXQUFPQSxhQUFZO0FBQUEsRUFDdkI7QUFFTyxFQUFNRCxPQUFBLFFBQVEsQ0FBQyxlQUF1QjtBQUN6QyxXQUFPLENBQUMsVUFBa0I7QUFDdEIsYUFBTyxLQUFLLElBQUksT0FBTyxVQUFVO0FBQUEsSUFDckM7QUFBQSxFQUNKO0FBRU8sRUFBTUEsT0FBQSxRQUFRLENBQUMsZUFBdUI7QUFDekMsV0FBTyxDQUFDLFVBQWtCO0FBQ3RCLGFBQU8sS0FBSyxJQUFJLE9BQU8sVUFBVTtBQUFBLElBQ3JDO0FBQUEsRUFDSjtBQUFBLEdBMUdhOzs7QUNDVixJQUFVO0FBQUEsQ0FBVixDQUFVRSxVQUFWO0FBbUJJLEVBQU1BLE1BQUEsV0FBVyxDQUFDLE1BQTRCLFVBQWdDO0FBQ2pGLFVBQU0sZUFBZSxLQUFLLElBQUksT0FBTyxJQUFJO0FBQ3pDLFFBQUksS0FBSyxVQUFVLE1BQU07QUFDckIsVUFBSSxLQUFLLFFBQVEsS0FBSztBQUNsQixlQUFPO0FBQUEsTUFDWDtBQUVBLFlBQU0sVUFBVSxLQUFLLE1BQU0sS0FBSyxRQUFRLFlBQVk7QUFDcEQsWUFBTSxVQUFVLEtBQUssSUFBSSxTQUFTLENBQUM7QUFDbkMsYUFBUSxVQUFVO0FBQUEsSUFDdEI7QUFDQSxXQUFRLEtBQUssUUFBUTtBQUFBLEVBQ3pCO0FBRU8sRUFBTUEsTUFBQSxlQUFlLENBQUMsU0FBMEM7QUFDbkUsUUFBSSxDQUFDLE1BQU07QUFDUCxhQUFPO0FBQUEsSUFDWDtBQUNBLFVBQU0sVUFBNEI7QUFDbEMsVUFBTSxXQUE2QjtBQUNuQyxVQUFNLGFBQWEsTUFBTSxPQUFPLE1BQU0sT0FBTztBQUM3QyxVQUFNLGNBQWMsTUFBTSxPQUFPLE1BQU0sUUFBUTtBQUMvQyxXQUFPLGNBQWM7QUFBQSxFQUN6QjtBQUFBLEdBMUNhOzs7QUNrRFYsSUFBVTtBQUFBLENBQVYsQ0FBVUMsWUFBVjtBQUNJLEVBQU1BLFFBQUEsWUFBWSxDQUF3QixPQUFhO0FBQzFELE9BQUcsTUFBTSxVQUFVO0FBQ25CLE9BQUcsTUFBTSxTQUFTO0FBQ2xCLE9BQUcsTUFBTSxXQUFXO0FBQ3BCLE9BQUcsTUFBTSxZQUFZO0FBQ3JCLFdBQU87QUFBQSxFQUNYO0FBRU8sRUFBTUEsUUFBQSxjQUFjLENBQXdCLElBQU8sT0FBd0IsVUFBcUI7QUFFbkcsVUFBTTtBQUFBLE1BQ0Y7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0osSUFBSTtBQUdKLFFBQUksaUJBQWlCO0FBQ2pCLFNBQUcsTUFBTSxrQkFBa0I7QUFBQSxJQUMvQjtBQUVBLFFBQUksUUFBUTtBQUNSLFNBQUcsTUFBTSxTQUFTO0FBQUEsSUFDdEI7QUFFQSxRQUFJLFdBQVc7QUFDWCxTQUFHLE1BQU0sWUFBWTtBQUFBLElBQ3pCO0FBRUEsUUFBSSxXQUFXO0FBQ1gsU0FBRyxNQUFNLFFBQVE7QUFBQSxJQUNyQjtBQUNBLFFBQUksV0FBVztBQUNYLFNBQUcsTUFBTSxZQUFZO0FBQUEsSUFDekI7QUFFQSxRQUFJLGFBQWE7QUFDYixTQUFHLE1BQU0sY0FBYztBQUFBLElBQzNCO0FBRUEsUUFBSSxhQUFhO0FBQ2IsU0FBRyxNQUFNLGNBQWMsS0FBSyxTQUFTLGFBQWEsS0FBSztBQUFBLElBQzNEO0FBQ0EsUUFBSSxZQUFZO0FBQ1osU0FBRyxNQUFNLGFBQWEsYUFBYTtBQUFBLElBQ3ZDO0FBQ0EsUUFBSSxhQUFhO0FBQ2IsU0FBRyxNQUFNLGNBQWM7QUFBQSxJQUMzQjtBQUNBLFFBQUksVUFBVTtBQUNWLFNBQUcsTUFBTSxXQUFXLEtBQUssU0FBUyxVQUFVLEtBQUs7QUFBQSxJQUNyRDtBQUVBLFFBQUksTUFBTSxTQUFTLENBQUMsR0FBRztBQUNuQixTQUFHLE1BQU0sT0FBTyxJQUFJO0FBQUEsSUFDeEI7QUFDQSxRQUFJLE1BQU0sU0FBUyxDQUFDLEdBQUc7QUFDbkIsU0FBRyxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQzFCO0FBRUEsUUFBSSxNQUFNLFNBQVMsQ0FBQyxHQUFHO0FBQ25CLFNBQUcsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUMxQjtBQUNBLFFBQUksTUFBTSxTQUFTLENBQUMsR0FBRztBQUNuQixTQUFHLE1BQU0sUUFBUSxJQUFJO0FBQUEsSUFDekI7QUFFQSxRQUFJLEtBQUssYUFBYSxZQUFZLEdBQUc7QUFDakMsU0FBRyxNQUFNLGVBQWUsS0FBSyxTQUFTLGNBQWMsS0FBSztBQUFBLElBQzdEO0FBRUEsUUFBSSxlQUFlO0FBQ2YsU0FBRyxNQUFNLGdCQUFnQixLQUFLLFNBQVMsZUFBZSxLQUFLO0FBQUEsSUFDL0Q7QUFDQSxRQUFJLFFBQVE7QUFDUixTQUFHLE1BQU0sU0FBUyxLQUFLLFNBQVMsUUFBUSxLQUFLO0FBQUEsSUFDakQ7QUFDQSxRQUFJLFNBQVM7QUFDVCxTQUFHLE1BQU0sVUFBVSxLQUFLLFNBQVMsU0FBUyxLQUFLO0FBQUEsSUFDbkQ7QUFFQSxRQUFJLE1BQU0sU0FBUyxPQUFPLEdBQUc7QUFDekIsU0FBRyxNQUFNLFVBQVUsVUFBVTtBQUFBLElBQ2pDO0FBRUEsUUFBSSxZQUFZO0FBQ1osU0FBRyxNQUFNLGFBQWE7QUFBQSxJQUMxQjtBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUEsR0E3R2E7OztBQzdDakIsSUFBTSxvQkFBb0I7QUFLbkIsSUFBTSxpQkFBTixNQUE2QztBQUFBLEVBcUZoRCxZQUNxQixJQUNBLFVBQ0EsT0FDbkI7QUFIbUI7QUFDQTtBQUNBO0FBRWpCLFNBQUssTUFBTTtBQUNYLFNBQUssR0FBRyxXQUFXO0FBQ25CLFdBQU8sVUFBVSxLQUFLLEVBQUU7QUFDeEIsV0FBTyxZQUFZLEtBQUssSUFBSSxLQUFLLGVBQWUsS0FBSyxNQUFNLEtBQUs7QUFFaEUsU0FBSyxHQUFHLFVBQVUsTUFBTTtBQUNwQixXQUFLLFNBQVMsS0FBSztBQUFBLFFBQ2YsTUFBTTtBQUFBLFFBQ04sV0FBVyxXQUFXLElBQUk7QUFBQSxRQUMxQixVQUFVO0FBQUEsUUFDVixZQUFZLEtBQUs7QUFBQSxRQUNqQixNQUFNLENBQUM7QUFBQSxNQUNYLENBQUM7QUFBQSxJQUNMO0FBQ0EsU0FBSyxHQUFHLFNBQVMsTUFBTTtBQUFBLElBRXZCO0FBRUEsU0FBSyxHQUFHLFVBQVUsTUFBTTtBQUFBLElBQUM7QUFDekIsU0FBSyxHQUFHLFVBQVUsTUFBTTtBQUFBLElBQUM7QUFDekIsU0FBSyxHQUFHLFlBQVksTUFBTTtBQUFBLElBTzFCO0FBQ0EsU0FBSyxHQUFHLG1CQUFtQixNQUFNO0FBQzdCLFlBQU0sV0FBVyxLQUFLLEdBQUc7QUFDekIsWUFBTSxhQUFhLE1BQU0sV0FBVyxRQUFRO0FBQzVDLFdBQUssU0FBUyxLQUFLO0FBQUEsUUFDZixNQUFNO0FBQUEsUUFDTixXQUFXLFdBQVcsSUFBSTtBQUFBLFFBQzFCLFVBQVU7QUFBQSxRQUNWLFlBQVksS0FBSztBQUFBLFFBQ2pCLE1BQU0sRUFBRSxVQUFVLFdBQVc7QUFBQSxNQUNqQyxDQUFDO0FBQUEsSUFDTDtBQUVBLFNBQUssR0FBRyxtQkFBbUIsTUFBTTtBQUM3QixZQUFNLFdBQVcsS0FBSyxHQUFHO0FBQ3pCLFlBQU0sYUFBYSxNQUFNLFdBQVcsUUFBUTtBQUM1QyxXQUFLLFNBQVMsS0FBSztBQUFBLFFBQ2YsTUFBTTtBQUFBLFFBQ04sVUFBVTtBQUFBLFFBQ1YsWUFBWSxLQUFLO0FBQUEsUUFDakIsV0FBVyxXQUFXLElBQUk7QUFBQSxRQUMxQixNQUFNLEVBQUUsVUFBVSxXQUFXO0FBQUEsTUFDakMsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQUEsRUE1SWlCO0FBQUEsRUFDVDtBQUFBLEVBQ0EsZ0JBQWlDLEVBQUUsR0FBRyxJQUFJLEdBQUcsS0FBSyxZQUFZLFVBQVUsR0FBRyxHQUFHO0FBQUEsRUFFdEYsUUFBUTtBQUNKLFNBQUssU0FBUyxLQUFLO0FBQUEsTUFDZixNQUFNO0FBQUEsTUFDTixNQUFNLENBQUM7QUFBQSxNQUNQLFVBQVU7QUFBQSxNQUNWLFlBQVksS0FBSztBQUFBLE1BQ2pCLFdBQVcsV0FBVyxJQUFJO0FBQUEsSUFDOUIsQ0FBQztBQUNELFNBQUssR0FBRyxNQUFNO0FBQUEsRUFDbEI7QUFBQSxFQUVBLEtBQUssS0FBYTtBQUNkLFFBQUksS0FBSyxHQUFHLFFBQVEsS0FBSztBQUNyQixXQUFLLEdBQUcsTUFBTTtBQUFBLElBQ2xCO0FBQ0EsVUFBTSxhQUFhLEtBQUssS0FBSyxNQUFNO0FBQ25DLFNBQUssU0FBUyxLQUFLO0FBQUEsTUFDZixNQUFNO0FBQUEsTUFDTixNQUFNLENBQUM7QUFBQSxNQUNQLFVBQVU7QUFBQSxNQUNWO0FBQUEsTUFDQSxXQUFXLFdBQVcsSUFBSTtBQUFBLElBQzlCLENBQUM7QUFDRCxTQUFLLEdBQ0EsS0FBSyxFQUNMLEtBQUssQ0FBQyxRQUFRO0FBQ1gsY0FBUSxJQUFJLEdBQUc7QUFBQSxJQUNuQixDQUFDLEVBQ0EsTUFBTSxDQUFDLE1BQU07QUFDVixjQUFRLElBQUksQ0FBQztBQUFBLElBQ2pCLENBQUM7QUFBQSxFQUlUO0FBQUEsRUFFQSxNQUFNLFlBQVk7QUFDZCxTQUFLLEdBQUcsU0FBUztBQUNqQixVQUFNLE1BQU0sS0FBSyxLQUFLO0FBQ3RCLFFBQUksQ0FBQyxLQUFLO0FBQ04sYUFBTztBQUFBLElBQ1g7QUFFQSxRQUFJO0FBQ0EsWUFBTSxpQkFBaUIsSUFBSSxRQUFpQixDQUFDLFNBQVMsV0FBVztBQUM3RCxhQUFLLEdBQUc7QUFBQSxVQUNKO0FBQUEsVUFDQSxDQUFDLE1BQU07QUFDSCxvQkFBUSxJQUFJO0FBQUEsVUFDaEI7QUFBQSxVQUNBLEVBQUUsTUFBTSxLQUFLO0FBQUEsUUFDakI7QUFDQSxhQUFLLEdBQUc7QUFBQSxVQUNKO0FBQUEsVUFDQSxDQUFDLE1BQU07QUFDSCxvQkFBUSxLQUFLO0FBQUEsVUFDakI7QUFBQSxVQUNBLEVBQUUsTUFBTSxLQUFLO0FBQUEsUUFDakI7QUFDQSxhQUFLLEdBQUc7QUFBQSxVQUNKO0FBQUEsVUFDQSxNQUFNO0FBQ0Ysb0JBQVEsSUFBSSxpQkFBaUI7QUFDN0IsbUJBQU8sU0FBUztBQUFBLFVBQ3BCO0FBQUEsVUFDQSxFQUFFLE1BQU0sS0FBSztBQUFBLFFBQ2pCO0FBQUEsTUFDSixDQUFDO0FBRUQsV0FBSyxLQUFLLEdBQUc7QUFDYixZQUFNO0FBQ04sYUFBTztBQUFBLElBQ1gsU0FBUyxHQUFHO0FBQ1IsY0FBUSxJQUFJLENBQUM7QUFDYixhQUFPO0FBQUEsSUFDWCxVQUFFO0FBQ0UsY0FBUSxJQUFJLEtBQUssTUFBTSxtREFBbUQsS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUMxRjtBQUFBLEVBQ0o7QUFBQSxFQTREQSxXQUFXO0FBQ1AsVUFBTSxXQUFXLEtBQUssR0FBRztBQUN6QixVQUFNLGNBQWMsS0FBSyxHQUFHO0FBQzVCLFVBQU0sU0FBUyxLQUFLLEdBQUc7QUFDdkIsVUFBTSxjQUFjLEtBQUssR0FBRztBQUM1QixVQUFNLGtCQUFrQixLQUFLLEdBQUcsd0JBQXdCO0FBQ3hELFVBQU0sc0JBQXNCLEtBQUssR0FBRztBQUNwQyxVQUFNLFNBQVMsS0FBSyxHQUFHO0FBQ3ZCLFVBQU0sU0FBUyxLQUFLLEdBQUc7QUFFdkIsV0FBTztBQUFBLE1BQ0g7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQU8sS0FBZ0I7QUFDbkIsU0FBSyxNQUFNO0FBQ1gsU0FBSyxHQUFHLFNBQVM7QUFDakIsU0FBSyxTQUFTLElBQUksS0FBSztBQUN2QixTQUFLLEdBQUcsTUFBTSxJQUFJO0FBQ2xCLFNBQUssR0FBRyxLQUFLO0FBQUEsRUFDakI7QUFBQSxFQUVBLGdCQUFtQztBQUMvQixXQUFPLEtBQUssT0FBTztBQUFBLEVBQ3ZCO0FBQUEsRUFFQSxTQUFTLFFBQXlCO0FBQzlCLFdBQU8sWUFBWSxLQUFLLElBQUksUUFBUSxLQUFLLE1BQU0sS0FBSztBQUFBLEVBQ3hEO0FBQUEsRUFFQSxJQUFZLEtBQUs7QUFDYixXQUFPLEtBQUssS0FBSyxNQUFNO0FBQUEsRUFDM0I7QUFBQSxFQUVBLFVBQVU7QUFBQSxFQUFDO0FBQ2Y7OztBQ2pNTyxJQUFNLGlCQUFOLE1BQTZDO0FBQUEsRUFJaEQsWUFBNkIsVUFBNEI7QUFBNUI7QUFDekIsU0FBSyxLQUFLLFNBQVMsY0FBYyxPQUFPO0FBQ3hDLFNBQUssR0FBRyxNQUFNLFdBQVc7QUFDekIsU0FBSyxHQUFHLE1BQU0sYUFBYTtBQUUzQixTQUFLLFNBQVMsS0FBSyxPQUFPLEtBQUssSUFBSTtBQUNuQyxTQUFLLEdBQUcsU0FBUyxLQUFLO0FBQ3RCLFNBQUssbUJBQW1CLEtBQUssaUJBQWlCLEtBQUssSUFBSTtBQUN2RCxTQUFLLEdBQUcsbUJBQW1CLEtBQUs7QUFDaEMsU0FBSyxHQUFHLFNBQVMsTUFBTTtBQUFBLElBRXZCO0FBQ0EsU0FBSyxtQkFBbUIsS0FBSyxpQkFBaUIsS0FBSyxJQUFJO0FBQ3ZELFNBQUssR0FBRyxtQkFBbUIsS0FBSztBQUNoQyxTQUFLLEdBQUcsVUFBVSxDQUFDLE1BQU07QUFDckIsWUFBTSxNQUFNLEtBQUssR0FBRztBQUNwQixXQUFLLFNBQVMsS0FBSztBQUFBLFFBQ2YsTUFBTTtBQUFBLFFBQ04sTUFBTSxFQUFFLElBQUk7QUFBQSxRQUNaLFVBQVU7QUFBQSxRQUNWLFdBQVcsV0FBVyxJQUFJO0FBQUEsUUFDMUIsWUFBWSxLQUFLO0FBQUEsTUFDckIsQ0FBQztBQUFBLElBQ0w7QUFDQSxTQUFLLEdBQUcsbUJBQW1CLENBQUMsTUFBYTtBQUNyQyxZQUFNLFdBQVcsS0FBSyxHQUFHO0FBQ3pCLFlBQU0sYUFBYSxhQUFhLE9BQU87QUFDdkMsV0FBSyxTQUFTLEtBQUs7QUFBQSxRQUNmLE1BQU07QUFBQSxRQUNOLFdBQVcsV0FBVyxJQUFJO0FBQUEsUUFDMUIsVUFBVTtBQUFBLFFBQ1YsWUFBWSxLQUFLO0FBQUEsUUFDakIsTUFBTSxFQUFFLFVBQVUsS0FBSyxHQUFHLFVBQVUsV0FBVztBQUFBLE1BQ25ELENBQUM7QUFBQSxJQUNMO0FBQUEsRUFDSjtBQUFBLEVBdENpQixNQUFNO0FBQUEsRUFDYixNQUF3QjtBQUFBLEVBQzFCO0FBQUEsRUFzQ1IsU0FBUyxLQUFnQjtBQUNyQixTQUFLLE1BQU07QUFDWCxTQUFLLEdBQUcsTUFBTSxJQUFJO0FBQ2xCLFNBQUssR0FBRyxLQUFLO0FBQUEsRUFDakI7QUFBQSxFQUVBLFVBQVU7QUFDTixRQUFJO0FBQ0EsV0FBSyxHQUFHLE1BQU07QUFDZCxXQUFLLEdBQUcsTUFBTTtBQUNkLFdBQUssR0FBRyxLQUFLO0FBQUEsSUFDakIsU0FBUyxHQUFHO0FBQ1IsY0FBUSxJQUFJLENBQUM7QUFBQSxJQUNqQjtBQUFBLEVBQ0o7QUFBQSxFQUVBLFFBQVE7QUFDSixRQUFJO0FBQ0EsV0FBSyxHQUFHLE1BQU07QUFBQSxJQUNsQixTQUFTLEdBQUc7QUFFUixjQUFRLElBQUksQ0FBQztBQUFBLElBQ2pCO0FBQUEsRUFDSjtBQUFBLEVBRUEsS0FBSyxLQUFhO0FBQ2QsUUFBSSxLQUFLLEdBQUcsUUFBUSxLQUFLO0FBQ3JCLFdBQUssR0FBRyxNQUFNO0FBQUEsSUFDbEI7QUFDQSxTQUFLLFNBQVMsS0FBSztBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sWUFBWSxLQUFLO0FBQUEsTUFDakIsTUFBTSxDQUFDO0FBQUEsTUFDUCxVQUFVO0FBQUEsTUFDVixXQUFXLFdBQVcsSUFBSTtBQUFBLElBQzlCLENBQUM7QUFDRCxTQUFLLEdBQ0EsS0FBSyxFQUNMLEtBQUssQ0FBQyxRQUFRO0FBQ1gsY0FBUSxJQUFJLEdBQUc7QUFBQSxJQUNuQixDQUFDLEVBQ0EsTUFBTSxDQUFDLE1BQU07QUFDVixjQUFRLElBQUksQ0FBQztBQUFBLElBQ2pCLENBQUM7QUFBQSxFQUNUO0FBQUEsRUFFQSxpQkFBaUIsR0FBVTtBQUN2QixTQUFLLFNBQVMsS0FBSztBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sV0FBVyxXQUFXLElBQUk7QUFBQSxNQUMxQixVQUFVO0FBQUEsTUFDVixZQUFZLEtBQUs7QUFBQSxNQUNqQixNQUFNLENBQUM7QUFBQSxJQUNYLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFQSxPQUFPLEdBQVU7QUFDYixTQUFLLFNBQVMsS0FBSztBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sV0FBVyxXQUFXLElBQUk7QUFBQSxNQUMxQixVQUFVO0FBQUEsTUFDVixZQUFZLEtBQUs7QUFBQSxNQUNqQixNQUFNLENBQUM7QUFBQSxJQUNYLENBQUM7QUFBQSxFQUVMO0FBQUEsRUFFQSxJQUFJLEtBQUs7QUFDTCxXQUFPLEtBQUssS0FBSyxNQUFNO0FBQUEsRUFDM0I7QUFBQSxFQUVRLGlCQUFpQixHQUFVO0FBQy9CLFNBQUssU0FBUyxLQUFLO0FBQUEsTUFDZixNQUFNO0FBQUEsTUFDTixNQUFNLENBQUM7QUFBQSxNQUNQLFVBQVU7QUFBQSxNQUNWLFdBQVcsV0FBVyxJQUFJO0FBQUEsTUFDMUIsWUFBWSxLQUFLO0FBQUEsSUFDckIsQ0FBQztBQUFBLEVBQ0w7QUFBQTtBQUFBLEVBSUEsTUFBTSxZQUE4QjtBQUNoQyxVQUFNLGlCQUFpQixJQUFJLFFBQWlCLENBQUMsWUFBWTtBQUNyRCxXQUFLLEdBQUc7QUFBQSxRQUNKO0FBQUEsUUFDQSxDQUFDLE1BQU07QUFFSCxrQkFBUSxJQUFJO0FBQUEsUUFDaEI7QUFBQSxRQUNBLEVBQUUsTUFBTSxLQUFLO0FBQUEsTUFDakI7QUFDQSxXQUFLLEdBQUc7QUFBQSxRQUNKO0FBQUEsUUFDQSxDQUFDLE1BQU07QUFFSCxrQkFBUSxLQUFLO0FBQUEsUUFDakI7QUFBQSxRQUNBLEVBQUUsTUFBTSxLQUFLO0FBQUEsTUFDakI7QUFBQSxJQUNKLENBQUM7QUFDRCxRQUFJO0FBQ0EsV0FBSyxLQUFLLEtBQUssR0FBRyxHQUFHO0FBQ3JCLFlBQU07QUFDTixhQUFPO0FBQUEsSUFDWCxTQUFTLEdBQUc7QUFFUixjQUFRLElBQUksQ0FBQztBQUNiLFdBQUssU0FBUyxLQUFLO0FBQUEsUUFDZixNQUFNO0FBQUEsUUFDTixXQUFXLFdBQVcsSUFBSTtBQUFBLFFBQzFCLFVBQVU7QUFBQSxRQUNWLFlBQVksS0FBSztBQUFBLFFBQ2pCLE1BQU0sRUFBRSxPQUFPLEVBQUU7QUFBQSxNQUNyQixDQUFDO0FBQ0QsYUFBTztBQUFBLElBQ1gsVUFBRTtBQUFBLElBQ0Y7QUFFQSxXQUFPLFFBQVEsUUFBUSxLQUFLO0FBQUEsRUFDaEM7QUFDSjs7O0FDdkpPLElBQU0sZ0JBQU4sTUFBTSxlQUF1QztBQUFBLEVBWWxELFlBQ1UsUUFDUyxZQUNBLFVBQ0Esa0JBQ0EsT0FDakI7QUFMUTtBQUNTO0FBQ0E7QUFDQTtBQUNBO0FBRWpCLG1CQUFjLGlCQUFpQixlQUFjLGlCQUFpQjtBQUM5RCxTQUFLLGlCQUFpQixlQUFjO0FBQ3BDLFVBQU0sVUFBVSxTQUFTLGNBQWMsT0FBTztBQUM5QyxTQUFLLE9BQU8sT0FBTyxPQUFPO0FBQzFCLFNBQUssaUJBQWlCLElBQUksZUFBZSxTQUFTLFVBQVUsS0FBSyxLQUFLO0FBQ3RFLFNBQUssaUJBQWlCLElBQUksZUFBZSxLQUFLLFFBQVE7QUFDdEQsU0FBSyxPQUFPLEtBQUssS0FBSyxLQUFLLElBQUk7QUFDL0IsU0FBSyxlQUFlLFNBQVMsRUFBRSxZQUFZLFNBQVMsQ0FBQztBQUNyRCxVQUFNLE1BQU0sV0FBVyxJQUFJO0FBQzNCLFNBQUssWUFBWTtBQUNqQixTQUFLLGlCQUFpQixXQUFXLEtBQUssS0FBSyxHQUFHO0FBQzlDLFNBQUssc0JBQXNCLEtBQUssV0FBVyxVQUFVLENBQUMsV0FBVztBQUMvRCxXQUFLLGVBQWUsTUFBTTtBQUFBLElBQzVCLEdBQUcsS0FBSyxHQUFHO0FBRVgsU0FBSyxZQUFZLE9BQU8sWUFBWSxNQUFNO0FBQUEsSUFBQyxHQUFHLEdBQUk7QUFBQSxFQUNwRDtBQUFBLEVBbENBLE9BQWUsaUJBQWlCO0FBQUEsRUFDZjtBQUFBLEVBQ0EsTUFBTTtBQUFBLEVBQ047QUFBQSxFQUNBO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxFQUNBLGNBQThCO0FBQUEsRUFDckI7QUFBQSxFQUNBO0FBQUEsRUFDQSxrQkFBMkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQTZCNUQsZ0JBQWdCO0FBQ2QsU0FBSyxlQUFlLE1BQU07QUFDMUIsU0FBSyxlQUFlLE1BQU07QUFBQSxFQUM1QjtBQUFBLEVBQ0EsVUFBVTtBQUNSLFlBQVEsSUFBSSx3QkFBd0I7QUFDcEMsU0FBSyxvQkFBb0I7QUFFekIsV0FBTyxjQUFjLEtBQUssU0FBUztBQUNuQyxTQUFLLGVBQWUsUUFBUTtBQUM1QixTQUFLLGVBQWUsUUFBUTtBQUFBLEVBQzlCO0FBQUEsRUFFQSxRQUFRLE1BQWU7QUFFckIsU0FBSyxjQUFjO0FBQ25CLFNBQUssZUFBZSxNQUFNO0FBQzFCLFNBQUssWUFBWSxXQUFXLElBQUk7QUFHaEMsVUFBTSxNQUFNLEtBQUs7QUFFakIsVUFBTSxFQUFFLGFBQWEsTUFBTSxJQUFJO0FBQy9CLFVBQU0sZ0JBQWdCLEtBQUs7QUFFM0IsUUFBSSxhQUFhO0FBQ2YsWUFBTSxNQUFNLEtBQUssaUJBQWlCLGFBQWEsV0FBVztBQUMxRCxVQUFJLEtBQUs7QUFDUCxhQUFLLGVBQWUsT0FBTyxHQUFHO0FBQzlCLGFBQUssZUFBZSxTQUFTLEVBQUUsR0FBRyxJQUFJLE9BQU8sWUFBWSxVQUFVLENBQUM7QUFBQSxNQUN0RTtBQUFBLElBRUYsT0FBTztBQUNMLFdBQUssZUFBZSxTQUFTLEVBQUUsWUFBWSxTQUFTLENBQUM7QUFBQSxJQUV2RDtBQUNBLFFBQUksZUFBZTtBQUNqQixZQUFNLFFBQVEsY0FBYyxDQUFDO0FBQzdCLFVBQUksT0FBTztBQUNULGFBQUssZUFBZSxTQUFTLEtBQUs7QUFBQSxNQUNwQztBQUFBLElBQ0Y7QUFDQSxRQUFJLEtBQUs7QUFDUCxXQUFLLGFBQWEsR0FBRztBQUFBLElBQ3ZCO0FBQUEsRUFFRjtBQUFBLEVBRVEsZUFBZSxTQUFtQjtBQUN4QyxRQUFJLFFBQVEsU0FBUyxzQkFBc0I7QUFDekMsWUFBTSxRQUFRLFFBQVE7QUFDdEIsWUFBTSxNQUFNLEtBQUssZUFBZSxjQUFjO0FBRTlDLFVBQUksT0FBTyxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQ3RDLGdCQUFRLElBQUksS0FBSztBQUNqQixhQUFLLGVBQWUsS0FBSyxJQUFJLEdBQUc7QUFBQSxNQUNsQztBQUFBLElBQ0Y7QUFDQSxRQUFJLFFBQVEsU0FBUyx1QkFBdUI7QUFDMUMsV0FBSyxlQUFlLE1BQU07QUFBQSxJQUM1QjtBQUNBLFFBQUksUUFBUSxTQUFTLHNCQUFzQjtBQUN6QyxXQUFLLGVBQ0YsVUFBVSxFQUNWLEtBQUssTUFBTTtBQUFBLE1BQUMsQ0FBQyxFQUNiLE1BQU0sRUFDTixRQUFRLE1BQU07QUFBQSxNQUFDLENBQUM7QUFBQSxJQUNyQjtBQUVBLFFBQUksUUFBUSxTQUFTLHVCQUF1QjtBQUFBLElBRTVDO0FBQUEsRUFDRjtBQUFBLEVBRUEsTUFBYyxhQUFhLEtBQXdCO0FBR2pELFVBQU0sV0FBVyxJQUFJO0FBQ3JCLFVBQU0sWUFBWSxDQUFDLEdBQUcsUUFBUTtBQUM5QixVQUFNLFFBQVEsVUFBVSxJQUFJO0FBRTVCLFFBQUksQ0FBQyxPQUFPO0FBQ1YsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLE1BQU0sV0FBVyxJQUFJO0FBQzNCLFFBQUksY0FBYyxRQUFRLENBQUMsTUFBTTtBQUMvQixjQUFRLElBQUksQ0FBQztBQUNiLFdBQUssV0FBVyxLQUFLLENBQUM7QUFBQSxJQUN4QixDQUFDO0FBS0QsYUFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN4QyxZQUFNLE9BQU8sU0FBUyxDQUFDO0FBQ3ZCLFVBQUksS0FBSyxTQUFTLGtCQUFrQjtBQUNsQyxjQUFNLE1BQU0sS0FBSyxpQkFBaUIsYUFBYSxLQUFLLE9BQU87QUFDM0QsWUFBSTtBQUFLLGVBQUssZUFBZSxPQUFPLEdBQUc7QUFDdkMsY0FBTSxLQUFLLGVBQWUsVUFBVTtBQUFBLE1BQ3RDO0FBQ0EsVUFBSSxLQUFLLFNBQVMsa0JBQWtCO0FBQ2xDLGdCQUFRLElBQUksSUFBSTtBQUNoQixjQUFNLE1BQU0sS0FBSyxpQkFBaUIsYUFBYSxLQUFLLE9BQU87QUFDM0QsWUFBSTtBQUFLLGVBQUssZUFBZSxTQUFTLEdBQUc7QUFDekMsY0FBTSxLQUFLLGVBQWUsVUFBVTtBQUFBLE1BQ3RDO0FBQUEsSUFDRjtBQUNBLFFBQUksWUFBWSxRQUFRLENBQUMsTUFBTTtBQUM3QixXQUFLLFdBQVcsS0FBSyxDQUFDO0FBQUEsSUFDeEIsQ0FBQztBQUdELFlBQVEsSUFBSSxLQUFLLE1BQU0sZ0JBQWdCO0FBQ3ZDLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQSxFQUlRLE9BQU87QUFBQSxFQUVmO0FBQ0Y7OztBQ25LTyxJQUFNLGNBQU4sTUFBK0Q7QUFBQSxFQUNuRCxNQUFNO0FBQUEsRUFDdkIsY0FBYztBQUFBLEVBQ0csYUFBMEQsQ0FBQztBQUFBLEVBQ25FLGNBQWMsb0JBQUksSUFBMkI7QUFBQTtBQUFBLEVBR3RELFVBQVUsSUFBaUMsY0FBc0I7QUFDL0QsVUFBTSxNQUE2QjtBQUFBLE1BQ2pDO0FBQUEsTUFDQSxVQUFVO0FBQUEsSUFDWjtBQUVBLFNBQUssWUFBWSxJQUFJLEdBQUc7QUFDeEIsV0FBTyxNQUFNO0FBQ1gsV0FBSyxZQUFZLE9BQU8sR0FBRztBQUFBLElBQzdCO0FBQUEsRUFDRjtBQUFBLEVBRUEsS0FBSyxTQUFtQjtBQUN0QixVQUFNLFlBQVksV0FBVyxJQUFJO0FBQ2pDLFNBQUssV0FBVyxLQUFLLEVBQUUsR0FBRyxTQUFTLFVBQVUsQ0FBQztBQUM5QyxRQUFJLEtBQUssYUFBYTtBQUNwQixXQUFLLFdBQVcsT0FBTztBQUFBLElBQ3pCO0FBQ0EsU0FBSyxZQUFZLFFBQVEsQ0FBQyxlQUFlO0FBQ3ZDLGlCQUFXLFNBQVMsT0FBTztBQUFBLElBQzdCLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxXQUFXO0FBQ1QsV0FBTztBQUFBLE1BQ0wsVUFBVSxDQUFDLEdBQUcsS0FBSyxVQUFVO0FBQUEsTUFDN0IsYUFBYSxDQUFDLEdBQUcsS0FBSyxXQUFXO0FBQUEsTUFDakMsa0JBQWtCLEtBQUssWUFBWTtBQUFBLElBQ3JDO0FBQUEsRUFDRjtBQUFBLEVBRVEsV0FBVyxTQUFtQjtBQUNwQyxZQUFRLGVBQWUsS0FBSyxNQUFNLE1BQU0sUUFBUSxJQUFJO0FBQ3BELFlBQVEsSUFBSSxnQkFBZ0IsUUFBUSxRQUFRO0FBQzVDLFlBQVEsSUFBSSxRQUFRLE9BQU87QUFDM0IsWUFBUSxTQUFTO0FBQUEsRUFDbkI7QUFDRjs7O0FDN0NPLElBQU0sV0FBTixNQUF3RDtBQUFBLEVBQzFDLE1BQU07QUFBQTtBQUFBLEVBRU4sY0FBYyxvQkFBSSxJQUFvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNdEMsV0FBcUIsQ0FBQztBQUFBLEVBQ3ZDLG1CQUFtQjtBQUFBO0FBQUEsRUFHbkIsVUFBVSxJQUE2QixjQUFzQjtBQUV6RCxVQUFNLGlCQUFpQztBQUFBLE1BQ25DO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFDQSxTQUFLLFlBQVksSUFBSSxjQUFjO0FBQ25DLFFBQUksS0FBSyxrQkFBa0I7QUFDdkIsY0FBUSxJQUFJLEtBQUssTUFBTSx5QkFBeUIsWUFBWTtBQUM1RCxjQUFRLElBQUksS0FBSyxNQUFNLHlCQUF5QixLQUFLLFlBQVksSUFBSTtBQUFBLElBQ3pFO0FBQ0EsV0FBTyxNQUFNO0FBQ1QsVUFBSSxLQUFLLGtCQUFrQjtBQUN2QixnQkFBUSxJQUFJLEtBQUssTUFBTSwyQkFBMkIsWUFBWTtBQUM5RCxnQkFBUSxJQUFJLEtBQUssTUFBTSwyQkFBMkIsS0FBSyxZQUFZLElBQUk7QUFBQSxNQUMzRTtBQUVBLFdBQUssWUFBWSxPQUFPLGNBQWM7QUFBQSxJQUMxQztBQUFBLEVBQ0o7QUFBQSxFQUVBLFdBQVc7QUFDUCxXQUFPO0FBQUEsTUFDSCxrQkFBa0IsS0FBSyxZQUFZO0FBQUEsTUFDbkMsVUFBVSxDQUFDLEdBQUcsS0FBSyxRQUFRO0FBQUEsTUFDM0IsYUFBYSxDQUFDLEdBQUcsS0FBSyxXQUFXO0FBQUEsSUFDckM7QUFBQSxFQUNKO0FBQUEsRUFFQSxLQUFLLE9BQWU7QUFDaEIsUUFBSSxLQUFLLGtCQUFrQjtBQUN2QixXQUFLLFNBQVMsS0FBSztBQUFBLElBQ3ZCO0FBQ0EsU0FBSyxTQUFTLEtBQUssS0FBSztBQUN4QixTQUFLLFlBQVksUUFBUSxDQUFDLFNBQVM7QUFFL0IsV0FBSyxHQUFHLEtBQUs7QUFBQSxJQUNqQixDQUFDO0FBQUEsRUFFTDtBQUFBLEVBRVEsU0FBUyxPQUFlO0FBQzVCLFlBQVEsZUFBZSxLQUFLLE1BQU0sTUFBTSxNQUFNLElBQUk7QUFDbEQsWUFBUSxJQUFJLGlCQUFpQixNQUFNLFVBQVU7QUFDN0MsWUFBUSxJQUFJLE1BQU0sSUFBSTtBQUN0QixZQUFRLFNBQVM7QUFBQSxFQUNyQjtBQUFBLEVBRVEsWUFBWTtBQUNoQixZQUFRLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFDL0IsWUFBUSxNQUFNLEtBQUssUUFBUTtBQUMzQixZQUFRLFNBQVM7QUFBQSxFQUNyQjtBQUNKOzs7QUN4RU8sSUFBVTtBQUFBLENBQVYsQ0FBVUMsc0JBQVY7QUFDSSxFQUFNQSxrQkFBQSxLQUFLLENBQUMsR0FBcUIsTUFBaUM7QUFDckUsV0FBTyxFQUFFLFNBQVMsRUFBRTtBQUFBLEVBQ3hCO0FBQUEsR0FIYTtBQVdWLElBQU0sYUFBTixNQUFpQjtBQUFBLEVBQ1osVUFBeUIsQ0FBQztBQUFBLEVBRWxDLFdBQXdCO0FBQ3BCLFVBQU0sVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxLQUFLLENBQUM7QUFDbkUsVUFBTSxRQUFRLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJO0FBRXZDLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxhQUFzQztBQUNsQyxVQUFNLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxDQUFDO0FBQ25FLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxhQUFhLE1BQW1CO0FBQzVCLFNBQUssUUFBUSxLQUFLLElBQUk7QUFBQSxFQUMxQjtBQUNKOzs7QUNqQ08sSUFBVTtBQUFBLENBQVYsQ0FBVUMsZUFBVjtBQTBDSSxFQUFNQSxXQUFBLFdBQVcsQ0FBQyxXQUFzQixVQUErQjtBQUMxRSxRQUFJLFNBQWtCO0FBQ3RCLFlBQVEsVUFBVSxNQUFNO0FBQUEsTUFDcEIsS0FBSztBQUNELGlCQUFTLGVBQWUsV0FBVyxLQUFLO0FBQ3hDO0FBQUEsTUFDSixLQUFLO0FBQ0QsaUJBQVMsZUFBZSxXQUFXLEtBQUs7QUFDeEM7QUFBQSxNQUNKLEtBQUs7QUFDRCxpQkFBUyxnQkFBZ0IsV0FBVyxLQUFLO0FBQ3pDO0FBQUEsTUFDSjtBQUNJLGNBQU0sUUFBZTtBQUFBLElBQzdCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFFQSxRQUFNLGtCQUFrQixDQUFDLFdBQThCLFVBQXdDO0FBQzNGLFFBQUksVUFBVSxLQUFLLFdBQVcsS0FBSyxVQUFVLElBQUksV0FBVyxHQUFHO0FBQzNELGFBQU87QUFBQSxJQUNYO0FBQ0EsVUFBTSxZQUFZLFVBQVUsSUFBSSxJQUFJLENBQUNDLGVBQWM7QUFDL0MsYUFBTyxlQUFlQSxZQUFXLEtBQUs7QUFBQSxJQUMxQyxDQUFDO0FBRUQsVUFBTSxnQkFBZ0IsVUFBVSxLQUFLLElBQUksQ0FBQ0EsZUFBYztBQUNwRCxhQUFPLGVBQWVBLFlBQVcsS0FBSztBQUFBLElBQzFDLENBQUM7QUFDRCxVQUFNLFlBQVksVUFBVSxNQUFNLE1BQU0sTUFBTTtBQUM5QyxVQUFNLGFBQWEsY0FBYyxXQUFXLEtBQUssY0FBYyxLQUFLLE1BQU0sTUFBTTtBQUNoRixXQUFPLGNBQWM7QUFBQSxFQUN6QjtBQUVBLFFBQU0saUJBQWlCLENBQUMsV0FBNkIsVUFBd0M7QUFDekYsVUFBTSxPQUFPLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsVUFBVSxXQUFXO0FBQ3RFLFFBQUksQ0FBQyxNQUFNO0FBQ1AsYUFBTztBQUFBLElBQ1g7QUFDQSxRQUFJLE1BQU07QUFDVixZQUFRLFVBQVUsTUFBTTtBQUFBLE1BQ3BCLEtBQUs7QUFDRCxZQUFJLEtBQUssU0FBUyxnQkFBZ0I7QUFDOUIsZ0JBQU0sZ0JBQWdCLFdBQVcsS0FBSyxLQUFLO0FBQUEsUUFDL0M7QUFDQTtBQUFBLE1BQ0osS0FBSztBQUNELFlBQUksS0FBSyxTQUFTLGVBQWU7QUFDN0IsZ0JBQU0sZUFBZSxXQUFXLEtBQUssS0FBSztBQUFBLFFBQzlDO0FBQ0E7QUFBQSxNQUNKO0FBQ0ksY0FBTSxRQUFlO0FBQUEsSUFDN0I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVPLEVBQU1ELFdBQUEsVUFBVSxDQUFDLFlBQXFCO0FBQ3pDLFdBQU8sUUFBUSxJQUFJLFdBQVcsS0FBSyxRQUFRLEtBQUssV0FBVztBQUFBLEVBQy9EO0FBRUEsUUFBTSxpQkFBaUIsQ0FBQyxXQUF1QyxVQUEyQjtBQUN0RixVQUFNLFdBQVcsVUFBVTtBQUMzQixRQUFJLFNBQVM7QUFDYixZQUFRLFVBQVU7QUFBQSxNQUNkLEtBQUs7QUFDRCxpQkFBUyxVQUFVLFVBQVU7QUFDN0I7QUFBQSxNQUNKLEtBQUs7QUFDRCxpQkFBUyxVQUFVLFVBQVU7QUFDN0I7QUFBQSxNQUNKLEtBQUs7QUFDRCxpQkFBUyxVQUFVLFVBQVU7QUFDN0I7QUFBQSxNQUNKLEtBQUs7QUFDRCxpQkFBUyxVQUFVLFVBQVU7QUFDN0I7QUFBQSxNQUNKO0FBQ0ksY0FBTSxRQUFlO0FBQUEsSUFDN0I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVBLFFBQU0sa0JBQWtCLENBQUMsV0FBb0IsVUFBMkI7QUFDcEUsVUFBTSxLQUFLLFVBQVU7QUFDckIsVUFBTSxpQkFBaUIsVUFBVTtBQUNqQyxRQUFJLFNBQVM7QUFDYixZQUFRLElBQUk7QUFBQSxNQUNSLEtBQUs7QUFDRCxpQkFBUyxVQUFVO0FBQ25CO0FBQUEsTUFDSixLQUFLO0FBQ0QsaUJBQVMsVUFBVTtBQUNuQjtBQUFBLE1BQ0osS0FBSztBQUNELGlCQUFTLFFBQVE7QUFDakI7QUFBQSxNQUNKLEtBQUs7QUFDRCxpQkFBUyxTQUFTO0FBQ2xCO0FBQUEsTUFDSixLQUFLO0FBQ0QsaUJBQVMsUUFBUTtBQUNqQjtBQUFBLE1BQ0osS0FBSztBQUNELGlCQUFTLFNBQVM7QUFDbEI7QUFBQSxNQUNKO0FBQ0ksY0FBTSxRQUFlO0FBQUEsSUFDN0I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVBLFFBQU0sZ0JBQWdCLENBQUMsY0FBMEQ7QUFDN0UsVUFBTSxTQUFrQyxDQUFDO0FBQ3pDLFlBQVEsVUFBVSxNQUFNO0FBQUEsTUFDcEIsS0FBSztBQUNELGVBQU8sS0FBSyxHQUFHLFVBQVUsR0FBRztBQUM1QixlQUFPLEtBQUssR0FBRyxVQUFVLElBQUk7QUFDN0I7QUFBQSxNQUNKLEtBQUs7QUFDRCxlQUFPLEtBQUssU0FBUztBQUNyQjtBQUFBLE1BQ0osS0FBSztBQUNELGVBQU8sS0FBSyxTQUFTO0FBQ3JCO0FBQUEsTUFDSjtBQUNJLGNBQU0sV0FBVyxTQUFTO0FBQUEsSUFDbEM7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVPLEVBQU1BLFdBQUEseUJBQXlCLENBQ2xDLGNBQ2tDO0FBQ2xDLFVBQU0sU0FBa0MsQ0FBQztBQUN6QyxRQUFJLE1BQU0sUUFBUSxTQUFTLEdBQUc7QUFDMUIsZ0JBQVUsUUFBUSxDQUFDLE1BQU07QUFDckIsZUFBTyxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUM7QUFBQSxNQUNuQyxDQUFDO0FBQUEsSUFDTCxPQUFPO0FBQ0gsYUFBTyxLQUFLLEdBQUcsY0FBYyxTQUFTLENBQUM7QUFBQSxJQUMzQztBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsR0F6TGE7OztBQ1NWLElBQVU7QUFBQSxDQUFWLENBQVVFLFVBQVY7QUFNRSxFQUFNQSxNQUFBLFVBQVUsQ0FBQyxTQUFrQztBQUN4RCxVQUFNLGtCQUFrQixLQUFLLElBQUksV0FBVyxLQUFLLEtBQUssS0FBSyxXQUFXO0FBQ3RFLFVBQU0sZUFBZSxLQUFLLFVBQVUsV0FBVyxLQUFLLEtBQUssVUFBVSxXQUFXO0FBQzlFLFdBQU8sbUJBQW1CO0FBQUEsRUFDNUI7QUFFTyxFQUFNQSxNQUFBLFFBQVEsQ0FBQyxNQUFzQixVQUF3QztBQUNsRixRQUFJLEtBQUssS0FBSyxXQUFXLEtBQUssS0FBSyxJQUFJLFdBQVcsR0FBRztBQUVuRCxhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sYUFBYSxLQUFLLEtBQUssSUFBSSxDQUFDLGNBQWMsVUFBVSxTQUFTLFdBQVcsS0FBSyxDQUFDO0FBRXBGLFVBQU0sYUFBYSxXQUFXLFdBQVcsS0FBSyxXQUFXLEtBQUssTUFBTSxNQUFNO0FBRTFFLFVBQU0sWUFBWSxLQUFLLElBQUksSUFBSSxDQUFDLGNBQWMsVUFBVSxTQUFTLFdBQVcsS0FBSyxDQUFDLEVBQUUsTUFBTSxNQUFNLE1BQU07QUFFdEcsV0FBTyxhQUFhO0FBQUEsRUFDdEI7QUFBQSxHQXpCZTs7O0FDTVYsSUFBTSxhQUFOLE1BQXVCO0FBQUEsRUFDNUIsY0FBYztBQUFBLEVBQUM7QUFBQSxFQUVmLFNBQVMsT0FBcUIsT0FBa0M7QUFDOUQsVUFBTSxTQUE0QixDQUFDO0FBQ25DLFVBQU0sV0FBMEIsQ0FBQztBQUNqQyxVQUFNLFFBQVEsQ0FBQyxTQUFTO0FBQ3RCLFVBQUksS0FBSyxRQUFRLElBQUksR0FBRztBQUN0QixlQUFPLEtBQUssRUFBRSxTQUFTLGlCQUFpQixLQUFLLEdBQUcsQ0FBQztBQUFBLE1BQ25ELFdBQVcsS0FBSyxNQUFNLE1BQU0sS0FBSyxHQUFHO0FBQ2xDLGNBQU0sUUFBcUI7QUFBQSxVQUN6QixpQkFBaUIsS0FBSztBQUFBLFVBQ3RCLGdCQUFnQixLQUFLLE1BQU07QUFBQSxVQUMzQixZQUFZLENBQUMsR0FBRyxLQUFLLFNBQVM7QUFBQSxRQUNoQztBQUNBLGlCQUFTLEtBQUssS0FBSztBQUFBLE1BQ3JCO0FBQUEsSUFDRixDQUFDO0FBQ0QsV0FBTyxFQUFFLFVBQVUsT0FBTztBQUFBLEVBQzVCO0FBQUEsRUFFQSxNQUFNLE1BQWtCLE9BQXdCO0FBRTlDLFdBQU8sS0FBSyxNQUFNLE1BQU0sS0FBSztBQUFBLEVBQy9CO0FBQ0Y7OztBQzFDTyxJQUFNLFVBQU4sTUFBYztBQUFBLEVBQ1QsZ0JBQXVDLENBQUM7QUFBQSxFQUN4QyxXQUFzQixDQUFDO0FBQUEsRUFDdkIsZUFBZSxvQkFBSSxJQUFZO0FBQUEsRUFDL0IsbUJBQW1CLG9CQUFJLElBQVk7QUFBQSxFQUNuQyxZQUF1QixDQUFDO0FBQUEsRUFDaEMsWUFBWSxRQUFtQixDQUFDLEdBQUc7QUFDL0IsU0FBSyxTQUFTLEtBQUs7QUFBQSxFQUN2QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxTQUFTLE9BQWtCO0FBQ3ZCLFNBQUssV0FBVyxDQUFDLEdBQUcsS0FBSztBQUN6QixTQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUs7QUFDMUIsU0FBSyxlQUFlLG9CQUFJLElBQUk7QUFDNUIsU0FBSyxtQkFBbUIsb0JBQUksSUFBSTtBQUNoQyxTQUFLLGdCQUFnQixLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFO0FBQUEsRUFDdEQ7QUFBQSxFQUVBLE1BQXVCO0FBQ25CLFVBQU0sT0FBTyxLQUFLLFVBQVUsTUFBTTtBQUVsQyxXQUFPLFFBQVE7QUFBQSxFQUNuQjtBQUFBLEVBRUEsT0FBd0I7QUFDcEIsVUFBTSxPQUFPLEtBQUssVUFBVSxDQUFDO0FBQzdCLFdBQU8sUUFBUTtBQUFBLEVBQ25CO0FBQUEsRUFFQSxlQUFlLFFBQXlCO0FBQ3BDLFVBQU0sUUFBUSxLQUFLLFVBQVUsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLE1BQU07QUFDN0QsUUFBSSxRQUFRLEdBQUc7QUFDWCxhQUFPO0FBQUEsSUFDWDtBQUNBLFNBQUssWUFBWSxLQUFLLFVBQVUsTUFBTSxLQUFLO0FBQzNDLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxZQUFZLEtBQXdCO0FBQ2hDLFFBQUksTUFBTSxRQUFRLEdBQUcsR0FBRztBQUNwQixVQUFJLFFBQVEsQ0FBQ0MsU0FBUTtBQUNqQixhQUFLLGFBQWEsSUFBSUEsSUFBRztBQUFBLE1BQzdCLENBQUM7QUFBQSxJQUNMLE9BQU87QUFDSCxXQUFLLGFBQWEsSUFBSSxHQUFHO0FBQUEsSUFDN0I7QUFDQSxTQUFLLGdCQUFnQjtBQUFBLEVBQ3pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLG9CQUFvQixPQUFrQjtBQUNsQyxTQUFLLFVBQVUsUUFBUSxHQUFHLEtBQUs7QUFBQSxFQUNuQztBQUFBLEVBRUEsZUFBZSxRQUEyQjtBQUN0QyxRQUFJLE1BQU0sUUFBUSxNQUFNLEdBQUc7QUFDdkIsYUFBTyxRQUFRLENBQUMsT0FBTztBQUNuQixhQUFLLGlCQUFpQixJQUFJLEVBQUU7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDTCxPQUFPO0FBQ0gsV0FBSyxpQkFBaUIsSUFBSSxNQUFNO0FBQUEsSUFDcEM7QUFDQSxTQUFLLGdCQUFnQjtBQUFBLEVBRXpCO0FBQUEsRUFFUSxrQkFBa0I7QUFDdEIsU0FBSyxZQUFZLEtBQUssVUFBVSxPQUFPLENBQUMsTUFBTTtBQUMxQyxZQUFNLE9BQU8sRUFBRSxRQUFRLENBQUM7QUFDeEIsWUFBTSxtQkFBbUIsQ0FBQyxLQUFLLEtBQUssQ0FBQyxRQUFRLEtBQUssYUFBYSxJQUFJLEdBQUcsQ0FBQztBQUN2RSxZQUFNLHFCQUFxQixDQUFDLEtBQUssaUJBQWlCLElBQUksRUFBRSxFQUFFO0FBQzFELGFBQU8sc0JBQXNCO0FBQUEsSUFDakMsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUNBLElBQUksVUFBbUI7QUFDbkIsV0FBTyxLQUFLLFVBQVUsV0FBVztBQUFBLEVBQ3JDO0FBQUEsRUFDQSxJQUFJLE9BQWU7QUFDZixXQUFPLEtBQUssVUFBVTtBQUFBLEVBQzFCO0FBQUEsRUFDQSxJQUFJLFlBQW9CO0FBQ3BCLFdBQU8sS0FBSyxjQUFjO0FBQUEsRUFDOUI7QUFDSjs7O0FDcEZPLElBQU0sVUFBTixNQUFjO0FBQUEsRUFDWCxVQUFVLElBQUksV0FBVztBQUFBLEVBQ3pCLGFBQWEsSUFBSSxXQUEyQztBQUFBLEVBQzVELFVBQVUsSUFBSSxRQUFRO0FBQUEsRUFDdEI7QUFBQSxFQUVSLFlBQVksTUFBbUI7QUFDN0IsU0FBSyxPQUFPO0FBQ1osU0FBSyxRQUFRLFNBQVMsS0FBSyxLQUFLO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFlBQVksYUFBMEI7QUFDcEMsWUFBUSxJQUFJLGdCQUFnQixXQUFXO0FBQ3ZDLFNBQUssUUFBUSxhQUFhLFdBQVc7QUFDckMsVUFBTSxRQUFRLEtBQUssUUFBUSxTQUFTO0FBQ3BDLFVBQU0sU0FBUyxLQUFLLFdBQVcsU0FBUyxLQUFLLEtBQUssT0FBTyxLQUFLO0FBQzlELFVBQU0sZ0JBQWdCLE9BQU87QUFDN0IsVUFBTSxVQUFVLGNBQWMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDO0FBQzdELFlBQVEsUUFBUSxDQUFDLE1BQU07QUFDckIsY0FBUSxJQUFJLEVBQUUsT0FBTztBQUNyQixjQUFRLEVBQUUsTUFBTTtBQUFBLFFBQ2QsS0FBSztBQUNILGVBQUssUUFBUSxlQUFlLEVBQUUsUUFBUSxNQUFNO0FBQzVDO0FBQUEsUUFDRixLQUFLO0FBQ0gsZUFBSyxRQUFRLGVBQWUsRUFBRSxRQUFRLE9BQU87QUFDN0M7QUFBQSxRQUNGLEtBQUs7QUFDSCxlQUFLLFFBQVEsWUFBWSxFQUFFLFFBQVEsTUFBTTtBQUN6QztBQUFBLFFBQ0Y7QUFDRSxrQkFBUSxJQUFJLGtCQUFrQixDQUFDO0FBQy9CLGdCQUFNLFFBQWU7QUFBQSxNQUN6QjtBQUFBLElBQ0YsQ0FBQztBQUNELFlBQVEsSUFBSSxPQUFPO0FBQUEsRUFDckI7QUFBQSxFQUVBLGFBQWlDO0FBQy9CLFdBQU8sS0FBSyxRQUFRLFdBQVc7QUFBQSxFQUNqQztBQUFBLEVBRVEsYUFBYSxRQUFnQjtBQUNuQyxTQUFLLFFBQVEsZUFBZSxNQUFNO0FBQUEsRUFDcEM7QUFBQSxFQUVBLHdCQUF3QixTQUE0QjtBQUNsRCxZQUFRLFFBQVEsTUFBTTtBQUFBLE1BQ3BCLEtBQUs7QUFFSDtBQUFBLE1BQ0YsS0FBSztBQUNILGFBQUssYUFBYSxRQUFRLFFBQVEsTUFBTTtBQUN4QztBQUFBLE1BQ0YsS0FBSztBQUNILGFBQUssbUJBQW1CLFFBQVEsUUFBUSxVQUFVO0FBQ2xEO0FBQUEsTUFFRjtBQUNFLGNBQU0sV0FBVyxPQUFPO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQUEsRUFFQSxjQUErQjtBQUU3QixXQUFPLEtBQUssUUFBUSxJQUFJO0FBQUEsRUFDMUI7QUFBQSxFQUVRLG1CQUFtQixJQUFZO0FBQ3JDLFVBQU0sTUFBTSxLQUFLLEtBQUssZUFBZSxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRTtBQUM1RCxRQUFJLEtBQUs7QUFDUCxXQUFLLFFBQVEsb0JBQW9CLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQztBQUFBLElBQ2pELE9BQU87QUFBQSxJQUdQO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxZQUFvQjtBQUN0QixXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3RCO0FBQ0Y7OztBQzVFTyxJQUFVO0FBQUEsQ0FBVixDQUFVQyxtQkFBVjtBQUVJLEVBQU1BLGVBQUEsZUFBZSxDQUFDLGFBQW9EO0FBQzdFLFVBQU0sTUFBTSxvQkFBSSxJQUFvRDtBQUNwRSxjQUFVLFFBQVEsQ0FBQyxNQUFNO0FBQ3JCLFlBQU0sT0FBTyxFQUFFO0FBQ2YsWUFBTSxVQUFVLElBQUksSUFBSSxJQUFJO0FBQzVCLFlBQU0sVUFBVSxVQUFVLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUMsVUFBSSxJQUFJLE1BQU0sT0FBTztBQUFBLElBQ3pCLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDWDtBQUFBLEdBWGE7OztBQ0pWLElBQWUsV0FBZixNQUErQztBQUFBLEVBQy9CO0FBQUEsRUFDWCx3QkFBd0I7QUFBQSxFQUN2QjtBQUFBLEVBQ0Qsa0JBQWtCO0FBQUEsRUFDaEIsWUFBNkI7QUFBQSxJQUNuQyxVQUFVLEVBQUUsT0FBTyxNQUFNLE9BQU8sSUFBSTtBQUFBLElBQ3BDLFlBQVk7QUFBQSxJQUNaLFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxFQUNiO0FBQUE7QUFBQSxFQUdpQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDVDtBQUFBLEVBQ087QUFBQSxFQUNFLGdCQUFnQixvQkFBSSxJQUFnQjtBQUFBLEVBRTdDLFlBQ04sSUFDQSxVQUNBLFlBQ0EsS0FDQSxPQUNGO0FBQ0UsU0FBSyxLQUFLO0FBQ1YsU0FBSyxLQUFLLElBQUk7QUFDZCxTQUFLLFVBQVU7QUFFZixTQUFLLGFBQWE7QUFDbEIsU0FBSyxXQUFXO0FBQ2hCLFNBQUssZ0JBQWdCLGNBQWMsYUFBYSxJQUFJLGFBQWE7QUFDakUsU0FBSyxRQUFRO0FBRWIsU0FBSyxpQkFBaUIsS0FBSyxlQUFlLEtBQUssSUFBSTtBQUNuRCxTQUFLLEdBQUcsVUFBVSxLQUFLO0FBR3ZCLFNBQUssY0FBYyxLQUFLLFlBQVksS0FBSyxJQUFJO0FBQzdDLFNBQUssR0FBRyxjQUFjLEtBQUs7QUFFM0IsUUFBSSxLQUFLO0FBQ0wsV0FBSyxhQUFhLEtBQUssS0FBSztBQUFBLElBQ2hDO0FBQ0EsVUFBTSxzQkFBc0IsS0FBSyxXQUFXLFVBQVUsQ0FBQyxNQUFNO0FBQ3pELFVBQUksRUFBRSxTQUFTLDJCQUEyQixFQUFFLGFBQWEsS0FBSyxJQUFJO0FBQzlELGFBQUssU0FBUyxFQUFFLFFBQVEsT0FBTztBQUFBLE1BQ25DO0FBQ0EsVUFBSSxFQUFFLFNBQVMsbUNBQW1DLEVBQUUsYUFBYSxLQUFLLElBQUk7QUFDdEUsYUFBSyx3QkFBd0I7QUFBQSxNQUNqQztBQUNBLFVBQUksRUFBRSxTQUFTLGtDQUFrQyxFQUFFLGFBQWEsS0FBSyxJQUFJO0FBQ3JFLGFBQUssd0JBQXdCO0FBQUEsTUFDakM7QUFDQSxVQUFJLEVBQUUsU0FBUyw2QkFBNkIsRUFBRSxhQUFhLEtBQUssSUFBSTtBQUNoRSxnQkFBUSxJQUFJLCtDQUErQztBQUFBLE1BQy9EO0FBQUEsSUFDSixHQUFHLEtBQUssRUFBRTtBQUVWLFVBQU0sb0JBQW9CLEtBQUssU0FBUyxVQUFVLENBQUMsVUFBVTtBQUN6RCxZQUFNLFdBQVcsS0FBSyxjQUFjLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQztBQUV4RCxZQUFNLFdBQVcsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7QUFDMUQsZUFBUyxRQUFRLENBQUMsWUFBWTtBQUMxQixhQUFLLFdBQVcsS0FBSyxPQUFPO0FBQUEsTUFFaEMsQ0FBQztBQUVELFVBQUksTUFBTSxTQUFTLDRCQUE0QjtBQUMzQyxnQkFBUSxJQUFJLDRCQUE0QjtBQUN4QyxhQUFLLGFBQWEsQ0FBQyxDQUFDO0FBQUEsTUFDeEI7QUFFQSxVQUFJLE1BQU0sU0FBUyxvQ0FBb0M7QUFDbkQsYUFBSyxvQkFBb0IsTUFBTSxJQUFJO0FBQUEsTUFDdkM7QUFBQSxJQUNKLEdBQUcsV0FBVztBQUNkLFNBQUssVUFBVTtBQUNmLFNBQUssY0FBYyxJQUFJLG1CQUFtQjtBQUMxQyxTQUFLLGNBQWMsSUFBSSxpQkFBaUI7QUFBQSxFQUM1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBaUZRLG9CQUFvQixRQUFpQztBQUN6RCxVQUFNLGdCQUFnQixLQUFLLFFBQVE7QUFDbkMsUUFBSSxDQUFDLGVBQWU7QUFDaEI7QUFBQSxJQUNKO0FBQ0EsVUFBTSxnQkFBZ0IsY0FBYyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsT0FBTyxTQUFTO0FBQ2xGLGtCQUFjLFFBQVEsQ0FBQyxNQUFNO0FBQ3pCLFVBQUksT0FBTyxNQUFNO0FBQ2IsVUFBRSxTQUFTLFFBQVEsQ0FBQyxZQUFZO0FBRTVCLGVBQUssV0FBVyxLQUFLLE9BQU87QUFBQSxRQUNoQyxDQUFDO0FBQUEsTUFDTCxPQUFPO0FBQ0gsVUFBRSxVQUFVLFFBQVEsQ0FBQyxZQUFZO0FBRTdCLGVBQUssV0FBVyxLQUFLLE9BQU87QUFBQSxRQUNoQyxDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0osQ0FBQztBQUFBLEVBR0w7QUFBQSxFQUVRLGVBQWUsR0FBZTtBQUVsQyxRQUFJLENBQUMsS0FBSyx1QkFBdUI7QUFDN0IsY0FBUSxJQUFJLEtBQUssS0FBSyxnQkFBZ0I7QUFDdEM7QUFBQSxJQUNKO0FBQ0EsVUFBTSxjQUFjLEtBQUssUUFBUTtBQUVqQyxRQUFJLGVBQWUsWUFBWSxTQUFTLEdBQUc7QUFFdkMsV0FBSyxTQUFTLEtBQUs7QUFBQSxRQUNmLE1BQU07QUFBQSxRQUNOLFVBQVU7QUFBQSxRQUNWLFlBQVksS0FBSztBQUFBLFFBQ2pCLE1BQU0sRUFBRSxXQUFXLEtBQUssR0FBRztBQUFBLFFBQzNCLFdBQVcsV0FBVyxJQUFJO0FBQUEsTUFDOUIsQ0FBQztBQUNELGtCQUFZLFFBQVEsQ0FBQyxZQUFZO0FBQzdCLGFBQUssV0FBVyxLQUFLLE9BQU87QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDTDtBQUFBLEVBQ0o7QUFBQSxFQUVRLFlBQVksR0FBZTtBQUFBLEVBRW5DO0FBQUEsRUFFQSxTQUFTLE9BQXdCO0FBQzdCLFNBQUssYUFBYSxLQUFLO0FBQUEsRUFDM0I7QUFBQSxFQUVBLGVBQWUsUUFBcUI7QUFDaEMsV0FBTyxPQUFPLEtBQUssRUFBRTtBQUFBLEVBRXpCO0FBQUEsRUFFUSx3QkFBd0IsS0FBbUI7QUFDL0MsU0FBSyxrQkFBa0I7QUFDdkIsVUFBTSxFQUFFLFdBQVcsUUFBUSxJQUFJO0FBRS9CLFVBQU0sWUFBWSxLQUFLLEdBQUcsUUFBUSxXQUFXLFFBQVEsUUFBUTtBQUM3RCxjQUFVLFdBQVcsQ0FBQyxNQUE4QjtBQUNoRCxjQUFRLElBQUksRUFBRSxJQUFJO0FBQ2xCLFdBQUssa0JBQWtCO0FBQUEsSUFDM0I7QUFDQSxjQUFVLFdBQVcsTUFBTTtBQUN2QixjQUFRLEtBQUssd0JBQXdCLFVBQVUsRUFBRTtBQUNqRCxXQUFLLGtCQUFrQjtBQUFBLElBQzNCO0FBQ0EsY0FBVSxXQUFXLE1BQU07QUFDdkIsY0FBUSxLQUFLLHlCQUF5QixVQUFVLEVBQUU7QUFDbEQsV0FBSyxrQkFBa0I7QUFBQSxJQUMzQjtBQUFBLEVBQ0o7QUFBQSxFQUVRLFlBQVk7QUFDaEIsV0FBTyxVQUFVLEtBQUssRUFBRTtBQUFBLEVBQzVCO0FBQUEsRUFFVSxhQUFhLE9BQXdCO0FBQzNDLFNBQUssWUFBWSxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUs7QUFDcEQsV0FBTyxZQUFZLEtBQUssSUFBSSxLQUFLLFdBQVcsS0FBSyxNQUFNLEtBQUs7QUFDNUQsV0FBTyxpQkFBaUIsS0FBSyxFQUFFO0FBQUEsRUFDbkM7QUFDSjs7O0FDOVBPLElBQU0sT0FBTixjQUFtQixTQUF5QjtBQUFBLEVBQzlCLE1BQU07QUFBQSxFQUNKLGVBQWUsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFO0FBQUEsRUFDeEMsV0FBZ0MsQ0FBQztBQUFBLEVBRXpDLFlBQ0ksS0FDQSxVQUNBLGVBQ0EsT0FDQSxVQUNGO0FBQ0UsVUFBTSxJQUFJLFNBQVMsY0FBYyxLQUFLO0FBQ3RDLFVBQU0sR0FBRyxVQUFVLGVBQWUsS0FBSyxLQUFLO0FBQzVDLFNBQUssV0FBVztBQUVoQixTQUFLLFNBQVMsUUFBUSxDQUFDLFVBQVU7QUFDN0IsWUFBTSxlQUFlLEtBQUssRUFBRTtBQUFBLElBQ2hDLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFQSxVQUFnQjtBQUNaLFNBQUssY0FBYyxRQUFRLENBQUMsZ0JBQWdCO0FBQ3hDLGtCQUFZO0FBQUEsSUFDaEIsQ0FBQztBQUNELFNBQUssU0FBUyxRQUFRLENBQUMsVUFBVTtBQUM3QixZQUFNLFFBQVE7QUFBQSxJQUNsQixDQUFDO0FBQUEsRUFDTDtBQUNKOzs7QUM5Qk8sSUFBTSxPQUFOLE1BQU0sY0FBYSxTQUEyQjtBQUFBLEVBT2pELFlBQ3FCLEtBQ0EsZUFDUixVQUNBLGNBQ1g7QUFDRSxVQUFNLFNBQVMsY0FBYyxLQUFLLEdBQUcsVUFBVSxlQUFlLEtBQUssWUFBWTtBQUw5RDtBQUNBO0FBQ1I7QUFDQTtBQUdULFVBQUssZUFBZTtBQUNwQixTQUFLLGFBQWEsTUFBSztBQUN2QixTQUFLLE1BQU0sWUFBWSxNQUFLLGNBQWM7QUFDMUMsU0FBSyxhQUFhLGdCQUFnQixNQUFLLGNBQWM7QUFDckQsU0FBSyxHQUFHLFVBQVU7QUFDbEIsU0FBSyxHQUFHLE1BQU0sV0FBVztBQUN6QixTQUFLLFNBQVMsSUFBSSxLQUFLO0FBQ3ZCLFNBQUssWUFBWSxXQUFXLElBQUk7QUFFaEMsU0FBSyxVQUFVLEtBQUssUUFBUSxLQUFLLElBQUk7QUFDckMsU0FBSyxTQUFTLEtBQUssT0FBTyxLQUFLLElBQUk7QUFFbkMsU0FBSyxHQUFHLFNBQVMsS0FBSztBQUN0QixTQUFLLEdBQUcsVUFBVSxLQUFLO0FBRXZCLFNBQUssR0FBRyxNQUFNLElBQUk7QUFDbEIsWUFBUSxLQUFLLEtBQUssVUFBVTtBQUFBLEVBQ2hDO0FBQUEsRUE5QkEsT0FBZSxjQUFjO0FBQUEsRUFDWjtBQUFBLEVBQ1I7QUFBQSxFQUNBO0FBQUEsRUFDUTtBQUFBLEVBNEJqQixNQUFZO0FBQUEsRUFBQztBQUFBLEVBRWIsU0FBUyxPQUFlO0FBQ3BCLFlBQVEsSUFBSSxLQUFLO0FBQ2pCLFNBQUssU0FBUyxLQUFLLFNBQVM7QUFBQSxFQUNoQztBQUFBLEVBQ0EsVUFBVTtBQUNOLFNBQUssY0FBYyxRQUFRLENBQUMsZ0JBQWdCO0FBQ3hDLGtCQUFZO0FBQUEsSUFDaEIsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVRLFFBQVEsSUFBb0I7QUFDaEMsUUFBSSxjQUFjLE9BQU87QUFDckIsY0FBUSxJQUFJLEtBQUssTUFBTSxNQUFNLEdBQUcsSUFBSTtBQUFBLElBQ3hDLE9BQU87QUFDSCxjQUFRLElBQUksS0FBSyxNQUFNLEVBQUU7QUFBQSxJQUM3QjtBQUFBLEVBQ0o7QUFBQSxFQUVRLE9BQU8sR0FBVTtBQUNyQixVQUFNLFdBQVcsV0FBVyxRQUFRLEtBQUssU0FBUztBQUVsRCxTQUFLLFNBQVMsS0FBSztBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsWUFBWSxLQUFLO0FBQUEsTUFDakIsV0FBVyxXQUFXLElBQUk7QUFBQSxNQUMxQixNQUFNO0FBQUEsUUFDRjtBQUFBLFFBQ0EsZUFBZSxLQUFLLEdBQUc7QUFBQSxRQUN2QixjQUFjLEtBQUssR0FBRztBQUFBLFFBQ3RCLFFBQVEsS0FBSyxHQUFHO0FBQUEsUUFDaEIsT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUNuQjtBQUFBLElBQ0osQ0FBQztBQUFBLEVBQ0w7QUFDSjs7O0FDdkVPLElBQU0sUUFBTixjQUFvQixTQUErQjtBQUFBLEVBQ3JDLE1BQU07QUFBQSxFQUNiLGVBQWUsQ0FBQztBQUFBLEVBRTFCLFlBQVksS0FBZSxVQUFvQixlQUE0QixPQUFxQjtBQUM1RixVQUFNLFNBQVMsY0FBYyxHQUFHLEdBQUcsVUFBVSxlQUFlLEtBQUssS0FBSztBQUN0RSxTQUFLLEdBQUcsTUFBTSxXQUFXO0FBQ3pCLFNBQUssR0FBRyxZQUFZLEtBQUssSUFBSTtBQUM3QixTQUFLLFNBQVMsSUFBSSxLQUFLO0FBQUEsRUFDM0I7QUFBQSxFQUVBLFNBQVMsT0FBZTtBQUNwQixTQUFLLFNBQVMsS0FBSyxTQUFTO0FBQzVCLFVBQU0sV0FBVyxLQUFLLEdBQUcsTUFBTTtBQUMvQixZQUFRLElBQUksS0FBSyxNQUFNLFlBQVksUUFBUSxnQkFBZ0IsUUFBUTtBQUFBLEVBQ3ZFO0FBQUEsRUFFQSxVQUFVO0FBQ04sU0FBSyxjQUFjLFFBQVEsQ0FBQyxnQkFBZ0I7QUFDeEMsa0JBQVk7QUFBQSxJQUNoQixDQUFDO0FBQUEsRUFDTDtBQUNKOzs7QUNuQk8sSUFBTSxpQkFBaUIsQ0FDMUIsS0FDQSxXQUNBLFVBQ0EsVUFDZ0I7QUFDaEIsVUFBUSxJQUFJLE1BQU07QUFBQSxJQUNkLEtBQUs7QUFDRCxZQUFNLFdBQVcscUJBQXFCLEtBQUssV0FBVyxVQUFVLEtBQUs7QUFDckUsWUFBTSxTQUFTLElBQUksS0FBSyxLQUFLLFVBQVUsV0FBVyxPQUFPLFFBQVE7QUFDakUsYUFBTztBQUFBLElBQ1gsS0FBSztBQUNELGFBQU8sSUFBSSxLQUFLLEtBQUssV0FBVyxVQUFVLEtBQUs7QUFBQSxJQUNuRCxLQUFLO0FBQ0QsYUFBTyxJQUFJLE1BQU0sS0FBSyxVQUFVLFdBQVcsS0FBSztBQUFBLElBQ3BEO0FBQ0ksWUFBTSxRQUFlO0FBQ3JCLFlBQU0sSUFBSSxNQUFNLG1EQUFtRDtBQUFBLEVBRTNFO0FBQ0o7QUFFQSxJQUFNLHVCQUF1QixDQUN6QixLQUNBLGVBQ0EsVUFDQSxVQUNtQjtBQUNuQixRQUFNLFdBQVcsSUFBSTtBQUNyQixRQUFNLFdBQWdDLENBQUM7QUFFdkMsV0FBUyxRQUFRLENBQUNDLFNBQVE7QUFDdEIsUUFBSUEsS0FBSSxTQUFTLEtBQUs7QUFDbEIsWUFBTSxVQUFVLElBQUksTUFBTUEsTUFBSyxVQUFVLGVBQWUsS0FBSztBQUM3RCxlQUFTLEtBQUssT0FBTztBQUFBLElBQ3pCO0FBQ0EsUUFBSUEsS0FBSSxTQUFTLE9BQU87QUFDcEIsWUFBTSxXQUFXLElBQUksS0FBS0EsTUFBSyxlQUFlLFVBQVUsS0FBSztBQUM3RCxlQUFTLEtBQUssUUFBUTtBQUFBLElBQzFCO0FBQUEsRUFDSixDQUFDO0FBQ0QsU0FBTztBQUNYOzs7QUMzQ08sSUFBTSxRQUFOLE1BQVk7QUFBQTtBQUFBLEVBUWpCLFlBQ21CLEtBQ2pCLFVBQ0EsWUFDQSxPQUNBO0FBSmlCO0FBS2pCLFNBQUssV0FBVztBQUNoQixTQUFLLGFBQWE7QUFDbEIsU0FBSyxRQUFRO0FBQ2IsU0FBSyxXQUFXLElBQUksU0FBUyxJQUFJLENBQUNDLFNBQVEsZUFBZUEsTUFBSyxLQUFLLFlBQVksS0FBSyxVQUFVLEtBQUssS0FBSyxDQUFDO0FBQUEsRUFDM0c7QUFBQSxFQWpCaUIsTUFBTTtBQUFBLEVBQ2YsV0FBb0MsQ0FBQztBQUFBLEVBQzVCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQWVqQixlQUFlLFFBQXFCO0FBRWxDLFNBQUssU0FBUyxRQUFRLENBQUMsT0FBTztBQUM1QixTQUFHLGVBQWUsTUFBTTtBQUFBLElBRTFCLENBQUM7QUFHRCxTQUFLLFNBQVMsS0FBSztBQUFBLE1BQ2pCLE1BQU07QUFBQSxNQUNOLFdBQVcsV0FBVyxJQUFJO0FBQUEsTUFDMUIsVUFBVTtBQUFBLE1BQ1YsWUFBWSxLQUFLO0FBQUEsTUFDakIsTUFBTSxFQUFFLFFBQVEsS0FBSyxHQUFHO0FBQUEsSUFDMUIsQ0FBQztBQUFBLEVBRUg7QUFBQSxFQUVBLFVBQVU7QUFDUixTQUFLLFNBQVMsUUFBUSxDQUFDLE9BQU87QUFDNUIsU0FBRyxRQUFRO0FBQUEsSUFDYixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRUEsTUFBWTtBQUFBLEVBRVo7QUFBQSxFQUVBLElBQUksS0FBSztBQUNQLFdBQU8sS0FBSyxJQUFJO0FBQUEsRUFDbEI7QUFDRjs7O0FDM0RPLElBQU0sZUFBTixNQUFtQjtBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsRUFDVCxrQkFBa0I7QUFBQSxFQUNsQixpQkFBaUI7QUFBQSxFQUV6QixJQUFJLFFBQVE7QUFDVixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFQSxJQUFJLGFBQWE7QUFDZixXQUFPLEtBQUssYUFBYSxLQUFLO0FBQUEsRUFDaEM7QUFBQSxFQUNBLElBQUksWUFBWTtBQUNkLFdBQU8sS0FBSyxZQUFZLEtBQUs7QUFBQSxFQUMvQjtBQUFBLEVBRVEsU0FBUztBQUFBLEVBRUEsY0FBYyxvQkFBSSxJQUE2QjtBQUFBLEVBRWhFLFlBQVksUUFBb0c7QUFDOUcsU0FBSyxhQUFhLE9BQU87QUFDekIsU0FBSyxZQUFZLE9BQU87QUFDeEIsU0FBSyxrQkFBa0IsT0FBTztBQUM5QixTQUFLLGlCQUFpQixPQUFPO0FBQzdCLFNBQUssWUFBWTtBQUFBLEVBQ25CO0FBQUEsRUFFQSxtQkFBbUIsUUFBMkM7QUFDNUQsU0FBSyxpQkFBaUIsT0FBTztBQUM3QixTQUFLLGtCQUFrQixPQUFPO0FBQzlCLFNBQUssWUFBWTtBQUFBLEVBQ25CO0FBQUEsRUFDUSxjQUFjO0FBQ3BCLFVBQU0sVUFBVSxNQUFNLEtBQUssS0FBSyxZQUFZLEtBQUssU0FBUztBQUMxRCxVQUFNLFFBQVEsUUFBUSxFQUFFLFFBQVEsS0FBSyxpQkFBaUIsT0FBTyxLQUFLLGVBQWUsQ0FBQztBQUNsRixVQUFNLGFBQWEsS0FBSyxVQUFVO0FBQ2xDLFNBQUssU0FBUztBQUNkLFFBQUksWUFBWTtBQUNkLFdBQUssWUFBWSxRQUFRLENBQUMsT0FBTztBQUMvQixXQUFHLEtBQUssTUFBTTtBQUFBLE1BQ2hCLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUFBLEVBRUEsU0FBUyxvQkFBNkMsY0FBc0I7QUFFMUUsU0FBSyxZQUFZLElBQUksa0JBQWtCO0FBQ3ZDLHVCQUFtQixLQUFLLE1BQU07QUFDOUIsV0FBTyxNQUFNO0FBQ1gsV0FBSyxZQUFZLE9BQU8sa0JBQWtCO0FBQUEsSUFDNUM7QUFBQSxFQUNGO0FBQ0Y7QUFDTyxJQUFVO0FBQUEsQ0FBVixDQUFVQyxXQUFWO0FBQ0UsRUFBTUEsT0FBQSxPQUFPLENBQUMsWUFBb0IsY0FBc0I7QUFDN0QsV0FBTyxDQUFDLGNBQWlEO0FBQ3ZELFlBQU0sY0FBYyxVQUFVLFNBQVM7QUFDdkMsWUFBTSxhQUFhLFVBQVUsUUFBUTtBQUNyQyxhQUFPLEtBQUssSUFBSSxhQUFhLFVBQVU7QUFBQSxJQUN6QztBQUFBLEVBQ0Y7QUFJTyxFQUFNQSxPQUFBLHVCQUF1QixDQUFDLFVBQWtCO0FBQ3JELFdBQU8sQ0FBQyxVQUFrQixRQUFRO0FBQUEsRUFDcEM7QUFBQSxHQWJlOzs7QUNyRFYsSUFBTSxtQkFBTixNQUF1QjtBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sV0FBVyxvQkFBSSxJQUF1QjtBQUFBLEVBQ3RDLFdBQVcsb0JBQUksSUFBdUI7QUFBQSxFQUN2RCxZQUFZLE1BQTZFO0FBR3JGLFNBQUssT0FBTyxRQUFRLENBQUMsVUFBVTtBQUMzQixXQUFLLFNBQVMsSUFBSSxNQUFNLElBQUksS0FBSztBQUFBLElBQ3JDLENBQUM7QUFDRCxTQUFLLE1BQU0sUUFBUSxDQUFDLFVBQVU7QUFDMUIsV0FBSyxTQUFTLElBQUksTUFBTSxJQUFJLEtBQUs7QUFBQSxJQUNyQyxDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRUEsYUFBYSxJQUErQjtBQUN4QyxVQUFNLGFBQWEsS0FBSyxTQUFTLElBQUksRUFBRTtBQUN2QyxRQUFJLENBQUMsWUFBWTtBQUNiLGNBQVEsTUFBTSxLQUFLLE1BQU0saUJBQWlCLEtBQUssYUFBYTtBQUFBLElBQ2hFO0FBQ0EsV0FBTyxjQUFjO0FBQUEsRUFDekI7QUFBQSxFQUVBLGFBQWEsSUFBK0I7QUFDeEMsVUFBTSxhQUFhLEtBQUssU0FBUyxJQUFJLEVBQUU7QUFDdkMsUUFBSSxDQUFDLFlBQVk7QUFDYixjQUFRLE1BQU0sS0FBSyxNQUFNLGlCQUFpQixLQUFLLGFBQWE7QUFBQSxJQUNoRTtBQUNBLFdBQU8sY0FBYztBQUFBLEVBQ3pCO0FBQ0o7OztBQ2hDTyxJQUFNLEtBQU4sTUFBTSxJQUE0QjtBQUFBLEVBQ3JDLFlBQXFCLE9BQVU7QUFBVjtBQUFBLEVBQVc7QUFBQSxFQUNoQyxPQUFzQjtBQUNsQixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0EsWUFBZ0M7QUFDNUIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLElBQU8sR0FBNEI7QUFDL0IsVUFBTSxRQUFRLEVBQUUsS0FBSyxLQUFLO0FBQzFCLFdBQU8sSUFBSSxJQUFNLEtBQUs7QUFBQSxFQUMxQjtBQUNKO0FBRU8sSUFBTSxVQUFOLE1BQU0sU0FBaUM7QUFBQSxFQUMxQyxZQUFxQixTQUFpQjtBQUFqQjtBQUFBLEVBQWtCO0FBQUEsRUFDdkMsWUFBZ0M7QUFDNUIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLE9BQXNCO0FBQ2xCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxJQUFPLElBQTZCO0FBQ2hDLFdBQU8sSUFBSSxTQUFXLEtBQUssT0FBTztBQUFBLEVBQ3RDO0FBQ0o7QUFTTyxJQUFVO0FBQUEsQ0FBVixDQUFVQyxZQUFWO0FBQ0ksRUFBTUEsUUFBQSxLQUFLLENBQUksVUFBYSxJQUFJLEdBQU0sS0FBSztBQUMzQyxFQUFNQSxRQUFBLFVBQVUsQ0FBSSxZQUFvQixJQUFJLFFBQVcsT0FBTztBQUFBLEdBRnhEOzs7QUNoQ1YsSUFBVTtBQUFBLENBQVYsQ0FBVUMsWUFBVjtBQW1ESSxFQUFNQSxRQUFBLG1CQUFtQixDQUFDLGNBQTJEO0FBQ3hGLFFBQUksQ0FBQyxXQUFXO0FBQ1osYUFBTztBQUFBLElBQ1g7QUFFQSxXQUNJLFVBQVUsU0FBUyxnQkFDbkIsVUFBVSxTQUFTLHNCQUNuQixVQUFVLFNBQVM7QUFBQSxFQUUzQjtBQUVPLEVBQU1BLFFBQUEsbUJBQW1CLENBQUMsYUFBMkQ7QUFDeEYsV0FBTyxZQUFZLFNBQVMsU0FBUztBQUFBLEVBQ3pDO0FBYU8sRUFBTUEsUUFBQSxvQkFBb0IsQ0FBQyxNQUFtQixVQUFrQjtBQUNuRSxVQUFNLE9BQXFCO0FBQUEsTUFDdkIsTUFBTTtBQUFBLE1BQ04sYUFBYSxLQUFLO0FBQUEsTUFDbEIsZ0JBQWdCLEtBQUssbUJBQW1CLHlCQUF5QixLQUFLO0FBQUEsTUFDdEU7QUFBQSxNQUNBLE9BQU8sZ0JBQWdCO0FBQUEsSUFDM0I7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVPLEVBQU1BLFFBQUEsbUJBQW1CLENBQUMsTUFBa0IsVUFBa0I7QUFDakUsVUFBTSxPQUFvQjtBQUFBLE1BQ3RCLE1BQU07QUFBQSxNQUNOLGFBQWEsS0FBSztBQUFBLE1BQ2xCLGdCQUFnQix5QkFBeUIsS0FBSztBQUFBLE1BQzlDO0FBQUEsTUFDQSxPQUFPLGdCQUFnQjtBQUFBLElBQzNCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxHQWxHYTs7O0FDSVYsSUFBTSxlQUFOLE1BQW1CO0FBQUEsRUFPeEIsWUFDbUIsVUFDQSxZQUNBLE9BQ0EsWUFBOEMsQ0FBQyxHQUNoRTtBQUppQjtBQUNBO0FBQ0E7QUFDQTtBQUVqQixVQUFNLFFBQVEsQ0FBQyxTQUFTO0FBQ3RCLFdBQUssaUJBQWlCLElBQUk7QUFBQSxJQUM1QixDQUFDO0FBQ0QsVUFBTSxRQUFRLEtBQUssWUFBWTtBQUMvQixjQUFVLFFBQVEsQ0FBQyxlQUFlO0FBQ2hDLFdBQUssY0FBYyxZQUFZLEtBQUs7QUFBQSxJQUN0QyxDQUFDO0FBRUQsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyxzQkFBc0IsS0FBSyxXQUFXLFVBQVUsQ0FBQyxZQUFZO0FBQ2hFLFVBQUksUUFBUSxTQUFTLHdCQUF3QjtBQUMzQyxhQUFLLFNBQVMsUUFBUSxRQUFRLFFBQVE7QUFBQSxNQUN4QztBQUFBLElBQ0YsR0FBRyxLQUFLLEdBQUc7QUFBQSxFQUNiO0FBQUEsRUExQmlCLE1BQU07QUFBQSxFQUNOLGNBQWMsb0JBQUksSUFBeUI7QUFBQSxFQUMzQyxlQUFlLG9CQUFJLElBQTBCO0FBQUEsRUFDN0Msa0JBQWtCLG9CQUFJLElBQXlCO0FBQUEsRUFDL0MsVUFBVSxvQkFBSSxJQUErRDtBQUFBLEVBQzdFO0FBQUEsRUF1QmpCLFVBQVU7QUFDUixTQUFLLG9CQUFvQjtBQUFBLEVBQzNCO0FBQUEsRUFFUSxjQUFjLE9BQTBCLGNBQW1DO0FBQ2pGLFVBQU0sU0FBUyxVQUFVLFNBQVMsTUFBTSxXQUFXLFlBQVk7QUFDL0QsU0FBSyxRQUFRLElBQUksTUFBTSxNQUFNLEVBQUUsT0FBYyxZQUFZLE9BQU8sQ0FBQztBQUNqRSxTQUFLLHNCQUFzQixFQUFFLFdBQVcsTUFBTSxNQUFNLE1BQU0sUUFBUSxNQUFNLE9BQU8sQ0FBQztBQUFBLEVBQ2xGO0FBQUEsRUFFUSxpQkFBaUIsTUFBbUI7QUFDMUMsUUFBSSxLQUFLLGdCQUFnQixJQUFJLEtBQUssUUFBUSxHQUFHO0FBRTNDLGNBQVEsS0FBSyx5QkFBeUIsS0FBSyxRQUFRO0FBQUEsSUFDckQ7QUFFQSxTQUFLLGdCQUFnQixJQUFJLEtBQUssVUFBVSxJQUFJO0FBRTVDLFFBQUksS0FBSyxpQkFBaUIsUUFBVztBQUNuQztBQUFBLElBQ0Y7QUFFQSxRQUFJLEtBQUssVUFBVSxVQUFVO0FBQzNCLFlBQU0sT0FBTyxPQUFPLGlCQUFpQixNQUFNLEtBQUssWUFBWTtBQUM1RCxXQUFLLFlBQVksSUFBSSxLQUFLLGFBQWEsSUFBSTtBQUFBLElBQzdDO0FBQ0EsUUFBSSxLQUFLLFVBQVUsVUFBVTtBQUMzQixZQUFNLE9BQU8sT0FBTyxrQkFBa0IsTUFBTSxLQUFLLFlBQVk7QUFDN0QsV0FBSyxhQUFhLElBQUksS0FBSyxhQUFhLElBQUk7QUFBQSxJQUM5QztBQUFBLEVBQ0Y7QUFBQSxFQUVRLGFBQWEsTUFBeUIsT0FBZTtBQUMzRCxVQUFNLE9BQU8sS0FBSyxZQUFZLElBQUksS0FBSyxRQUFRO0FBQy9DLFFBQUksTUFBTTtBQUNSLFlBQU0sVUFBdUIsRUFBRSxHQUFHLE1BQU0sTUFBTTtBQUM5QyxXQUFLLFFBQVEsT0FBTztBQUFBLElBQ3RCLE9BQU87QUFDTCxZQUFNLFVBQXVCO0FBQUEsUUFDM0IsTUFBTTtBQUFBLFFBQ04sYUFBYSxLQUFLO0FBQUEsUUFDbEIsZ0JBQWdCLGdCQUFnQixLQUFLO0FBQUEsUUFDckM7QUFBQSxRQUNBLE9BQU8sWUFBWTtBQUFBLE1BQ3JCO0FBQ0EsV0FBSyxRQUFRLE9BQU87QUFBQSxJQUN0QjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGFBQWEsTUFBMEIsVUFBa0M7QUFDL0UsVUFBTSxPQUFPLEtBQUssYUFBYSxJQUFJLEtBQUssUUFBUTtBQUNoRCxRQUFJLENBQUMsTUFBTTtBQUNULGNBQVEsU0FBUyxNQUFNO0FBQUEsUUFDckIsS0FBSztBQUNILGVBQUssUUFBUSxPQUFPLGtCQUFrQixNQUFNLFNBQVMsS0FBSyxDQUFDO0FBQzNEO0FBQUEsUUFDRixLQUFLO0FBQ0gsZUFBSyxRQUFRLE9BQU8sa0JBQWtCLE1BQU0sU0FBUyxtQkFBbUIsQ0FBQztBQUN6RTtBQUFBLFFBQ0YsS0FBSztBQUNILGVBQUssUUFBUSxPQUFPLGtCQUFrQixNQUFNLFNBQVMsbUJBQW1CLENBQUM7QUFDekU7QUFBQSxRQUNGO0FBQ0UsZ0JBQU0sUUFBZTtBQUFBLE1BQ3pCO0FBQUEsSUFDRjtBQUNBLFFBQUksTUFBTTtBQUNSLGNBQVEsU0FBUyxNQUFNO0FBQUEsUUFDckIsS0FBSztBQUNILGVBQUssUUFBUSxFQUFFLEdBQUcsTUFBTSxPQUFPLFNBQVMsTUFBTSxDQUFDO0FBQy9DO0FBQUEsUUFDRixLQUFLO0FBQ0gsZUFBSyxRQUFRLEVBQUUsR0FBRyxNQUFNLE9BQU8sS0FBSyxRQUFRLFNBQVMsU0FBUyxDQUFDO0FBQy9EO0FBQUEsUUFDRixLQUFLO0FBQ0gsZUFBSyxRQUFRLEVBQUUsR0FBRyxNQUFNLE9BQU8sS0FBSyxRQUFRLFNBQVMsU0FBUyxDQUFDO0FBQy9EO0FBQUEsUUFDRjtBQUNFLGdCQUFNLFFBQWU7QUFBQSxNQUN6QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFUSxrQkFBMEc7QUFDaEgsVUFBTSxRQUFRLEtBQUssWUFBWTtBQUMvQixVQUFNLE1BQXNGLENBQUM7QUFDN0YsU0FBSyxRQUFRLFFBQVEsQ0FBQyxNQUFNO0FBQzFCLFlBQU0sT0FBTyxFQUFFO0FBRWYsWUFBTSxPQUFPLFVBQVUsU0FBUyxFQUFFLE1BQU0sV0FBVyxLQUFLO0FBQ3hELFlBQU0sWUFBWSxTQUFTO0FBQzNCLFFBQUUsYUFBYTtBQUNmLFVBQUksS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLE1BQU0sTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUFBLElBRTdELENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRVEsU0FBUyxVQUFzRDtBQUNyRSxVQUFNLFVBQVUsS0FBSyxnQkFBZ0IsSUFBSSxTQUFTLFFBQVE7QUFDMUQsUUFBSSxDQUFDLFNBQVM7QUFFWixhQUFPLEVBQUUsU0FBUyxNQUFNO0FBQUEsSUFDMUI7QUFFQSxRQUFJLFFBQVEsVUFBVSxZQUFZLE9BQU8saUJBQWlCLFFBQVEsR0FBRztBQUNuRSxXQUFLLGFBQWEsU0FBUyxTQUFTLEtBQUs7QUFBQSxJQUMzQztBQUVBLFFBQUksUUFBUSxVQUFVLFlBQVksT0FBTyxpQkFBaUIsUUFBUSxHQUFHO0FBQ25FLFdBQUssYUFBYSxTQUFTLFFBQVE7QUFBQSxJQUNyQztBQUNBLFVBQU0sZUFBZSxLQUFLLGdCQUFnQjtBQUMxQyxVQUFNLGdCQUFnQixhQUFhLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUztBQUM1RCxrQkFBYyxRQUFRLENBQUMsUUFBUTtBQUM3QixXQUFLLHNCQUFzQixFQUFFLFdBQVcsSUFBSSxXQUFXLE1BQU0sSUFBSSxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUM7QUFBQSxJQUN6RixDQUFDO0FBRUQsV0FBTyxFQUFFLFNBQVMsS0FBSztBQUFBLEVBQ3pCO0FBQUEsRUFFUSxzQkFBc0IsTUFBMkQ7QUFDdkYsVUFBTSxvQkFBdUM7QUFBQSxNQUMzQyxNQUFNO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixXQUFXLFdBQVcsSUFBSTtBQUFBLE1BQzFCO0FBQUEsSUFDRjtBQUNBLFVBQU0sRUFBRSxXQUFXLE1BQU0sS0FBSyxJQUFJLGtCQUFrQjtBQUVwRCxTQUFLLFNBQVMsS0FBSyxpQkFBaUI7QUFBQSxFQUN0QztBQUFBLEVBRUEsY0FBYyxVQUFnQztBQUM1QyxVQUFNLFVBQVUsS0FBSyxnQkFBZ0IsSUFBSSxRQUFRO0FBQ2pELFFBQUksQ0FBQyxTQUFTO0FBQ1osYUFBTyxPQUFPO0FBQUEsUUFDWix5Q0FBeUMsV0FBVztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUNBLFVBQU0sUUFBUSxLQUFLLFlBQVksSUFBSSxRQUFRLEtBQUssS0FBSyxhQUFhLElBQUksUUFBUTtBQUU5RSxXQUFPLFFBQVEsT0FBTyxHQUFHLEtBQUssSUFBSSxPQUFPLFFBQVEsY0FBYyxXQUFXLGdCQUFnQjtBQUFBLEVBQzVGO0FBQUEsRUFFUSxRQUFRLE1BQVk7QUFDMUIsWUFBUSxLQUFLLE1BQU07QUFBQSxNQUNqQixLQUFLO0FBQ0gsYUFBSyxhQUFhLElBQUksS0FBSyxhQUFhLElBQUk7QUFDNUM7QUFBQSxNQUNGLEtBQUs7QUFDSCxhQUFLLFlBQVksSUFBSSxLQUFLLGFBQWEsSUFBSTtBQUMzQztBQUFBLE1BQ0Y7QUFDRSxjQUFNLFFBQWU7QUFBQSxJQUN6QjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFdBQVc7QUFDVCxVQUFNLFFBQTBELENBQUM7QUFDakUsU0FBSyxnQkFBZ0IsUUFBUSxDQUFDLFFBQVE7QUFDcEMsVUFBSSxRQUFnQztBQUNwQyxZQUFNLFlBQVksS0FBSyxXQUFXLElBQUksUUFBUTtBQUM5QyxVQUFJLFdBQVc7QUFDYixnQkFBUSxVQUFVO0FBQUEsTUFDcEI7QUFDQSxZQUFNLElBQUksUUFBUSxJQUFJO0FBQUEsSUFDeEIsQ0FBQztBQUNELFNBQUssUUFBUSxRQUFRLENBQUMsVUFBVTtBQUM5QixZQUFNLE1BQU0sTUFBTSxJQUFJLElBQUksTUFBTTtBQUFBLElBQ2xDLENBQUM7QUFFRCxVQUFNLFlBQVksT0FBTyxLQUFLLEtBQUs7QUFDbkMsVUFBTSxZQUFZLFVBQVU7QUFDNUIsVUFBTSxZQUFZLENBQUMsR0FBRyxLQUFLLGdCQUFnQixPQUFPLENBQUM7QUFFbkQsV0FBTyxFQUFFLFdBQVcsV0FBVyxXQUFXLE9BQU8sTUFBTTtBQUFBLEVBQ3pEO0FBQUEsRUFFUSxXQUFXLFVBQWdDO0FBQ2pELFdBQU8sS0FBSyxZQUFZLElBQUksUUFBUSxLQUFLLEtBQUssYUFBYSxJQUFJLFFBQVEsS0FBSztBQUFBLEVBQzlFO0FBQUEsRUFFUSxjQUFtQztBQUN6QyxXQUFPLENBQUMsR0FBRyxLQUFLLGFBQWEsT0FBTyxHQUFHLEdBQUcsS0FBSyxZQUFZLE9BQU8sQ0FBQztBQUFBLEVBQ3JFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLGFBQWEsV0FBK0I7QUFDMUMsVUFBTSxtQkFBbUIsVUFBVSx1QkFBdUIsU0FBUztBQUNuRSxRQUFJLFNBQVM7QUFFYixVQUFNLFNBQVMsaUJBQWlCLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVztBQUV4RCxVQUFNLGFBQXVCLENBQUM7QUFDOUIsV0FBTyxRQUFRLENBQUMsT0FBTztBQUNyQixVQUFJLENBQUMsS0FBSyxnQkFBZ0IsSUFBSSxFQUFFLEdBQUc7QUFDakMsaUJBQVM7QUFDVCxtQkFBVyxLQUFLLEVBQUU7QUFBQSxNQUNwQjtBQUFBLElBQ0YsQ0FBQztBQUNELFlBQVEsSUFBSSxLQUFLLEtBQUssVUFBVTtBQUVoQyxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsVUFBVSxXQUFzQjtBQUM5QixXQUFPLFVBQVUsU0FBUyxXQUFXLEtBQUssWUFBWSxDQUFDO0FBQUEsRUFDekQ7QUFDRjs7O0FDek5PLElBQU0sZUFBTixNQUE0QztBQUFBLEVBZ0JqRCxZQUNFLFFBQ2lCLFFBQ0EsT0FDQSxRQUNqQjtBQUhpQjtBQUNBO0FBQ0E7QUFFakIsU0FBSyxjQUFjO0FBQ25CLFNBQUssWUFBWSxZQUFZLEtBQUssV0FBVztBQUM3QyxTQUFLLFlBQVksWUFBWSxLQUFLLGNBQWM7QUFDaEQsVUFBTSxhQUFhLEtBQUssT0FBTyxjQUFjLENBQUM7QUFDOUMsVUFBTSxlQUFlLEtBQUssT0FBTyxnQkFBZ0IsQ0FBQztBQUNsRCxTQUFLLGVBQWUsSUFBSSxhQUFhLEtBQUssVUFBVSxLQUFLLFlBQVksWUFBWSxZQUFZO0FBQzdGLFNBQUssUUFBUSxJQUFJLGFBQWE7QUFBQSxNQUM1QixZQUFZLE9BQU87QUFBQSxNQUNuQixXQUFXLE9BQU87QUFBQSxNQUNsQixnQkFBZ0I7QUFBQSxNQUNoQixpQkFBaUI7QUFBQSxJQUNuQixDQUFDO0FBRUQsVUFBTSxzQkFBc0IsT0FBTyxrQkFBa0IsQ0FBQztBQUV0RCx3QkFBb0IsUUFBUSxDQUFDLE1BQU07QUFDakMsV0FBSywyQkFBMkIsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXO0FBQUEsSUFDOUQsQ0FBQztBQUVELFVBQU0sWUFBWSxVQUFVLGFBQWEsS0FBSyxNQUFNO0FBQ3BELFNBQUssbUJBQW1CLElBQUksaUJBQWlCLEVBQUUsUUFBUSxVQUFVLFdBQVcsT0FBTyxVQUFVLFVBQVUsQ0FBQztBQUN4RyxTQUFLLGVBQWUsSUFBSTtBQUFBLE1BQ3RCLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxJQUNQO0FBQ0EsU0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLE1BQU07QUFDckMsU0FBSyxVQUFVO0FBQ2YsU0FBSyxTQUFTO0FBQ2QsU0FBSyxnQkFBZ0I7QUFBQSxFQUN2QjtBQUFBLEVBckRpQixNQUFNO0FBQUEsRUFDTixhQUFhLElBQUksWUFBWTtBQUFBLEVBQzdCLFdBQVcsSUFBSSxTQUFTO0FBQUEsRUFDeEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsY0FBOEIsU0FBUyxjQUFjLEtBQUs7QUFBQSxFQUMxRCxpQkFBaUMsU0FBUyxjQUFjLEtBQUs7QUFBQSxFQUM3RDtBQUFBLEVBQ0E7QUFBQSxFQUNBLDZCQUE2QixvQkFBSSxJQUF5QztBQUFBLEVBQ25GO0FBQUEsRUFDQSxjQUE2QjtBQUFBLEVBQ3BCLE9BQTBCLENBQUM7QUFBQSxFQTBDcEMsa0JBQWtCO0FBQ3hCLFVBQU0sb0JBQW9CLEtBQUssU0FBUyxVQUFVLENBQUMsT0FBTztBQUN4RCxXQUFLLGlCQUFpQixFQUFFO0FBQ3hCLFlBQU0saUJBQWlCLEtBQUssMkJBQTJCLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN4RSxxQkFBZSxRQUFRLENBQUMsaUJBQWlCO0FBQ3ZDLGFBQUssV0FBVyxLQUFLLFlBQVk7QUFBQSxNQUNuQyxDQUFDO0FBQUEsSUFDSCxHQUFHLEtBQUssTUFBTSxtQkFBbUI7QUFDakMsVUFBTSxzQkFBc0IsS0FBSyxXQUFXLFVBQVUsQ0FBQyxZQUFZO0FBSWpFLFdBQUssaUJBQWlCLE9BQU87QUFDN0IsVUFBSSxRQUFRLFNBQVMsOEJBQThCO0FBQ2pELGFBQUssU0FBUztBQUFBLE1BQ2hCO0FBRUEsVUFBSSxRQUFRLFNBQVMsNkJBQTZCO0FBQ2hELGdCQUFRLElBQUksS0FBSyxNQUFNLDJDQUEyQztBQUNsRSxnQkFBUSxJQUFJLE9BQU87QUFDbkIsY0FBTSxTQUFTLFFBQVEsUUFBUTtBQUMvQixjQUFNLFFBQVEsUUFBUSxRQUFRO0FBQzlCLGNBQU0sWUFBWSxXQUFXLElBQUk7QUFDakMsY0FBTSxNQUEwQixNQUFNLElBQUksQ0FBQyxPQUFPO0FBQUEsVUFDaEQ7QUFBQSxVQUNBLE1BQU07QUFBQSxRQUNSLEVBQUU7QUFDRixhQUFLLE9BQU8sWUFBWTtBQUFBLFVBQ3RCLG1CQUFtQjtBQUFBLFVBQ25CO0FBQUEsUUFDRixDQUFDO0FBRUQsYUFBSyxTQUFTO0FBQUEsTUFFaEI7QUFBQSxJQUNGLEdBQUcsS0FBSyxHQUFHO0FBRVgsU0FBSyxLQUFLLEtBQUssbUJBQW1CO0FBQ2xDLFNBQUssS0FBSyxLQUFLLGlCQUFpQjtBQUFBLEVBQ2xDO0FBQUEsRUFFUSxZQUFZO0FBQ2xCLFNBQUssWUFBWSxNQUFNLFNBQVMsS0FBSyxNQUFNLGFBQWE7QUFDeEQsU0FBSyxZQUFZLE1BQU0sUUFBUSxLQUFLLE1BQU0sWUFBWTtBQUN0RCxTQUFLLFlBQVksTUFBTSxrQkFBa0IsS0FBSyxPQUFPLG1CQUFtQjtBQUN4RSxTQUFLLFlBQVksTUFBTSxXQUFXO0FBRWxDLFVBQU0sYUFBYSxDQUFDLFFBQXdCO0FBQzFDLFVBQUksTUFBTSxTQUFTO0FBQ25CLFVBQUksTUFBTSxRQUFRO0FBQ2xCLFVBQUksTUFBTSxXQUFXO0FBQUEsSUFDdkI7QUFFQSxlQUFXLEtBQUssV0FBVztBQUMzQixlQUFXLEtBQUssY0FBYztBQUFBLEVBQ2hDO0FBQUEsRUFFUSxXQUFXO0FBT2pCLFNBQUssYUFBYSxjQUFjO0FBQ2hDLFVBQU0sV0FBVyxLQUFLLE9BQU8sWUFBWTtBQUl6QyxRQUFJLEtBQUssYUFBYTtBQUNwQixXQUFLLFlBQVksUUFBUTtBQUN6QixXQUFLLFlBQVksWUFBWTtBQUFBLElBQy9CO0FBQ0EsUUFBSSxDQUFDLFVBQVU7QUFFYixXQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssTUFBTTtBQUNyQyxVQUFJLEtBQUssT0FBTyxNQUFNLFNBQVMsR0FBRztBQUNoQyxhQUFLLFNBQVM7QUFBQSxNQUNoQjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxVQUFVLElBQUksTUFBTSxVQUFVLEtBQUssVUFBVSxLQUFLLFlBQVksS0FBSyxLQUFLO0FBRTlFLFNBQUssY0FBYztBQUNuQixZQUFRLGVBQWUsS0FBSyxXQUFXO0FBRXZDLFNBQUssYUFBYSxRQUFRLFFBQVE7QUFDbEMsVUFBTSxLQUFLLEtBQUssYUFBYSxTQUFTO0FBSXRDLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxVQUFVO0FBQ1IsUUFBSSxLQUFLLGFBQWE7QUFDcEIsV0FBSyxZQUFZLFFBQVE7QUFDekIsV0FBSyxZQUFZLFlBQVk7QUFBQSxJQUMvQjtBQUNBLFNBQUssYUFBYSxRQUFRO0FBQzFCLFNBQUssYUFBYSxRQUFRO0FBQzFCLFNBQUssS0FBSyxRQUFRLENBQUMsUUFBUTtBQUN6QixVQUFJO0FBQUEsSUFDTixDQUFDO0FBQ0QsVUFBTSxVQUFVLEtBQUssU0FBUyxTQUFTO0FBQ3ZDLFVBQU0sV0FBVyxLQUFLLFdBQVcsU0FBUztBQUMxQyxZQUFRLE9BQU8sUUFBUSxxQkFBcUIsR0FBRyxLQUFLLE1BQU0seUNBQXlDLE9BQU87QUFDMUcsWUFBUSxPQUFPLFNBQVMscUJBQXFCLEdBQUcsS0FBSyxNQUFNLHlDQUF5QyxRQUFRO0FBQUEsRUFDOUc7QUFBQSxFQUNBLFdBQVcsU0FBeUM7QUFDbEQsWUFBUSxJQUFJLE9BQU87QUFBQSxFQUNyQjtBQUFBLEVBRUEsYUFBYSxTQUFxRDtBQUNoRSxZQUFRLElBQUksT0FBTztBQUFBLEVBQ3JCO0FBQUEsRUFFQSxpQkFBaUIsbUJBQXNDO0FBQUEsRUFBQztBQUFBLEVBRXhELFVBQVUsUUFBeUI7QUFDakMsWUFBUSxJQUFJLE1BQU07QUFBQSxFQUNwQjtBQUNGOzs7QUMvTU8sSUFBTSx1QkFBTixNQUFNLHNCQUE4QztBQUFBLEVBaUR2RCxZQUFZLFVBQXFDLGNBQXVCLGFBQXFCO0FBQTVDO0FBQzdDLFNBQUssV0FBVztBQUNoQixVQUFNLFVBQVUsZUFBZSxJQUFJO0FBQ25DLFVBQU0sa0JBQWtCLGNBQWMsY0FBYztBQUNwRCxTQUFLLGlCQUFpQjtBQUFBLE1BQ2xCO0FBQUEsTUFDQTtBQUFBLE1BQ0EsY0FBYztBQUFBLE1BQ2QsU0FBUztBQUFBLFFBQ0wsRUFBRSxPQUFPLHNCQUFxQixNQUFNLE9BQU8sWUFBWSxzQkFBcUIsTUFBTSxNQUFNO0FBQUEsUUFDeEYsRUFBRSxPQUFPLHNCQUFxQixLQUFLLE9BQU8sWUFBWSxzQkFBcUIsS0FBSyxNQUFNO0FBQUEsTUFDMUY7QUFBQSxNQUNBLE9BQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUFBLEVBOURTO0FBQUEsRUFDVCxPQUF3QixPQUFPLEVBQUUsT0FBTyxHQUFHLE9BQU8sT0FBTztBQUFBLEVBQ3pELE9BQXdCLFFBQVEsRUFBRSxPQUFPLEdBQUcsT0FBTyxRQUFRO0FBQUEsRUFDbEQ7QUFBQSxFQUVULHFCQUF3QztBQUNwQyxXQUFPO0FBQUEsTUFDSCxNQUFNO0FBQUEsTUFDTixhQUFhLEtBQUs7QUFBQSxNQUNsQixnQkFBZ0IsS0FBSyxXQUFXO0FBQUEsTUFDaEMsWUFBWSxzQkFBcUIsS0FBSztBQUFBLE1BQ3RDLE9BQU8sc0JBQXFCLEtBQUs7QUFBQSxNQUNqQyxVQUFVO0FBQUEsSUFDZDtBQUFBLEVBQ0o7QUFBQSxFQUNBLHNCQUF5QztBQUNyQyxXQUFPO0FBQUEsTUFDSCxNQUFNO0FBQUEsTUFDTixhQUFhLEtBQUs7QUFBQSxNQUNsQixnQkFBZ0IsS0FBSyxXQUFXO0FBQUEsTUFDaEMsWUFBWSxzQkFBcUIsTUFBTTtBQUFBLE1BQ3ZDLE9BQU8sc0JBQXFCLE1BQU07QUFBQSxNQUNsQyxVQUFVO0FBQUEsSUFDZDtBQUFBLEVBQ0o7QUFBQSxFQUVBLG9CQUFrQztBQUM5QixXQUFPO0FBQUEsTUFDSCxNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixTQUFTO0FBQUEsUUFDTCxVQUFVLEVBQUUsVUFBVSxLQUFLLFVBQVUsTUFBTSxjQUFjLE9BQU8sRUFBRTtBQUFBLE1BQ3RFO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUVBLHFCQUFtQztBQUMvQixXQUFPO0FBQUEsTUFDSCxNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixTQUFTO0FBQUEsUUFDTCxVQUFVLEVBQUUsVUFBVSxLQUFLLFVBQVUsTUFBTSxjQUFjLE9BQU8sRUFBRTtBQUFBLE1BQ3RFO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFpQko7OztBQ25FQSxJQUFNLFlBQVk7QUFHbEIsSUFBTSxhQUFhO0FBSW5CLElBQU0sT0FBTyxDQUF5QixRQUFXLE9BQTZCO0FBQzVFLE1BQUksT0FBTyxPQUFPO0FBQVUsV0FBTztBQUNuQyxTQUFPLEdBQUcsVUFBVTtBQUN0QjtBQUVBLElBQU0sV0FBVyxDQUF5QixXQUFxQjtBQUM3RCxRQUFNLFVBQVU7QUFDaEIsUUFBTSxNQUFNLFVBQVUsUUFBUSxZQUFZO0FBQzFDLE1BQUksU0FBUztBQUNiLFdBQVMsSUFBSSxHQUFHLElBQUksV0FBVyxLQUFLO0FBQ2xDLFVBQU0sT0FBTyxJQUFJLE9BQU8sS0FBSyxNQUFNLEtBQUssT0FBTyxJQUFJLElBQUksTUFBTSxDQUFDO0FBQzlELGNBQVU7QUFBQSxFQUNaO0FBQ0EsU0FBTztBQUNUO0FBTU8sSUFBTSx5QkFBeUIsQ0FBeUIsV0FBYztBQUkzRSxRQUFNLFNBQVMsTUFBYSxTQUFTLE1BQU07QUFNM0MsUUFBTSxLQUFLLENBQUMsT0FBNEIsS0FBSyxRQUFRLEVBQUU7QUFNdkQsUUFBTSxrQkFBa0IsQ0FBQyxPQUFzQjtBQUM3QyxRQUFJLENBQUMsR0FBRyxFQUFFLEdBQUc7QUFDWCxZQUFNLElBQUksTUFBTSxlQUFlLEVBQUUsRUFBRTtBQUFBLElBQ3JDO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFLQSxRQUFNLE9BQVU7QUFNaEIsUUFBTSxTQUFTLENBQUMsT0FBc0I7QUFDcEMsV0FBTyxHQUFHLEVBQUUsSUFBSSxLQUFLLE9BQU87QUFBQSxFQUM5QjtBQUVBLFNBQU8sT0FBTyxPQUFPLEVBQUUsUUFBUSxJQUFJLFFBQVEsaUJBQWlCLEtBQUssQ0FBQztBQUNwRTtBQUdPLElBQU0sV0FBVyx1QkFBdUIsUUFBUTtBQUVoRCxJQUFNLFNBQVMsdUJBQXVCLE1BQU07IiwKICAibmFtZXMiOiBbIlNjaGVtYUR0byIsICJEVGltZXN0YW1wIiwgIkRVdGlsIiwgImlzTnVtYmVyIiwgIkRDc3MiLCAiRFN0eWxlIiwgIkFuc3dlcmVkUXVlc3Rpb24iLCAiQ29uZGl0aW9uIiwgImNvbmRpdGlvbiIsICJSdWxlIiwgInRhZyIsICJERXZlbnRIYW5kbGVyIiwgImR0byIsICJkdG8iLCAiU2NhbGUiLCAiUmVzdWx0IiwgIkRTdGF0ZSJdCn0K
2205
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2R0by9TY2hlbWFEdG8udHMiLCAiLi4vc3JjL2NvbW1vbi9EVGltZXN0YW1wLnRzIiwgIi4uL3NyYy91dGlscy9EVXRpbC50cyIsICIuLi9zcmMvRGVsZW1lbnQvY3NzLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EU3R5bGUudHMiLCAiLi4vc3JjL0RlbGVtZW50L1ZpZGVvQ29udGFpbmVyLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9BdWRpb0NvbnRhaW5lci50cyIsICIuLi9zcmMvc2VydmljZXMvRE1lZGlhLW1hbmFnZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL0RDb21tYW5kQnVzLnRzIiwgIi4uL3NyYy9ldmVudHMvZXZlbnQtYnVzLnRzIiwgIi4uL3NyYy9wbGF5ZXIvaGlzdG9yeS1xdWUudHMiLCAiLi4vc3JjL3J1bGVzL2NvbmRpdGlvbi50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS1lbmdpbmUudHMiLCAiLi4vc3JjL3BsYXllci9uZXh0LXF1ZS50cyIsICIuLi9zcmMvcGxheWVyL2RwbGF5ZXIudHMiLCAiLi4vc3JjL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXIudHMiLCAiLi4vc3JjL0RlbGVtZW50L0RFbGVtZW50LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EZGl2LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9ESW1nLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EVGV4dC50cyIsICIuLi9zcmMvZW5naW5lL2VsZW1lbnQtZmFjdG9yeS50cyIsICIuLi9zcmMvZW5naW5lL0RQYWdlLnRzIiwgIi4uL3NyYy9lbmdpbmUvc2NhbGUudHMiLCAiLi4vc3JjL3NlcnZpY2VzL3Jlc291cmNlLXByb3ZpZGVyLnRzIiwgIi4uL3NyYy9jb21tb24vcmVzdWx0LnRzIiwgIi4uL3NyYy9zdGF0ZS9Ec3RhdGUudHMiLCAiLi4vc3JjL3N0YXRlL3N0YXRlLXNlcnZpY2UudHMiLCAiLi4vc3JjL2VuZ2luZS9TY2hlbWFFbmdpbmUudHMiLCAiLi4vc3JjL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHkudHMiLCAiLi4vc3JjL3V0aWxzL0lELnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBEQXV0b1BsYXlTZXF1ZW5jZSB9IGZyb20gXCIuLi9EZWxlbWVudC9EQXV0by1wbGF5XCI7XG5pbXBvcnQgeyBEQXVkaW9EdG8sIERFbGVtZW50RHRvLCBESW1nRHRvLCBEVmlkZW9EdG8gfSBmcm9tIFwiLi9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IFJ1bGUgfSBmcm9tIFwiLi4vcnVsZXMvcnVsZVwiO1xuaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBQYWdlUXVlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFN0YXRlIH0gZnJvbSBcIi4uL3N0YXRlL0RzdGF0ZVwiO1xuaW1wb3J0IHsgUGFnZUlELCBTY2hlbWFJRCB9IGZyb20gXCIuLi91dGlscy9JRFwiO1xuXG5leHBvcnQgdHlwZSBQYWdlUXVlUnVsZXMgPSBSdWxlPFBhZ2VRdWVDb21tYW5kLCBuZXZlcj47XG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VEdG8ge1xuICByZWFkb25seSBpZDogUGFnZUlEO1xuICByZWFkb25seSBlbGVtZW50czogQXJyYXk8REVsZW1lbnREdG8+O1xuICByZWFkb25seSB0YWdzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IG1haW5WaWRlb0lkPzogc3RyaW5nO1xuICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZpZGVvPzogQXJyYXk8RFZpZGVvRHRvPjtcbiAgcmVhZG9ubHkgYXVkaW8/OiBBcnJheTxEQXVkaW9EdG8+O1xuICByZWFkb25seSBhdXRvUGxheVNlcXVlbmNlPzogREF1dG9QbGF5U2VxdWVuY2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVNlcXVlbmNlRHRvIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZXM6IEFycmF5PFBhZ2VRdWVSdWxlcz47XG4gIHJlYWRvbmx5IHBhZ2VzOiBBcnJheTxQYWdlRHRvPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFEdG8ge1xuICByZWFkb25seSBpZDogU2NoZW1hSUQ7XG4gIHJlYWRvbmx5IGJhc2VIZWlnaHQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgYmFzZVdpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICByZWFkb25seSBwYWdlczogUGFnZUR0b1tdO1xuICByZWFkb25seSBydWxlczogQXJyYXk8UGFnZVF1ZVJ1bGVzPjtcbiAgcmVhZG9ubHkgc3RhdGVQcm9wcz86IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlByb3A+O1xuICByZWFkb25seSBzdGF0ZVF1ZXJpZXM/OiBSZWFkb25seUFycmF5PERTdGF0ZS5TdGF0ZVF1ZXJ5PjtcbiAgcmVhZG9ubHkgc3RhdGVGcm9tRXZlbnQ6IFJlYWRvbmx5QXJyYXk8RFN0YXRlLmZyb21FdmVudEhhbmRsZXI+O1xuICByZWFkb25seSBwYWdlU2VxdWVuY2VzPzogQXJyYXk8UGFnZVNlcXVlbmNlRHRvPjtcbiAgcmVhZG9ubHkgcHJlZGVmaW5lZEZhY3RzPzogUmVhZG9ubHlBcnJheTxGYWN0Pjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTY2hlbWFEdG8ge1xuICBleHBvcnQgY29uc3QgZ2V0UmVzb3VyY2VzID0gKFxuICAgIHNjaGVtYTogU2NoZW1hRHRvLFxuICApOiB7XG4gICAgdmlkZW9MaXN0OiBSZWFkb25seUFycmF5PERWaWRlb0R0bz47XG4gICAgYXVkaW9MaXN0OiBSZWFkb25seUFycmF5PERBdWRpb0R0bz47XG4gICAgaW1hZ2VMaXN0OiBSZWFkb25seUFycmF5PERJbWdEdG8+O1xuICB9ID0+IHtcbiAgICBjb25zdCB7IHBhZ2VzIH0gPSBzY2hlbWE7XG4gICAgY29uc3QgdmlkZW9MaXN0ID0gcGFnZXMucmVkdWNlPEFycmF5PERWaWRlb0R0bz4+KChhY2MsIGN1cnIpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnIudmlkZW8pKSB7XG4gICAgICAgIGFjYy5wdXNoKC4uLmN1cnIudmlkZW8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgYXVkaW9MaXN0OiBBcnJheTxEQXVkaW9EdG8+ID0gcGFnZXMucmVkdWNlPEFycmF5PERBdWRpb0R0bz4+KChhY2MsIGN1cnIpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnIuYXVkaW8pKSB7XG4gICAgICAgIGFjYy5wdXNoKC4uLmN1cnIuYXVkaW8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4geyB2aWRlb0xpc3QsIGF1ZGlvTGlzdCwgaW1hZ2VMaXN0OiBbXSB9O1xuICB9O1xufVxuIiwgImV4cG9ydCB0eXBlIERUaW1lc3RhbXAgPSBudW1iZXIgJiB7IF9fdGltZXN0YW1wX186IHRydWUgfTtcbmV4cG9ydCBuYW1lc3BhY2UgRFRpbWVzdGFtcCB7XG4gICAgZXhwb3J0IGNvbnN0IG5vdyA9ICgpID0+IERhdGUubm93KCkgYXMgRFRpbWVzdGFtcDtcbiAgICBleHBvcnQgdHlwZSBEaWZmID0gbnVtYmVyICYgeyBfX2RpZmZfXzogdHJ1ZSB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGFkZE1pbGxzID0gKHQ6IERUaW1lc3RhbXAsIG1zOiBudW1iZXIpOiBEVGltZXN0YW1wID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gdCArIE1hdGguYWJzKG1zKTtcbiAgICAgICAgcmV0dXJuIHJlcyBhcyBEVGltZXN0YW1wO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgZGlmZiA9ICh0MTogRFRpbWVzdGFtcCwgdDI6IERUaW1lc3RhbXApOiBEaWZmID0+IHtcbiAgICAgICAgY29uc3QgdDFBYnMgPSBNYXRoLmFicyh0MSk7XG4gICAgICAgIGNvbnN0IHQyQWJzID0gTWF0aC5hYnModDIpO1xuICAgICAgICByZXR1cm4gTWF0aC5hYnModDFBYnMgLSB0MkFicykgYXMgRGlmZjtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGRpZmZOb3cgPSAodDogRFRpbWVzdGFtcCk6IERpZmYgPT4ge1xuICAgICAgICByZXR1cm4gZGlmZih0LCBub3coKSk7XG4gICAgfTtcbn1cbiIsICJleHBvcnQgdHlwZSBSYW5kb21PYmplY3RJZCA9IHN0cmluZyAmIHsgcmFuZG9tT2JqZWN0SWQ6IHRydWUgfTtcbmV4cG9ydCBuYW1lc3BhY2UgRFV0aWwge1xuICAgIGV4cG9ydCBjb25zdCByYW5kb21TdHJpbmcgPSAobGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBsZXR0ZXJzID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2eHl6XCI7XG4gICAgICAgIGNvbnN0IHVwcGVyY2FzZSA9IGxldHRlcnMudG9VcHBlckNhc2UoKTtcbiAgICAgICAgY29uc3QgYWxsID0gbGV0dGVycyArIHVwcGVyY2FzZTtcbiAgICAgICAgY29uc3QgYWJzID0gTWF0aC5hYnMobGVuZ3RoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhYnM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGFsbC5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsLmxlbmd0aCkpO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IHJhbmRvbU9iamVjdElkID0gKCkgPT4gcmFuZG9tU3RyaW5nKDMyKSBhcyBSYW5kb21PYmplY3RJZDtcblxuICAgIGV4cG9ydCBjb25zdCBkZWxldGVQcm9wID0gPE9iaiwgS2V5IGV4dGVuZHMga2V5b2YgT2JqPihvYmo6IE9iaiwga2V5OiBLZXkpOiBPbWl0PE9iaiwgS2V5PiA9PiB7XG4gICAgICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzSW5SYW5nZSA9IChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4O1xuICAgIH07XG4gICAgZXhwb3J0IGNvbnN0IGlzSW5maW5pdHkgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8IG51bWJlciA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIHx8IG51bWJlciA9PT0gSW5maW5pdHk7XG4gICAgfTtcbiAgICBleHBvcnQgdHlwZSBOb25FbXB0eUFycmF5PFQ+ID0gW1QsIC4uLlRbXV07XG4gICAgZXhwb3J0IGNvbnN0IGlzTm9uRW1wdHlBcnJheSA9IDxUPihhcnJheTogQXJyYXk8VD4pOiBhcnJheSBpcyBOb25FbXB0eUFycmF5PFQ+ID0+IHtcbiAgICAgICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDA7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBuZXZlckNoZWNrID0gKGFyZ3M6IG5ldmVyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiT09QUzogVGhpcyB2YWx1ZSBzbGlwcGVkIHRocm91Z2ggdGhlIG5ldmVyLWNoZWNrXCIsIGFyZ3MpO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNTdHJpbmcgPSAoc3RyOiB1bmtub3duKTogc3RyIGlzIHN0cmluZyA9PiB0eXBlb2Ygc3RyID09PSBcInN0cmluZ1wiO1xuXG4gICAgZXhwb3J0IGNvbnN0IGhhc0tleSA9IDxUIGV4dGVuZHMgc3RyaW5nPihvYmo6IHVua25vd24sIGtleTogVCk6IG9iaiBpcyBSZWNvcmQ8dHlwZW9mIGtleSwgdW5rbm93bj4gPT4ge1xuICAgICAgICBpZiAoIWlzUmVjb3JkKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzUmVjb3JkID0gKG9iajogdW5rbm93bik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNCb29sID0gKG9iajogYm9vbGVhbik6IG9iaiBpcyBib29sZWFuID0+IHR5cGVvZiBvYmogPT09IFwiYm9vbGVhblwiO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzVHJ1ZSA9IChib29sOiBib29sZWFuKTogYm9vbCBpcyB0cnVlID0+IGJvb2wgPT09IHRydWU7XG5cbiAgICBleHBvcnQgY29uc3QgaXNGYWxzZSA9IChib29sOiBib29sZWFuKTogYm9vbCBpcyBmYWxzZSA9PiBib29sID09PSBmYWxzZTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0RlZmluZWQgPSAob2JqOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IG5vdE51bGwgPSBvYmogIT09IG51bGw7XG4gICAgICAgIGNvbnN0IG5vdFVuZGVmaW5lZCA9IG9iaiAhPT0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbm90TnVsbCAmJiBub3RVbmRlZmluZWQ7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBoYXNLaW5kID0gKG9iajogdW5rbm93bik6IG9iaiBpcyB7IHJlYWRvbmx5IGtpbmQ6IHN0cmluZyB9ID0+IHtcbiAgICAgICAgaWYgKCFoYXNLZXkob2JqLCBcImtpbmRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9iai5raW5kICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iai5raW5kLmxlbmd0aCA+IDA7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBoYXNWYWx1ZSA9IChvYmo6IHVua25vd24pOiBvYmogaXMgeyB2YWx1ZTogdW5rbm93biB9ID0+IHtcbiAgICAgICAgcmV0dXJuIGhhc0tleShvYmosIFwidmFsdWVcIik7XG4gICAgfTtcbiAgICBleHBvcnQgY29uc3QgaXNOdW1iZXIgPSAodmFsdWU/OiBudW1iZXIpOiB2YWx1ZSBpcyBudW1iZXIgPT4ge1xuICAgICAgICBjb25zdCBpc051bWJlciA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcbiAgICAgICAgY29uc3Qgbm90TmFOID0gIU51bWJlci5pc05hTih2YWx1ZSk7XG4gICAgICAgIHJldHVybiBpc051bWJlciAmJiBub3ROYU47XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBtYXhGbiA9ICh1cHBlckxpbWl0OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odmFsdWUsIHVwcGVyTGltaXQpO1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgbWluRm4gPSAobG93ZXJMaW1pdDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlLCBsb3dlckxpbWl0KTtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgRENzcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBQeCB7XG4gICAgICAgIHJlYWRvbmx5IF91bml0OiBcInB4XCI7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgTGVuZ3RoU3RyaW5nID0gYCR7bnVtYmVyfXB4YCB8IGAke251bWJlcn0lYDtcbiAgICBleHBvcnQgaW50ZXJmYWNlIFBlcmNlbnQge1xuICAgICAgICByZWFkb25seSBfdW5pdDogXCJwZXJjZW50XCI7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgTGVuZ3RoVW5pdCA9IFB4IHwgUGVyY2VudDtcblxuICAgIC8qKlxuICAgICAqIFdpbGwgc2NhbGUgdG8gMyUgb2YgYmFzZVNjYWxlXG4gICAgICogQHBhcmFtIHVuaXRcbiAgICAgKiBAcGFyYW0gc2NhbGVcbiAgICAgKi9cbiAgICBleHBvcnQgY29uc3QgdG9TdHJpbmcgPSAodW5pdDogUmVhZG9ubHk8TGVuZ3RoVW5pdD4sIHNjYWxlOiBudW1iZXIpOiBMZW5ndGhTdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBjbGFtcGVkU2NhbGUgPSBNYXRoLm1heChzY2FsZSwgMC4wMyk7XG4gICAgICAgIGlmICh1bml0Ll91bml0ID09PSBcInB4XCIpIHtcbiAgICAgICAgICAgIGlmICh1bml0LnZhbHVlIDwgMC4xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiMHB4XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvdW5kZWQgPSBNYXRoLnJvdW5kKHVuaXQudmFsdWUgKiBjbGFtcGVkU2NhbGUpO1xuICAgICAgICAgICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KHJvdW5kZWQsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIChjbGFtcGVkICsgXCJweFwiKSBhcyBMZW5ndGhTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh1bml0LnZhbHVlICsgXCIlXCIpIGFzIExlbmd0aFN0cmluZztcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzTGVuZ3RoVW5pdCA9ICh1bml0PzogTGVuZ3RoVW5pdCk6IHVuaXQgaXMgTGVuZ3RoVW5pdCA9PiB7XG4gICAgICAgIGlmICghdW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVuaXRLZXk6IGtleW9mIExlbmd0aFVuaXQgPSBcIl91bml0XCI7XG4gICAgICAgIGNvbnN0IHZhbHVlS2V5OiBrZXlvZiBMZW5ndGhVbml0ID0gXCJ2YWx1ZVwiO1xuICAgICAgICBjb25zdCBoYXNVbml0S2V5ID0gRFV0aWwuaGFzS2V5KHVuaXQsIHVuaXRLZXkpO1xuICAgICAgICBjb25zdCBoYXNWYWx1ZUtleSA9IERVdGlsLmhhc0tleSh1bml0LCB2YWx1ZUtleSk7XG4gICAgICAgIHJldHVybiBoYXNVbml0S2V5ICYmIGhhc1ZhbHVlS2V5O1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgRENzcyB9IGZyb20gXCIuL2Nzc1wiO1xuaW1wb3J0IHsgRWxlbWVudEtleU5hbWVzIH0gZnJvbSBcIi4vRFN0eWxlLXV0aWxzXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG50eXBlIERTdHlsZTIgPSBDU1NTdHlsZURlY2xhcmF0aW9uO1xuZXhwb3J0IGludGVyZmFjZSBEU3R5bGUge1xuICAgIG9wYWNpdHk6IG51bWJlcjtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICB2aXNpYmlsaXR5OiBcInZpc2libGVcIiB8IFwiaGlkZGVuXCI7XG4gICAgY3Vyc29yOlxuICAgICAgICB8IFwicG9pbnRlclwiXG4gICAgICAgIHwgXCJoZWxwXCJcbiAgICAgICAgfCBcImNvcHlcIlxuICAgICAgICB8IFwid2FpdFwiXG4gICAgICAgIHwgXCJub3QtYWxsb3dlZFwiXG4gICAgICAgIHwgXCJjb250ZXh0LW1lbnVcIlxuICAgICAgICB8IFwibW92ZVwiXG4gICAgICAgIHwgXCJncmFiYmluZ1wiXG4gICAgICAgIHwgXCJncmFiXCJcbiAgICAgICAgfCBcInpvb20taW5cIlxuICAgICAgICB8IFwiem9vbS1vdXRcIlxuICAgICAgICB8IFwibm9uZVwiXG4gICAgICAgIHwgXCJhdXRvXCJcbiAgICAgICAgfCBcImRlZmF1bHRcIjtcblxuICAgIC8vIFBPU0lUSU9OXG4gICAgaDogbnVtYmVyO1xuICAgIHc6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuXG4gICAgLy8gQk9SREVSU1xuICAgIGJvcmRlclN0eWxlOiBcInNvbGlkXCIgfCBcIm5vbmVcIiB8IFwiZG90dGVkXCIgfCBcImRhc2hlZFwiO1xuICAgIGJvcmRlclJhZGl1czogRENzcy5QeCB8IERDc3MuUGVyY2VudDtcbiAgICBib3JkZXJXaWR0aDogRENzcy5QeDtcbiAgICBib3JkZXJDb2xvcjogc3RyaW5nO1xuXG4gICAgbWFyZ2luOiBEQ3NzLlB4IHwgRENzcy5QZXJjZW50O1xuICAgIHBhZGRpbmc6IERDc3MuUHggfCBEQ3NzLlBlcmNlbnQ7XG5cbiAgICAvLyBUcmFuc2xhdGVcbiAgICB0cmFuc2Zvcm06IHN0cmluZztcbiAgICB0cmFuc2xhdGU6IHN0cmluZztcblxuICAgIC8vIFRFWFRcbiAgICBmb250U2l6ZTogRENzcy5QeDtcbiAgICB0ZXh0Q29sb3I6IHN0cmluZztcbiAgICBmb250V2VpZ2h0OiAxMDAgfCAyMDAgfCAzMDAgfCA0MDAgfCA1MDAgfCA2MDAgfCA3MDAgfCA4MDAgfCA5MDA7XG4gICAgdGV4dEFsaWduOiBcInJpZ2h0XCIgfCBcImxlZnRcIiB8IFwiY2VudGVyXCI7XG4gICAgbGV0dGVyU3BhY2luZzogRENzcy5QeDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBEU3R5bGUge1xuICAgIGV4cG9ydCBjb25zdCBub3JtYWxpemUgPSA8VCBleHRlbmRzIEhUTUxFbGVtZW50PihlbDogVCk6IFQgPT4ge1xuICAgICAgICBlbC5zdHlsZS5wYWRkaW5nID0gXCIwXCI7XG4gICAgICAgIGVsLnN0eWxlLm1hcmdpbiA9IFwiMFwiO1xuICAgICAgICBlbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgZWwuc3R5bGUuYm94U2l6aW5nID0gXCJib3JkZXItYm94XCI7XG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzID0gPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oZWw6IFQsIHN0eWxlOiBQYXJ0aWFsPERTdHlsZT4sIHNjYWxlOiBudW1iZXIpOiBUID0+IHtcbiAgICAgICAgLy8gY29uc3Qgc2NhbGVQeCA9IERDc3MudG9TdHJpbmdDcmUodGhpcy5zY2FsZSk7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aCxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1cyxcbiAgICAgICAgICAgIGJvcmRlclN0eWxlLFxuICAgICAgICAgICAgdyxcbiAgICAgICAgICAgIG9wYWNpdHksXG4gICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQsXG4gICAgICAgICAgICB0ZXh0Q29sb3IsXG4gICAgICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgICAgICB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtYXJnaW4sXG4gICAgICAgICAgICBwYWRkaW5nLFxuICAgICAgICAgICAgbGV0dGVyU3BhY2luZyxcbiAgICAgICAgICAgIGgsXG4gICAgICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgICAgICB2aXNpYmlsaXR5LFxuICAgICAgICB9ID0gc3R5bGU7XG5cbiAgICAgICAgLy8gdGhpcy5lbC5zdHlsZS5mb250V2VpZ2h0ID0gJzkwMCc7XG4gICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmNvbG9yID0gdGV4dENvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0QWxpZ24pIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnRleHRBbGlnbiA9IHRleHRBbGlnbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3JkZXJDb2xvcikge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyQ29sb3IgPSBib3JkZXJDb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3JkZXJXaWR0aCkge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyV2lkdGggPSBEQ3NzLnRvU3RyaW5nKGJvcmRlcldpZHRoLCBzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvbnRXZWlnaHQpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmZvbnRXZWlnaHQgPSBmb250V2VpZ2h0ICsgXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm9yZGVyU3R5bGUpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlclN0eWxlID0gYm9yZGVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvbnRTaXplKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5mb250U2l6ZSA9IERDc3MudG9TdHJpbmcoZm9udFNpemUsIHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcih4KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUubGVmdCA9IHggKyBcIiVcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIoeSkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvdHRvbSA9IHkgKyBcIiVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcihoKSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gaCArIFwiJVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcih3KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUud2lkdGggPSB3ICsgXCIlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRENzcy5pc0xlbmd0aFVuaXQoYm9yZGVyUmFkaXVzKSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyUmFkaXVzID0gRENzcy50b1N0cmluZyhib3JkZXJSYWRpdXMsIHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZXR0ZXJTcGFjaW5nKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5sZXR0ZXJTcGFjaW5nID0gRENzcy50b1N0cmluZyhsZXR0ZXJTcGFjaW5nLCBzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcmdpbikge1xuICAgICAgICAgICAgZWwuc3R5bGUubWFyZ2luID0gRENzcy50b1N0cmluZyhtYXJnaW4sIHNjYWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGluZykge1xuICAgICAgICAgICAgZWwuc3R5bGUucGFkZGluZyA9IERDc3MudG9TdHJpbmcocGFkZGluZywgc2NhbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERVdGlsLmlzTnVtYmVyKG9wYWNpdHkpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eSArIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgZWwuc3R5bGUudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcbiAgICAvLyBjb25zdCBwcm9wTmFtZXMgPSBuZXcgU2V0KC4uLkVsZW1lbnRLZXlOYW1lcyk7XG4gICAgLy8gZXhwb3J0IGNvbnN0IHZhbGlkS2V5ID0gKGtleU5hbWU6IHN0cmluZykgPT4gcHJvcE5hbWVzLmhhcyhrZXlOYW1lKTtcbn1cbiIsICJpbXBvcnQgeyBEVmlkZW9EdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgREV2ZW50RGlzcGF0Y2hlciB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBEU3R5bGUgfSBmcm9tIFwiLi9EU3R5bGVcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmNvbnN0IEFCT1JUX1BMQVlfVE9fRU5EID0gXCJBQk9SVF9QTEFZX1RPX0VORFwiO1xuZXhwb3J0IGludGVyZmFjZSBDYW5QbGF5VG9FbmQge1xuICAgIHBsYXlUb0VuZCgpOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG5leHBvcnQgY2xhc3MgVmlkZW9Db250YWluZXIgaW1wbGVtZW50cyBDYW5QbGF5VG9FbmQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkdG8/OiBEVmlkZW9EdG87XG4gICAgcHJpdmF0ZSBkZWZhdWx0U3R5bGVzOiBQYXJ0aWFsPERTdHlsZT4gPSB7IGg6IDQ1LCB3OiAxMDAsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIHk6IDU1IH07XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fUEFVU0VEX0VWRU5UXCIsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWwucGF1c2UoKTtcbiAgICB9XG5cbiAgICBwbGF5KHVybDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmVsLnNyYyAhPT0gdXJsKSB7XG4gICAgICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9kdWNlcklkID0gdGhpcy5kdG8/LmlkID8/IFwiRFZpZGVvXCI7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIlZJREVPX1BMQVlfRVZFTlRcIixcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFZpZGVvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgLnBsYXkoKVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYodGhpcy5lbC5zcmMgIT09IHVybCkge1xuICAgICAgICAvLyAgICAgdGhpcy5cbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIGFzeW5jIHBsYXlUb0VuZCgpIHtcbiAgICAgICAgdGhpcy5lbC52b2x1bWUgPSAxO1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmR0bz8udXJsO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVuZGVkT3JFcnJvcmVkID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxuICAgICAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIEFCT1JUX1BMQVlfVE9fRU5ELFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNBVENIRUQgQUJCT1JULlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChcIkFib3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQTEFZXCIpO1xuICAgICAgICAgICAgdGhpcy5wbGF5KHVybCk7XG4gICAgICAgICAgICBhd2FpdCBlbmRlZE9yRXJyb3JlZDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCIgZmluYWxseSBibG9jayBwbGF5VG9FbmQoKSBjb21wbGV0ZWQgdmlkZW9JZDogXCIgKyB0aGlzLmR0bz8uaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZWw6IEhUTUxWaWRlb0VsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IERFdmVudERpc3BhdGNoZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IFNjYWxlU2VydmljZSAvLyBkdG8/OiBEVmlkZW9EdG9cbiAgICApIHtcbiAgICAgICAgdGhpcy5UQUcgPSBcIlsgRF9WaWRlbyBdIDogXCI7XG4gICAgICAgIHRoaXMuZWwuY29udHJvbHMgPSBmYWxzZTtcbiAgICAgICAgRFN0eWxlLm5vcm1hbGl6ZSh0aGlzLmVsKTtcbiAgICAgICAgRFN0eWxlLmFwcGx5U3R5bGVzKHRoaXMuZWwsIHRoaXMuZGVmYXVsdFN0eWxlcywgdGhpcy5zY2FsZS5zY2FsZSk7XG5cbiAgICAgICAgdGhpcy5lbC5vbmVuZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlZJREVPX0VOREVEX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbC5vbnBsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBUT0RPIExPR0cgSU5URVJOQUwgU1RBVEVfQ0hBTkdFUy5cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmVsLm9ucGF1c2UgPSAoKSA9PiB7fTtcbiAgICAgICAgdGhpcy5lbC5vbmVycm9yID0gKCkgPT4ge307XG4gICAgICAgIHRoaXMuZWwub25jYW5wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cENvbGxhcHNlZCh0aGlzLlRBRyArIFwiUkVBRFkgVE8gUExBWVwiKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRHVyYXRpb246IFwiICsgdGhpcy5lbC5kdXJhdGlvbik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIklkOiBcIiArIHRoaXMuaWQpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDdXJyZW50IFRpbWU6IFwiICsgdGhpcy5lbC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkF1ZG9QbGF5OiBcIiArIHRoaXMuZWwuYXV0b3BsYXkpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVsLm9ubG9hZGVkbWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgICAgICBjb25zdCBpc0luZmluaXR5ID0gRFV0aWwuaXNJbmZpbml0eShkdXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fTE9BREVEX01FVEFEQVRBX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBkdXJhdGlvbiwgaXNJbmZpbml0eSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRPRE8gVVNFIFRISVMgU1lOVEFYP1xuICAgICAgICB0aGlzLmVsLm9uZHVyYXRpb25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgICAgICBjb25zdCBpc0luZmluaXR5ID0gRFV0aWwuaXNJbmZpbml0eShkdXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVklERU9fRFVSQVRJT05fQ0hBTkdFX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFZpZGVvXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgZGF0YTogeyBkdXJhdGlvbiwgaXNJbmZpbml0eSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U3RhdHMoKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5lbC5kdXJhdGlvbjtcbiAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLmVsLmN1cnJlbnRUaW1lO1xuICAgICAgICBjb25zdCB2b2x1bWUgPSB0aGlzLmVsLnZvbHVtZTtcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQgPSB0aGlzLmVsLmlzQ29ubmVjdGVkO1xuICAgICAgICBjb25zdCBwbGF5YmFja1F1YWxpdHkgPSB0aGlzLmVsLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5KCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQbGF5YmFja1JhdGUgPSB0aGlzLmVsLmRlZmF1bHRQbGF5YmFja1JhdGU7XG4gICAgICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMuZWwucGF1c2VkO1xuICAgICAgICBjb25zdCBwbGF5ZWQgPSB0aGlzLmVsLnBsYXllZDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBwYXVzZWQsXG4gICAgICAgICAgICBwbGF5ZWQsXG4gICAgICAgICAgICBjdXJyZW50VGltZSxcbiAgICAgICAgICAgIHZvbHVtZSxcbiAgICAgICAgICAgIGlzQ29ubmVjdGVkLFxuICAgICAgICAgICAgcGxheWJhY2tRdWFsaXR5LFxuICAgICAgICAgICAgZGVmYXVsdFBsYXliYWNrUmF0ZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXREdG8oZHRvOiBEVmlkZW9EdG8pIHtcbiAgICAgICAgdGhpcy5kdG8gPSBkdG87XG4gICAgICAgIHRoaXMuZWwudm9sdW1lID0gMTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShkdG8uc3R5bGUpO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IGR0by51cmw7XG4gICAgICAgIHRoaXMuZWwubG9hZCgpO1xuICAgIH1cblxuICAgIGdldEN1cnJlbnREdG8oKTogRFZpZGVvRHRvIHwgZmFsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5kdG8gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGVzOiBQYXJ0aWFsPERTdHlsZT4pIHtcbiAgICAgICAgRFN0eWxlLmFwcGx5U3R5bGVzKHRoaXMuZWwsIHN0eWxlcywgdGhpcy5zY2FsZS5zY2FsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmR0bz8uaWQgPz8gXCJEVmlkZW9cIjtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge31cbn1cbiIsICJpbXBvcnQgeyBDYW5QbGF5VG9FbmQgfSBmcm9tIFwiLi9WaWRlb0NvbnRhaW5lclwiO1xuaW1wb3J0IHsgREF1ZGlvRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9Db250YWluZXIgaW1wbGVtZW50cyBDYW5QbGF5VG9FbmQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIERBdWRpbyBdOiBcIjtcbiAgICBwcm90ZWN0ZWQgZHRvOiBEQXVkaW9EdG8gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGVsOiBIVE1MQXVkaW9FbGVtZW50O1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IERFdmVudERpc3BhdGNoZXIpIHtcbiAgICAgICAgdGhpcy5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhdWRpb1wiKTtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgLy8gdGhpcy5lbC5vblxuICAgICAgICB0aGlzLm9uTG9hZCA9IHRoaXMub25Mb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25sb2FkID0gdGhpcy5vbkxvYWQ7XG4gICAgICAgIHRoaXMub25Mb2FkZWRNZXRhZGF0YSA9IHRoaXMub25Mb2FkZWRNZXRhZGF0YS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubG9hZGVkbWV0YWRhdGEgPSB0aGlzLm9uTG9hZGVkTWV0YWRhdGE7XG4gICAgICAgIHRoaXMuZWwub25wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uQ2FuUGxheVRocm91Z2ggPSB0aGlzLm9uQ2FuUGxheVRocm91Z2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmNhbnBsYXl0aHJvdWdoID0gdGhpcy5vbkNhblBsYXlUaHJvdWdoO1xuICAgICAgICB0aGlzLmVsLm9uZW5kZWQgPSAoXykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5lbC5zcmM7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fRU5ERURfRVZFTlRcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7IHVybCB9LFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWwub25kdXJhdGlvbmNoYW5nZSA9IChfOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNJbmZpbml0eSA9IGR1cmF0aW9uID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fRFVSQVRJT05fQ0hBTkdFX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBkdXJhdGlvbjogdGhpcy5lbC5kdXJhdGlvbiwgaXNJbmZpbml0eSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0QXVkaW8oZHRvOiBEQXVkaW9EdG8pIHtcbiAgICAgICAgdGhpcy5kdG8gPSBkdG87XG4gICAgICAgIHRoaXMuZWwuc3JjID0gZHRvLnVybDtcbiAgICAgICAgdGhpcy5lbC5sb2FkKCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZWwucGF1c2UoKTtcbiAgICAgICAgICAgIHRoaXMuZWwuc3JjID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuZWwubG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhdXNlKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lbC5wYXVzZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBUT0RPIEVNSVQgRVJST1IgRVZFTlQuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBsYXkodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuZWwuc3JjICE9PSB1cmwpIHtcbiAgICAgICAgICAgIHRoaXMuZWwuc3JjID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX1BMQVlfRVZFTlRcIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbFxuICAgICAgICAgICAgLnBsYXkoKVxuICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkxvYWRlZE1ldGFkYXRhKF86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX01FVEFEQVRBX0xPQURFRF9FVkVOVFwiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uTG9hZChfOiBFdmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19MT0FEX0VWRU5UXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgZXZlbnQudHlwZSk7XG4gICAgfVxuXG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kdG8/LmlkID8/IFwiREF1ZGlvXCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNhblBsYXlUaHJvdWdoKF86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIkFVRElPX0NBTl9QTEFZX1RIUk9VR0hfRVZFTlRcIixcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIG9uUGxheShfOiBFdmVudCkge31cblxuICAgIGFzeW5jIHBsYXlUb0VuZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5kZWRPckVycm9yZWQgPSBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgIFwiZW5kZWRcIixcbiAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBsYXkodGhpcy5lbC5zcmMpO1xuICAgICAgICAgICAgYXdhaXQgZW5kZWRPckVycm9yZWQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVE9ETyBMRVQgUEFSRU5UIERFQUwgV0lUSCBFUlJPUlM/IFRIRSBNQU5BR0VSPz8gTUFOQUdFUlMgQ0FMTCBBQk9SVC5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIkFVRElPX0VSUk9SX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBlcnJvcjogZSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUGFnZUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5pbXBvcnQgeyBWaWRlb0NvbnRhaW5lciB9IGZyb20gXCIuLi9EZWxlbWVudC9WaWRlb0NvbnRhaW5lclwiO1xuaW1wb3J0IHsgQXVkaW9Db250YWluZXIgfSBmcm9tIFwiLi4vRGVsZW1lbnQvQXVkaW9Db250YWluZXJcIjtcbmltcG9ydCB7IEF1dG9QbGF5RWxlbWVudCwgREF1dG9QbGF5U2VxdWVuY2UgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREF1dG8tcGxheVwiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IERDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVByb3ZpZGVyIH0gZnJvbSBcIi4vcmVzb3VyY2UtcHJvdmlkZXJcIjtcbmltcG9ydCB7IEF1dG9wbGF5VGFzaywgU2VxdWVuY2VNYW5hZ2VyIH0gZnJvbSBcIi4vc2VxdWVuY2UtbWFuYWdlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNZWRpYU1hbmFnZXIge1xuICBzZXRQYWdlKHBhZ2U6IFBhZ2VEdG8pOiB2b2lkO1xuICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBETWVkaWFNYW5hZ2VyIGltcGxlbWVudHMgSU1lZGlhTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIElOU1RBTkNFX0NPVU5UID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZU51bWJlcjogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBNRURJQV9NQU5BR0VSIF0gOiBcIjtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWRlb0NvbnRhaW5lcjogVmlkZW9Db250YWluZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXVkaW9Db250YWluZXI6IEF1ZGlvQ29udGFpbmVyO1xuICBwcml2YXRlIHBhZ2VFbnRlcjogRFRpbWVzdGFtcDtcbiAgcHJpdmF0ZSBzaW5jZVBhZ2VFbnRlcjogRFRpbWVzdGFtcC5EaWZmO1xuICBwcml2YXRlIGN1cnJlbnRQYWdlOiBQYWdlRHRvIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmVDb21tYW5kczogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSB0aWNrZXJSZWY6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXF1ZW5jZU1hbmFnZXI6IFNlcXVlbmNlTWFuYWdlciB8IGZhbHNlID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaG9zdEVsOiBIVE1MRGl2RWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VQcm92aWRlcjogUmVzb3VyY2VQcm92aWRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2UsXG4gICkge1xuICAgIERNZWRpYU1hbmFnZXIuSU5TVEFOQ0VfQ09VTlQgPSBETWVkaWFNYW5hZ2VyLklOU1RBTkNFX0NPVU5UICsgMTtcbiAgICB0aGlzLmluc3RhbmNlTnVtYmVyID0gRE1lZGlhTWFuYWdlci5JTlNUQU5DRV9DT1VOVDtcbiAgICBjb25zdCB2aWRlb0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO1xuICAgIHRoaXMuaG9zdEVsLmFwcGVuZCh2aWRlb0VsKTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyID0gbmV3IFZpZGVvQ29udGFpbmVyKHZpZGVvRWwsIGV2ZW50QnVzLCB0aGlzLnNjYWxlKTtcbiAgICB0aGlzLmF1ZGlvQ29udGFpbmVyID0gbmV3IEF1ZGlvQ29udGFpbmVyKHRoaXMuZXZlbnRCdXMpO1xuICAgIHRoaXMudGljayA9IHRoaXMudGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0U3R5bGUoeyB2aXNpYmlsaXR5OiBcImhpZGRlblwiIH0pO1xuICAgIGNvbnN0IG5vdyA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgdGhpcy5wYWdlRW50ZXIgPSBub3c7XG4gICAgdGhpcy5zaW5jZVBhZ2VFbnRlciA9IERUaW1lc3RhbXAuZGlmZihub3csIG5vdyk7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvbW1hbmRzID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoYWN0aW9uKSA9PiB7XG4gICAgICB0aGlzLmNvbW1hbmRIYW5kbGVyKGFjdGlvbik7XG4gICAgfSwgdGhpcy5UQUcpO1xuXG4gICAgdGhpcy50aWNrZXJSZWYgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge30sIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYWxsIG1lZGlhIHRoYXQgaXMgcGxheWluZ1xuICAgKi9cbiAgY2xlYXJBbGxNZWRpYSgpIHtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnBhdXNlKCk7XG4gICAgdGhpcy5hdWRpb0NvbnRhaW5lci5wYXVzZSgpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgY29uc29sZS5sb2coXCJUT0RPIERFU1RST1kgQUxMIE1FRElBXCIpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcygpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudGlja2VyUmVmKTtcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnRpY2tlclJlZik7XG4gICAgdGhpcy5hdWRpb0NvbnRhaW5lci5kZXN0cm95KCk7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lci5kZXN0cm95KCk7XG4gIH1cblxuICBzZXRQYWdlKHBhZ2U6IFBhZ2VEdG8pIHtcbiAgICAvLyBUT0RPIFNUT1AgVklERU8vQVVESU8gVEhBVCBNSUdIVCBCRSBQTEFZSU5HIElOIFRIRSBET00/P1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIucGF1c2UoKTtcbiAgICB0aGlzLnBhZ2VFbnRlciA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgLy8gVE9ETyBUSGlzIG1pZ2h0IGJlIGEgYnVnIGlmIHNvbWVvbmVcblxuICAgIGNvbnN0IHNlcSA9IHBhZ2UuYXV0b1BsYXlTZXF1ZW5jZTtcbiAgICAvLyB0aGlzLnNlcXVlbmNlID0gc2VxID8gWy4uLnNlcS5pdGVtc10gOiBbXTtcbiAgICBjb25zdCB7IG1haW5WaWRlb0lkLCBhdWRpbyB9ID0gcGFnZTtcbiAgICBjb25zdCBhdWRpb0VsZW1lbnRzID0gcGFnZS5hdWRpbztcblxuICAgIGlmIChtYWluVmlkZW9JZCkge1xuICAgICAgY29uc3QgZHRvID0gdGhpcy5yZXNvdXJjZVByb3ZpZGVyLmdldFZpZGVvQnlJZChtYWluVmlkZW9JZCk7XG4gICAgICBpZiAoZHRvKSB7XG4gICAgICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0RHRvKGR0byk7XG4gICAgICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0U3R5bGUoeyAuLi5kdG8uc3R5bGUsIHZpc2liaWxpdHk6IFwidmlzaWJsZVwiIH0pO1xuICAgICAgfVxuICAgICAgLy8gdGhpcy52aWRlb0NvbnRhaW5lci5wbGF5VG9FbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5zZXRTdHlsZSh7IHZpc2liaWxpdHk6IFwiaGlkZGVuXCIgfSk7XG4gICAgICAvLyBISURFP1xuICAgIH1cbiAgICBpZiAoYXVkaW9FbGVtZW50cykge1xuICAgICAgY29uc3QgZmlyc3QgPSBhdWRpb0VsZW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgIHRoaXMuYXVkaW9Db250YWluZXIuc2V0QXVkaW8oZmlyc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VxKSB7XG4gICAgICB0aGlzLnBsYXlTZXF1ZW5jZShzZXEpO1xuICAgIH1cbiAgICAvLyBjb25zdCBoYXNWaWRlbyA9XG4gIH1cblxuICBwcml2YXRlIGNvbW1hbmRIYW5kbGVyKGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJWSURFT19QTEFZX0NPTU1BTkRcIikge1xuICAgICAgY29uc3QgdmlkZW8gPSBjb21tYW5kLnRhcmdldElkO1xuICAgICAgY29uc3QgZHRvID0gdGhpcy52aWRlb0NvbnRhaW5lci5nZXRDdXJyZW50RHRvKCk7XG5cbiAgICAgIGlmIChkdG8gJiYgZHRvLmlkID09PSBjb21tYW5kLnRhcmdldElkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHZpZGVvKTtcbiAgICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5wbGF5KGR0by51cmwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIlZJREVPX1BBVVNFX0NPTU1BTkRcIikge1xuICAgICAgdGhpcy52aWRlb0NvbnRhaW5lci5wYXVzZSgpO1xuICAgIH1cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIkFVRElPX1BMQVlfQ09NTUFORFwiKSB7XG4gICAgICB0aGlzLmF1ZGlvQ29udGFpbmVyXG4gICAgICAgIC5wbGF5VG9FbmQoKVxuICAgICAgICAudGhlbigoKSA9PiB7fSlcbiAgICAgICAgLmNhdGNoKClcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge30pO1xuICAgIH1cblxuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiQVVESU9fUEFVU0VfQ09NTUFORFwiKSB7XG4gICAgICAvLyB0aGlzLmF1ZGlvQ29udGFpbmVyLlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGxheVNlcXVlbmNlKHNlcTogREF1dG9QbGF5U2VxdWVuY2UpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiU0VRVUVOQ0UgU1RBUlRFRCAtLSBUT0RPIEVWRU5UIEZPUiBUSElTPz9cIik7XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IHNlcS5pdGVtcztcbiAgICBjb25zdCB0ZXN0Q2xvbmUgPSBbLi4uZWxlbWVudHNdO1xuICAgIGNvbnN0IGZpcnN0ID0gdGVzdENsb25lLnBvcCgpO1xuXG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIHNlcS5zdGFydENvbW1hbmRzLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGMpO1xuICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoYyk7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmVtaXQoRFN0YXRlUHJvcHMubWVkaWFCbG9ja2VkQnlTZXF1ZW5jZS5zZXRUcnVlQ29tbWFuZCk7XG4gICAgLy8gaWYgKHNlcS5ibG9ja1VzZXJJbnB1dCkge1xuICAgIC8vICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChEU3RhdGVQcm9wcy5pbnB1dEJsb2NraW5nQnlTZXF1ZW5jZS5nZXRTZXRUcnVlQ29tbWFuZCgpKTtcbiAgICAvLyB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJhdXRvcGxheS12aWRlb1wiKSB7XG4gICAgICAgIGNvbnN0IGR0byA9IHRoaXMucmVzb3VyY2VQcm92aWRlci5nZXRWaWRlb0J5SWQoaXRlbS52aWRlb0lkKTtcbiAgICAgICAgaWYgKGR0bykgdGhpcy52aWRlb0NvbnRhaW5lci5zZXREdG8oZHRvKTtcbiAgICAgICAgYXdhaXQgdGhpcy52aWRlb0NvbnRhaW5lci5wbGF5VG9FbmQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmtpbmQgPT09IFwiYXV0b3BsYXktYXVkaW9cIikge1xuICAgICAgICBjb25zb2xlLmxvZyhpdGVtKTtcbiAgICAgICAgY29uc3QgZHRvID0gdGhpcy5yZXNvdXJjZVByb3ZpZGVyLmdldEF1ZGlvQnlJZChpdGVtLmF1ZGlvSWQpO1xuICAgICAgICBpZiAoZHRvKSB0aGlzLmF1ZGlvQ29udGFpbmVyLnNldEF1ZGlvKGR0byk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXVkaW9Db250YWluZXIucGxheVRvRW5kKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHNlcS5lbmRDb21tYW5kcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjKTtcbiAgICB9KTtcbiAgICAvLyB0aGlzLmFjdGlvblNlcnZpY2UuZW1pdChEU3RhdGVQcm9wcy5tZWRpYUJsb2NrZWRCeVNlcXVlbmNlLnNldEZhbHNlQ29tbWFuZCk7XG4gICAgLy8gdGhpcy5hY3Rpb25TZXJ2aWNlLmVtaXQoRFN0YXRlUHJvcHMuaW5wdXRCbG9ja2luZ0J5U2VxdWVuY2Uuc2V0RmFsc2VDb21tYW5kKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiU0VRVUVOQ0UgRU5ERURcIik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBzZXRQYWdlKClcblxuICBwcml2YXRlIHRpY2soKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy52aWRlbzEuZ2V0U3RhdHMoKSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBEQ29tbWFuZCB9IGZyb20gXCIuL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRENvbW1hbmRTdG9yZSB7XG4gIHN1YnNjcmliZShjYWxsYmFjazogKCkgPT4gdm9pZCwgc3Vic2NyaWJlcklkOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERDb21tYW5kRGlzcGF0Y2hlciB7XG4gIGVtaXQoY29tbWFuZDogRENvbW1hbmQpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgQ29tbWFuZFN1YnNjcmliZXJEYXRhIHtcbiAgcmVhZG9ubHkgc3Vic2NyaWJlcklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNhbGxiYWNrOiAoY29tbWFuZDogRENvbW1hbmQpID0+IHZvaWQ7XG59XG5leHBvcnQgY2xhc3MgRENvbW1hbmRCdXMgaW1wbGVtZW50cyBEQ29tbWFuZFN0b3JlLCBEQ29tbWFuZERpc3BhdGNoZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBDT01NQU5EX0JVUyBdIFwiO1xuICBsb2dDb21tYW5kcyA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRMb2c6IEFycmF5PERDb21tYW5kICYgeyB0aW1lc3RhbXA6IERUaW1lc3RhbXAgfT4gPSBbXTtcbiAgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PENvbW1hbmRTdWJzY3JpYmVyRGF0YT4oKTtcbiAgLy8gcmVhZG9ubHkgc3ViXG5cbiAgc3Vic2NyaWJlKGNiOiAoY29tbWFuZDogRENvbW1hbmQpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ViOiBDb21tYW5kU3Vic2NyaWJlckRhdGEgPSB7XG4gICAgICBzdWJzY3JpYmVySWQsXG4gICAgICBjYWxsYmFjazogY2IsXG4gICAgfTtcblxuICAgIHRoaXMuc3Vic2NyaWJlcnMuYWRkKHN1Yik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZGVsZXRlKHN1Yik7XG4gICAgfTtcbiAgfVxuXG4gIGVtaXQoY29tbWFuZDogRENvbW1hbmQpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIHRoaXMuY29tbWFuZExvZy5wdXNoKHsgLi4uY29tbWFuZCwgdGltZXN0YW1wIH0pO1xuICAgIGlmICh0aGlzLmxvZ0NvbW1hbmRzKSB7XG4gICAgICB0aGlzLmxvZ0NvbW1hbmQoY29tbWFuZCk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgc3Vic2NyaWJlci5jYWxsYmFjayhjb21tYW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFN0YXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb21tYW5kczogWy4uLnRoaXMuY29tbWFuZExvZ10sXG4gICAgICBzdWJzY3JpYmVyczogWy4uLnRoaXMuc3Vic2NyaWJlcnNdLFxuICAgICAgc3Vic2NyaWJlcnNDb3VudDogdGhpcy5zdWJzY3JpYmVycy5zaXplLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxvZ0NvbW1hbmQoY29tbWFuZDogRENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKHRoaXMuVEFHICsgXCIgXCIgKyBjb21tYW5kLmtpbmQpO1xuICAgIGNvbnNvbGUubG9nKFwiVGFyZ2V0SUQgOiBcIiArIGNvbW1hbmQudGFyZ2V0SWQpO1xuICAgIGNvbnNvbGUubG9nKGNvbW1hbmQucGF5bG9hZCk7XG4gICAgY29uc29sZS5ncm91cEVuZCgpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgREV2ZW50IH0gZnJvbSBcIi4vREV2ZW50c1wiO1xuXG5pbnRlcmZhY2UgU3Vic2NyaWJlckRhdGEge1xuICAgIHJlYWRvbmx5IHN1YnNjcmliZXJJZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNiOiAoZXZlbnQ6IERFdmVudCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBERXZlbnRTdG9yZSB7XG4gICAgc3Vic2NyaWJlKGNiOiAoZXZlbnQ6IERFdmVudCkgPT4gdm9pZCwgc3Vic2NyaWJlcklkOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERFdmVudERpc3BhdGNoZXIge1xuICAgIGVtaXQoZXZlbnQ6IERFdmVudCk6IHZvaWQ7XG59XG5leHBvcnQgY2xhc3MgRXZlbnRCdXMgaW1wbGVtZW50cyBERXZlbnRTdG9yZSwgREV2ZW50RGlzcGF0Y2hlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgIEVWRU5UX0JVUyAgXSA6XCI7XG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8KGV2ZW50OiBERXZlbnQpID0+IHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8U3Vic2NyaWJlckRhdGE+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IG9uIG1vZHVsZSBlbmQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TG9nOiBERXZlbnRbXSA9IFtdO1xuICAgIGNvbnNvbGVMb2dFdmVudHMgPSBmYWxzZTtcbiAgICAvLyByZWFkb25seSBzdWJcblxuICAgIHN1YnNjcmliZShjYjogKGV2ZW50OiBERXZlbnQpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIC8vIHRoaXMuc3Vic2NyaWJlcnMuYWRkKGNiKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlckRhdGE6IFN1YnNjcmliZXJEYXRhID0ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcklkLFxuICAgICAgICAgICAgY2IsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuYWRkKHN1YnNjcmliZXJEYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuY29uc29sZUxvZ0V2ZW50cykge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiBhZGRlZDogXCIgKyBzdWJzY3JpYmVySWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiBjb3VudDogXCIgKyB0aGlzLnN1YnNjcmliZXJzLnNpemUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25zb2xlTG9nRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiByZW1vdmVkOiBcIiArIHN1YnNjcmliZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInN1YnNjcmlwdGlvbiBjb3VudCAgOiBcIiArIHRoaXMuc3Vic2NyaWJlcnMuc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShjYik7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShzdWJzY3JpYmVyRGF0YSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U3RhdHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyc0NvdW50OiB0aGlzLnN1YnNjcmliZXJzLnNpemUsXG4gICAgICAgICAgICBldmVudExvZzogWy4uLnRoaXMuZXZlbnRMb2ddLFxuICAgICAgICAgICAgc3Vic2NyaWJlcnM6IFsuLi50aGlzLnN1YnNjcmliZXJzXSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBlbWl0KGV2ZW50OiBERXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uc29sZUxvZ0V2ZW50cykge1xuICAgICAgICAgICAgdGhpcy5sb2dFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudExvZy5wdXNoKGV2ZW50KTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQ0FMTElORyBFTUlUJyk7XG4gICAgICAgICAgICBkYXRhLmNiKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRoaXMubG9nRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dFdmVudChldmVudDogREV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQodGhpcy5UQUcgKyBcIiBcIiArIGV2ZW50LmtpbmQpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlByb2R1Y2VySWQ6IFwiICsgZXZlbnQucHJvZHVjZXJJZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LmRhdGEpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dFdmVudHMoKSB7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXAodGhpcy5UQUcgKyBcIkxPR0dcIik7XG4gICAgICAgIGNvbnNvbGUudGFibGUodGhpcy5ldmVudExvZyk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW5zd2VyZWRRdWVzdGlvbiB7XG4gICAgcmVhZG9ubHkgdGltZXN0YW1wOiBEVGltZXN0YW1wO1xuICAgIHJlYWRvbmx5IGZhY3Q6IEZhY3Q7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQW5zd2VyZWRRdWVzdGlvbiB7XG4gICAgZXhwb3J0IGNvbnN0IGVxID0gKGE6IEFuc3dlcmVkUXVlc3Rpb24sIGI6IEFuc3dlcmVkUXVlc3Rpb24pOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIGEuZmFjdCA9PT0gYi5mYWN0O1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUhpc3Rvcnkge1xuICAgIHJlYWRvbmx5IHBhZ2VJZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGFuc3dlcmVkUXVlc3Rpb25zOiBBbnN3ZXJlZFF1ZXN0aW9uW107XG59XG5cbmV4cG9ydCBjbGFzcyBIaXN0b3J5UXVlIHtcbiAgICBwcml2YXRlIGhpc3Rvcnk6IFBhZ2VIaXN0b3J5W10gPSBbXTtcblxuICAgIGdldEZhY3RzKCk6IEFycmF5PEZhY3Q+IHtcbiAgICAgICAgY29uc3QgYW5zd2VycyA9IHRoaXMuaGlzdG9yeS5tYXAoKGgpID0+IGguYW5zd2VyZWRRdWVzdGlvbnMpLmZsYXQoMSk7XG4gICAgICAgIGNvbnN0IGZhY3RzID0gYW5zd2Vycy5tYXAoKGEpID0+IGEuZmFjdCk7XG4gICAgICAgIC8vIFRPRE8gRklORCBMQVRFU1QgRkFDVCAoYW5zd2VyKSBpZiBoYXZlIG11bHRpcGxlLlxuICAgICAgICByZXR1cm4gZmFjdHM7XG4gICAgfVxuXG4gICAgZ2V0QW5zd2VycygpOiBBcnJheTxBbnN3ZXJlZFF1ZXN0aW9uPiB7XG4gICAgICAgIGNvbnN0IGFuc3dlcnMgPSB0aGlzLmhpc3RvcnkubWFwKChoKSA9PiBoLmFuc3dlcmVkUXVlc3Rpb25zKS5mbGF0KDEpO1xuICAgICAgICByZXR1cm4gYW5zd2VycztcbiAgICB9XG5cbiAgICBhZGRUb0hpc3RvcnkocGFnZTogUGFnZUhpc3RvcnkpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocGFnZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi9mYWN0XCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuZXhwb3J0IHR5cGUgQ29uZGl0aW9uID0gQ29uZGl0aW9uLlN0cmluZyB8IENvbmRpdGlvbi5OdW1lcmljIHwgQ29uZGl0aW9uLkNvbXBsZXg7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29uZGl0aW9uIHtcbiAgICBleHBvcnQgdHlwZSBTdHJpbmdPcGVyYXRvciA9IFwiZXFcIiB8IFwibm90LWVxXCIgfCBcImxvbmdlci10aGVuXCIgfCBcInNob3J0ZXItdGhlblwiO1xuXG4gICAgZXhwb3J0IHR5cGUgTnVtZXJpY09wZXJhdG9yID1cbiAgICAgICAgfCBcImVxXCJcbiAgICAgICAgfCBcIm5vdC1lcVwiXG4gICAgICAgIHwgXCJncmVhdGVyLXRoZW5cIlxuICAgICAgICB8IFwibGVzcy10aGVuXCJcbiAgICAgICAgfCBcImdyZWF0ZXItdGhlbi1pbmNsdXNpdmVcIlxuICAgICAgICB8IFwibGVzcy10aGVuLWluY2x1c2l2ZVwiO1xuXG4gICAgZXhwb3J0IGludGVyZmFjZSBOdW1lcmljIHtcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlSWQ6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWVMYWJlbDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBraW5kOiBcIm51bWVyaWMtY29uZGl0aW9uXCI7XG4gICAgICAgIHJlYWRvbmx5IG9wZXJhdG9yOiBOdW1lcmljT3BlcmF0b3I7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nIHtcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlSWQ6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcmVmZXJlbmNlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWVMYWJlbDogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBraW5kOiBcInN0cmluZy1jb25kaXRpb25cIjtcbiAgICAgICAgcmVhZG9ubHkgb3BlcmF0b3I6IFN0cmluZ09wZXJhdG9yO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcGxleCB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwiY29tcGxleC1jb25kaXRpb25cIjtcbiAgICAgICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBhbGw6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT47XG4gICAgICAgIHJlYWRvbmx5IHNvbWU6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT47XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgU2ltcGxlID0gQ29uZGl0aW9uLlN0cmluZyB8IENvbmRpdGlvbi5OdW1lcmljO1xuXG4gICAgLyoqXG4gICAgICogQW4gZW1wdHkgY29uZGl0aW9uIHdpbGwgZXZhbHVhdGUgdG8gZmFsc2UsXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbjogQ29uZGl0aW9uLkFueVxuICAgICAqIEBwYXJhbSBmYWN0c1xuICAgICAqL1xuICAgIGV4cG9ydCBjb25zdCBldmFsdWF0ZSA9IChjb25kaXRpb246IENvbmRpdGlvbiwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm51bWVyaWMtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY29tcGxleC1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBldmFsdWF0ZUNvbXBsZXgoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZUNvbXBsZXggPSAoY29uZGl0aW9uOiBDb25kaXRpb24uQ29tcGxleCwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbi5zb21lLmxlbmd0aCA9PT0gMCAmJiBjb25kaXRpb24uYWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbFNvbHZlZCA9IGNvbmRpdGlvbi5hbGwubWFwKChjb25kaXRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZVNpbXBsZShjb25kaXRpb24sIGZhY3RzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc29tZUV2YWx1YXRlZCA9IGNvbmRpdGlvbi5zb21lLm1hcCgoY29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBhbGxSZXN1bHQgPSBhbGxTb2x2ZWQuZXZlcnkoRFV0aWwuaXNUcnVlKTtcbiAgICAgICAgY29uc3Qgc29tZVJlc3VsdCA9IHNvbWVFdmFsdWF0ZWQubGVuZ3RoID09PSAwIHx8IHNvbWVFdmFsdWF0ZWQuc29tZShEVXRpbC5pc1RydWUpO1xuICAgICAgICByZXR1cm4gc29tZVJlc3VsdCAmJiBhbGxSZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGV2YWx1YXRlU2ltcGxlID0gKGNvbmRpdGlvbjogQ29uZGl0aW9uLlNpbXBsZSwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgZmFjdCA9IGZhY3RzLmZpbmQoKGYpID0+IGYucmVmZXJlbmNlSWQgPT09IGNvbmRpdGlvbi5yZWZlcmVuY2VJZCk7XG4gICAgICAgIGlmICghZmFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChjb25kaXRpb24ua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcIm51bWVyaWMtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgaWYgKGZhY3Qua2luZCA9PT0gXCJudW1lcmljLWZhY3RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBldmFsdWF0ZU51bWVyaWMoY29uZGl0aW9uLCBmYWN0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIGlmIChmYWN0LmtpbmQgPT09IFwic3RyaW5nLWZhY3RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBldmFsdWF0ZVN0cmluZyhjb25kaXRpb24sIGZhY3QudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gY29uZGl0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKGNvbXBsZXg6IENvbXBsZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXguYWxsLmxlbmd0aCA9PT0gMCAmJiBjb21wbGV4LnNvbWUubGVuZ3RoID09PSAwO1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZVN0cmluZyA9IChjb25kaXRpb246IFJlYWRvbmx5PENvbmRpdGlvbi5TdHJpbmc+LCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IG9wZXJhdG9yID0gY29uZGl0aW9uLm9wZXJhdG9yO1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgXCJlcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibm90LWVxXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlICE9PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzaG9ydGVyLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udmFsdWUgIT09IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxvbmdlci10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlICE9PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gb3BlcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVOdW1lcmljID0gKGNvbmRpdGlvbjogTnVtZXJpYywgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBvcCA9IGNvbmRpdGlvbi5vcGVyYXRvcjtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSBjb25kaXRpb24udmFsdWU7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgICAgICAgY2FzZSBcImVxXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPT09IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm5vdC1lcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlICE9PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJncmVhdGVyLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA+IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImdyZWF0ZXItdGhlbi1pbmNsdXNpdmVcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA+PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsZXNzLXRoZW5cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA8IGNvbmRpdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxlc3MtdGhlbi1pbmNsdXNpdmVcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA8PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgX2dldEFsbFNpbXBsZSA9IChjb25kaXRpb246IENvbmRpdGlvbik6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPT4ge1xuICAgICAgICBjb25zdCBzaW1wbGU6IEFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0gW107XG4gICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJjb21wbGV4LWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLmNvbmRpdGlvbi5hbGwpO1xuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLmNvbmRpdGlvbi5zb21lKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJudW1lcmljLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHNpbXBsZS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIERVdGlsLm5ldmVyQ2hlY2soY29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgZ2V0QWxsU2ltcGxlQ29uZGl0aW9ucyA9IChcbiAgICAgICAgY29uZGl0aW9uOiBDb25kaXRpb24gfCBBcnJheTxDb25kaXRpb24+XG4gICAgKTogUmVhZG9ubHlBcnJheTxDb25kaXRpb24uU2ltcGxlPiA9PiB7XG4gICAgICAgIGNvbnN0IHNpbXBsZTogQXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPSBbXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSkge1xuICAgICAgICAgICAgY29uZGl0aW9uLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaCguLi5fZ2V0QWxsU2ltcGxlKGMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2ltcGxlLnB1c2goLi4uX2dldEFsbFNpbXBsZShjb25kaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlO1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4vZmFjdFwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSdWxlPE9uU3VjY2Vzc0FjdGlvbiwgT25GYWlsdXJlQWN0aW9uPiB7XG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBhbGw6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uPjtcbiAgcmVhZG9ubHkgc29tZTogUmVhZG9ubHlBcnJheTxDb25kaXRpb24+O1xuICByZWFkb25seSBvblN1Y2Nlc3M6IFJlYWRvbmx5QXJyYXk8T25TdWNjZXNzQWN0aW9uPjtcbiAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWFkb25seUFycmF5PE9uRmFpbHVyZUFjdGlvbj47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVsZSB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgcnVsZSBpcyB2YWxpZC5cbiAgICogQHBhcmFtIHJ1bGVcbiAgICovXG5cbiAgZXhwb3J0IGNvbnN0IGlzRW1wdHkgPSAocnVsZTogUnVsZTxhbnksIGFueT4pOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBlbXB0eUNvbmRpdGlvbnMgPSBydWxlLmFsbC5sZW5ndGggPT09IDAgJiYgcnVsZS5zb21lLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBlbXB0eUFjdGlvbnMgPSBydWxlLm9uU3VjY2Vzcy5sZW5ndGggPT09IDAgJiYgcnVsZS5vbkZhaWx1cmUubGVuZ3RoID09PSAwO1xuICAgIHJldHVybiBlbXB0eUNvbmRpdGlvbnMgfHwgZW1wdHlBY3Rpb25zO1xuICB9O1xuXG4gIGV4cG9ydCBjb25zdCBzb2x2ZSA9IChydWxlOiBSdWxlPGFueSwgYW55PiwgZmFjdHM6IFJlYWRvbmx5QXJyYXk8RmFjdD4pOiBib29sZWFuID0+IHtcbiAgICBpZiAocnVsZS5zb21lLmxlbmd0aCA9PT0gMCAmJiBydWxlLmFsbC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFRPRE8gUkVUVVJOIFdBUk5JTkc/IE9SIExPR0dJTkcgP1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvbWVTb2x2ZWQgPSBydWxlLnNvbWUubWFwKChjb25kaXRpb24pID0+IENvbmRpdGlvbi5ldmFsdWF0ZShjb25kaXRpb24sIGZhY3RzKSk7XG5cbiAgICBjb25zdCBzb21lUmVzdWx0ID0gc29tZVNvbHZlZC5sZW5ndGggPT09IDAgfHwgc29tZVNvbHZlZC5zb21lKERVdGlsLmlzVHJ1ZSk7XG5cbiAgICBjb25zdCBhbGxTb2x2ZWQgPSBydWxlLmFsbC5tYXAoKGNvbmRpdGlvbikgPT4gQ29uZGl0aW9uLmV2YWx1YXRlKGNvbmRpdGlvbiwgZmFjdHMpKS5ldmVyeShEVXRpbC5pc1RydWUpO1xuXG4gICAgcmV0dXJuIGFsbFNvbHZlZCAmJiBzb21lUmVzdWx0O1xuICB9O1xufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi9mYWN0XCI7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSBcIi4vcnVsZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvbHZlUmVzdWx0PFMsIEY+IHtcbiAgbWF0Y2hpbmc6IFJlYWRvbmx5QXJyYXk8TWF0Y2g8UywgRj4+O1xuICBlcnJvcnM6IFJlYWRvbmx5QXJyYXk8UnVsZUVuZ2luZUVycm9yPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRjaDxTLCBGPiB7XG4gIHJlYWRvbmx5IG1hdGNoaW5nUnVsZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVEZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBhY3Rpb25MaXN0OiBSZWFkb25seUFycmF5PFM+IHwgUmVhZG9ubHlBcnJheTxGPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBraW5kPzogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBSdWxlRW5naW5lPFMsIEY+IHtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHNvbHZlQWxsKHJ1bGVzOiBSdWxlPFMsIEY+W10sIGZhY3RzOiBGYWN0W10pOiBTb2x2ZVJlc3VsdDxTLCBGPiB7XG4gICAgY29uc3QgZXJyb3JzOiBSdWxlRW5naW5lRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IG1hdGNoaW5nOiBNYXRjaDxTLCBGPltdID0gW107XG4gICAgcnVsZXMuZm9yRWFjaCgocnVsZSkgPT4ge1xuICAgICAgaWYgKFJ1bGUuaXNFbXB0eShydWxlKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6IFwiRW1wdHkgcnVsZTogXCIgKyBydWxlLmlkIH0pO1xuICAgICAgfSBlbHNlIGlmIChSdWxlLnNvbHZlKHJ1bGUsIGZhY3RzKSkge1xuICAgICAgICBjb25zdCBtYXRjaDogTWF0Y2g8UywgRj4gPSB7XG4gICAgICAgICAgcnVsZURlc2NyaXB0aW9uOiBydWxlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIG1hdGNoaW5nUnVsZUlkOiBydWxlLmlkID8/IFwibm8taWQtZ2l2ZW5cIixcbiAgICAgICAgICBhY3Rpb25MaXN0OiBbLi4ucnVsZS5vblN1Y2Nlc3NdLFxuICAgICAgICB9O1xuICAgICAgICBtYXRjaGluZy5wdXNoKG1hdGNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBtYXRjaGluZywgZXJyb3JzIH07XG4gIH1cblxuICBzb2x2ZShydWxlOiBSdWxlPFMsIEY+LCBmYWN0czogRmFjdFtdKTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyBWYWxpZGF0ZSwgYW5kIFJldHVybiByZXN1bHRcbiAgICByZXR1cm4gUnVsZS5zb2x2ZShydWxlLCBmYWN0cyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQYWdlRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcblxuZXhwb3J0IGNsYXNzIE5leHRRdWUge1xuICAgIHByaXZhdGUgb3JpZ2luYWxPcmRlcjogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0gW107XG4gICAgcHJpdmF0ZSBhbGxQYWdlczogUGFnZUR0b1tdID0gW107XG4gICAgcHJpdmF0ZSBleGNsdWRlZFRhZ3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGV4Y2x1ZGVkQnlQYWdlSWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIHJlbWFpbmluZzogUGFnZUR0b1tdID0gW107XG4gICAgY29uc3RydWN0b3IocGFnZXM6IFBhZ2VEdG9bXSA9IFtdKSB7XG4gICAgICAgIHRoaXMucmVzZXRRdWUocGFnZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdpbGwgcmVzZXQgcXVlIHdpdGggdGhlIG5ldyBwYWdlcy5cbiAgICAgKiBAcGFyYW0gcGFnZXNcbiAgICAgKi9cbiAgICByZXNldFF1ZShwYWdlczogUGFnZUR0b1tdKSB7XG4gICAgICAgIHRoaXMuYWxsUGFnZXMgPSBbLi4ucGFnZXNdO1xuICAgICAgICB0aGlzLnJlbWFpbmluZyA9IFsuLi5wYWdlc107XG4gICAgICAgIHRoaXMuZXhjbHVkZWRUYWdzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMub3JpZ2luYWxPcmRlciA9IHRoaXMuYWxsUGFnZXMubWFwKChwKSA9PiBwLmlkKTtcbiAgICB9XG5cbiAgICBwb3AoKTogUGFnZUR0byB8IGZhbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMucmVtYWluaW5nLnNoaWZ0KCk7XG4gICAgICAgIC8vIFRPRE8gQ0xPTkU/P1xuICAgICAgICByZXR1cm4gbmV4dCA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBwZWVrKCk6IFBhZ2VEdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnJlbWFpbmluZ1swXTtcbiAgICAgICAgcmV0dXJuIG5leHQgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAganVtcFRvUGFnZUJ5SWQocGFnZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlbWFpbmluZy5maW5kSW5kZXgoKHApID0+IHAuaWQgPT09IHBhZ2VJZCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMucmVtYWluaW5nLnNsaWNlKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlUYWcodGFnOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWcpKSB7XG4gICAgICAgICAgICB0YWcuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlZFRhZ3MuYWRkKHRhZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRUYWdzLmFkZCh0YWcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyUmVtYWluaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2lsbCBub3QgYmUgaW5jbHVkZWRcbiAgICAgKiBAcGFyYW0gcGFnZXNcbiAgICAgKi9cbiAgICBpbnNlcnRBc05leHRCeUZvcmNlKHBhZ2VzOiBQYWdlRHRvW10pIHtcbiAgICAgICAgdGhpcy5yZW1haW5pbmcudW5zaGlmdCguLi5wYWdlcyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlQYWdlSWQocGFnZUlkOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYWdlSWQpKSB7XG4gICAgICAgICAgICBwYWdlSWQuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQuYWRkKGlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmFkZChwYWdlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyUmVtYWluaW5nKCk7XG4gICAgICAgIC8vIHRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5hZGQocGFnZUlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlclJlbWFpbmluZygpIHtcbiAgICAgICAgdGhpcy5yZW1haW5pbmcgPSB0aGlzLnJlbWFpbmluZy5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBwLnRhZ3MgPz8gW107XG4gICAgICAgICAgICBjb25zdCBpc0luY2x1ZWRlZEJ5VGFnID0gIXRhZ3Muc29tZSgodGFnKSA9PiB0aGlzLmV4Y2x1ZGVkVGFncy5oYXModGFnKSk7XG4gICAgICAgICAgICBjb25zdCBpc0luY2x1ZGVkQnlQYWdlSWQgPSAhdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmhhcyhwLmlkKTtcbiAgICAgICAgICAgIHJldHVybiBpc0luY2x1ZGVkQnlQYWdlSWQgJiYgaXNJbmNsdWVkZWRCeVRhZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcubGVuZ3RoO1xuICAgIH1cbiAgICBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsT3JkZXIubGVuZ3RoO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBbnN3ZXJlZFF1ZXN0aW9uLCBIaXN0b3J5UXVlLCBQYWdlSGlzdG9yeSB9IGZyb20gXCIuL2hpc3RvcnktcXVlXCI7XG5pbXBvcnQgeyBSdWxlRW5naW5lIH0gZnJvbSBcIi4uL3J1bGVzL3J1bGUtZW5naW5lXCI7XG5pbXBvcnQgeyBOZXh0UXVlIH0gZnJvbSBcIi4vbmV4dC1xdWVcIjtcbmltcG9ydCB7IFBhZ2VEdG8sIFNjaGVtYUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uQ29tbWFuZCwgUGFnZVF1ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmV4cG9ydCB0eXBlIERQbGF5ZXJEYXRhID0gUGljazxTY2hlbWFEdG8sIFwicGFnZXNcIiB8IFwicGFnZVNlcXVlbmNlc1wiIHwgXCJydWxlc1wiPjtcbmV4cG9ydCBjbGFzcyBEUGxheWVyIHtcbiAgcHJpdmF0ZSBoaXN0b3J5ID0gbmV3IEhpc3RvcnlRdWUoKTtcbiAgcHJpdmF0ZSBydWxlRW5naW5lID0gbmV3IFJ1bGVFbmdpbmU8UGFnZVF1ZUNvbW1hbmQsIFBhZ2VRdWVDb21tYW5kPigpO1xuICBwcml2YXRlIG5leHRRdWUgPSBuZXcgTmV4dFF1ZSgpO1xuICBwcml2YXRlIGRhdGE6IERQbGF5ZXJEYXRhO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IERQbGF5ZXJEYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLm5leHRRdWUucmVzZXRRdWUoZGF0YS5wYWdlcyk7XG4gIH1cblxuICBzYXZlSGlzdG9yeShwYWdlSGlzdG9yeTogUGFnZUhpc3RvcnkpIHtcbiAgICBjb25zb2xlLmxvZyhcIlNBVkUgSElTVE9SWVwiLCBwYWdlSGlzdG9yeSk7XG4gICAgdGhpcy5oaXN0b3J5LmFkZFRvSGlzdG9yeShwYWdlSGlzdG9yeSk7XG4gICAgY29uc3QgZmFjdHMgPSB0aGlzLmhpc3RvcnkuZ2V0RmFjdHMoKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJ1bGVFbmdpbmUuc29sdmVBbGwodGhpcy5kYXRhLnJ1bGVzLCBmYWN0cyk7XG4gICAgY29uc3QgbWF0Y2hpbmdSdWxlcyA9IHJlc3VsdC5tYXRjaGluZztcbiAgICBjb25zdCBhY3Rpb25zID0gbWF0Y2hpbmdSdWxlcy5tYXAoKHIpID0+IHIuYWN0aW9uTGlzdCkuZmxhdCgxKTtcbiAgICBhY3Rpb25zLmZvckVhY2goKGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGEucGF5bG9hZCk7XG4gICAgICBzd2l0Y2ggKGEua2luZCkge1xuICAgICAgICBjYXNlIFwiUEFHRV9RVUVfSlVNUF9UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAgICAgICB0aGlzLm5leHRRdWUuanVtcFRvUGFnZUJ5SWQoYS5wYXlsb2FkLnBhZ2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1BBR0VfSURfQ09NTUFORFwiOlxuICAgICAgICAgIHRoaXMubmV4dFF1ZS5yZW1vdmVCeVBhZ2VJZChhLnBheWxvYWQucGFnZUlkcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1RBR19DT01NQU5EXCI6XG4gICAgICAgICAgdGhpcy5uZXh0UXVlLnJlbW92ZUJ5VGFnKGEucGF5bG9hZC50YWdJZHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiVU5LTk9XTiBBQ1RJT05cIiwgYSk7XG4gICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gYTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhhY3Rpb25zKTtcbiAgfVxuXG4gIGdldFJlc3VsdHMoKTogQW5zd2VyZWRRdWVzdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5oaXN0b3J5LmdldEFuc3dlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ29Ub1BhZ2VCeUlkKHBhZ2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5uZXh0UXVlLmp1bXBUb1BhZ2VCeUlkKHBhZ2VJZCk7XG4gIH1cblxuICBoYW5kbGVOYXZpZ2F0aW9uQ29tbWFuZChjb21tYW5kOiBOYXZpZ2F0aW9uQ29tbWFuZCkge1xuICAgIHN3aXRjaCAoY29tbWFuZC5raW5kKSB7XG4gICAgICBjYXNlIFwiUEFHRV9RVUVfTkVYVF9QQUdFX0NPTU1BTkRcIjpcbiAgICAgICAgLy8gTk8gTkVFRCBUTyBETyBBTllUSElOR1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAgICAgdGhpcy5nb1RvUGFnZUJ5SWQoY29tbWFuZC5wYXlsb2FkLnBhZ2VJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlBBR0VfUVVFX0dPX1RPX1NFUVVFTkNFX0NPTU1BTkRcIjpcbiAgICAgICAgdGhpcy5pbnNlcnRTZXF1ZW5jZUJ5SWQoY29tbWFuZC5wYXlsb2FkLnNlcXVlbmNlSWQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgRFV0aWwubmV2ZXJDaGVjayhjb21tYW5kKTtcbiAgICB9XG4gIH1cblxuICBnZXROZXh0UGFnZSgpOiBQYWdlRHRvIHwgZmFsc2Uge1xuICAgIC8vIFRPRE8gSEFORExFIFJVTEVTISFcbiAgICByZXR1cm4gdGhpcy5uZXh0UXVlLnBvcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRTZXF1ZW5jZUJ5SWQoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlcSA9IHRoaXMuZGF0YS5wYWdlU2VxdWVuY2VzPy5maW5kKChzKSA9PiBzLmlkID09PSBpZCk7XG4gICAgaWYgKHNlcSkge1xuICAgICAgdGhpcy5uZXh0UXVlLmluc2VydEFzTmV4dEJ5Rm9yY2UoWy4uLnNlcS5wYWdlc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIT1cgVE8gSEFORExFIElOVkFMSUQgSURfUkVGUz8/IExPR0dFUj8/XG4gICAgICAvLyBMT0cgSU5WQUxJRCBDT01NQU5ELlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgcGFnZXMuXG4gICAqL1xuICBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubmV4dFF1ZS5wYWdlQ291bnQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBEQ29tbWFuZCwgRWxlbWVudENvbW1hbmQsIFN0YXRlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgREV2ZW50IH0gZnJvbSBcIi4uL2V2ZW50cy9ERXZlbnRzXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgREV2ZW50SGFuZGxlcjxFIGV4dGVuZHMgREV2ZW50ID0gREV2ZW50PiB7XG4gICAgcmVhZG9ubHkgb25FdmVudDogRVtcImtpbmRcIl07XG4gICAgcmVhZG9ubHkgd2hlbj86IHsgcHJvZHVjZXJJZD86IHN0cmluZzsgY29uZGl0aW9uPzogQ29uZGl0aW9uIH07XG4gICAgcmVhZG9ubHkgdGhlbkV4ZWN1dGU6IFJlYWRvbmx5QXJyYXk8RENvbW1hbmQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2hhbmdlZEhhbmRsZXIge1xuICAgIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHdoZW5UcnVlOiBSZWFkb25seUFycmF5PEVsZW1lbnRDb21tYW5kPjtcbiAgICByZWFkb25seSB3aGVuRmFsc2U6IFJlYWRvbmx5QXJyYXk8RWxlbWVudENvbW1hbmQ+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIERFdmVudEhhbmRsZXIge1xuICAgIGV4cG9ydCB0eXBlIExvb2tVcCA9IE1hcDxERXZlbnRIYW5kbGVyW1wib25FdmVudFwiXSwgQXJyYXk8REV2ZW50SGFuZGxlcj4+O1xuICAgIGV4cG9ydCBjb25zdCBjcmVhdGVMb29rVXAgPSAoaGFuZGxlcnM/OiBSZWFkb25seUFycmF5PERFdmVudEhhbmRsZXI+KTogTG9va1VwID0+IHtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxERXZlbnRIYW5kbGVyW1wib25FdmVudFwiXSwgQXJyYXk8REV2ZW50SGFuZGxlcj4+KCk7XG4gICAgICAgIGhhbmRsZXJzPy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBraW5kID0gaC5vbkV2ZW50O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IG1hcC5nZXQoa2luZCk7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gY3VycmVudCA/IFsuLi5jdXJyZW50LCBoXSA6IFtoXTtcbiAgICAgICAgICAgIG1hcC5zZXQoa2luZCwgYWN0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH07XG59XG4iLCAiaW1wb3J0IHsgRFN0eWxlIH0gZnJvbSBcIi4vRFN0eWxlXCI7XG5pbXBvcnQgeyBERWxlbWVudEJhc2VEdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmQsIEVsZW1lbnRDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgREV2ZW50SGFuZGxlciB9IGZyb20gXCIuLi9ldmVudC1oYW5kbGVycy9ERXZlbnRIYW5kbGVyXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgQW5pbWF0aW9uRHRvIH0gZnJvbSBcIi4uL2R0by9BbmltYXRpb25EdG9cIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcbmltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuLi9zdGF0ZS9Ec3RhdGVcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERFbGVtZW50PFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBlbDogVDtcbiAgICBwcml2YXRlIGNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IHRydWU7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICBwcml2YXRlIGlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBjdXJyU3R5bGU6IFBhcnRpYWw8RFN0eWxlPiA9IHtcbiAgICAgICAgZm9udFNpemU6IHsgX3VuaXQ6IFwicHhcIiwgdmFsdWU6IDEwMCB9LFxuICAgICAgICBmb250V2VpZ2h0OiA1MDAsXG4gICAgICAgIHRleHRDb2xvcjogXCJibGFja1wiLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgIH07XG5cbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IG9uUXVlcnlDaGFuZ2VkSGFuZGxlcnMgPVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyczogREV2ZW50SGFuZGxlci5Mb29rVXA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbW1hbmRCdXM6IERDb21tYW5kQnVzO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudEJ1czogRXZlbnRCdXM7XG4gICAgcHJvdGVjdGVkIHNjYWxlOiBTY2FsZVNlcnZpY2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBiYXNlRHRvOiBERWxlbWVudEJhc2VEdG87XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU2V0PCgpID0+IHZvaWQ+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIGVsOiBULFxuICAgICAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgICAgIGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgICAgICBkdG86IERFbGVtZW50QmFzZUR0byxcbiAgICAgICAgc2NhbGU6IFNjYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIHRoaXMuaWQgPSBkdG8uaWQ7XG4gICAgICAgIHRoaXMuYmFzZUR0byA9IGR0bztcbiAgICAgICAgLy8gdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5jb21tYW5kQnVzID0gY29tbWFuZEJ1cztcbiAgICAgICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlcnMgPSBERXZlbnRIYW5kbGVyLmNyZWF0ZUxvb2tVcChkdG8uZXZlbnRIYW5kbGVycyk7XG4gICAgICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgLy8gQ0xJQ0tcbiAgICAgICAgdGhpcy5vbkNsaWNrSGFuZGxlciA9IHRoaXMub25DbGlja0hhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmNsaWNrID0gdGhpcy5vbkNsaWNrSGFuZGxlcjtcblxuICAgICAgICAvLyBIT1ZFUlxuICAgICAgICB0aGlzLm9uTW91c2VPdmVyID0gdGhpcy5vbk1vdXNlT3Zlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubW91c2VvdmVyID0gdGhpcy5vbk1vdXNlT3ZlcjtcblxuICAgICAgICBpZiAoZHRvKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhkdG8/LnN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21tYW5kU3Vic2NyaXB0aW9uID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX1NUWUxFX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdHlsZShjLnBheWxvYWQuY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5raW5kID09PSBcIkVMRU1FTlRfRElTQUJMRV9DTElDS19DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5raW5kID09PSBcIkVMRU1FTlRfRU5BQkxFX0NMSUNLX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja0hhbmRsZXJJc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX0FOSU1BVEVfQ09NTUFORFwiICYmIGMudGFyZ2V0SWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRPRE8gSU1QTEVNRU5UIEFOSU1BVElPTl9IQU5ETEVSIElOIERFbGVtZW50LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5pZCk7XG4gICAgICAgIC8vIFRPRE8gTUVNT1JZIExFQUtcbiAgICAgICAgY29uc3QgZXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50QnVzLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5ldmVudEhhbmRsZXJzLmdldChldmVudC5raW5kKSA/PyBbXTtcbiAgICAgICAgICAgIC8vIFRPRE8gQXBwbHkgQ29uZGl0aW9ucyBpbiBXSEVOLlxuICAgICAgICAgICAgY29uc3QgY29tbWFuZHMgPSBoYW5kbGVycy5tYXAoKGgpID0+IGgudGhlbkV4ZWN1dGUpLmZsYXQoMSk7XG4gICAgICAgICAgICBjb21tYW5kcy5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5kb0FjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gXCJIT1NUX1NDQUxFX0NIQU5HRURfRVZFTlRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSEFORExFIFRISVMgU0NBTEUgQ0hBTkdFISFcIik7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoe30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXZlbnQua2luZCA9PT0gXCJTVEFURV9RVUVSWV9SRVNVTFRfQ0hBTkdFRF9FVkVOVFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeUNoYW5nZWRIYW5kbGVyKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBcIkVMRU1FTlQ6IFwiKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemUoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChjb21tYW5kU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChldmVudFN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZGVzdHJveSgpOiB2b2lkO1xuXG4gICAgLy8gYWJzdHJhY3Qgc2V0U2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQ7XG5cbiAgICAvLyAvKipcbiAgICAvLyAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHJlLWVtaXQgY29tbWFuZHMgZnJvbSBldmVudC1oYW5kbGVycz9cbiAgICAvLyAgKiBAcGFyYW0gY29tbWFuZFxuICAgIC8vICAqIEBwcml2YXRlXG4gICAgLy8gICovXG4gICAgLy8gcHJpdmF0ZSBoYW5kbGVDb21tYW5kc0VtaXR0ZWRCeVByaXZhdGVFdmVudEhhbmRsZXJzKGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKGNvbW1hbmQpO1xuICAgIC8vICAgICBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfU1RZTEVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIGlmIChjb21tYW5kLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKGNvbW1hbmQucGF5bG9hZC5jaGFuZ2VzKTtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9BTklNQVRFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICAvLyBUT0RPIENIRUNLIEZPUiBUQVJHRVQgSURcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmhhbmRsZUFuaW1hdGVTZWxmQWN0aW9uKGNvbW1hbmQucGF5bG9hZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9FTkFCTEVfQ0xJQ0tfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gdHJ1ZTtcbiAgICAvLyAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZVN0eWxlcyhjb21tYW5kLnBheWxvYWQuY2hhbmdlcyk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRUxFTUVOVF9ESVNBQkxFX0NMSUNLX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IGZhbHNlO1xuICAgIC8vICAgICAgICAgICAgIC8vIHRoaXMuaGFuZGxlQW5pbWF0ZVNlbGZBY3Rpb24oY29tbWFuZC5wYXlsb2FkKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19QTEFZX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19QQVVTRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiRU5HSU5FX0xFQVZFX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlZJREVPX0pVTVBfVE9fQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlZJREVPX1NFVF9WT0xVTUVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkFVRElPX1BMQVlfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkFVRElPX1BBVVNFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJBVURJT19TRVRfVk9MVU1FX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9ORVhUX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0dPX1RPX1NFUVVFTkNFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9FWENMVURFX0JZX1BBR0VfSURfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0pVTVBfVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9UQUdfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlNUQVRFX01VVEFURV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBkZWZhdWx0OlxuICAgIC8vICAgICAgICAgICAgIERVdGlsLm5ldmVyQ2hlY2soY29tbWFuZCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIHF1ZXJ5Q2hhbmdlZEhhbmRsZXIocmVzdWx0OiBEU3RhdGUuU3RhdGVRdWVyeVJlc3VsdCkge1xuICAgICAgICBjb25zdCBtYXliZUhhbmRsZXJzID0gdGhpcy5iYXNlRHRvLm9uU3RhdGVDaGFuZ2U7XG4gICAgICAgIGlmICghbWF5YmVIYW5kbGVycykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHF1ZXJ5SGFuZGxlcnMgPSBtYXliZUhhbmRsZXJzLmZpbHRlcigoaCkgPT4gaC5xdWVyeU5hbWUgPT09IHJlc3VsdC5xdWVyeU5hbWUpO1xuICAgICAgICBxdWVyeUhhbmRsZXJzLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY3Vycikge1xuICAgICAgICAgICAgICAgIGgud2hlblRydWUuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRvQWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaC53aGVuRmFsc2UuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRvQWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGZpbmRCeVF1ZXJ5LCB2YWx1ZSk7XG4gICAgICAgIC8vIGNvbnN0IGFsbCA9IHRoaXMuYmFzZUR0by5zdGF0ZVF1ZXJ5Q2hhbmdlID8/IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DbGlja0hhbmRsZXIoXzogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygpO1xuICAgICAgICBpZiAoIXRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmlkICsgXCJDbGljayBkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGlja0FjdGlvbiA9IHRoaXMuYmFzZUR0by5vbkNsaWNrO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5BVElWRSBDTElDSyBFTEVNRU5UOiBIYW5kbGVycyBcIiArIGNsaWNrQWN0aW9uPy5sZW5ndGgpO1xuICAgICAgICBpZiAoY2xpY2tBY3Rpb24gJiYgY2xpY2tBY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUQVJHRVRJRDogXCIgKyBjbGlja0FjdGlvblswXS50YXJnZXRJZCArIFwiIFwiICsgdGhpcy5pZCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiVVNFUl9DTElDS0VEX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IFwiRFVzZXJcIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZWxlbWVudElkOiB0aGlzLmlkIH0sXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjbGlja0FjdGlvbi5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Nb3VzZU92ZXIoXzogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhldik7XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGU6IFBhcnRpYWw8RFN0eWxlPikge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhzdHlsZSk7XG4gICAgfVxuXG4gICAgYXBwZW5kWW91cnNlbGYocGFyZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBwYXJlbnQuYXBwZW5kKHRoaXMuZWwpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhwYXJlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQW5pbWF0ZVNlbGZBY3Rpb24oZHRvOiBBbmltYXRpb25EdG8pIHtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZ1NlbGYgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IGtleWZyYW1lcywgb3B0aW9ucyB9ID0gZHRvO1xuXG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuZWwuYW5pbWF0ZShrZXlmcmFtZXMsIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgICBhbmltYXRpb24ub25maW5pc2ggPSAoZTogQW5pbWF0aW9uUGxheWJhY2tFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZS50eXBlKTtcbiAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGFuaW1hdGlvbi5vbnJlbW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkFOSU1BVElPTiBSRU1PVkVEOiBcIiArIGFuaW1hdGlvbi5pZCk7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBhbmltYXRpb24ub25jYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJBTklNQVRJT04gQ0FOQ0VMRUQ6IFwiICsgYW5pbWF0aW9uLmlkKTtcbiAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemUoKSB7XG4gICAgICAgIERTdHlsZS5ub3JtYWxpemUodGhpcy5lbCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVN0eWxlcyhzdHlsZTogUGFydGlhbDxEU3R5bGU+KSB7XG4gICAgICAgIHRoaXMuY3VyclN0eWxlID0gT2JqZWN0LmFzc2lnbih0aGlzLmN1cnJTdHlsZSwgc3R5bGUpO1xuICAgICAgICBEU3R5bGUuYXBwbHlTdHlsZXModGhpcy5lbCwgdGhpcy5jdXJyU3R5bGUsIHRoaXMuc2NhbGUuc2NhbGUpO1xuICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi9ERWxlbWVudFwiO1xuaW1wb3J0IHsgRERpdkR0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEVGV4dCB9IGZyb20gXCIuL0RUZXh0XCI7XG5pbXBvcnQgeyBESW1nIH0gZnJvbSBcIi4vREltZ1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcblxuZXhwb3J0IGNsYXNzIEREaXYgZXh0ZW5kcyBERWxlbWVudDxIVE1MRGl2RWxlbWVudD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIEREaXYgXTogXCI7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRTdHlsZSA9IHsgeDogMjIsIHk6IDQgfTtcbiAgICBwcml2YXRlIGNoaWxkcmVuOiBBcnJheTxEVGV4dCB8IERJbWc+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZHRvOiBERGl2RHRvLFxuICAgICAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgICAgIGFjdGlvblNlcnZpY2U6IERDb21tYW5kQnVzLFxuICAgICAgICBzY2FsZTogU2NhbGVTZXJ2aWNlLFxuICAgICAgICBjaGlsZHJlbjogQXJyYXk8RFRleHQgfCBESW1nPlxuICAgICkge1xuICAgICAgICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgc3VwZXIoZCwgZXZlbnRCdXMsIGFjdGlvblNlcnZpY2UsIGR0bywgc2NhbGUpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgY2hpbGQuYXBwZW5kWW91cnNlbGYodGhpcy5lbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4vREVsZW1lbnRcIjtcbmltcG9ydCB7IERJbWdEdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcblxuZXhwb3J0IGNsYXNzIERJbWcgZXh0ZW5kcyBERWxlbWVudDxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgSU1BR0VfQ09VTlQgPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW1hZ2VDb3VudDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IFRBRzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IFRJTUlOR19UQUc6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvYWRTdGFydDogRFRpbWVzdGFtcDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGR0bzogREltZ0R0byxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25TdWJqZWN0OiBEQ29tbWFuZEJ1cyxcbiAgICAgICAgcmVhZG9ubHkgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgICAgICByZWFkb25seSBzY2FsZVNlcnZpY2U6IFNjYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLCBldmVudEJ1cywgYWN0aW9uU3ViamVjdCwgZHRvLCBzY2FsZVNlcnZpY2UpO1xuICAgICAgICBESW1nLklNQUdFX0NPVU5UICs9IDE7XG4gICAgICAgIHRoaXMuaW1hZ2VDb3VudCA9IERJbWcuSU1BR0VfQ09VTlQ7XG4gICAgICAgIHRoaXMuVEFHID0gXCJbRF9JTUcgXCIgKyBESW1nLklNQUdFX0NPVU5UICsgXCIgXTogXCI7XG4gICAgICAgIHRoaXMuVElNSU5HX1RBRyA9IFwibG9hZC10aW1lIChcIiArIERJbWcuSU1BR0VfQ09VTlQgKyBcIikgXCI7XG4gICAgICAgIHRoaXMuZWwubG9hZGluZyA9IFwiZWFnZXJcIjtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShkdG8uc3R5bGUpO1xuICAgICAgICB0aGlzLmxvYWRTdGFydCA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgICAgIC8vIEJpbmQgSGFuZGxlcnNcbiAgICAgICAgdGhpcy5vbkVycm9yID0gdGhpcy5vbkVycm9yLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Mb2FkID0gdGhpcy5vbkxvYWQuYmluZCh0aGlzKTtcbiAgICAgICAgLy8gdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25sb2FkID0gdGhpcy5vbkxvYWQ7XG4gICAgICAgIHRoaXMuZWwub25lcnJvciA9IHRoaXMub25FcnJvcjtcbiAgICAgICAgLy8gdGhpcy5lbC5vbmNsaWNrID0gdGhpcy5vbkNsaWNrO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IGR0by51cmw7XG4gICAgICAgIGNvbnNvbGUudGltZSh0aGlzLlRJTUlOR19UQUcpO1xuICAgIH1cblxuICAgIGxvZygpOiB2b2lkIHt9XG5cbiAgICBzZXRTY2FsZShzY2FsZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHNjYWxlKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLmN1cnJTdHlsZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkVycm9yKGV2OiBFdmVudCB8IHN0cmluZykge1xuICAgICAgICBpZiAoZXYgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBcIiArIGV2LnR5cGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBldik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTG9hZChfOiBFdmVudCkge1xuICAgICAgICBjb25zdCBsb2FkVGltZSA9IERUaW1lc3RhbXAuZGlmZk5vdyh0aGlzLmxvYWRTdGFydCk7XG5cbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiSU1BR0VfTE9BREVEX0VWRU5UXCIsXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJESW1hZ2VcIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgbG9hZFRpbWUsXG4gICAgICAgICAgICAgICAgbmF0dXJhbEhlaWdodDogdGhpcy5lbC5uYXR1cmFsSGVpZ2h0LFxuICAgICAgICAgICAgICAgIG5hdHVyYWxXaWR0aDogdGhpcy5lbC5uYXR1cmFsV2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmVsLmhlaWdodCxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5lbC53aWR0aCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuL0RFbGVtZW50XCI7XG5pbXBvcnQgeyBEVGV4dER0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuXG5leHBvcnQgY2xhc3MgRFRleHQgZXh0ZW5kcyBERWxlbWVudDxIVE1MUGFyYWdyYXBoRWxlbWVudD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIERQYXJhZ3JhcGggXTogXCI7XG4gICAgcHJvdGVjdGVkIGRlZmF1bHRTdHlsZSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoZHRvOiBEVGV4dER0bywgZXZlbnRCdXM6IEV2ZW50QnVzLCBhY3Rpb25TZXJ2aWNlOiBEQ29tbWFuZEJ1cywgc2NhbGU6IFNjYWxlU2VydmljZSkge1xuICAgICAgICBzdXBlcihkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSwgZXZlbnRCdXMsIGFjdGlvblNlcnZpY2UsIGR0bywgc2NhbGUpO1xuICAgICAgICB0aGlzLmVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB0aGlzLmVsLmlubmVyVGV4dCA9IFwiXCIgKyBkdG8udGV4dDtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShkdG8uc3R5bGUpO1xuICAgIH1cblxuICAgIHNldFNjYWxlKHNjYWxlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRTdHlsZSh0aGlzLmN1cnJTdHlsZSk7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5lbC5zdHlsZS5mb250U2l6ZTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcInNjYWxlOiBcIiArIHNjYWxlICsgXCIgRm9udHNpemU6IFwiICsgZm9udFNpemUpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RFbGVtZW50XCI7XG5pbXBvcnQgeyBERGl2IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RkaXZcIjtcbmltcG9ydCB7IERJbWcgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREltZ1wiO1xuaW1wb3J0IHsgRFRleHQgfSBmcm9tIFwiLi4vRGVsZW1lbnQvRFRleHRcIjtcbmltcG9ydCB7IEREaXZEdG8sIERFbGVtZW50RHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi9zY2FsZVwiO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlREVsZW1lbnQgPSAoXG4gICAgZHRvOiBERWxlbWVudER0byxcbiAgICBhY3Rpb25CdXM6IERDb21tYW5kQnVzLFxuICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBzY2FsZTogU2NhbGVTZXJ2aWNlXG4pOiBERWxlbWVudDxhbnk+ID0+IHtcbiAgICBzd2l0Y2ggKGR0by5fdGFnKSB7XG4gICAgICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkRWxzID0gY3JlYXRlQ2hpbGRyZW5Gb3JEaXYoZHRvLCBhY3Rpb25CdXMsIGV2ZW50QnVzLCBzY2FsZSk7XG4gICAgICAgICAgICBjb25zdCBuZXdEaXYgPSBuZXcgRERpdihkdG8sIGV2ZW50QnVzLCBhY3Rpb25CdXMsIHNjYWxlLCBjaGlsZEVscyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3RGl2O1xuICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IERJbWcoZHRvLCBhY3Rpb25CdXMsIGV2ZW50QnVzLCBzY2FsZSk7XG4gICAgICAgIGNhc2UgXCJwXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IERUZXh0KGR0bywgZXZlbnRCdXMsIGFjdGlvbkJ1cywgc2NhbGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gZHRvO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBkdG8gZ2l2ZW4gdG8gdGhlIGNyZWF0ZURFbGVtZW50IGZ1bmN0aW9uLlwiKTtcbiAgICAgICAgLy8gVE9ETyBMT0dHSU5HIG9yIGNyZWF0ZSBhbnkgSFRNTC1FTEVNRU5UPz9cbiAgICB9XG59O1xuXG5jb25zdCBjcmVhdGVDaGlsZHJlbkZvckRpdiA9IChcbiAgICBkdG86IEREaXZEdG8sXG4gICAgYWN0aW9uU3ViamVjdDogRENvbW1hbmRCdXMsXG4gICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgIHNjYWxlOiBTY2FsZVNlcnZpY2Vcbik6IEREaXZbXCJjaGlsZHJlblwiXSA9PiB7XG4gICAgY29uc3QgY2hpbGREdG8gPSBkdG8uY2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGRFbHM6IEFycmF5PERJbWcgfCBEVGV4dD4gPSBbXTtcbiAgICAvLyBjb25zb2xlLmxvZyhjaGlsZEVsZW1lbnRzKTtcbiAgICBjaGlsZER0by5mb3JFYWNoKChkdG8pID0+IHtcbiAgICAgICAgaWYgKGR0by5fdGFnID09PSBcInBcIikge1xuICAgICAgICAgICAgY29uc3QgbmV3VGV4dCA9IG5ldyBEVGV4dChkdG8sIGV2ZW50QnVzLCBhY3Rpb25TdWJqZWN0LCBzY2FsZSk7XG4gICAgICAgICAgICBjaGlsZEVscy5wdXNoKG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdG8uX3RhZyA9PT0gXCJpbWdcIikge1xuICAgICAgICAgICAgY29uc3QgbmV3SW1hZ2UgPSBuZXcgREltZyhkdG8sIGFjdGlvblN1YmplY3QsIGV2ZW50QnVzLCBzY2FsZSk7XG4gICAgICAgICAgICBjaGlsZEVscy5wdXNoKG5ld0ltYWdlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjaGlsZEVscztcbn07XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREVsZW1lbnRcIjtcbmltcG9ydCB7IFBhZ2VEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgY3JlYXRlREVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50LWZhY3RvcnlcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi9zY2FsZVwiO1xuXG5leHBvcnQgY2xhc3MgRFBhZ2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBEUGFnZSBdOiBcIjtcbiAgcHJpdmF0ZSBlbGVtZW50czogREVsZW1lbnQ8SFRNTEVsZW1lbnQ+W10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1cztcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2U7XG4gIC8vIFRvZG8gR0xPQkFMIEVWRU5UX0JVU1MgQU5EIFBBR0UgRVZFTlRTOlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZHRvOiBQYWdlRHRvLFxuICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBzY2FsZTogU2NhbGVTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7XG4gICAgdGhpcy5jb21tYW5kQnVzID0gY29tbWFuZEJ1cztcbiAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5lbGVtZW50cyA9IGR0by5lbGVtZW50cy5tYXAoKGR0bykgPT4gY3JlYXRlREVsZW1lbnQoZHRvLCB0aGlzLmNvbW1hbmRCdXMsIHRoaXMuZXZlbnRCdXMsIHRoaXMuc2NhbGUpKTtcbiAgfVxuXG4gIGFwcGVuZFlvdXJzZWxmKHBhcmVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIEFQUEVORElORyBUTyBQQVJFTlRcIik7XG4gICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuYXBwZW5kWW91cnNlbGYocGFyZW50KTtcbiAgICAgIC8vIHBhcmVudC5hcHBlbmRDaGlsZChlbC5lbCk7XG4gICAgfSk7XG5cbiAgICAvLyBpZiAoIXByZWxvYWRNb2RlKSB7XG4gICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgIGtpbmQ6IFwiUEFHRV9FTlRFUl9FVkVOVFwiLFxuICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgcHJvZHVjZXI6IFwiRFBhZ2VcIixcbiAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICBkYXRhOiB7IHBhZ2VJZDogdGhpcy5pZCB9LFxuICAgIH0pO1xuICAgIC8vIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9nKCk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgJ3NjYWxlIC0gJyArIHRoaXMuc2NhbGUpO1xuICB9XG5cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmR0by5pZDtcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBTY2FsZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VIZWlnaHQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVdpZHRoO1xuICBwcml2YXRlIGNvbnRhaW5lckhlaWdodCA9IDEzMDA7XG4gIHByaXZhdGUgY29udGFpbmVyV2lkdGggPSAxMzAwO1xuXG4gIGdldCBzY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NhbGU7XG4gIH1cblxuICBnZXQgcGFnZUhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlSGVpZ2h0ICogdGhpcy5zY2FsZTtcbiAgfVxuICBnZXQgcGFnZVdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLmJhc2VXaWR0aCAqIHRoaXMuX3NjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2NhbGUgPSAxO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PChzY2FsZTogbnVtYmVyKSA9PiB2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogeyBiYXNlSGVpZ2h0OiBudW1iZXI7IGJhc2VXaWR0aDogbnVtYmVyOyBjb250YWluZXJIZWlnaHQ6IG51bWJlcjsgY29udGFpbmVyV2lkdGg6IG51bWJlciB9KSB7XG4gICAgdGhpcy5iYXNlSGVpZ2h0ID0gY29uZmlnLmJhc2VIZWlnaHQ7XG4gICAgdGhpcy5iYXNlV2lkdGggPSBjb25maWcuYmFzZVdpZHRoO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gY29uZmlnLmNvbnRhaW5lckhlaWdodDtcbiAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gY29uZmlnLmNvbnRhaW5lcldpZHRoO1xuICAgIHRoaXMudXBkYXRlU2NhbGUoKTtcbiAgfVxuXG4gIHNldENvbnRhaW5lckJvdW5kcyhib3VuZHM6IHsgaGVpZ2h0OiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfSkge1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBib3VuZHMud2lkdGg7XG4gICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0O1xuICAgIHRoaXMudXBkYXRlU2NhbGUoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVNjYWxlKCkge1xuICAgIGNvbnN0IHNjYWxlRm4gPSBTY2FsZS5jYWxjKHRoaXMuYmFzZUhlaWdodCwgdGhpcy5iYXNlV2lkdGgpO1xuICAgIGNvbnN0IHNjYWxlID0gc2NhbGVGbih7IGhlaWdodDogdGhpcy5jb250YWluZXJIZWlnaHQsIHdpZHRoOiB0aGlzLmNvbnRhaW5lcldpZHRoIH0pO1xuICAgIGNvbnN0IGhhc0NoYW5nZWQgPSB0aGlzLnNjYWxlICE9PSBzY2FsZTtcbiAgICB0aGlzLl9zY2FsZSA9IHNjYWxlO1xuICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKGZuKSA9PiB7XG4gICAgICAgIGZuKHRoaXMuX3NjYWxlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlKHNjYWxlQ2hhbmdlSGFuZGxlcjogKHNjYWxlOiBudW1iZXIpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKSB7XG4gICAgLy8gY29uc29sZS5sb2coc3Vic2NyaWJlcklkKTtcbiAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChzY2FsZUNoYW5nZUhhbmRsZXIpO1xuICAgIHNjYWxlQ2hhbmdlSGFuZGxlcih0aGlzLl9zY2FsZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZGVsZXRlKHNjYWxlQ2hhbmdlSGFuZGxlcik7XG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG5hbWVzcGFjZSBTY2FsZSB7XG4gIGV4cG9ydCBjb25zdCBjYWxjID0gKGJhc2VIZWlnaHQ6IG51bWJlciwgYmFzZVdpZHRoOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gKGNvbnRhaW5lcjogeyBoZWlnaHQ6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9KSA9PiB7XG4gICAgICBjb25zdCBoZWlnaHRSYXRpbyA9IGNvbnRhaW5lci5oZWlnaHQgLyBiYXNlSGVpZ2h0O1xuICAgICAgY29uc3Qgd2lkdGhSYXRpbyA9IGNvbnRhaW5lci53aWR0aCAvIGJhc2VXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLm1pbihoZWlnaHRSYXRpbywgd2lkdGhSYXRpbyk7XG4gICAgfTtcbiAgfTtcblxuICB0eXBlIFNjYWxlUG9zSW5wdXQgPSB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBoOiBudW1iZXI7IHc6IG51bWJlciB9O1xuXG4gIGV4cG9ydCBjb25zdCBzY2FsZUZ1bmN0aW9uQ3JlYXRvciA9IChzY2FsZTogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiB2YWx1ZSAqIHNjYWxlO1xuICB9O1xufVxuIiwgImltcG9ydCB7IERBdWRpb0R0bywgREltZ0R0bywgRFZpZGVvRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlUHJvdmlkZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbIFJFU09VUkNFX1BST1ZJREVSIF06IFwiO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlkZW9NYXAgPSBuZXcgTWFwPHN0cmluZywgRFZpZGVvRHRvPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXVkaW9NYXAgPSBuZXcgTWFwPHN0cmluZywgREF1ZGlvRHRvPigpO1xuICAgIGNvbnN0cnVjdG9yKGRhdGE6IHsgdmlkZW9zOiBSZWFkb25seUFycmF5PERWaWRlb0R0bz47IGF1ZGlvOiBSZWFkb25seUFycmF5PERBdWRpb0R0bz4gfSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiVklERU9fQ09VTlQgXCIgKyBkYXRhLnZpZGVvcy5sZW5ndGgpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiQVVESU9fQ09VTlQgXCIgKyBkYXRhLmF1ZGlvLmxlbmd0aCk7XG4gICAgICAgIGRhdGEudmlkZW9zLmZvckVhY2goKHZpZGVvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvTWFwLnNldCh2aWRlby5pZCwgdmlkZW8pO1xuICAgICAgICB9KTtcbiAgICAgICAgZGF0YS5hdWRpby5mb3JFYWNoKChhdWRpbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5hdWRpb01hcC5zZXQoYXVkaW8uaWQsIGF1ZGlvKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QXVkaW9CeUlkKGlkOiBzdHJpbmcpOiBEQXVkaW9EdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG1heWJlQXVkaW8gPSB0aGlzLmF1ZGlvTWFwLmdldChpZCk7XG4gICAgICAgIGlmICghbWF5YmVBdWRpbykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLlRBRyArIFwiQXVkaW8gYnkgaWQgXCIgKyBpZCArIFwiIGRvbnQgZXhpc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heWJlQXVkaW8gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0VmlkZW9CeUlkKGlkOiBzdHJpbmcpOiBEVmlkZW9EdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG1heWJlVmlkZW8gPSB0aGlzLnZpZGVvTWFwLmdldChpZCk7XG4gICAgICAgIGlmICghbWF5YmVWaWRlbykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLlRBRyArIFwiVmlkZW8gYnkgaWQgXCIgKyBpZCArIFwiIGRvbnQgZXhpc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heWJlVmlkZW8gPz8gZmFsc2U7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBPazxUPiBpbXBsZW1lbnRzIElSZXN1bHQ8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHZhbHVlOiBUKSB7fVxuICAgIGlzT2soKTogdGhpcyBpcyBPazxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG1hcDxBPihmOiAodDogVCkgPT4gQSk6IElSZXN1bHQ8QT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGYodGhpcy52YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgT2s8QT4odmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZhaWx1cmU8VD4gaW1wbGVtZW50cyBJUmVzdWx0PFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSBtZXNzYWdlOiBzdHJpbmcpIHt9XG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlzT2soKTogdGhpcyBpcyBPazxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXA8QT4oX2Y6ICh0OiBUKSA9PiBBKTogSVJlc3VsdDxBPiB7XG4gICAgICAgIHJldHVybiBuZXcgRmFpbHVyZTxBPih0aGlzLm1lc3NhZ2UpO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIElSZXN1bHQ8VD4ge1xuICAgIGlzT2soKTogdGhpcyBpcyBPazxUPjtcbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+O1xuICAgIG1hcDxBPihmOiAodDogVCkgPT4gQSk6IElSZXN1bHQ8QT47XG59XG5cbmV4cG9ydCB0eXBlIFJlc3VsdDxUPiA9IEZhaWx1cmU8VD4gfCBPazxUPjtcbmV4cG9ydCBuYW1lc3BhY2UgUmVzdWx0IHtcbiAgICBleHBvcnQgY29uc3Qgb2sgPSA8VD4odmFsdWU6IFQpID0+IG5ldyBPazxUPih2YWx1ZSk7XG4gICAgZXhwb3J0IGNvbnN0IGZhaWx1cmUgPSA8VD4obWVzc2FnZTogc3RyaW5nKSA9PiBuZXcgRmFpbHVyZTxUPihtZXNzYWdlKTtcbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4uL3J1bGVzL2ZhY3RcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9ydWxlcy9jb25kaXRpb25cIjtcbmltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuaW1wb3J0IHsgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgRFN0YXRlIHtcbiAgICBpbnRlcmZhY2UgUHJvcERlZmluaXRpb248VHlwZU5hbWUsIFR5cGUgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXI+IHtcbiAgICAgICAgcmVhZG9ubHkgX3R5cGU6IFR5cGVOYW1lO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBwcm9wRGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgaW5pdGlhbFZhbHVlPzogVHlwZTtcbiAgICAgICAgcmVhZG9ubHkgb3B0aW9ucz86IFJlYWRvbmx5QXJyYXk8UHJvcFZhbHVlPFR5cGU+PjtcbiAgICB9XG5cbiAgICBleHBvcnQgdHlwZSBOdW1lcmljUHJvcCA9IFByb3BEZWZpbml0aW9uPFwibnVtYmVyXCIsIG51bWJlcj47XG4gICAgZXhwb3J0IHR5cGUgU3RyaW5nUHJvcCA9IFByb3BEZWZpbml0aW9uPFwic3RyaW5nXCIsIHN0cmluZz47XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIGZyb21FdmVudEhhbmRsZXIge1xuICAgICAgICByZWFkb25seSBvbkV2ZW50OiBERXZlbnRbXCJraW5kXCJdO1xuICAgICAgICByZWFkb25seSB0aGVuRXhlY3V0ZTogUmVhZG9ubHlBcnJheTxTdGF0ZUNvbW1hbmQ+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgUHJvcFZhbHVlPFQ+IHtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IFQ7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlTGFiZWw6IHN0cmluZztcbiAgICB9XG4gICAgZXhwb3J0IHR5cGUgUHJvcCA9IE51bWVyaWNQcm9wIHwgU3RyaW5nUHJvcDtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0U3RyaW5nTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcInNldC1zdHJpbmdcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEluY3JlbWVudE51bWJlck11dGF0aW9uIHtcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJpbmNyZW1lbnQtbnVtYmVyXCI7XG4gICAgICAgIHJlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHN0ZXBTaXplOiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGlmTm90RXhpc3RUaGVuU2V0VG86IG51bWJlcjtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBEZWNyZW1lbnROdW1iZXJNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwiZGVjcmVtZW50LW51bWJlclwiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBzdGVwU2l6ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBpZk5vdEV4aXN0VGhlblNldFRvOiBudW1iZXI7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBTZXROdW1iZXJNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwic2V0LW51bWJlclwiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cbiAgICBleHBvcnQgdHlwZSBOdW1iZXJNdXRhdGlvbnMgPSBJbmNyZW1lbnROdW1iZXJNdXRhdGlvbiB8IERlY3JlbWVudE51bWJlck11dGF0aW9uIHwgU2V0TnVtYmVyTXV0YXRpb247XG5cbiAgICBleHBvcnQgdHlwZSBTdGF0ZU11dGF0aW9uID0gU2V0U3RyaW5nTXV0YXRpb24gfCBOdW1iZXJNdXRhdGlvbnM7XG5cbiAgICBleHBvcnQgY29uc3QgaXNOdW1iZXJNdXRhdGlvbiA9IChtdXRhdGlvbnM6IFN0YXRlTXV0YXRpb24pOiBtdXRhdGlvbnMgaXMgTnVtYmVyTXV0YXRpb25zID0+IHtcbiAgICAgICAgaWYgKCFtdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBtdXRhdGlvbnMua2luZCA9PT0gXCJzZXQtbnVtYmVyXCIgfHxcbiAgICAgICAgICAgIG11dGF0aW9ucy5raW5kID09PSBcImRlY3JlbWVudC1udW1iZXJcIiB8fFxuICAgICAgICAgICAgbXV0YXRpb25zLmtpbmQgPT09IFwiaW5jcmVtZW50LW51bWJlclwiXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc1N0cmluZ011dGF0aW9uID0gKG11dGF0aW9uOiBTdGF0ZU11dGF0aW9uKTogbXV0YXRpb24gaXMgU2V0U3RyaW5nTXV0YXRpb24gPT4ge1xuICAgICAgICByZXR1cm4gbXV0YXRpb24gJiYgbXV0YXRpb24ua2luZCA9PT0gXCJzZXQtc3RyaW5nXCI7XG4gICAgfTtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3RhdGVRdWVyeSB7XG4gICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgY29uZGl0aW9uOiBDb25kaXRpb247XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBTdGF0ZVF1ZXJ5UmVzdWx0IHtcbiAgICAgICAgcmVhZG9ubHkgcXVlcnlOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHByZXY6IGJvb2xlYW47XG4gICAgICAgIHJlYWRvbmx5IGN1cnI6IGJvb2xlYW47XG4gICAgfVxuXG4gICAgZXhwb3J0IGNvbnN0IG51bWVyaWNQcm9wVG9GYWN0ID0gKHByb3A6IE51bWVyaWNQcm9wLCB2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3Q6IEZhY3QuTnVtZXJpYyA9IHtcbiAgICAgICAgICAgIGtpbmQ6IFwibnVtZXJpYy1mYWN0XCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiBwcm9wLnByb3BEZXNjcmlwdGlvbiA/PyBcIiBbU1RBVEVfUFJPUEVSVFldIDogXCIgKyBwcm9wLnByb3BOYW1lLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBsYWJlbDogXCIgW1ZBTFVFXSA6IFwiICsgdmFsdWUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmYWN0O1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3Qgc3RyaW5nUHJvcFRvRmFjdCA9IChwcm9wOiBTdHJpbmdQcm9wLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3Q6IEZhY3QuU3RyaW5nID0ge1xuICAgICAgICAgICAga2luZDogXCJzdHJpbmctZmFjdFwiLFxuICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICByZWZlcmVuY2VMYWJlbDogXCIgW1NUQVRFX1BST1BFUlRZXSA6IFwiICsgcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IFwiIFtWQUxVRV0gOiBcIiArIHZhbHVlLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZmFjdDtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSBcIi4uL2NvbW1vbi9yZXN1bHRcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9ydWxlcy9jb25kaXRpb25cIjtcbmltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuL0RzdGF0ZVwiO1xuaW1wb3J0IHsgREV2ZW50RGlzcGF0Y2hlciB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBRdWVyeUNoYW5nZWRFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcblxuZXhwb3J0IGNsYXNzIFN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCIgWyBTVEFURV9TRVJWSUNFIF0gOlwiO1xuICBwcml2YXRlIHJlYWRvbmx5IGZhY3RzU3RyaW5nID0gbmV3IE1hcDxzdHJpbmcsIEZhY3QuU3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZhY3RzTnVtZXJpYyA9IG5ldyBNYXA8c3RyaW5nLCBGYWN0Lk51bWVyaWM+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcERlZmluaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIERTdGF0ZS5Qcm9wPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJpZXMgPSBuZXcgTWFwPHN0cmluZywgeyBxdWVyeTogRFN0YXRlLlN0YXRlUXVlcnk7IGxhc3RSZXN1bHQ6IGJvb2xlYW4gfT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZUNvbW1hbmRzOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBERXZlbnREaXNwYXRjaGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZEJ1czogRENvbW1hbmRCdXMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogUmVhZG9ubHlBcnJheTxEU3RhdGUuUHJvcD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBxdWVyeUxpc3Q6IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlN0YXRlUXVlcnk+ID0gW10sXG4gICkge1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIHRoaXMucmVnaXN0ZXJQcm9wZXJ0eShwcm9wKTtcbiAgICB9KTtcbiAgICBjb25zdCBmYWN0cyA9IHRoaXMuZ2V0QWxsRmFjdHMoKTtcbiAgICBxdWVyeUxpc3QuZm9yRWFjaCgoZGVmaW5pdGlvbikgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RlclF1ZXJ5KGRlZmluaXRpb24sIGZhY3RzKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZhbHVhdGVRdWVyaWVzKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvbW1hbmRzID0gdGhpcy5jb21tYW5kQnVzLnN1YnNjcmliZSgoY29tbWFuZCkgPT4ge1xuICAgICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiKSB7XG4gICAgICAgIHRoaXMubXV0YXRpb24oY29tbWFuZC5wYXlsb2FkLm11dGF0aW9uKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLlRBRyk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclF1ZXJ5KHF1ZXJ5OiBEU3RhdGUuU3RhdGVRdWVyeSwgY3VycmVudEZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gQ29uZGl0aW9uLmV2YWx1YXRlKHF1ZXJ5LmNvbmRpdGlvbiwgY3VycmVudEZhY3RzKTtcbiAgICB0aGlzLnF1ZXJpZXMuc2V0KHF1ZXJ5Lm5hbWUsIHsgcXVlcnk6IHF1ZXJ5LCBsYXN0UmVzdWx0OiByZXN1bHQgfSk7XG4gICAgdGhpcy5lbWl0UXVlcnlDaGFuZ2VkRXZlbnQoeyBxdWVyeU5hbWU6IHF1ZXJ5Lm5hbWUsIHByZXY6IHJlc3VsdCwgY3VycjogcmVzdWx0IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclByb3BlcnR5KHByb3A6IERTdGF0ZS5Qcm9wKSB7XG4gICAgaWYgKHRoaXMucHJvcERlZmluaXRpb25zLmhhcyhwcm9wLnByb3BOYW1lKSkge1xuICAgICAgLy8gTE9HR0lOR1xuICAgICAgY29uc29sZS53YXJuKFwiUHJvcCBleGNpc3RzIGFscmVhZHkuXCIsIHByb3AucHJvcE5hbWUpO1xuICAgIH1cblxuICAgIHRoaXMucHJvcERlZmluaXRpb25zLnNldChwcm9wLnByb3BOYW1lLCBwcm9wKTtcblxuICAgIGlmIChwcm9wLmluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3AuX3R5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGZhY3QgPSBEU3RhdGUuc3RyaW5nUHJvcFRvRmFjdChwcm9wLCBwcm9wLmluaXRpYWxWYWx1ZSk7XG4gICAgICB0aGlzLmZhY3RzU3RyaW5nLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICB9XG4gICAgaWYgKHByb3AuX3R5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGNvbnN0IGZhY3QgPSBEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgcHJvcC5pbml0aWFsVmFsdWUpO1xuICAgICAgdGhpcy5mYWN0c051bWVyaWMuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbXV0YXRlU3RyaW5nKHByb3A6IERTdGF0ZS5TdHJpbmdQcm9wLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VyciA9IHRoaXMuZmFjdHNTdHJpbmcuZ2V0KHByb3AucHJvcE5hbWUpO1xuICAgIGlmIChjdXJyKSB7XG4gICAgICBjb25zdCB1cGRhdGVkOiBGYWN0LlN0cmluZyA9IHsgLi4uY3VyciwgdmFsdWUgfTtcbiAgICAgIHRoaXMuc2V0RmFjdCh1cGRhdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3JlYXRlZDogRmFjdC5TdHJpbmcgPSB7XG4gICAgICAgIGtpbmQ6IFwic3RyaW5nLWZhY3RcIixcbiAgICAgICAgcmVmZXJlbmNlSWQ6IHByb3AucHJvcE5hbWUsXG4gICAgICAgIHJlZmVyZW5jZUxhYmVsOiBcImxhYmVsIGZvcjogXCIgKyBwcm9wLnByb3BOYW1lLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbGFiZWw6IFwiVmFsdWU6IFwiICsgdmFsdWUsXG4gICAgICB9O1xuICAgICAgdGhpcy5zZXRGYWN0KGNyZWF0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbXV0YXRlTnVtYmVyKHByb3A6IERTdGF0ZS5OdW1lcmljUHJvcCwgbXV0YXRpb246IERTdGF0ZS5OdW1iZXJNdXRhdGlvbnMpIHtcbiAgICBjb25zdCBjdXJyID0gdGhpcy5mYWN0c051bWVyaWMuZ2V0KHByb3AucHJvcE5hbWUpO1xuICAgIGlmICghY3Vycikge1xuICAgICAgc3dpdGNoIChtdXRhdGlvbi5raW5kKSB7XG4gICAgICAgIGNhc2UgXCJzZXQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KERTdGF0ZS5udW1lcmljUHJvcFRvRmFjdChwcm9wLCBtdXRhdGlvbi52YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGVjcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdChEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgbXV0YXRpb24uaWZOb3RFeGlzdFRoZW5TZXRUbykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5jcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdChEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgbXV0YXRpb24uaWZOb3RFeGlzdFRoZW5TZXRUbykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG11dGF0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3Vycikge1xuICAgICAgc3dpdGNoIChtdXRhdGlvbi5raW5kKSB7XG4gICAgICAgIGNhc2UgXCJzZXQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KHsgLi4uY3VyciwgdmFsdWU6IG11dGF0aW9uLnZhbHVlIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGVjcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdCh7IC4uLmN1cnIsIHZhbHVlOiBjdXJyLnZhbHVlIC0gbXV0YXRpb24uc3RlcFNpemUgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpbmNyZW1lbnQtbnVtYmVyXCI6XG4gICAgICAgICAgdGhpcy5zZXRGYWN0KHsgLi4uY3VyciwgdmFsdWU6IGN1cnIudmFsdWUgKyBtdXRhdGlvbi5zdGVwU2l6ZSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBtdXRhdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlUXVlcmllcygpOiBSZWFkb25seUFycmF5PHsgcXVlcnlOYW1lOiBzdHJpbmc7IHByZXY6IGJvb2xlYW47IGN1cnI6IGJvb2xlYW47IGRpZENoYW5nZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZmFjdHMgPSB0aGlzLmdldEFsbEZhY3RzKCk7XG4gICAgY29uc3QgYWxsOiBBcnJheTx7IHF1ZXJ5TmFtZTogc3RyaW5nOyBwcmV2OiBib29sZWFuOyBjdXJyOiBib29sZWFuOyBkaWRDaGFuZ2U6IGJvb2xlYW4gfT4gPSBbXTtcbiAgICB0aGlzLnF1ZXJpZXMuZm9yRWFjaCgocSkgPT4ge1xuICAgICAgY29uc3QgcHJldiA9IHEubGFzdFJlc3VsdDtcblxuICAgICAgY29uc3QgY3VyciA9IENvbmRpdGlvbi5ldmFsdWF0ZShxLnF1ZXJ5LmNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gcHJldiAhPT0gY3VycjtcbiAgICAgIHEubGFzdFJlc3VsdCA9IGN1cnI7XG4gICAgICBhbGwucHVzaCh7IHF1ZXJ5TmFtZTogcS5xdWVyeS5uYW1lLCBwcmV2LCBjdXJyLCBkaWRDaGFuZ2UgfSk7XG4gICAgICAvLyBkZWYudmFsdWUgPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBtdXRhdGlvbihtdXRhdGlvbjogRFN0YXRlLlN0YXRlTXV0YXRpb24pOiB7IHN1Y2Nlc3M6IGJvb2xlYW4gfSB7XG4gICAgY29uc3QgcHJvcERlZiA9IHRoaXMucHJvcERlZmluaXRpb25zLmdldChtdXRhdGlvbi5wcm9wTmFtZSk7XG4gICAgaWYgKCFwcm9wRGVmKSB7XG4gICAgICAvLyBUT0RPIExPR0dJTkdcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3BEZWYuX3R5cGUgPT09IFwic3RyaW5nXCIgJiYgRFN0YXRlLmlzU3RyaW5nTXV0YXRpb24obXV0YXRpb24pKSB7XG4gICAgICB0aGlzLm11dGF0ZVN0cmluZyhwcm9wRGVmLCBtdXRhdGlvbi52YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BEZWYuX3R5cGUgPT09IFwibnVtYmVyXCIgJiYgRFN0YXRlLmlzTnVtYmVyTXV0YXRpb24obXV0YXRpb24pKSB7XG4gICAgICB0aGlzLm11dGF0ZU51bWJlcihwcm9wRGVmLCBtdXRhdGlvbik7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5UmVzdWx0cyA9IHRoaXMuZXZhbHVhdGVRdWVyaWVzKCk7XG4gICAgY29uc3QgY2hhbmdlZFJlc3VsdCA9IHF1ZXJ5UmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuZGlkQ2hhbmdlKTtcbiAgICBjaGFuZ2VkUmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgdGhpcy5lbWl0UXVlcnlDaGFuZ2VkRXZlbnQoeyBxdWVyeU5hbWU6IHJlcy5xdWVyeU5hbWUsIHByZXY6IHJlcy5wcmV2LCBjdXJyOiByZXMuY3VyciB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFF1ZXJ5Q2hhbmdlZEV2ZW50KGRhdGE6IHsgcXVlcnlOYW1lOiBzdHJpbmc7IHByZXY6IGJvb2xlYW47IGN1cnI6IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IHF1ZXJ5Q2hhbmdlZEV2ZW50OiBRdWVyeUNoYW5nZWRFdmVudCA9IHtcbiAgICAgIGtpbmQ6IFwiU1RBVEVfUVVFUllfUkVTVUxUX0NIQU5HRURfRVZFTlRcIixcbiAgICAgIHByb2R1Y2VyOiBcIlNUQVRFLVNFUlZJQ0VcIixcbiAgICAgIHByb2R1Y2VySWQ6IFwiU1RBVEUtU0VSVklDRVwiLFxuICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgZGF0YSxcbiAgICB9O1xuICAgIGNvbnN0IHsgcXVlcnlOYW1lLCBjdXJyLCBwcmV2IH0gPSBxdWVyeUNoYW5nZWRFdmVudC5kYXRhO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiWyBRVUVSWV9DSEFOR0VEIFwiICsgcXVlcnlOYW1lICsgXCJdIDogXCIgKyBwcmV2ICsgXCIgLT4gXCIgKyBjdXJyKTtcbiAgICB0aGlzLmV2ZW50QnVzLmVtaXQocXVlcnlDaGFuZ2VkRXZlbnQpO1xuICB9XG5cbiAgZ2V0UHJvcEFzRmFjdChwcm9wTmFtZTogc3RyaW5nKTogUmVzdWx0PEZhY3Q+IHtcbiAgICBjb25zdCBwcm9wRGVmID0gdGhpcy5wcm9wRGVmaW5pdGlvbnMuZ2V0KHByb3BOYW1lKTtcbiAgICBpZiAoIXByb3BEZWYpIHtcbiAgICAgIHJldHVybiBSZXN1bHQuZmFpbHVyZShcbiAgICAgICAgXCJObyBkZWZpbml0aW9uIGZvcm0gcHJvcGVydHkgbnkgbmFtZSBcIiArIHByb3BOYW1lICsgXCIgaXMgcmVnaXN0ZXJlZC4gKFBhc3MgaW4gY29uc3RydWN0b3IuKVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZhY3RzU3RyaW5nLmdldChwcm9wTmFtZSkgPz8gdGhpcy5mYWN0c051bWVyaWMuZ2V0KHByb3BOYW1lKTtcblxuICAgIHJldHVybiB2YWx1ZSA/IFJlc3VsdC5vayh2YWx1ZSkgOiBSZXN1bHQuZmFpbHVyZShcIlByb3BlcnR5IFwiICsgcHJvcE5hbWUgKyBcIiBoYXMgbm8gdmFsdWUuXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGYWN0KGZhY3Q6IEZhY3QpIHtcbiAgICBzd2l0Y2ggKGZhY3Qua2luZCkge1xuICAgICAgY2FzZSBcIm51bWVyaWMtZmFjdFwiOlxuICAgICAgICB0aGlzLmZhY3RzTnVtZXJpYy5zZXQoZmFjdC5yZWZlcmVuY2VJZCwgZmFjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInN0cmluZy1mYWN0XCI6XG4gICAgICAgIHRoaXMuZmFjdHNTdHJpbmcuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGZhY3Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdGUoKSB7XG4gICAgY29uc3QgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IG51bGwgfCBib29sZWFuPiA9IHt9O1xuICAgIHRoaXMucHJvcERlZmluaXRpb25zLmZvckVhY2goKGRlZikgPT4ge1xuICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IG1heWJlRmFjdCA9IHRoaXMuZ2V0QW55RmFjdChkZWYucHJvcE5hbWUpO1xuICAgICAgaWYgKG1heWJlRmFjdCkge1xuICAgICAgICB2YWx1ZSA9IG1heWJlRmFjdC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHByb3BzW2RlZi5wcm9wTmFtZV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXJpZXMuZm9yRWFjaCgocXVlcnkpID0+IHtcbiAgICAgIHByb3BzW3F1ZXJ5LnF1ZXJ5Lm5hbWVdID0gcXVlcnkubGFzdFJlc3VsdDtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICBjb25zdCBwcm9wQ291bnQgPSBwcm9wTmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IHByb3BBcnJheSA9IFsuLi50aGlzLnByb3BEZWZpbml0aW9ucy52YWx1ZXMoKV07XG5cbiAgICByZXR1cm4geyBwcm9wQ291bnQsIHByb3BOYW1lcywgcHJvcEFycmF5LCBzdGF0ZTogcHJvcHMgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QW55RmFjdChwcm9wTmFtZTogc3RyaW5nKTogRmFjdCB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5mYWN0c1N0cmluZy5nZXQocHJvcE5hbWUpID8/IHRoaXMuZmFjdHNOdW1lcmljLmdldChwcm9wTmFtZSkgPz8gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdldEFsbEZhY3RzKCk6IFJlYWRvbmx5QXJyYXk8RmFjdD4ge1xuICAgIHJldHVybiBbLi4udGhpcy5mYWN0c051bWVyaWMudmFsdWVzKCksIC4uLnRoaXMuZmFjdHNTdHJpbmcudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgY2hlY2sgdGhhdCBhbGwgcmVmZXJlbmNlSWRzIHVzZWQgaW4gQ29uZGl0aW9uIGlzIHJlZ2lzdGVyZWQgYXMgYSB2YWxpZCBwcm9wZXJ0eSBpbiBzdGF0ZS5cbiAgICogQHBhcmFtIGNvbmRpdGlvblxuICAgKi9cbiAgY2FuQmVNYXRjaGVkKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2ltcGxlQ29uZGl0aW9ucyA9IENvbmRpdGlvbi5nZXRBbGxTaW1wbGVDb25kaXRpb25zKGNvbmRpdGlvbik7XG4gICAgbGV0IGhhc0FsbCA9IHRydWU7XG5cbiAgICBjb25zdCBhbGxJZHMgPSBzaW1wbGVDb25kaXRpb25zLm1hcCgoYykgPT4gYy5yZWZlcmVuY2VJZCk7XG5cbiAgICBjb25zdCBtaXNzaW5nSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGFsbElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnByb3BEZWZpbml0aW9ucy5oYXMoaWQpKSB7XG4gICAgICAgIGhhc0FsbCA9IGZhbHNlO1xuICAgICAgICBtaXNzaW5nSWRzLnB1c2goaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHLCBtaXNzaW5nSWRzKTtcblxuICAgIHJldHVybiBoYXNBbGw7XG4gIH1cbiAgaXNNYXRjaGVkKGNvbmRpdGlvbjogQ29uZGl0aW9uKSB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ldmFsdWF0ZShjb25kaXRpb24sIHRoaXMuZ2V0QWxsRmFjdHMoKSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBTY2hlbWFEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgRE1lZGlhTWFuYWdlciB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ETWVkaWEtbWFuYWdlclwiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERQbGF5ZXIgfSBmcm9tIFwiLi4vcGxheWVyL2RwbGF5ZXJcIjtcbmltcG9ydCB7IEFuc3dlcmVkUXVlc3Rpb24gfSBmcm9tIFwiLi4vcGxheWVyL2hpc3RvcnktcXVlXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5pbXBvcnQgeyBEUGFnZSB9IGZyb20gXCIuL0RQYWdlXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi9zY2FsZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VQcm92aWRlciB9IGZyb20gXCIuLi9zZXJ2aWNlcy9yZXNvdXJjZS1wcm92aWRlclwiO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3N0YXRlL3N0YXRlLXNlcnZpY2VcIjtcbmltcG9ydCB7IERDb21tYW5kLCBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuZ2luZUxvZ2dlciB7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAgYXBwRXZlbnQoZXZlbnQ6IERFdmVudCk6IHZvaWQ7XG4gIGFwcENvbW1hbmQoY29tbWFuZDogRENvbW1hbmQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYVJlc3VsdCB7XG4gIHJlYWRvbmx5IGV2ZW50TG9nOiBSZWFkb25seUFycmF5PERFdmVudD47XG4gIHJlYWRvbmx5IGNvbW1hbmRMb2c6IFJlYWRvbmx5QXJyYXk8RENvbW1hbmQ+O1xuICByZWFkb25seSBhbnN3ZXJzOiBSZWFkb25seUFycmF5PGFueT47XG59XG5leHBvcnQgaW50ZXJmYWNlIElTY2hlbWFFbmdpbmUge1xuICBvbkNvbXBsZXRlKGhhbmRsZXI6IChyZXN1bHQ6IFNjaGVtYVJlc3VsdCkgPT4gdm9pZCk6IHZvaWQ7XG4gIG9uQ29tbWFuZE9yRXZlbnQoaXRlbTogREV2ZW50IHwgRENvbW1hbmQpOiB2b2lkO1xuICBzZXRTY2hlbWEoc2NoZW1hOiBTY2hlbWFEdG8pOiB2b2lkO1xuICBvbkZhdGFsRXJyb3IoaGFuZGxlcjogKGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYUVuZ2luZSBpbXBsZW1lbnRzIElTY2hlbWFFbmdpbmUge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBTQ0hFTUFfRU5HSU5FIF0gOlwiO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXMgPSBuZXcgRENvbW1hbmRCdXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1cyA9IG5ldyBFdmVudEJ1cygpO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lZGlhTWFuYWdlcjogRE1lZGlhTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSB1aUNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lZGlhQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VQcm92aWRlcjogUmVzb3VyY2VQcm92aWRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxFdmVudFRvU3RhdGVIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seUFycmF5PFN0YXRlQ29tbWFuZD4+KCk7XG4gIHByaXZhdGUgcGxheWVyOiBEUGxheWVyO1xuICBwcml2YXRlIGN1cnJlbnRQYWdlOiBEUGFnZSB8IGZhbHNlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0RWw6IEhUTUxEaXZFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3aWR0aDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBTY2hlbWFEdG8sXG4gICkge1xuICAgIHRoaXMuaG9zdEVsZW1lbnQgPSBob3N0RWw7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnVpQ29udGFpbmVyKTtcbiAgICB0aGlzLmhvc3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMubWVkaWFDb250YWluZXIpO1xuICAgIGNvbnN0IHN0YXRlUHJvcHMgPSB0aGlzLnNjaGVtYS5zdGF0ZVByb3BzID8/IFtdO1xuICAgIGNvbnN0IHN0YXRlUXVlcmllcyA9IHRoaXMuc2NoZW1hLnN0YXRlUXVlcmllcyA/PyBbXTtcbiAgICB0aGlzLnN0YXRlU2VydmljZSA9IG5ldyBTdGF0ZVNlcnZpY2UodGhpcy5ldmVudEJ1cywgdGhpcy5jb21tYW5kQnVzLCBzdGF0ZVByb3BzLCBzdGF0ZVF1ZXJpZXMpO1xuICAgIHRoaXMuc2NhbGUgPSBuZXcgU2NhbGVTZXJ2aWNlKHtcbiAgICAgIGJhc2VIZWlnaHQ6IHNjaGVtYS5iYXNlSGVpZ2h0LFxuICAgICAgYmFzZVdpZHRoOiBzY2hlbWEuYmFzZVdpZHRoLFxuICAgICAgY29udGFpbmVyV2lkdGg6IHdpZHRoLFxuICAgICAgY29udGFpbmVySGVpZ2h0OiBoZWlnaHQsXG4gICAgfSk7XG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmxvZ0NvbW1hbmRzID0gdHJ1ZTtcbiAgICBjb25zdCBnbG9iYWxFdmVudEhhbmRsZXJzID0gc2NoZW1hLnN0YXRlRnJvbUV2ZW50ID8/IFtdO1xuXG4gICAgZ2xvYmFsRXZlbnRIYW5kbGVycy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICB0aGlzLmdsb2JhbEV2ZW50VG9TdGF0ZUhhbmRsZXJzLnNldChoLm9uRXZlbnQsIGgudGhlbkV4ZWN1dGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VzID0gU2NoZW1hRHRvLmdldFJlc291cmNlcyh0aGlzLnNjaGVtYSk7XG4gICAgdGhpcy5yZXNvdXJjZVByb3ZpZGVyID0gbmV3IFJlc291cmNlUHJvdmlkZXIoeyB2aWRlb3M6IHJlc291cmNlcy52aWRlb0xpc3QsIGF1ZGlvOiByZXNvdXJjZXMuYXVkaW9MaXN0IH0pO1xuICAgIHRoaXMubWVkaWFNYW5hZ2VyID0gbmV3IERNZWRpYU1hbmFnZXIoXG4gICAgICB0aGlzLm1lZGlhQ29udGFpbmVyLFxuICAgICAgdGhpcy5jb21tYW5kQnVzLFxuICAgICAgdGhpcy5ldmVudEJ1cyxcbiAgICAgIHRoaXMucmVzb3VyY2VQcm92aWRlcixcbiAgICAgIHRoaXMuc2NhbGUsXG4gICAgKTtcbiAgICB0aGlzLnBsYXllciA9IG5ldyBEUGxheWVyKHRoaXMuc2NoZW1hKTtcbiAgICB0aGlzLnN0eWxlU2VsZigpO1xuICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICB0aGlzLmhvb2tVcExpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBob29rVXBMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50QnVzLnN1YnNjcmliZSgoZXYpID0+IHtcbiAgICAgIHRoaXMub25Db21tYW5kT3JFdmVudChldik7XG4gICAgICBjb25zdCBnbG9iYWxIYW5kbGVycyA9IHRoaXMuZ2xvYmFsRXZlbnRUb1N0YXRlSGFuZGxlcnMuZ2V0KGV2LmtpbmQpID8/IFtdO1xuICAgICAgZ2xvYmFsSGFuZGxlcnMuZm9yRWFjaCgoc3RhdGVDb21tYW5kKSA9PiB7XG4gICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KHN0YXRlQ29tbWFuZCk7XG4gICAgICB9KTtcbiAgICB9LCB0aGlzLlRBRyArIFwiSE9PS19VUF9MSVNURU5FUlNcIik7XG4gICAgY29uc3QgY29tbWFuZFN1YnNjcmlwdGlvbiA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGNvbW1hbmQpID0+IHtcbiAgICAgIC8vIHN3aXRjaCAoY29tbWFuZC5raW5kKSB7XG4gICAgICAvL1xuICAgICAgLy8gfVxuICAgICAgdGhpcy5vbkNvbW1hbmRPckV2ZW50KGNvbW1hbmQpO1xuICAgICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJQQUdFX1FVRV9ORVhUX1BBR0VfQ09NTUFORFwiKSB7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJFTkdJTkVfTEVBVkVfUEFHRV9DT01NQU5EXCIpIHtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlNFUVVFTkNFIFNUQVJURUQgLS0gVE9ETyBFVkVOVCBGT1IgVEhJUz8/XCIpO1xuICAgICAgICBjb25zb2xlLmxvZyhjb21tYW5kKTtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gY29tbWFuZC5wYXlsb2FkLnBhZ2VJZDtcbiAgICAgICAgY29uc3QgZmFjdHMgPSBjb21tYW5kLnBheWxvYWQuZmFjdHNDb2xsZWN0ZWQ7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERUaW1lc3RhbXAubm93KCk7XG4gICAgICAgIGNvbnN0IGFuczogQW5zd2VyZWRRdWVzdGlvbltdID0gZmFjdHMubWFwKChmKSA9PiAoe1xuICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgICBmYWN0OiBmLFxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMucGxheWVyLnNhdmVIaXN0b3J5KHtcbiAgICAgICAgICBhbnN3ZXJlZFF1ZXN0aW9uczogYW5zLFxuICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgICAvLyBjb25zdCBoaXN0b3J5OiBQYWdlSGlzdG9yeSA9IHsgcGFnZToge30sIGFuc3dlcmVkUXVlc3Rpb25zOiBbXSB9O1xuICAgICAgfVxuICAgIH0sIHRoaXMuVEFHKTtcblxuICAgIHRoaXMuc3Vicy5wdXNoKGNvbW1hbmRTdWJzY3JpcHRpb24pO1xuICAgIHRoaXMuc3Vicy5wdXNoKGV2ZW50U3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgc3R5bGVTZWxmKCkge1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zY2FsZS5wYWdlSGVpZ2h0ICsgXCJweFwiO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLnNjYWxlLnBhZ2VXaWR0aCArIFwicHhcIjtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2NoZW1hLmJhY2tncm91bmRDb2xvciA/PyBcIndoaXRlXCI7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICAvLyB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICBjb25zdCBtYWtlU3RhdGljID0gKGRpdjogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBcIjBweFwiO1xuICAgICAgZGl2LnN0eWxlLndpZHRoID0gXCIwcHhcIjtcbiAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwic3RhdGljXCI7XG4gICAgfTtcblxuICAgIG1ha2VTdGF0aWModGhpcy51aUNvbnRhaW5lcik7XG4gICAgbWFrZVN0YXRpYyh0aGlzLm1lZGlhQ29udGFpbmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dFBhZ2UoKSB7XG4gICAgLy8gVE9ETyBTSE9VTEQgVEhJUyBCRSBQQVJUIE9GIFRIRSBTQ0hFTUE/PyBUSElTIElTIENMRUFOVVAgTE9HSUNcbiAgICAvLyB0aGlzLmNvbW1hbmRCdXMuZW1pdCh7IGtpbmQ6IFwiVklERU9fUEFVU0VfQ09NTUFORFwiLCB0YXJnZXQ6IFwiVklERU9cIiwgdGFyZ2V0SWQ6IFwiVklERU9cIiwgcGF5bG9hZDoge30gfSk7XG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmVtaXQoeyBraW5kOiBcIkFVRElPX1BBVVNFX0NPTU1BTkRcIiwgdGFyZ2V0OiBcIkFVRElPXCIsIHRhcmdldElkOiBcIkFVRElPXCIsIHBheWxvYWQ6IHt9IH0pO1xuICAgIC8vIGNvbnN0IGN1cnJQYWdlSWQgPSB0aGlzLmN1cnJlbnRQYWdlID8gdGhpcy5jdXJyZW50UGFnZS5pZCA6IFwiTk9fUEFHRVwiO1xuICAgIC8vIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXCJORVhUX1BBR0UgRlJPTTogXCIgKyBjdXJyUGFnZUlkKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIE5FWFRfUEFHRSBTVEFSVEVEIEFUOiBcIiArIGN1cnJQYWdlSWQpO1xuICAgIHRoaXMubWVkaWFNYW5hZ2VyLmNsZWFyQWxsTWVkaWEoKTtcbiAgICBjb25zdCBuZXh0UGFnZSA9IHRoaXMucGxheWVyLmdldE5leHRQYWdlKCk7XG4gICAgLy8gY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlU2VydmljZS5nZXRTdGF0ZSgpO1xuICAgIC8vIGNvbnNvbGUubG9nKHN0YXRlKTtcbiAgICAvLyBUT0RPIENMRUFOIFVQIFBBR0UgQ09NUE9ORU5UUyB0aGlzLnBhZ2UuQ2xlYW5VcCgpXG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy51aUNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgICBpZiAoIW5leHRQYWdlKSB7XG4gICAgICAvLyBUT0RPIEZJR1VSRSBPVVQgV0hBUVQgVE8gRE8gQVQgRU5EIE9GIFRFU1QhISBTdGFydCBvdmVyPz9cbiAgICAgIHRoaXMucGxheWVyID0gbmV3IERQbGF5ZXIodGhpcy5zY2hlbWEpO1xuICAgICAgaWYgKHRoaXMuc2NoZW1hLnBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBuZXdQYWdlID0gbmV3IERQYWdlKG5leHRQYWdlLCB0aGlzLmV2ZW50QnVzLCB0aGlzLmNvbW1hbmRCdXMsIHRoaXMuc2NhbGUpO1xuXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IG5ld1BhZ2U7XG4gICAgbmV3UGFnZS5hcHBlbmRZb3Vyc2VsZih0aGlzLnVpQ29udGFpbmVyKTtcblxuICAgIHRoaXMubWVkaWFNYW5hZ2VyLnNldFBhZ2UobmV4dFBhZ2UpO1xuICAgIGNvbnN0IHMxID0gdGhpcy5zdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICAvLyBjb25zb2xlLmxvZyhzMSk7XG4gICAgLy8gY29uc29sZS5sb2coXCJOZXh0LXBhZ2U6IFwiICsgbmV3UGFnZS5pZCk7XG4gICAgLy8gY29uc29sZS5ncm91cEVuZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLnVpQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICAgIHRoaXMubWVkaWFNYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5kZXN0cm95KCk7XG4gICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YikgPT4ge1xuICAgICAgc3ViKCk7XG4gICAgfSk7XG4gICAgY29uc3QgZXZTdGF0cyA9IHRoaXMuZXZlbnRCdXMuZ2V0U3RhdHMoKTtcbiAgICBjb25zdCBjbWRTdGF0cyA9IHRoaXMuY29tbWFuZEJ1cy5nZXRTdGF0cygpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KGV2U3RhdHMuc3Vic2NyaWJlcnNDb3VudCA9PT0gMCwgdGhpcy5UQUcgKyBcIiBFdmVudGJ1cyBzaG91bGQgaGF2ZSBubyBzdWJzY3JpYmVycyBcIiwgZXZTdGF0cyk7XG4gICAgY29uc29sZS5hc3NlcnQoY21kU3RhdHMuc3Vic2NyaWJlcnNDb3VudCA9PT0gMCwgdGhpcy5UQUcgKyBcIkNvbW1hbmRidXMgc2hvdWxkIGhhdmUgbm8gc3Vic2NyaWJlcnNcIiwgY21kU3RhdHMpO1xuICB9XG4gIG9uQ29tcGxldGUoaGFuZGxlcjogKHJlc3VsdDogU2NoZW1hUmVzdWx0KSA9PiB2b2lkKSB7XG4gICAgY29uc29sZS5sb2coaGFuZGxlcik7XG4gIH1cblxuICBvbkZhdGFsRXJyb3IoaGFuZGxlcjogKGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coaGFuZGxlcik7XG4gIH1cblxuICBvbkNvbW1hbmRPckV2ZW50KF9ldmVudF9vcl9jb21tYW5kOiBERXZlbnQgfCBEQ29tbWFuZCkge31cblxuICBzZXRTY2hlbWEoc2NoZW1hOiBTY2hlbWFEdG8pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhzY2hlbWEpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRFN0YXRlIH0gZnJvbSBcIi4vRHN0YXRlXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5TdGF0ZVByb3BlcnR5PFByb3BOYW1lIGV4dGVuZHMgc3RyaW5nPiB7XG4gICAgcmVhZG9ubHkgcHJvcE5hbWU6IFByb3BOYW1lO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRSVUUgPSB7IHZhbHVlOiAxLCBsYWJlbDogXCJUUlVFXCIgfTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGQUxTRSA9IHsgdmFsdWU6IDAsIGxhYmVsOiBcIkZBTFNFXCIgfTtcbiAgICByZWFkb25seSBwcm9wRGVmaW5pdGlvbjogRFN0YXRlLk51bWVyaWNQcm9wO1xuXG4gICAgZ2V0SXNUcnVlQ29uZGl0aW9uKCk6IENvbmRpdGlvbi5OdW1lcmljIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwibnVtZXJpYy1jb25kaXRpb25cIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiB0aGlzLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IHRoaXMucHJvcE5hbWUgKyBcIlsgQk9PTEVBTiBdXCIsXG4gICAgICAgICAgICB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LlRSVUUudmFsdWUsXG4gICAgICAgICAgICBvcGVyYXRvcjogXCJlcVwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRJc0ZhbHNlQ29uZGl0aW9uKCk6IENvbmRpdGlvbi5OdW1lcmljIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwibnVtZXJpYy1jb25kaXRpb25cIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiB0aGlzLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IHRoaXMucHJvcE5hbWUgKyBcIlsgQk9PTEVBTiBdXCIsXG4gICAgICAgICAgICB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS52YWx1ZSxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcImVxXCIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U2V0VHJ1ZUNvbW1hbmQoKTogU3RhdGVDb21tYW5kIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIixcbiAgICAgICAgICAgIHRhcmdldDogXCJTVEFURVwiLFxuICAgICAgICAgICAgdGFyZ2V0SWQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogeyBwcm9wTmFtZTogdGhpcy5wcm9wTmFtZSwga2luZDogXCJzZXQtbnVtYmVyXCIsIHZhbHVlOiAxIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFNldEZhbHNlQ29tbWFuZCgpOiBTdGF0ZUNvbW1hbmQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiLFxuICAgICAgICAgICAgdGFyZ2V0OiBcIlNUQVRFXCIsXG4gICAgICAgICAgICB0YXJnZXRJZDogXCJTVEFURVwiLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIG11dGF0aW9uOiB7IHByb3BOYW1lOiB0aGlzLnByb3BOYW1lLCBraW5kOiBcInNldC1udW1iZXJcIiwgdmFsdWU6IDAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJvcE5hbWU6IFByb3BOYW1lLCBwcml2YXRlIHJlYWRvbmx5IGluaXRpYWxWYWx1ZTogYm9vbGVhbiwgZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7XG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBpbml0aWFsVmFsdWUgPyAxIDogMDtcbiAgICAgICAgY29uc3QgcHJvcERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPyBkZXNjcmlwdGlvbiA6IFwiTm8gZGVzY3JpcHRpb24gZ2l2ZW5cIjtcbiAgICAgICAgdGhpcy5wcm9wRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgIHByb3BEZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wTmFtZSxcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZTogaW5pdGlhbCxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5GQUxTRS52YWx1ZSwgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UubGFiZWwgfSxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLnZhbHVlLCB2YWx1ZUxhYmVsOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLmxhYmVsIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgX3R5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhbiBJRFxuY29uc3QgSURfTEVOR1RIID0gMzI7XG5cbi8vIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiBhbiBJRFxuY29uc3QgTUlOX0xFTkdUSCA9IDEwO1xuXG5leHBvcnQgdHlwZSBJRDxCIGV4dGVuZHMgc3RyaW5nPiA9IHN0cmluZyAmIHsgX19JRF9fOiBCIH07XG5cbmNvbnN0IGlzSUQgPSA8Y29uc3QgQiBleHRlbmRzIHN0cmluZz4oaWROYW1lOiBCLCBpZD86IHN0cmluZyk6IGlkIGlzIElEPEI+ID0+IHtcbiAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaWQubGVuZ3RoID49IE1JTl9MRU5HVEg7XG59O1xuXG5jb25zdCBjcmVhdGVJREJ5TmFtZSA9IDxjb25zdCBCIGV4dGVuZHMgc3RyaW5nPihpZE5hbWU6IEIpOiBJRDxCPiA9PiB7XG4gIGNvbnN0IGxldHRlcnMgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ5elwiO1xuICBjb25zdCBhbGwgPSBsZXR0ZXJzICsgbGV0dGVycy50b1VwcGVyQ2FzZSgpO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBJRF9MRU5HVEg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBhbGwuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbC5sZW5ndGgpKTtcbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0IGFzIElEPEI+O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgb2JqZWN0IHdpdGggaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzcGVjaWZpYyBJRCB0eXBlXG4gKiBAcGFyYW0gaWROYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVUeXBlZElkU2luZ2xldG9uID0gPGNvbnN0IEIgZXh0ZW5kcyBzdHJpbmc+KGlkTmFtZTogQikgPT4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBJRCBvZiB0aGUgY29ycmVjdCB0eXBlXG4gICAqL1xuICBjb25zdCBjcmVhdGUgPSAoKTogSUQ8Qj4gPT4gY3JlYXRlSURCeU5hbWUoaWROYW1lKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlXG4gICAqIEBwYXJhbSBpZFxuICAgKi9cbiAgY29uc3QgaXMgPSAoaWQ6IHN0cmluZyk6IGlkIGlzIElEPEI+ID0+IGlzSUQoaWROYW1lLCBpZCk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaWQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSwgaWYgbm90IGl0IHRocm93cyBhbiBlcnJvclxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlT3JUaHJvdyA9IChpZDogc3RyaW5nKTogSUQ8Qj4gPT4ge1xuICAgIGlmICghaXMoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWQ6ICR7aWR9YCk7XG4gICAgfVxuICAgIHJldHVybiBpZDtcbiAgfTtcblxuICAvKipcbiAgICogVGhlIGxvd2VyY2FzZSBuYW1lIG9mIHRoZSBpZCAoU0NIRU1BLCBQQUdFLCBldGMpXG4gICAqL1xuICBjb25zdCBuYW1lOiBCID0gaWROYW1lO1xuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgdGhlIGlkIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUsIGlmIG5vdCBpdCBjcmVhdGVzIGEgbmV3IG9uZVxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIGNvbnN0IGVuc3VyZSA9IChpZDogc3RyaW5nKTogSUQ8Qj4gPT4ge1xuICAgIHJldHVybiBpcyhpZCkgPyBpZCA6IGNyZWF0ZSgpO1xuICB9O1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgY3JlYXRlLCBpcywgZW5zdXJlLCB2YWxpZGF0ZU9yVGhyb3csIG5hbWUgfSk7XG59O1xuXG5leHBvcnQgdHlwZSBTY2hlbWFJRCA9IElEPFwiU0NIRU1BXCI+O1xuZXhwb3J0IGNvbnN0IFNjaGVtYUlEID0gY3JlYXRlVHlwZWRJZFNpbmdsZXRvbihcIlNDSEVNQVwiKTtcbmV4cG9ydCB0eXBlIFBhZ2VJRCA9IElEPFwiUEFHRVwiPjtcbmV4cG9ydCBjb25zdCBQYWdlSUQgPSBjcmVhdGVUeXBlZElkU2luZ2xldG9uKFwiUEFHRVwiKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUF3Q08sSUFBVTtBQUFBLENBQVYsQ0FBVUEsZUFBVjtBQUNFLEVBQU1BLFdBQUEsZUFBZSxDQUMxQixXQUtHO0FBQ0gsVUFBTSxFQUFFLE1BQU0sSUFBSTtBQUNsQixVQUFNLFlBQVksTUFBTSxPQUF5QixDQUFDLEtBQUssU0FBUztBQUM5RCxVQUFJLE1BQU0sUUFBUSxLQUFLLEtBQUssR0FBRztBQUM3QixZQUFJLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBQSxNQUN4QjtBQUNBLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBQ0wsVUFBTSxZQUE4QixNQUFNLE9BQXlCLENBQUMsS0FBSyxTQUFTO0FBQ2hGLFVBQUksTUFBTSxRQUFRLEtBQUssS0FBSyxHQUFHO0FBQzdCLFlBQUksS0FBSyxHQUFHLEtBQUssS0FBSztBQUFBLE1BQ3hCO0FBQ0EsYUFBTztBQUFBLElB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QyxHQUFHLEVBQUUsR0FBRztBQUNYLFlBQU0sSUFBSSxNQUFNLGVBQWUsRUFBRSxFQUFFO0FBQUEsSUFDckM7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUtBLFFBQU0sT0FBVTtBQU1oQixRQUFNLFNBQVMsQ0FBQyxPQUFzQjtBQUNwQyxXQUFPLEdBQUcsRUFBRSxJQUFJLEtBQUssT0FBTztBQUFBLEVBQzlCO0FBRUEsU0FBTyxPQUFPLE9BQU8sRUFBRSxRQUFRLElBQUksUUFBUSxpQkFBaUIsS0FBSyxDQUFDO0FBQ3BFO0FBR08sSUFBTSxXQUFXLHVCQUF1QixRQUFRO0FBRWhELElBQU0sU0FBUyx1QkFBdUIsTUFBTTsiLAogICJuYW1lcyI6IFsiU2NoZW1hRHRvIiwgIkRUaW1lc3RhbXAiLCAiRFV0aWwiLCAiaXNOdW1iZXIiLCAiRENzcyIsICJEU3R5bGUiLCAiQW5zd2VyZWRRdWVzdGlvbiIsICJDb25kaXRpb24iLCAiY29uZGl0aW9uIiwgIlJ1bGUiLCAidGFnIiwgIkRFdmVudEhhbmRsZXIiLCAiZHRvIiwgImR0byIsICJTY2FsZSIsICJSZXN1bHQiLCAiRFN0YXRlIl0KfQo=