跳转到内容

User:SunAfterRain/js/RCPatrol.js/dist.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
/*!
 * RCPatrol
 * Build from source: https://github.com/Xi-Plus/RCPatrol
 * vite config: https://gist.github.com/sunafterrainwm/4ad3217414734634e5ce46cb90d3815d
 */
(function() {
  "use strict";
  var hansLocale = {
    "gadget-rcp-hist-basic-auto": "已自动巡查",
    "gadget-rcp-hist-basic-user": "已由[[User:$1|$1]]巡查",
    "gadget-rcp-hist-pending-difflink": "<b>[[Special:Diff/$1/$2|等候巡查]]</b>",
    "gadget-rcp-hist-basic": "已巡查修订",
    "gadget-rcp-hist-pending": "待巡查修订",
    "gadget-rcp-diff2stable": "查看所有待巡查变更",
    "gadget-rcp-patrol": "巡查",
    "gadget-rcp-patrol-multi": "标记$1笔修订为已巡查",
    "gadget-rcp-patrol-multi-confirm": "您确定要将$1笔修订都标记为已巡查吗?",
    "gadget-rcp-patrol-notify": "修订版本$1已标记为已巡查。"
  };
  var hantLocale = {
    "gadget-rcp-hist-basic-auto": "已自動巡查",
    "gadget-rcp-hist-basic-user": "已由[[User:$1|$1]]巡查",
    "gadget-rcp-hist-pending-difflink": "<b>[[Special:Diff/$1/$2|等候巡查]]</b>",
    "gadget-rcp-hist-basic": "已巡查修訂",
    "gadget-rcp-hist-pending": "待巡查修訂",
    "gadget-rcp-diff2stable": "檢視所有待巡查變更",
    "gadget-rcp-patrol": "巡查",
    "gadget-rcp-patrol-multi": "標記$1筆修訂為已巡查",
    "gadget-rcp-patrol-multi-confirm": "您確定要將$1筆修訂都標記為已巡查嗎?",
    "gadget-rcp-patrol-notify": "修訂版本$1已標記為已巡查。"
  };
  $.i18n({
    locale: mw.config.get("wgUserLanguage")
  });
  $.i18n().load({
    "zh-hans": hansLocale,
    "zh-hant": hantLocale
  });
  function msg(key, ...parameters) {
    if (!mw.messages.exists(key)) {
      mw.messages.set(key, $.i18n(key));
    }
    return mw.message(key, ...parameters).text();
  }
  function parsedmsg(key, ...parameters) {
    if (!mw.messages.exists(key)) {
      mw.messages.set(key, $.i18n(key));
    }
    return mw.message(key, ...parameters).parse();
  }
  const api = new mw.Api();
  const hasPatrol = mw.config.get("wgUserGroups").includes("patroller") || mw.config.get("wgUserGroups").includes("sysop");
  let rcpOptions = {
    multiPatrol: false,
    multiPatrolConfirm: true,
    patrolInRC: false
  };
  var last_patrolled_revid = 0;
  var last_rc_revid = 0;
  var recentchanges = null;
  var autopatrollers = [];
  var patrol_logs = null;
  async function getAutopatrollers() {
    if (autopatrollers.length > 0) {
      return;
    }
    let query = {
      "action": "query",
      "format": "json",
      "list": "allusers",
      "aurights": "autopatrol",
      "aulimit": "max"
    };
    while (true) {
      let data = await api.get(query);
      for (const user of data.query.allusers) {
        autopatrollers.push(user.name);
      }
      if (data.continue) {
        query = {
          ...query,
          ...data.continue
        };
      } else {
        break;
      }
    }
  }
  async function getPatrolLogs() {
    if (patrol_logs) {
      return;
    }
    await api.get({
      "action": "query",
      "format": "json",
      "list": "logevents",
      "leprop": "user|details",
      "leaction": "patrol/patrol",
      "letitle": mw.config.get("wgPageName"),
      "lelimit": "max"
    }).then(function(data) {
      patrol_logs = data.query.logevents;
    });
    patrol_logs.forEach((log) => {
      last_patrolled_revid = Math.max(last_patrolled_revid, log.params.curid);
    });
  }
  async function getPatrolRecords() {
    if (recentchanges) {
      return;
    }
    let query = {
      "action": "query",
      "format": "json",
      "list": "recentchanges",
      "rctype": "edit|new",
      "rcprop": "ids",
      "rclimit": "max",
      "rctitle": mw.config.get("wgPageName")
    };
    if (hasPatrol) {
      query.rcprop += "|patrolled";
    } else {
      query.rcprop += "|user";
    }
    await api.get(query).then(function(data) {
      recentchanges = data.query.recentchanges;
    });
    if (!hasPatrol) {
      await getAutopatrollers();
      await getPatrolLogs();
    }
    if (recentchanges.length === 0) {
      last_patrolled_revid = mw.config.get("wgCurRevisionId");
      last_rc_revid = mw.config.get("wgCurRevisionId");
    } else {
      last_patrolled_revid = Math.max(last_patrolled_revid, recentchanges[recentchanges.length - 1].old_revid);
      last_rc_revid = recentchanges[recentchanges.length - 1].old_revid;
      if (hasPatrol) {
        recentchanges.forEach((recentchange) => {
          if (recentchange.patrolled !== void 0) {
            last_patrolled_revid = Math.max(last_patrolled_revid, recentchange.revid);
            return;
          }
        });
      } else {
        recentchanges.forEach((recentchange) => {
          if (autopatrollers.includes(recentchange.user)) {
            last_patrolled_revid = Math.max(last_patrolled_revid, recentchange.revid);
            return;
          }
        });
      }
    }
  }
  function markHistByRC() {
    recentchanges.forEach((recentchange) => {
      let $contribution_row = $(".mw-contributions-list li[data-mw-revid=" + recentchange.revid + "]");
      if (recentchange.autopatrolled !== void 0) {
        $contribution_row.addClass("gadget-rcp-autopatrolled");
        $("<span>").text("[" + msg("gadget-rcp-hist-basic-auto") + "]").addClass("gadget-rcp-hist-basic-auto").appendTo($contribution_row);
      } else if (recentchange.patrolled !== void 0) {
        $contribution_row.addClass("gadget-rcp-patrolled");
      } else {
        $contribution_row.addClass("gadget-rcp-unpatrolled");
        if (recentchange.revid > last_patrolled_revid) {
          $contribution_row.addClass("gadget-rcp-pending");
          if (last_patrolled_revid > 0) {
            $("<span>").html("[" + parsedmsg("gadget-rcp-hist-pending-difflink", last_patrolled_revid, recentchange.revid) + "]").addClass("gadget-rcp-hist-difflink").appendTo($contribution_row);
          }
        }
      }
    });
  }
  async function markHistByPatrolLog() {
    await getPatrolLogs();
    patrol_logs.forEach((log) => {
      let $contribution_row = $(".mw-contributions-list li[data-mw-revid=" + log.params.curid + "]");
      $("<span>").html("[" + parsedmsg("gadget-rcp-hist-basic-user", log.user) + "]").addClass("gadget-rcp-hist-basic-user").appendTo($contribution_row);
      $contribution_row.addClass("gadget-rcp-patrolled");
    });
  }
  async function markHistByAutopatrollers() {
    await getAutopatrollers();
    for (const contribution_row of $(".mw-contributions-list li")) {
      const revid = $(contribution_row).data("mw-revid");
      const username = $(contribution_row).find(".history-user a bdi").text();
      if (autopatrollers.includes(username) && (!hasPatrol || revid <= last_rc_revid)) {
        $(contribution_row).addClass("gadget-rcp-autopatrolled");
        $("<span>").text("[" + msg("gadget-rcp-hist-basic-auto") + "]").addClass("gadget-rcp-hist-basic-auto").appendTo(contribution_row);
      }
    }
  }
  function markHistWithoutRC() {
    for (const contribution_row of $(".mw-contributions-list li")) {
      const revid = $(contribution_row).data("mw-revid");
      if (revid > last_patrolled_revid) {
        $(contribution_row).addClass("gadget-rcp-pending");
        if (last_patrolled_revid > 0) {
          $("<span>").html("[" + parsedmsg("gadget-rcp-hist-pending-difflink", last_patrolled_revid, revid) + "]").addClass("gadget-rcp-hist-difflink").appendTo($(contribution_row));
        }
      }
    }
  }
  function markDiffPatrolStatus() {
    const $diffHeaderItems = $("<div>").attr("id", "gadget-rcp-diff-headeritems").insertBefore("#mw-content-text table.diff");
    const $diffToStable = $("<div>").addClass("gadget-rcp-diff-to-stable").appendTo($diffHeaderItems);
    $diffToStable.css({
      "text-align": "center"
    });
    if (last_patrolled_revid > 0 && mw.config.get("wgCurRevisionId") != last_patrolled_revid && (mw.config.get("wgDiffOldId") != last_patrolled_revid || mw.config.get("wgDiffNewId") != mw.config.get("wgCurRevisionId"))) {
      $diffToStable.append(document.createTextNode("("));
      $diffToStable.append($("<a>").attr("href", mw.util.getUrl(null, {
        oldid: last_patrolled_revid,
        diff: "cur"
      })).text(msg("gadget-rcp-diff2stable")));
      $diffToStable.append(document.createTextNode(")"));
    }
    const $ratingsTable = $("<table>").addClass("gadget-rcp-diff-ratings").appendTo($diffHeaderItems);
    const $oldWrapper = $("<td>").addClass("gadget-rcp-diff-old");
    $oldWrapper.css({
      "text-align": "center",
      "width": "50%"
    });
    const $newWrapper = $("<td>").addClass("gadget-rcp-diff-new");
    $newWrapper.css({
      "text-align": "center",
      "width": "50%"
    });
    $ratingsTable.append($("<tbody>").append($("<tr>").append($oldWrapper).append($newWrapper)));
    const $oldMark = $("<span>").attr("id", "gadget-rcp-diff-old-status").appendTo($oldWrapper);
    if (mw.config.get("wgDiffOldId") <= last_patrolled_revid) {
      $oldMark.addClass("gadget-rcp-diff-patrolled");
      $oldMark.text("[" + msg("gadget-rcp-hist-basic") + "]");
    } else {
      $oldMark.addClass("gadget-rcp-diff-pending");
      $oldMark.text("[" + msg("gadget-rcp-hist-pending") + "]");
    }
    const $newMark = $("<span>").attr("id", "gadget-rcp-diff-new-status").appendTo($newWrapper);
    if (mw.config.get("wgDiffNewId") <= last_patrolled_revid) {
      $newMark.addClass("gadget-rcp-diff-patrolled");
      $newMark.text("[" + msg("gadget-rcp-hist-basic") + "]");
    } else {
      $newMark.addClass("gadget-rcp-diff-pending");
      $newMark.text("[" + msg("gadget-rcp-hist-pending") + "]");
    }
    if (hasPatrol && rcpOptions.multiPatrol && $(".diff-multi").length > 0) {
      const revidsToPatrol = [];
      recentchanges.forEach((recentchange) => {
        if (recentchange.revid <= mw.config.get("wgDiffOldId")) {
          return;
        }
        if (recentchange.revid <= mw.config.get("wgDiffNewId") && recentchange.patrolled === void 0) {
          revidsToPatrol.push(recentchange.revid);
        }
      });
      if (revidsToPatrol.length > 0) {
        const $diffMulti = $(".diff-multi").first();
        const $mutilPatrol = $("<span>").addClass("gadget-rcp-multi-patrol").appendTo($diffMulti);
        const $mutilPatrolLink = $("<a>").attr("href", "#").text(msg("gadget-rcp-patrol-multi", revidsToPatrol.length));
        $mutilPatrolLink.on("click", function(e) {
          e.preventDefault();
          if (rcpOptions.multiPatrolConfirm && !confirm(msg("gadget-rcp-patrol-multi-confirm", revidsToPatrol.length))) {
            return;
          }
          $(".patrollink").remove();
          $mutilPatrol.remove();
          revidsToPatrol.forEach((revid) => {
            api.postWithToken("patrol", {
              action: "patrol",
              revid
            }).done(() => {
              mw.notify(msg("gadget-rcp-patrol-notify", revid));
            });
          });
        });
        $mutilPatrol.append(document.createTextNode("["));
        $mutilPatrol.append($mutilPatrolLink);
        $mutilPatrol.append(document.createTextNode("]"));
      }
    }
  }
  function addPatrolLinksInRC() {
    $(".mw-changeslist-reviewstatus-unpatrolled").each(function(key, change) {
      const revid = $(change).data("mw-revid");
      const $rcPatrol = $("<span>").addClass("gadget-rcp-rc-patrol").appendTo(change);
      const $rcPatrolLink = $("<a>").attr("href", "#").text(msg("gadget-rcp-patrol"));
      $rcPatrolLink.on("click", function(e) {
        e.preventDefault();
        $rcPatrol.remove();
        $(change).find(".unpatrolled").remove();
        api.postWithToken("patrol", {
          action: "patrol",
          revid
        }).done(() => {
          mw.notify(msg("gadget-rcp-patrol-notify", revid));
        });
      });
      $rcPatrol.append(document.createTextNode("["));
      $rcPatrol.append($rcPatrolLink);
      $rcPatrol.append(document.createTextNode("]"));
    });
  }
  async function main() {
    rcpOptions = {
      ...rcpOptions,
      ...window.RCPatrolOptions
    };
    if (mw.config.get("wgAction") === "history") {
      await getPatrolRecords();
      if (hasPatrol) {
        markHistByRC();
      } else {
        markHistWithoutRC();
      }
      markHistByAutopatrollers();
      markHistByPatrolLog();
    }
    if (mw.config.get("wgDiffNewId") && mw.config.get("wgDiffOldId")) {
      await getPatrolRecords();
      mw.hook("wikipage.diff").add(markDiffPatrolStatus);
    }
    if (hasPatrol && ["Recentchanges", "Recentchangeslinked", "Watchlist"].includes(mw.config.get("wgCanonicalSpecialPageName")) && rcpOptions.patrolInRC) {
      mw.hook("wikipage.content").add(function(item) {
        if (item.is("div")) {
          addPatrolLinksInRC();
        }
      });
    }
  }
  main();
})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUkNQYXRyb2wuaWlmZS5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL1JDUGF0cm9sLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBoYW5zTG9jYWxlIGZyb20gJy4uL2kxOG4vemgtaGFucy5qc29uJztcbmltcG9ydCBoYW50TG9jYWxlIGZyb20gJy4uL2kxOG4vemgtaGFudC5qc29uJztcblxuJC5pMThuKHtcblx0bG9jYWxlOiBtdy5jb25maWcuZ2V0KCd3Z1VzZXJMYW5ndWFnZScpLFxufSk7XG4kLmkxOG4oKS5sb2FkKHtcblx0J3poLWhhbnMnOiBoYW5zTG9jYWxlLFxuXHQnemgtaGFudCc6IGhhbnRMb2NhbGUsXG59KTtcbmZ1bmN0aW9uIG1zZyhrZXksIC4uLnBhcmFtZXRlcnMpIHtcblx0aWYgKCFtdy5tZXNzYWdlcy5leGlzdHMoa2V5KSkge1xuXHRcdG13Lm1lc3NhZ2VzLnNldChrZXksICQuaTE4bihrZXkpKTtcblx0fVxuXHRyZXR1cm4gbXcubWVzc2FnZShrZXksIC4uLnBhcmFtZXRlcnMpLnRleHQoKTtcbn1cbmZ1bmN0aW9uIHBhcnNlZG1zZyhrZXksIC4uLnBhcmFtZXRlcnMpIHtcblx0aWYgKCFtdy5tZXNzYWdlcy5leGlzdHMoa2V5KSkge1xuXHRcdG13Lm1lc3NhZ2VzLnNldChrZXksICQuaTE4bihrZXkpKTtcblx0fVxuXHRyZXR1cm4gbXcubWVzc2FnZShrZXksIC4uLnBhcmFtZXRlcnMpLnBhcnNlKCk7XG59XG5cbmNvbnN0IGFwaSA9IG5ldyBtdy5BcGkoKTtcbmNvbnN0IGhhc1BhdHJvbCA9IG13LmNvbmZpZy5nZXQoJ3dnVXNlckdyb3VwcycpLmluY2x1ZGVzKCdwYXRyb2xsZXInKSB8fCBtdy5jb25maWcuZ2V0KCd3Z1VzZXJHcm91cHMnKS5pbmNsdWRlcygnc3lzb3AnKTtcblxubGV0IHJjcE9wdGlvbnMgPSB7XG5cdG11bHRpUGF0cm9sOiBmYWxzZSxcblx0bXVsdGlQYXRyb2xDb25maXJtOiB0cnVlLFxuXHRwYXRyb2xJblJDOiBmYWxzZSxcbn07XG5cbi8qKlxuICog5pyA6L+R5beh5p+l55qE54mI5pysSUTvvIzngrrku6XkuIvmlbjlgLzkuK3nmoTmnIDlpKflgLxcbiAqIDEuIOWmguaenOaykuacieS7u+S9leacgOi/keabtOaUue+8iDMw5aSp77yJ77yM5YmH54K655uu5YmN54mI5pysSURcbiAqIDIuIO+8iOWwjeaWvOW3oeafpeWToe+8ieacgOi/keabtOaUueS4reeahOacgOi/keW3oeafpeaomeiomFxuICogMy4g77yI5bCN5pa86Z2e5beh5p+l5ZOh77yJ5beh5p+l5pel6KqM5Lit55qE54mI5pysSURcbiAqIDQuIO+8iOWwjeaWvOmdnuW3oeafpeWToe+8ieacgOi/keabtOaUueS4reWxrOaWvOW3oeafpeixgeWFjeiAheeahOeJiOacrElEXG4gKi9cbnZhciBsYXN0X3BhdHJvbGxlZF9yZXZpZCA9IDA7XG5cbi8qKlxuICog5pyA6L+R5pu05pS55Lit5pyA6ICB55qE54mI5pys55qE5YmN5LiA54mI5pysSURcbiAqIOWmguaenOaykuacieacgOi/keabtOaUueWJh+eCuuebruWJjeeJiOacrElEXG4gKi9cbnZhciBsYXN0X3JjX3JldmlkID0gMDtcblxudmFyIHJlY2VudGNoYW5nZXMgPSBudWxsO1xudmFyIGF1dG9wYXRyb2xsZXJzID0gW107XG52YXIgcGF0cm9sX2xvZ3MgPSBudWxsO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRBdXRvcGF0cm9sbGVycygpIHtcblx0aWYgKGF1dG9wYXRyb2xsZXJzLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRsZXQgcXVlcnkgPSB7XG5cdFx0J2FjdGlvbic6ICdxdWVyeScsXG5cdFx0J2Zvcm1hdCc6ICdqc29uJyxcblx0XHQnbGlzdCc6ICdhbGx1c2VycycsXG5cdFx0J2F1cmlnaHRzJzogJ2F1dG9wYXRyb2wnLFxuXHRcdCdhdWxpbWl0JzogJ21heCdcblx0fVxuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdGxldCBkYXRhID0gYXdhaXQgYXBpLmdldChxdWVyeSk7XG5cdFx0Zm9yIChjb25zdCB1c2VyIG9mIGRhdGEucXVlcnkuYWxsdXNlcnMpIHtcblx0XHRcdGF1dG9wYXRyb2xsZXJzLnB1c2godXNlci5uYW1lKTtcblx0XHR9XG5cdFx0aWYgKGRhdGEuY29udGludWUpIHtcblx0XHRcdHF1ZXJ5ID0geyAuLi5xdWVyeSwgLi4uZGF0YS5jb250aW51ZSB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UGF0cm9sTG9ncygpIHtcblx0aWYgKHBhdHJvbF9sb2dzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0YXdhaXQgYXBpLmdldCh7XG5cdFx0J2FjdGlvbic6ICdxdWVyeScsXG5cdFx0J2Zvcm1hdCc6ICdqc29uJyxcblx0XHQnbGlzdCc6ICdsb2dldmVudHMnLFxuXHRcdCdsZXByb3AnOiAndXNlcnxkZXRhaWxzJyxcblx0XHQnbGVhY3Rpb24nOiAncGF0cm9sL3BhdHJvbCcsXG5cdFx0J2xldGl0bGUnOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0J2xlbGltaXQnOiAnbWF4Jyxcblx0fSkudGhlbihmdW5jdGlvbihkYXRhKSB7XG5cdFx0cGF0cm9sX2xvZ3MgPSBkYXRhLnF1ZXJ5LmxvZ2V2ZW50cztcblx0fSk7XG5cblx0cGF0cm9sX2xvZ3MuZm9yRWFjaChsb2cgPT4ge1xuXHRcdGxhc3RfcGF0cm9sbGVkX3JldmlkID0gTWF0aC5tYXgobGFzdF9wYXRyb2xsZWRfcmV2aWQsIGxvZy5wYXJhbXMuY3VyaWQpO1xuXHR9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UGF0cm9sUmVjb3JkcygpIHtcblx0aWYgKHJlY2VudGNoYW5nZXMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRsZXQgcXVlcnkgPSB7XG5cdFx0J2FjdGlvbic6ICdxdWVyeScsXG5cdFx0J2Zvcm1hdCc6ICdqc29uJyxcblx0XHQnbGlzdCc6ICdyZWNlbnRjaGFuZ2VzJyxcblx0XHQncmN0eXBlJzogJ2VkaXR8bmV3Jyxcblx0XHQncmNwcm9wJzogJ2lkcycsXG5cdFx0J3JjbGltaXQnOiAnbWF4Jyxcblx0XHQncmN0aXRsZSc6IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0fTtcblx0aWYgKGhhc1BhdHJvbCkge1xuXHRcdHF1ZXJ5LnJjcHJvcCArPSAnfHBhdHJvbGxlZCc7XG5cdH0gZWxzZSB7XG5cdFx0cXVlcnkucmNwcm9wICs9ICd8dXNlcic7XG5cdH1cblxuXHRhd2FpdCBhcGkuZ2V0KHF1ZXJ5KS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRyZWNlbnRjaGFuZ2VzID0gZGF0YS5xdWVyeS5yZWNlbnRjaGFuZ2VzO1xuXHR9KTtcblxuXHRpZiAoIWhhc1BhdHJvbCkge1xuXHRcdGF3YWl0IGdldEF1dG9wYXRyb2xsZXJzKCk7XG5cdFx0YXdhaXQgZ2V0UGF0cm9sTG9ncygpO1xuXHR9XG5cblx0aWYgKHJlY2VudGNoYW5nZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0bGFzdF9wYXRyb2xsZWRfcmV2aWQgPSBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKTtcblx0XHRsYXN0X3JjX3JldmlkID0gbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJyk7XG5cdH0gZWxzZSB7XG5cdFx0bGFzdF9wYXRyb2xsZWRfcmV2aWQgPSBNYXRoLm1heChsYXN0X3BhdHJvbGxlZF9yZXZpZCwgcmVjZW50Y2hhbmdlc1tyZWNlbnRjaGFuZ2VzLmxlbmd0aCAtIDFdLm9sZF9yZXZpZCk7XG5cdFx0bGFzdF9yY19yZXZpZCA9IHJlY2VudGNoYW5nZXNbcmVjZW50Y2hhbmdlcy5sZW5ndGggLSAxXS5vbGRfcmV2aWQ7XG5cdFx0aWYgKGhhc1BhdHJvbCkge1xuXHRcdFx0cmVjZW50Y2hhbmdlcy5mb3JFYWNoKHJlY2VudGNoYW5nZSA9PiB7XG5cdFx0XHRcdGlmIChyZWNlbnRjaGFuZ2UucGF0cm9sbGVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRsYXN0X3BhdHJvbGxlZF9yZXZpZCA9IE1hdGgubWF4KGxhc3RfcGF0cm9sbGVkX3JldmlkLCByZWNlbnRjaGFuZ2UucmV2aWQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlY2VudGNoYW5nZXMuZm9yRWFjaChyZWNlbnRjaGFuZ2UgPT4ge1xuXHRcdFx0XHQvLyDlt6Hmn6XosYHlhY3ogIXnmoTnt6jovK9cblx0XHRcdFx0aWYgKGF1dG9wYXRyb2xsZXJzLmluY2x1ZGVzKHJlY2VudGNoYW5nZS51c2VyKSkge1xuXHRcdFx0XHRcdGxhc3RfcGF0cm9sbGVkX3JldmlkID0gTWF0aC5tYXgobGFzdF9wYXRyb2xsZWRfcmV2aWQsIHJlY2VudGNoYW5nZS5yZXZpZCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbWFya0hpc3RCeVJDKCkge1xuXHRyZWNlbnRjaGFuZ2VzLmZvckVhY2gocmVjZW50Y2hhbmdlID0+IHtcblx0XHRsZXQgJGNvbnRyaWJ1dGlvbl9yb3cgPSAkKCcubXctY29udHJpYnV0aW9ucy1saXN0IGxpW2RhdGEtbXctcmV2aWQ9JyArIHJlY2VudGNoYW5nZS5yZXZpZCArICddJyk7XG5cdFx0aWYgKHJlY2VudGNoYW5nZS5hdXRvcGF0cm9sbGVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdCRjb250cmlidXRpb25fcm93LmFkZENsYXNzKCdnYWRnZXQtcmNwLWF1dG9wYXRyb2xsZWQnKTtcblx0XHRcdCQoJzxzcGFuPicpLnRleHQoJ1snICsgbXNnKCdnYWRnZXQtcmNwLWhpc3QtYmFzaWMtYXV0bycpICsgJ10nKS5hZGRDbGFzcygnZ2FkZ2V0LXJjcC1oaXN0LWJhc2ljLWF1dG8nKS5hcHBlbmRUbygkY29udHJpYnV0aW9uX3Jvdyk7XG5cdFx0fSBlbHNlIGlmIChyZWNlbnRjaGFuZ2UucGF0cm9sbGVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdCRjb250cmlidXRpb25fcm93LmFkZENsYXNzKCdnYWRnZXQtcmNwLXBhdHJvbGxlZCcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkY29udHJpYnV0aW9uX3Jvdy5hZGRDbGFzcygnZ2FkZ2V0LXJjcC11bnBhdHJvbGxlZCcpO1xuXHRcdFx0aWYgKHJlY2VudGNoYW5nZS5yZXZpZCA+IGxhc3RfcGF0cm9sbGVkX3JldmlkKSB7XG5cdFx0XHRcdCRjb250cmlidXRpb25fcm93LmFkZENsYXNzKCdnYWRnZXQtcmNwLXBlbmRpbmcnKTtcblx0XHRcdFx0aWYgKGxhc3RfcGF0cm9sbGVkX3JldmlkID4gMCkge1xuXHRcdFx0XHRcdCQoJzxzcGFuPicpLmh0bWwoJ1snICsgcGFyc2VkbXNnKCdnYWRnZXQtcmNwLWhpc3QtcGVuZGluZy1kaWZmbGluaycsIGxhc3RfcGF0cm9sbGVkX3JldmlkLCByZWNlbnRjaGFuZ2UucmV2aWQpICsgJ10nKS5hZGRDbGFzcygnZ2FkZ2V0LXJjcC1oaXN0LWRpZmZsaW5rJykuYXBwZW5kVG8oJGNvbnRyaWJ1dGlvbl9yb3cpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFya0hpc3RCeVBhdHJvbExvZygpIHtcblx0YXdhaXQgZ2V0UGF0cm9sTG9ncygpO1xuXG5cdHBhdHJvbF9sb2dzLmZvckVhY2gobG9nID0+IHtcblx0XHRsZXQgJGNvbnRyaWJ1dGlvbl9yb3cgPSAkKCcubXctY29udHJpYnV0aW9ucy1saXN0IGxpW2RhdGEtbXctcmV2aWQ9JyArIGxvZy5wYXJhbXMuY3VyaWQgKyAnXScpO1xuXHRcdCQoJzxzcGFuPicpLmh0bWwoJ1snICsgcGFyc2VkbXNnKCdnYWRnZXQtcmNwLWhpc3QtYmFzaWMtdXNlcicsIGxvZy51c2VyKSArICddJykuYWRkQ2xhc3MoJ2dhZGdldC1yY3AtaGlzdC1iYXNpYy11c2VyJykuYXBwZW5kVG8oJGNvbnRyaWJ1dGlvbl9yb3cpO1xuXHRcdCRjb250cmlidXRpb25fcm93LmFkZENsYXNzKCdnYWRnZXQtcmNwLXBhdHJvbGxlZCcpO1xuXHR9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFya0hpc3RCeUF1dG9wYXRyb2xsZXJzKCkge1xuXHRhd2FpdCBnZXRBdXRvcGF0cm9sbGVycygpO1xuXG5cdGZvciAoY29uc3QgY29udHJpYnV0aW9uX3JvdyBvZiAkKCcubXctY29udHJpYnV0aW9ucy1saXN0IGxpJykpIHtcblx0XHRjb25zdCByZXZpZCA9ICQoY29udHJpYnV0aW9uX3JvdykuZGF0YSgnbXctcmV2aWQnKTtcblx0XHRjb25zdCB1c2VybmFtZSA9ICQoY29udHJpYnV0aW9uX3JvdykuZmluZCgnLmhpc3RvcnktdXNlciBhIGJkaScpLnRleHQoKTtcblx0XHRpZiAoYXV0b3BhdHJvbGxlcnMuaW5jbHVkZXModXNlcm5hbWUpICYmICghaGFzUGF0cm9sIHx8IHJldmlkIDw9IGxhc3RfcmNfcmV2aWQpKSB7XG5cdFx0XHQkKGNvbnRyaWJ1dGlvbl9yb3cpLmFkZENsYXNzKCdnYWRnZXQtcmNwLWF1dG9wYXRyb2xsZWQnKTtcblx0XHRcdCQoJzxzcGFuPicpLnRleHQoJ1snICsgbXNnKCdnYWRnZXQtcmNwLWhpc3QtYmFzaWMtYXV0bycpICsgJ10nKS5hZGRDbGFzcygnZ2FkZ2V0LXJjcC1oaXN0LWJhc2ljLWF1dG8nKS5hcHBlbmRUbyhjb250cmlidXRpb25fcm93KTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbWFya0hpc3RXaXRob3V0UkMoKSB7XG5cdGZvciAoY29uc3QgY29udHJpYnV0aW9uX3JvdyBvZiAkKCcubXctY29udHJpYnV0aW9ucy1saXN0IGxpJykpIHtcblx0XHRjb25zdCByZXZpZCA9ICQoY29udHJpYnV0aW9uX3JvdykuZGF0YSgnbXctcmV2aWQnKTtcblx0XHRpZiAocmV2aWQgPiBsYXN0X3BhdHJvbGxlZF9yZXZpZCkge1xuXHRcdFx0JChjb250cmlidXRpb25fcm93KS5hZGRDbGFzcygnZ2FkZ2V0LXJjcC1wZW5kaW5nJyk7XG5cdFx0XHRpZiAobGFzdF9wYXRyb2xsZWRfcmV2aWQgPiAwKSB7XG5cdFx0XHRcdCQoJzxzcGFuPicpLmh0bWwoJ1snICsgcGFyc2VkbXNnKCdnYWRnZXQtcmNwLWhpc3QtcGVuZGluZy1kaWZmbGluaycsIGxhc3RfcGF0cm9sbGVkX3JldmlkLCByZXZpZCkgKyAnXScpLmFkZENsYXNzKCdnYWRnZXQtcmNwLWhpc3QtZGlmZmxpbmsnKS5hcHBlbmRUbygkKGNvbnRyaWJ1dGlvbl9yb3cpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbWFya0RpZmZQYXRyb2xTdGF0dXMoKSB7XG5cdGNvbnN0ICRkaWZmSGVhZGVySXRlbXMgPSAkKCc8ZGl2PicpLmF0dHIoJ2lkJywgJ2dhZGdldC1yY3AtZGlmZi1oZWFkZXJpdGVtcycpLmluc2VydEJlZm9yZSgnI213LWNvbnRlbnQtdGV4dCB0YWJsZS5kaWZmJyk7XG5cdGNvbnN0ICRkaWZmVG9TdGFibGUgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdnYWRnZXQtcmNwLWRpZmYtdG8tc3RhYmxlJykuYXBwZW5kVG8oJGRpZmZIZWFkZXJJdGVtcyk7XG5cdCRkaWZmVG9TdGFibGUuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KTtcblxuXHRpZiAobGFzdF9wYXRyb2xsZWRfcmV2aWQgPiAwXG5cdFx0JiYgbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJykgIT0gbGFzdF9wYXRyb2xsZWRfcmV2aWRcblx0XHQmJiAobXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSAhPSBsYXN0X3BhdHJvbGxlZF9yZXZpZFxuXHRcdFx0fHwgbXcuY29uZmlnLmdldCgnd2dEaWZmTmV3SWQnKSAhPSBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSlcblx0KSB7XG5cdFx0JGRpZmZUb1N0YWJsZS5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ++8iCcpKTtcblx0XHQkZGlmZlRvU3RhYmxlLmFwcGVuZChcblx0XHRcdCQoJzxhPicpXG5cdFx0XHRcdC5hdHRyKCdocmVmJywgbXcudXRpbC5nZXRVcmwobnVsbCwgeyBvbGRpZDogbGFzdF9wYXRyb2xsZWRfcmV2aWQsIGRpZmY6ICdjdXInIH0pKVxuXHRcdFx0XHQudGV4dChtc2coJ2dhZGdldC1yY3AtZGlmZjJzdGFibGUnKSlcblx0XHQpO1xuXHRcdCRkaWZmVG9TdGFibGUuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCfvvIknKSk7XG5cdH1cblxuXHRjb25zdCAkcmF0aW5nc1RhYmxlID0gJCgnPHRhYmxlPicpLmFkZENsYXNzKCdnYWRnZXQtcmNwLWRpZmYtcmF0aW5ncycpLmFwcGVuZFRvKCRkaWZmSGVhZGVySXRlbXMpO1xuXG5cdGNvbnN0ICRvbGRXcmFwcGVyID0gJCgnPHRkPicpLmFkZENsYXNzKCdnYWRnZXQtcmNwLWRpZmYtb2xkJyk7XG5cdCRvbGRXcmFwcGVyLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicsICd3aWR0aCc6ICc1MCUnIH0pO1xuXHRjb25zdCAkbmV3V3JhcHBlciA9ICQoJzx0ZD4nKS5hZGRDbGFzcygnZ2FkZ2V0LXJjcC1kaWZmLW5ldycpO1xuXHQkbmV3V3JhcHBlci5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInLCAnd2lkdGgnOiAnNTAlJyB9KTtcblxuXHQkcmF0aW5nc1RhYmxlXG5cdFx0LmFwcGVuZCgkKCc8dGJvZHk+Jylcblx0XHRcdC5hcHBlbmQoJCgnPHRyPicpXG5cdFx0XHRcdC5hcHBlbmQoJG9sZFdyYXBwZXIpXG5cdFx0XHRcdC5hcHBlbmQoJG5ld1dyYXBwZXIpXG5cdFx0XHQpXG5cdFx0KTtcblxuXHRjb25zdCAkb2xkTWFyayA9ICQoJzxzcGFuPicpLmF0dHIoJ2lkJywgJ2dhZGdldC1yY3AtZGlmZi1vbGQtc3RhdHVzJykuYXBwZW5kVG8oJG9sZFdyYXBwZXIpO1xuXHRpZiAobXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSA8PSBsYXN0X3BhdHJvbGxlZF9yZXZpZCkge1xuXHRcdCRvbGRNYXJrLmFkZENsYXNzKCdnYWRnZXQtcmNwLWRpZmYtcGF0cm9sbGVkJyk7XG5cdFx0JG9sZE1hcmsudGV4dCgnWycgKyBtc2coJ2dhZGdldC1yY3AtaGlzdC1iYXNpYycpICsgJ10nKTtcblx0fSBlbHNlIHtcblx0XHQkb2xkTWFyay5hZGRDbGFzcygnZ2FkZ2V0LXJjcC1kaWZmLXBlbmRpbmcnKTtcblx0XHQkb2xkTWFyay50ZXh0KCdbJyArIG1zZygnZ2FkZ2V0LXJjcC1oaXN0LXBlbmRpbmcnKSArICddJyk7XG5cdH1cblxuXHRjb25zdCAkbmV3TWFyayA9ICQoJzxzcGFuPicpLmF0dHIoJ2lkJywgJ2dhZGdldC1yY3AtZGlmZi1uZXctc3RhdHVzJykuYXBwZW5kVG8oJG5ld1dyYXBwZXIpO1xuXHRpZiAobXcuY29uZmlnLmdldCgnd2dEaWZmTmV3SWQnKSA8PSBsYXN0X3BhdHJvbGxlZF9yZXZpZCkge1xuXHRcdCRuZXdNYXJrLmFkZENsYXNzKCdnYWRnZXQtcmNwLWRpZmYtcGF0cm9sbGVkJyk7XG5cdFx0JG5ld01hcmsudGV4dCgnWycgKyBtc2coJ2dhZGdldC1yY3AtaGlzdC1iYXNpYycpICsgJ10nKTtcblx0fSBlbHNlIHtcblx0XHQkbmV3TWFyay5hZGRDbGFzcygnZ2FkZ2V0LXJjcC1kaWZmLXBlbmRpbmcnKTtcblx0XHQkbmV3TWFyay50ZXh0KCdbJyArIG1zZygnZ2FkZ2V0LXJjcC1oaXN0LXBlbmRpbmcnKSArICddJyk7XG5cdH1cblxuXHRpZiAoaGFzUGF0cm9sICYmIHJjcE9wdGlvbnMubXVsdGlQYXRyb2wgJiYgJCgnLmRpZmYtbXVsdGknKS5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgcmV2aWRzVG9QYXRyb2wgPSBbXTtcblx0XHRyZWNlbnRjaGFuZ2VzLmZvckVhY2gocmVjZW50Y2hhbmdlID0+IHtcblx0XHRcdGlmIChyZWNlbnRjaGFuZ2UucmV2aWQgPD0gbXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVjZW50Y2hhbmdlLnJldmlkIDw9IG13LmNvbmZpZy5nZXQoJ3dnRGlmZk5ld0lkJykgJiYgcmVjZW50Y2hhbmdlLnBhdHJvbGxlZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldmlkc1RvUGF0cm9sLnB1c2gocmVjZW50Y2hhbmdlLnJldmlkKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmIChyZXZpZHNUb1BhdHJvbC5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCAkZGlmZk11bHRpID0gJCgnLmRpZmYtbXVsdGknKS5maXJzdCgpO1xuXHRcdFx0Y29uc3QgJG11dGlsUGF0cm9sID0gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ2dhZGdldC1yY3AtbXVsdGktcGF0cm9sJykuYXBwZW5kVG8oJGRpZmZNdWx0aSk7XG5cdFx0XHRjb25zdCAkbXV0aWxQYXRyb2xMaW5rID0gJCgnPGE+JykuYXR0cignaHJlZicsICcjJykudGV4dChtc2coJ2dhZGdldC1yY3AtcGF0cm9sLW11bHRpJywgcmV2aWRzVG9QYXRyb2wubGVuZ3RoKSk7XG5cdFx0XHQkbXV0aWxQYXRyb2xMaW5rLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRpZiAocmNwT3B0aW9ucy5tdWx0aVBhdHJvbENvbmZpcm1cblx0XHRcdFx0XHQmJiAhY29uZmlybShtc2coJ2dhZGdldC1yY3AtcGF0cm9sLW11bHRpLWNvbmZpcm0nLCByZXZpZHNUb1BhdHJvbC5sZW5ndGgpKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQkKCcucGF0cm9sbGluaycpLnJlbW92ZSgpO1xuXHRcdFx0XHQkbXV0aWxQYXRyb2wucmVtb3ZlKCk7XG5cblx0XHRcdFx0cmV2aWRzVG9QYXRyb2wuZm9yRWFjaChyZXZpZCA9PiB7XG5cdFx0XHRcdFx0YXBpLnBvc3RXaXRoVG9rZW4oJ3BhdHJvbCcsIHtcblx0XHRcdFx0XHRcdGFjdGlvbjogJ3BhdHJvbCcsXG5cdFx0XHRcdFx0XHRyZXZpZDogcmV2aWQsXG5cdFx0XHRcdFx0fSkuZG9uZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHRtdy5ub3RpZnkobXNnKCdnYWRnZXQtcmNwLXBhdHJvbC1ub3RpZnknLCByZXZpZCkpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cblx0XHRcdCRtdXRpbFBhdHJvbC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1snKSk7XG5cdFx0XHQkbXV0aWxQYXRyb2wuYXBwZW5kKCRtdXRpbFBhdHJvbExpbmspO1xuXHRcdFx0JG11dGlsUGF0cm9sLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXScpKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYWRkUGF0cm9sTGlua3NJblJDKCkge1xuXHQkKCcubXctY2hhbmdlc2xpc3QtcmV2aWV3c3RhdHVzLXVucGF0cm9sbGVkJykuZWFjaChmdW5jdGlvbihrZXksIGNoYW5nZSkge1xuXHRcdGNvbnN0IHJldmlkID0gJChjaGFuZ2UpLmRhdGEoJ213LXJldmlkJyk7XG5cblx0XHRjb25zdCAkcmNQYXRyb2wgPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnZ2FkZ2V0LXJjcC1yYy1wYXRyb2wnKS5hcHBlbmRUbyhjaGFuZ2UpO1xuXHRcdGNvbnN0ICRyY1BhdHJvbExpbmsgPSAkKCc8YT4nKS5hdHRyKCdocmVmJywgJyMnKS50ZXh0KG1zZygnZ2FkZ2V0LXJjcC1wYXRyb2wnKSk7XG5cdFx0JHJjUGF0cm9sTGluay5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdCRyY1BhdHJvbC5yZW1vdmUoKTtcblx0XHRcdCQoY2hhbmdlKS5maW5kKCcudW5wYXRyb2xsZWQnKS5yZW1vdmUoKTtcblxuXHRcdFx0YXBpLnBvc3RXaXRoVG9rZW4oJ3BhdHJvbCcsIHtcblx0XHRcdFx0YWN0aW9uOiAncGF0cm9sJyxcblx0XHRcdFx0cmV2aWQ6IHJldmlkLFxuXHRcdFx0fSkuZG9uZSgoKSA9PiB7XG5cdFx0XHRcdG13Lm5vdGlmeShtc2coJ2dhZGdldC1yY3AtcGF0cm9sLW5vdGlmeScsIHJldmlkKSk7XG5cdFx0XHR9KTtcblx0XHR9KVxuXG5cdFx0JHJjUGF0cm9sLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnWycpKTtcblx0XHQkcmNQYXRyb2wuYXBwZW5kKCRyY1BhdHJvbExpbmspO1xuXHRcdCRyY1BhdHJvbC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ10nKSk7XG5cdH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuXHRyY3BPcHRpb25zID0geyAuLi5yY3BPcHRpb25zLCAuLi53aW5kb3cuUkNQYXRyb2xPcHRpb25zIH07XG5cblx0LyoqXG5cdCAqIOWcqOatt+WPsumggemdouaomeiomOacquW3oeafpee3qOi8r1xuXHQgKi9cblx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICdoaXN0b3J5Jykge1xuXHRcdGF3YWl0IGdldFBhdHJvbFJlY29yZHMoKTtcblx0XHRpZiAoaGFzUGF0cm9sKSB7XG5cdFx0XHRtYXJrSGlzdEJ5UkMoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWFya0hpc3RXaXRob3V0UkMoKTtcblx0XHR9XG5cdFx0bWFya0hpc3RCeUF1dG9wYXRyb2xsZXJzKCk7XG5cdFx0bWFya0hpc3RCeVBhdHJvbExvZygpO1xuXHR9XG5cdGlmIChtdy5jb25maWcuZ2V0KCd3Z0RpZmZOZXdJZCcpICYmIG13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJykpIHtcblx0XHRhd2FpdCBnZXRQYXRyb2xSZWNvcmRzKCk7XG5cdFx0bXcuaG9vaygnd2lraXBhZ2UuZGlmZicpLmFkZChtYXJrRGlmZlBhdHJvbFN0YXR1cyk7XG5cdH1cblx0aWYgKGhhc1BhdHJvbFxuXHRcdCYmIFsnUmVjZW50Y2hhbmdlcycsICdSZWNlbnRjaGFuZ2VzbGlua2VkJywgJ1dhdGNobGlzdCddLmluY2x1ZGVzKG13LmNvbmZpZy5nZXQoJ3dnQ2Fub25pY2FsU3BlY2lhbFBhZ2VOYW1lJykpXG5cdFx0JiYgcmNwT3B0aW9ucy5wYXRyb2xJblJDXG5cdCkge1xuXHRcdG13Lmhvb2soJ3dpa2lwYWdlLmNvbnRlbnQnKS5hZGQoZnVuY3Rpb24oaXRlbSkge1xuXHRcdFx0aWYgKGl0ZW0uaXMoJ2RpdicpKSB7XG5cdFx0XHRcdGFkZFBhdHJvbExpbmtzSW5SQygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbm1haW4oKTtcbiJdLCJuYW1lcyI6WyIkIiwiaTE4biIsImxvY2FsZSIsIm13IiwiY29uZmlnIiwiZ2V0IiwibG9hZCIsImhhbnNMb2NhbGUiLCJoYW50TG9jYWxlIiwia2V5IiwicGFyYW1ldGVycyIsIm1lc3NhZ2VzIiwiZXhpc3RzIiwic2V0IiwibWVzc2FnZSIsInRleHQiLCJwYXJzZSIsImFwaSIsIkFwaSIsImhhc1BhdHJvbCIsImluY2x1ZGVzIiwicmNwT3B0aW9ucyIsIm11bHRpUGF0cm9sIiwibXVsdGlQYXRyb2xDb25maXJtIiwicGF0cm9sSW5SQyIsImxhc3RfcGF0cm9sbGVkX3JldmlkIiwibGFzdF9yY19yZXZpZCIsInJlY2VudGNoYW5nZXMiLCJhdXRvcGF0cm9sbGVycyIsInBhdHJvbF9sb2dzIiwibGVuZ3RoIiwicXVlcnkiLCJkYXRhIiwidXNlciIsImFsbHVzZXJzIiwicHVzaCIsIm5hbWUiLCJjb250aW51ZSIsInRoZW4iLCJsb2dldmVudHMiLCJmb3JFYWNoIiwibG9nIiwiTWF0aCIsIm1heCIsInBhcmFtcyIsImN1cmlkIiwicmNwcm9wIiwiZ2V0QXV0b3BhdHJvbGxlcnMiLCJnZXRQYXRyb2xMb2dzIiwib2xkX3JldmlkIiwicmVjZW50Y2hhbmdlIiwicGF0cm9sbGVkIiwidW5kZWZpbmVkIiwicmV2aWQiLCIkY29udHJpYnV0aW9uX3JvdyIsImF1dG9wYXRyb2xsZWQiLCJhZGRDbGFzcyIsIm1zZyIsImFwcGVuZFRvIiwiaHRtbCIsInBhcnNlZG1zZyIsImNvbnRyaWJ1dGlvbl9yb3ciLCJ1c2VybmFtZSIsImZpbmQiLCIkZGlmZkhlYWRlckl0ZW1zIiwiYXR0ciIsImluc2VydEJlZm9yZSIsIiRkaWZmVG9TdGFibGUiLCJjc3MiLCJhcHBlbmQiLCJkb2N1bWVudCIsImNyZWF0ZVRleHROb2RlIiwidXRpbCIsImdldFVybCIsIm9sZGlkIiwiZGlmZiIsIiRyYXRpbmdzVGFibGUiLCIkb2xkV3JhcHBlciIsIiRuZXdXcmFwcGVyIiwiJG9sZE1hcmsiLCIkbmV3TWFyayIsInJldmlkc1RvUGF0cm9sIiwiJGRpZmZNdWx0aSIsImZpcnN0IiwiJG11dGlsUGF0cm9sIiwiJG11dGlsUGF0cm9sTGluayIsIm9uIiwiZSIsInByZXZlbnREZWZhdWx0IiwiY29uZmlybSIsInJlbW92ZSIsInBvc3RXaXRoVG9rZW4iLCJhY3Rpb24iLCJkb25lIiwibm90aWZ5IiwiZWFjaCIsImNoYW5nZSIsIiRyY1BhdHJvbCIsIiRyY1BhdHJvbExpbmsiLCJ3aW5kb3ciLCJSQ1BhdHJvbE9wdGlvbnMiLCJnZXRQYXRyb2xSZWNvcmRzIiwibWFya0hpc3RCeVJDIiwibWFya0hpc3RXaXRob3V0UkMiLCJtYXJrSGlzdEJ5QXV0b3BhdHJvbGxlcnMiLCJtYXJrSGlzdEJ5UGF0cm9sTG9nIiwiaG9vayIsImFkZCIsIm1hcmtEaWZmUGF0cm9sU3RhdHVzIiwiaXRlbSIsImlzIiwiYWRkUGF0cm9sTGlua3NJblJDIiwibWFpbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBQSxJQUFFQyxLQUFLO0FBQUEsSUFDTkMsUUFBUUMsR0FBR0MsT0FBT0MsSUFBSSxnQkFBZDtBQUFBLEVBREYsQ0FBUDtBQUdBTCxJQUFFQyxLQUFPSyxFQUFBQSxLQUFLO0FBQUEsSUFDYixXQUFXQztBQUFBQSxJQUNYLFdBQVdDO0FBQUFBLEVBRkUsQ0FBZDtBQUlBLGVBQWFDLFFBQVFDLFlBQVk7QUFDaEMsUUFBSSxDQUFDUCxHQUFHUSxTQUFTQyxPQUFPSCxHQUFuQixHQUF5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