MediaWiki:Gadget-EditConflict.js:修订间差异

MediaWiki系统消息页面
(导入1个版本:​小工具集导入 来源求闻百科[页面文字原许可:CC BY-SA 4.0])
(Git commit d323730: feat: 迁移多个小工具,引入编辑页面样式、脚本)
第1行: 第1行:
/**
/**
* SPDX-License-Identifier: CC-BY-SA-4.0
* SPDX-License-Identifier: GPL-3.0-or-later
* _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
* _addText: '{{Gadget Header|license=GPL-3.0-or-later}}'
*
*
* @source {@link https://github.com/TopRealm/YsArxiv-Gadgets/tree/master/src/EditConflict}
* @source <meta.wikimedia.org/wiki/User:Bluedeck/source/edit-conflict.js>
* @author 安忆 <i@anyi.in>
* @license GPL-3.0-or-later {@link https://youshou.wiki/wiki/H:GPLV3}
*/
*/
/**
* +------------------------------------------------------------+
* | === WARNING: GLOBAL GADGET FILE === |
* +------------------------------------------------------------+
* | All changes should be made in the repository, |
* | otherwise they will be lost. |
* +------------------------------------------------------------+
* | Changes to this page may affect many users. |
* | Please discuss changes by opening an issue before editing. |
* +------------------------------------------------------------+
*/
/* <nowiki> */

(() => {

"use strict";
"use strict";


// dist/EditConflict/EditConflict.js
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
try {
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
var info = gen[key](arg);
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
var value = info.value;
(function (ele, txt, time, condition) {
if (!condition) {
} catch (error) {
reject(error);
return;
return;
}
}
if (info.done) {
ele.innerHTML = "";
resolve(value);
(function (ele, txt, time) {
} else {
txt = txt.split("");
Promise.resolve(value).then(_next, _throw);
var len = txt.length,
rate = time / len;
for (var i = 0; i < len; i++) {
setTimeout(function () {
ele.innerHTML += txt.shift();
}, i * rate);
}
})(ele, txt, time);
})(document.getElementById("edit_conflict"), "2021.0.2", 400, document.getElementById("8c23b4144bd58c689e192c6ab912a3b75c76f6849977518b8bedefd5e347d67f"));
(function (w) {
// if not edit mode, abort
if (!/[&?]action=edit/.test(w.location.search)) {
return;
}
}
}
if ((mw.config.values.wgCurRevisionId || w.wgCurRevisionId) === 0) {
function _asyncToGenerator(fn) {
// the page does not exist, abort actions.
return function() {
return;
var self = this, args = arguments;
}
return new Promise(function(resolve, reject) {
var lang_code = "en_us";
var done = false;
var gen = fn.apply(self, args);
function _next(value) {
var interval_id = null;
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
var current_revid = mw.config.values.wgCurRevisionId || w.wgCurRevisionId;
var lang = {
notice: {
en_us: '<div>This page has been changed by someone else after you started editing. Copy your changes, refresh and start over to avoid edit conflicts. </div><div style="margin-top: 0.4em;"><button>OK</button>&nbsp;<button onclick="window.location.reload()">Refresh</button></div>',
zh_cn: '<div>本页面已被他人更改。请复制您的编辑,然后刷新页面,重新开始编辑,以避免编辑冲突。</div><div style="margin-top: 0.4em;"><button>OK</button>&nbsp;<button onclick="window.location.reload()">刷新</button></div>',
zh_hk: '<div>本頁已被他人更改。請將您的編輯複製,並重新載入頁面,然後繼續編輯,來避免編輯衝突。</div><div style="margin-top: 0.4em;"><button>OK</button>&nbsp;<button onclick="window.location.reload()">重新載入</button></div>'
}
};

// libs
var ding = window.DingExposedInterface;
var acc_lang = function () {
var PREVENT_INFINITE_LOOP = 1000;
var accepted_languages_dict = {
// lang_code
en: "en_us",
enau: "en_au",
enca: "en_ca",
enhk: "en_hk",
ennz: "en_nz",
enuk: "en_uk",
enus: "en_us",
zh: "zh_cn",
zhcn: "zh_cn",
zhhk: "zh_hk",
zhmo: "zh_mo",
zhtw: "zh_tw",
zhsg: "zh_sg",
// country code
au: "en_au",
ca: "en_ca",
ch: "de_ch",
cn: "zh_cn",
hk: "zh_hk",
nz: "en_us",
tw: "zh_tw",
sg: "zh_cn",
uk: "en_uk",
us: "en_us",
// non-standard raw lang code
"zh-hans": "zh_cn",
"zh-hant": "zh_hk"
};
var Language_proximity_group = /*#__PURE__*/function () {
function Language_proximity_group(desc) {
_classCallCheck(this, Language_proximity_group);
this.parent = null;
this.desc = desc;
this.sub_groups = [];
this.languages = [];
}
}
function _throw(err) {
_createClass(Language_proximity_group, [{
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
key: "all",
value: function all() {
var all_codes = [];
for (var i = 0; i < this.languages.length; i++) {
all_codes = all_codes.concat(this.languages[i]);
}
for (var _i2 = 0; _i2 < this.sub_groups.length; _i2++) {
all_codes = all_codes.concat(this.sub_groups[_i2].all());
}
return all_codes;
}
}, {
key: "add_one",
value: function add_one(item) {
if (typeof item === "string" && this.languages.indexOf(item) === -1) {
this.languages.push(item);
} else if (_typeof(item) === "object" && item !== null && item.constructor === Language_proximity_group && this.sub_groups.indexOf(item) === -1) {
item.parent = this, this.sub_groups.push(item);
} else {
throw new TypeError("cannot add this item ".concat(_typeof(item), ". add only language code and proximity groups."));
}
return this;
}
}, {
key: "add",
value: function add() {
for (var i = 0; i < arguments.length; i++) {
this.add_one(arguments[i]);
}
return this;
}

// return the group in which the language code resides.
}, {
key: "group_of",
value: function group_of(code_or_desc) {
if (this.languages.indexOf(code_or_desc) !== -1) {
// desired language is in this group
return this;
} else if (this.all().indexOf(code_or_desc) !== -1) {
// desired language is not in this group, but in a sub group of this group
for (var i = 0; i < this.sub_groups.length; i++) {
var search_result = this.sub_groups[i].group_of(code_or_desc);
if (search_result !== null) {
return search_result;
}
}
// search has finished but all subgroups returned null, which should not happen since the desired language is alleged to be in one of these sub groups, as per the opening condition of this if-else ladder.
console.log("reporting a [peculiarity], see line 90 of dependencies/accepted_languages.js. this line is never intended to be executed.");
return null;
} else if (this.desc === code_or_desc) {
// this is the desired group
return this;
}

// desired language is not in this group
return null;
}
}]);
return Language_proximity_group;
}();
var group_north_am_eng = new Language_proximity_group("en_north_american").add("en_us", "en_ca");
var group_australian_eng = new Language_proximity_group("en_au_nz").add("en_nz", "en_au");
var group_dominant_english = new Language_proximity_group("en_native").add("en_uk", group_north_am_eng, group_australian_eng);
var group_english = new Language_proximity_group("en").add(group_dominant_english, "en_sg", "en_hk");
var group_european = new Language_proximity_group("european").add(group_english);
var group_zh_hans = new Language_proximity_group("zh_hans").add("zh_cn", "zh_sg", "zh_mo");
var group_zh_hant = new Language_proximity_group("zh_hant").add("zh_hk", "zh_tw");
var group_zh = new Language_proximity_group("zh").add(group_zh_hans, group_zh_hant);
var group_asian = new Language_proximity_group("asian").add(group_zh);
var group_world = new Language_proximity_group("world").add(group_asian, group_european);
var accepted_languages = function accepted_languages(raw_lang_code) {
var all_acceptable_codes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
var processed_lang_code = String(raw_lang_code).toLowerCase().replace(/[^a-z]/g, "").slice(0, 4);
var processed_lang_code_short = processed_lang_code.slice(0, 2);
var best_match;
if (raw_lang_code in accepted_languages_dict) {
best_match = accepted_languages_dict[raw_lang_code];
} else if (processed_lang_code in accepted_languages_dict) {
best_match = accepted_languages_dict[processed_lang_code];
} else if (processed_lang_code_short in accepted_languages_dict) {
best_match = accepted_languages_dict[processed_lang_code_short];
} else {
best_match = null;
}
}
_next(void 0);
if (all_acceptable_codes === null || _typeof(all_acceptable_codes) !== "object" ||
});
// eslint-disable-next-line no-unsafe-negation
!all_acceptable_codes instanceof Array || all_acceptable_codes.length === 0 || all_acceptable_codes.indexOf(best_match) !== -1) {
return best_match;
}
var current_group = group_world.group_of(best_match);
if (current_group === null) {
return all_acceptable_codes[0];
}

// this was originally a while(true) loop, but i changed it into a for loop that will force quit if it runs more than a specified length,
// just as a fail safe in case the current_group.parent somehow referred to itself.
for (var i = 0; i < PREVENT_INFINITE_LOOP; i++) {
var close_match_group = current_group.all();
for (var _i4 = 0; _i4 < close_match_group.length; _i4++) {
if (all_acceptable_codes.indexOf(close_match_group[_i4]) !== -1) {
return close_match_group[_i4];
}
}
if (current_group.parent) {
current_group = current_group.parent;
} else {
return all_acceptable_codes[0];
}
}
console.log("[warning][peculiarity] produced at accepted_languages.js:175, forced jump out of a suspected 1k loop that should not happen. This indicates that a faulty language proximity group has one/multiple parent pointer(s) that formed a circle.");
return all_acceptable_codes[0];
};
return accepted_languages;
}();
var ui_notify = function ui_notify() {
ding(lang.notice[lang_code], "info", "long");
};
};
}
var expose = function () {
//! src/EditConflict/modules/constant.ts
var glb = {
url: mw.config.values.wgServer,
var WG_ACTION = mw.config.get("wgAction");
p: mw.config.values.wgPageName,
var WG_CUR_REVISION_ID = mw.config.get("wgCurRevisionId");
un: mw.config.values.wgUserName,
var WG_PAGE_NAME = mw.config.get("wgPageName");
var IS_WG_EDIT_OR_SUBMIT_ACTION = ["edit", "submit"].includes(WG_ACTION);
u: "User:".concat(mw.config.values.wgUserName),
//! src/EditConflict/modules/core.ts
ut: "User_talk:".concat(mw.config.values.wgUserName),
var import_ext_gadget3 = require("ext.gadget.Util");
t: null
//! src/EditConflict/options.json
};
var version = "2.0";
glb.a = "".concat(glb.url).concat(mw.config.get("wgScriptPath"), "/api.php");
//! src/EditConflict/modules/api.ts
var eur = encodeURIComponent;
var import_ext_gadget = require("ext.gadget.Util");
var asyncPost = function asyncPost(url, body, cb) {
var api = (0, import_ext_gadget.initMwApi)("EditConflict/".concat(version));
var z1 = "Content-Type";
//! src/EditConflict/modules/util/queryPageInfo.ts
var z2 = "application/x-www-form-urlencoded";
var parameters = {
var a = new XMLHttpRequest();
action: "query",
a.onreadystatechange = cb;
format: "json",
a.open("POST", url, true);
formatversion: "2",
a.setRequestHeader(z1, z2);
prop: "revisions",
a.send(body);
rvprop: "ids"
};
};
var getPage = function getPage(a, cb) {
var queryPageInfo = /* @__PURE__ */ function() {
var z = "action=query&prop=revisions&rvprop=ids|flags|timestamp|user|userid|size&format=json&titles=";
var _ref = _asyncToGenerator(function* (title) {
asyncPost(glb.a, z + eur(a), cb);
};
try {
return yield api.post({
var pickPageRevid = function pickPageRevid(a) {
var focus = "revid";
...parameters,
if (typeof a === "string") {
titles: title
var b = JSON.parse(a);
if (_typeof(b) === "object") {
for (var x in b.query.pages) {
var c = b.query.pages[x];
return c.revisions[0][focus];
}
} else {
return false;
}
// from now on pick functions will only work with string inputs. DO NOT parse pages before passing them into pick functions.
} else {
return false;
}
};
var tellPageExist = function tellPageExist(a) {
try {
a = JSON.parse(a);
} catch (e) {
return false;
}
if (_typeof(a) !== "object") {
return false;
}
if (!("query" in a)) {
return false;
}
if (!("pages" in a.query)) {
return false;
}
if (-1 in a.query.pages) {
return false;
}
return true;
};
var check_page_revid = function check_page_revid(title) {
// eslint-disable-next-line compat/compat, no-unused-vars
return new Promise(function (r, _s) {
getPage(title, function () {
if (this.readyState !== 4) {
return;
}
if (tellPageExist(this.responseText)) {
r(pickPageRevid(this.responseText));
} else {
r(null);
}
});
});
});
};
} catch (error) {
console.error("[EditConflict] Ajax error:", error);
return check_page_revid;
}();
return {};
// end of libs
var raw_lang_code = mw.config.get("wgUserLanguage") || navigator.language;
lang_code = acc_lang(raw_lang_code, ["en_us", "zh_cn", "zh_hk"]);
var main_loop = function main_loop() {
if (done) {
return;
}
}
});
expose(mw.config.values.wgPageName || w.wgPageName).then(function (a) {
return function queryPageInfo2(_x) {
if (a === null) {
return _ref.apply(this, arguments);
// the page does not exist. stop polling.
};
done = true;
}();
clearInterval(interval_id);
//! src/EditConflict/modules/getCurrentRevisionId.ts
} else if (a > current_revid) {
var getCurrentRevisionId = /* @__PURE__ */ function() {
ui_notify();
var _ref2 = _asyncToGenerator(function* (title) {
done = true;
const pageInfo = yield queryPageInfo(title);
if (interval_id !== null) {
const {
clearInterval(interval_id);
query
} = pageInfo;
if (!query) {
return 0;
}
const [page] = query.pages;
if (!page || page.missing) {
return 0;
}
return page.revisions[0].revid;
});
return function getCurrentRevisionId2(_x2) {
return _ref2.apply(this, arguments);
};
}();
//! src/EditConflict/modules/i18n.ts
var import_ext_gadget2 = require("ext.gadget.i18n");
var getI18nMessages = () => {
return {
Notice: (0, import_ext_gadget2.localize)({
en: '<span>This page has been changed by someone else after you started editing. Copy your changes, refresh and start over to avoid edit conflicts.<a href="#" onclick="location.reload();return false;">Refresh</a></span>',
ja: '<span>このページは他の人によって変更されています。編集衝突を避けるため、編集内容をコピーしてページを再読み込みし、編集を続けてください。<a href="#" onclick="location.reload();return false;">再読み込み</a></span>',
"zh-hans": '<span>此页面已被他人更改。请复制您的编辑,然后刷新页面,重新开始编辑,以避免编辑冲突。<a href="#" onclick="location.reload();return false;">刷新页面</a></span>',
"zh-hant": '<span>本頁已被他人更改。請將您的編輯複製,並重新載入頁面,然後繼續編輯,來避免編輯衝突。<a href="#" onclick="location.reload();return false;">重新載入</a></span>'
})
};
};
var i18nMessages = getI18nMessages();
var getMessage = (key) => {
return i18nMessages[key] || key;
};
//! src/EditConflict/modules/core.ts
var import_ext_gadget4 = require("ext.gadget.Toastify");
var editConflict = /* @__PURE__ */ function() {
var _ref3 = _asyncToGenerator(function* () {
let isContinue = true;
void (0, import_ext_gadget3.getBody)().then(($body) => {
$body.find('input[name="wpSave"]').on("click", () => {
isContinue = false;
});
});
const checkEditConflict = /* @__PURE__ */ function() {
var _ref4 = _asyncToGenerator(function* () {
const pageRevisionId = yield getCurrentRevisionId(WG_PAGE_NAME);
if (!pageRevisionId) {
isContinue = false;
} else if (pageRevisionId > WG_CUR_REVISION_ID) {
isContinue = false;
(0, import_ext_gadget4.toastify)({
node: $(getMessage("Notice")).get(0),
close: true,
duration: -1
}, "info");
}
}
} else {
});
return function checkEditConflict2() {
return 0;
return _ref4.apply(this, arguments);
};
}();
while (true) {
yield checkEditConflict();
if (!isContinue) {
break;
}
}
yield (0, import_ext_gadget3.delay)(3 * 1e3);
});
}
});
return function editConflict2() {
return _ref3.apply(this, arguments);
};
};
}();
interval_id = setInterval(main_loop, 2000);
//! src/EditConflict/EditConflict.ts
try {
if (IS_WG_EDIT_OR_SUBMIT_ACTION && WG_CUR_REVISION_ID) {
document.getElementById("wpSave").addEventListener("click", function () {
void editConflict();
done = true;
}
clearInterval(interval_id);

});
})();
} catch (e) {}

})(window);
/* </nowiki> */

//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL0VkaXRDb25mbGljdC9tb2R1bGVzL2NvbnN0YW50LnRzIiwgInNyYy9FZGl0Q29uZmxpY3QvbW9kdWxlcy9jb3JlLnRzIiwgInNyYy9FZGl0Q29uZmxpY3Qvb3B0aW9ucy5qc29uIiwgInNyYy9FZGl0Q29uZmxpY3QvbW9kdWxlcy9hcGkudHMiLCAic3JjL0VkaXRDb25mbGljdC9tb2R1bGVzL3V0aWwvcXVlcnlQYWdlSW5mby50cyIsICJzcmMvRWRpdENvbmZsaWN0L21vZHVsZXMvZ2V0Q3VycmVudFJldmlzaW9uSWQudHMiLCAic3JjL0VkaXRDb25mbGljdC9tb2R1bGVzL2kxOG4udHMiLCAic3JjL0VkaXRDb25mbGljdC9FZGl0Q29uZmxpY3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IFdHX0FDVElPTjogTWVkaWFXaWtpQ29uZmlnTWFwV2dBY3Rpb24gPSBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpO1xuY29uc3QgV0dfQ1VSX1JFVklTSU9OX0lEOiBudW1iZXIgPSBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKTtcbmNvbnN0IFdHX1BBR0VfTkFNRTogc3RyaW5nID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXG5jb25zdCBJU19XR19FRElUX09SX1NVQk1JVF9BQ1RJT046IGJvb2xlYW4gPSBbJ2VkaXQnLCAnc3VibWl0J10uaW5jbHVkZXMoV0dfQUNUSU9OKTtcblxuZXhwb3J0IHtXR19DVVJfUkVWSVNJT05fSUQsIFdHX1BBR0VfTkFNRSwgSVNfV0dfRURJVF9PUl9TVUJNSVRfQUNUSU9OfTtcbiIsICJpbXBvcnQge1dHX0NVUl9SRVZJU0lPTl9JRCwgV0dfUEFHRV9OQU1FfSBmcm9tICcuL2NvbnN0YW50JztcbmltcG9ydCB7ZGVsYXksIGdldEJvZHl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5pbXBvcnQge2dldEN1cnJlbnRSZXZpc2lvbklkfSBmcm9tICcuL2dldEN1cnJlbnRSZXZpc2lvbklkJztcbmltcG9ydCB7Z2V0TWVzc2FnZX0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB7dG9hc3RpZnl9IGZyb20gJ2V4dC5nYWRnZXQuVG9hc3RpZnknO1xuXG5jb25zdCBlZGl0Q29uZmxpY3QgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdGxldCBpc0NvbnRpbnVlOiBib29sZWFuID0gdHJ1ZTtcblxuXHR2b2lkIGdldEJvZHkoKS50aGVuKCgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0XHQkYm9keS5maW5kKCdpbnB1dFtuYW1lPVwid3BTYXZlXCJdJykub24oJ2NsaWNrJywgKCk6IHZvaWQgPT4ge1xuXHRcdFx0aXNDb250aW51ZSA9IGZhbHNlO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRjb25zdCBjaGVja0VkaXRDb25mbGljdCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRjb25zdCBwYWdlUmV2aXNpb25JZDogbnVtYmVyID0gYXdhaXQgZ2V0Q3VycmVudFJldmlzaW9uSWQoV0dfUEFHRV9OQU1FKTtcblx0XHRpZiAoIXBhZ2VSZXZpc2lvbklkKSB7XG5cdFx0XHRpc0NvbnRpbnVlID0gZmFsc2U7XG5cdFx0fSBlbHNlIGlmIChwYWdlUmV2aXNpb25JZCA+IFdHX0NVUl9SRVZJU0lPTl9JRCkge1xuXHRcdFx0aXNDb250aW51ZSA9IGZhbHNlO1xuXHRcdFx0dG9hc3RpZnkoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRub2RlOiAkKGdldE1lc3NhZ2UoJ05vdGljZScpKS5nZXQoMCksXG5cdFx0XHRcdFx0Y2xvc2U6IHRydWUsXG5cdFx0XHRcdFx0ZHVyYXRpb246IC0xLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW5mbydcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0YXdhaXQgY2hlY2tFZGl0Q29uZmxpY3QoKTtcblxuXHRcdGlmICghaXNDb250aW51ZSkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0YXdhaXQgZGVsYXkoMyAqIDEwMDApO1xuXHR9XG59O1xuXG5leHBvcnQge2VkaXRDb25mbGljdH07XG4iLCAie1xuXHRcInZlcnNpb25cIjogXCIyLjBcIlxufVxuIiwgImltcG9ydCAqIGFzIE9QVElPTlMgZnJvbSAnLi4vb3B0aW9ucy5qc29uJztcbmltcG9ydCB7aW5pdE13QXBpfSBmcm9tICdleHQuZ2FkZ2V0LlV0aWwnO1xuXG5jb25zdCBhcGk6IG13LkFwaSA9IGluaXRNd0FwaShgRWRpdENvbmZsaWN0LyR7T1BUSU9OUy52ZXJzaW9ufWApO1xuXG5leHBvcnQge2FwaX07XG4iLCAiaW1wb3J0IHthcGl9IGZyb20gJy4uL2FwaSc7XG5cbmludGVyZmFjZSBQYWdlSW5mbyB7XG5cdHF1ZXJ5Pzoge1xuXHRcdHBhZ2VzOiBBcnJheTx7XG5cdFx0XHRtaXNzaW5nPzogYm9vbGVhbjtcblx0XHRcdHJldmlzaW9uczogQXJyYXk8e1xuXHRcdFx0XHRyZXZpZDogbnVtYmVyO1xuXHRcdFx0fT47XG5cdFx0fT47XG5cdH07XG59XG5cbmNvbnN0IHBhcmFtZXRlcnM6IEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zID0ge1xuXHRhY3Rpb246ICdxdWVyeScsXG5cdGZvcm1hdDogJ2pzb24nLFxuXHRmb3JtYXR2ZXJzaW9uOiAnMicsXG5cdHByb3A6ICdyZXZpc2lvbnMnLFxuXHRydnByb3A6ICdpZHMnLFxufTtcblxuY29uc3QgcXVlcnlQYWdlSW5mbyA9IGFzeW5jICh0aXRsZTogc3RyaW5nKTogUHJvbWlzZTxQYWdlSW5mbz4gPT4ge1xuXHR0cnkge1xuXHRcdHJldHVybiAoYXdhaXQgYXBpLnBvc3Qoe1xuXHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdHRpdGxlczogdGl0bGUsXG5cdFx0fSkpIGFzIFBhZ2VJbmZvO1xuXHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdGNvbnNvbGUuZXJyb3IoJ1tFZGl0Q29uZmxpY3RdIEFqYXggZXJyb3I6JywgZXJyb3IpO1xuXHRcdHJldHVybiB7fTtcblx0fVxufTtcblxuZXhwb3J0IHtxdWVyeVBhZ2VJbmZvfTtcbiIsICJpbXBvcnQge3F1ZXJ5UGFnZUluZm99IGZyb20gJy4vdXRpbC9xdWVyeVBhZ2VJbmZvJztcblxuY29uc3QgZ2V0Q3VycmVudFJldmlzaW9uSWQgPSBhc3luYyAodGl0bGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG5cdGNvbnN0IHBhZ2VJbmZvOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHF1ZXJ5UGFnZUluZm8+PiA9IGF3YWl0IHF1ZXJ5UGFnZUluZm8odGl0bGUpO1xuXG5cdGNvbnN0IHtxdWVyeX0gPSBwYWdlSW5mbztcblx0aWYgKCFxdWVyeSkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgW3BhZ2VdID0gcXVlcnkucGFnZXM7XG5cdGlmICghcGFnZSB8fCBwYWdlLm1pc3NpbmcpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHJldHVybiBwYWdlLnJldmlzaW9uc1swXSEucmV2aWQ7XG59O1xuXG5leHBvcnQge2dldEN1cnJlbnRSZXZpc2lvbklkfTtcbiIsICJpbXBvcnQge2xvY2FsaXplfSBmcm9tICdleHQuZ2FkZ2V0LmkxOG4nO1xuXG5jb25zdCBnZXRJMThuTWVzc2FnZXMgPSAoKSA9PiB7XG5cdHJldHVybiB7XG5cdFx0Tm90aWNlOiBsb2NhbGl6ZSh7XG5cdFx0XHRlbjogJzxzcGFuPlRoaXMgcGFnZSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHNvbWVvbmUgZWxzZSBhZnRlciB5b3Ugc3RhcnRlZCBlZGl0aW5nLiBDb3B5IHlvdXIgY2hhbmdlcywgcmVmcmVzaCBhbmQgc3RhcnQgb3ZlciB0byBhdm9pZCBlZGl0IGNvbmZsaWN0cy48YSBocmVmPVwiI1wiIG9uY2xpY2s9XCJsb2NhdGlvbi5yZWxvYWQoKTtyZXR1cm4gZmFsc2U7XCI+UmVmcmVzaDwvYT48L3NwYW4+Jyxcblx0XHRcdGphOiAnPHNwYW4+44GT44Gu44Oa44O844K444Gv5LuW44Gu5Lq644Gr44KI44Gj44Gm5aSJ5pu044GV44KM44Gm44GE44G+44GZ44CC57eo6ZuG6KGd56qB44KS6YG/44GR44KL44Gf44KB44CB57eo6ZuG5YaF5a6544KS44Kz44OU44O844GX44Gm44Oa44O844K444KS5YaN6Kqt44G/6L6844G/44GX44CB57eo6ZuG44KS57aa44GR44Gm44GP44Gg44GV44GE44CCPGEgaHJlZj1cIiNcIiBvbmNsaWNrPVwibG9jYXRpb24ucmVsb2FkKCk7cmV0dXJuIGZhbHNlO1wiPuWGjeiqreOBv+i+vOOBvzwvYT48L3NwYW4+Jyxcblx0XHRcdCd6aC1oYW5zJzpcblx0XHRcdFx0JzxzcGFuPuatpOmhtemdouW3suiiq+S7luS6uuabtOaUueOAguivt+WkjeWItuaCqOeahOe8lui+ke+8jOeEtuWQjuWIt+aWsOmhtemdou+8jOmHjeaWsOW8gOWni+e8lui+ke+8jOS7pemBv+WFjee8lui+keWGsueqgeOAgjxhIGhyZWY9XCIjXCIgb25jbGljaz1cImxvY2F0aW9uLnJlbG9hZCgpO3JldHVybiBmYWxzZTtcIj7liLfmlrDpobXpnaI8L2E+PC9zcGFuPicsXG5cdFx0XHQnemgtaGFudCc6XG5cdFx0XHRcdCc8c3Bhbj7mnKzpoIHlt7Looqvku5bkurrmm7TmlLnjgILoq4vlsIfmgqjnmoTnt6jovK/opIfoo73vvIzkuKbph43mlrDovInlhaXpoIHpnaLvvIznhLblvoznubznuoznt6jovK/vvIzkvobpgb/lhY3nt6jovK/ooZ3nqoHjgII8YSBocmVmPVwiI1wiIG9uY2xpY2s9XCJsb2NhdGlvbi5yZWxvYWQoKTtyZXR1cm4gZmFsc2U7XCI+6YeN5paw6LyJ5YWlPC9hPjwvc3Bhbj4nLFxuXHRcdH0pLFxuXHR9O1xufTtcblxuY29uc3QgaTE4bk1lc3NhZ2VzID0gZ2V0STE4bk1lc3NhZ2VzKCk7XG5cbmNvbnN0IGdldE1lc3NhZ2U6IEdldE1lc3NhZ2VzPHR5cGVvZiBpMThuTWVzc2FnZXM+ID0gKGtleSkgPT4ge1xuXHRyZXR1cm4gaTE4bk1lc3NhZ2VzW2tleV0gfHwga2V5O1xufTtcblxuZXhwb3J0IHtnZXRNZXNzYWdlfTtcbiIsICJpbXBvcnQge0lTX1dHX0VESVRfT1JfU1VCTUlUX0FDVElPTiwgV0dfQ1VSX1JFVklTSU9OX0lEfSBmcm9tICcuL21vZHVsZXMvY29uc3RhbnQnO1xuaW1wb3J0IHtlZGl0Q29uZmxpY3R9IGZyb20gJy4vbW9kdWxlcy9jb3JlJztcblxuaWYgKElTX1dHX0VESVRfT1JfU1VCTUlUX0FDVElPTiAmJiBXR19DVVJfUkVWSVNJT05fSUQpIHtcblx0dm9pZCBlZGl0Q29uZmxpY3QoKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBTUEsWUFBd0NDLEdBQUdDLE9BQU9DLElBQUksVUFBVTtBQUN0RSxJQUFNQyxxQkFBNkJILEdBQUdDLE9BQU9DLElBQUksaUJBQWlCO0FBQ2xFLElBQU1FLGVBQXVCSixHQUFHQyxPQUFPQyxJQUFJLFlBQVk7QUFFdkQsSUFBTUcsOEJBQXVDLENBQUMsUUFBUSxRQUFRLEVBQUVDLFNBQVNQLFNBQVM7O0FDSGxGLElBQUFRLHFCQUE2QkMsUUFBQSxpQkFBQTs7QUNBNUIsSUFBQUMsVUFBVzs7QUNBWixJQUFBQyxvQkFBd0JGLFFBQUEsaUJBQUE7QUFFeEIsSUFBTUcsT0FBQSxHQUFjRCxrQkFBQUUsV0FBQSxnQkFBQUMsT0FBa0NKLE9BQU8sQ0FBRTs7QUNVL0QsSUFBTUssYUFBc0M7RUFDM0NDLFFBQVE7RUFDUkMsUUFBUTtFQUNSQyxlQUFlO0VBQ2ZDLE1BQU07RUFDTkMsUUFBUTtBQUNUO0FBRUEsSUFBTUMsZ0JBQUEsMkJBQUE7QUFBQSxNQUFBQyxPQUFBQyxrQkFBZ0IsV0FBT0MsT0FBcUM7QUFDakUsUUFBSTtBQUNILGFBQUEsTUFBY1osSUFBSWEsS0FBSztRQUN0QixHQUFHVjtRQUNIVyxRQUFRRjtNQUNULENBQUM7SUFDRixTQUFTRyxPQUFnQjtBQUN4QkMsY0FBUUQsTUFBTSw4QkFBOEJBLEtBQUs7QUFDakQsYUFBTyxDQUFDO0lBQ1Q7RUFDRCxDQUFBO0FBQUEsU0FBQSxTQVZNTixlQUFBUSxJQUFBO0FBQUEsV0FBQVAsS0FBQVEsTUFBQSxNQUFBQyxTQUFBO0VBQUE7QUFBQSxFQUFBOztBQ25CTixJQUFNQyx1QkFBQSwyQkFBQTtBQUFBLE1BQUFDLFFBQUFWLGtCQUF1QixXQUFPQyxPQUFtQztBQUN0RSxVQUFNVSxXQUFBLE1BQTREYixjQUFjRyxLQUFLO0FBRXJGLFVBQU07TUFBQ1c7SUFBSyxJQUFJRDtBQUNoQixRQUFJLENBQUNDLE9BQU87QUFDWCxhQUFPO0lBQ1I7QUFFQSxVQUFNLENBQUNDLElBQUksSUFBSUQsTUFBTUU7QUFDckIsUUFBSSxDQUFDRCxRQUFRQSxLQUFLRSxTQUFTO0FBQzFCLGFBQU87SUFDUjtBQUVBLFdBQU9GLEtBQUtHLFVBQVUsQ0FBQyxFQUFHQztFQUMzQixDQUFBO0FBQUEsU0FBQSxTQWRNUixzQkFBQVMsS0FBQTtBQUFBLFdBQUFSLE1BQUFILE1BQUEsTUFBQUMsU0FBQTtFQUFBO0FBQUEsRUFBQTs7QUNGTixJQUFBVyxxQkFBdUJqQyxRQUFBLGlCQUFBO0FBRXZCLElBQU1rQyxrQkFBa0JBLE1BQU07QUFDN0IsU0FBTztJQUNOQyxTQUFBLEdBQVFGLG1CQUFBRyxVQUFTO01BQ2hCQyxJQUFJO01BQ0pDLElBQUk7TUFDSixXQUNDO01BQ0QsV0FDQztJQUNGLENBQUM7RUFDRjtBQUNEO0FBRUEsSUFBTUMsZUFBZUwsZ0JBQWdCO0FBRXJDLElBQU1NLGFBQWdEQyxTQUFRO0FBQzdELFNBQU9GLGFBQWFFLEdBQUcsS0FBS0E7QUFDN0I7O0FMZkEsSUFBQUMscUJBQXVCMUMsUUFBQSxxQkFBQTtBQUV2QixJQUFNMkMsZUFBQSwyQkFBQTtBQUFBLE1BQUFDLFFBQUE5QixrQkFBZSxhQUEyQjtBQUMvQyxRQUFJK0IsYUFBc0I7QUFFMUIsVUFBQSxHQUFLOUMsbUJBQUErQyxTQUFRLEVBQUVDLEtBQU1DLFdBQXlDO0FBQzdEQSxZQUFNQyxLQUFLLHNCQUFzQixFQUFFQyxHQUFHLFNBQVMsTUFBWTtBQUMxREwscUJBQWE7TUFDZCxDQUFDO0lBQ0YsQ0FBQztBQUVELFVBQU1NLG9CQUFBLDJCQUFBO0FBQUEsVUFBQUMsUUFBQXRDLGtCQUFvQixhQUEyQjtBQUNwRCxjQUFNdUMsaUJBQUEsTUFBK0I5QixxQkFBcUIzQixZQUFZO0FBQ3RFLFlBQUksQ0FBQ3lELGdCQUFnQjtBQUNwQlIsdUJBQWE7UUFDZCxXQUFXUSxpQkFBaUIxRCxvQkFBb0I7QUFDL0NrRCx1QkFBYTtBQUNiLFdBQUEsR0FBQUgsbUJBQUFZLFVBQ0M7WUFDQ0MsTUFBTUMsRUFBRWhCLFdBQVcsUUFBUSxDQUFDLEVBQUU5QyxJQUFJLENBQUM7WUFDbkMrRCxPQUFPO1lBQ1BDLFVBQVU7VUFDWCxHQUNBLE1BQ0Q7UUFDRDtNQUNELENBQUE7QUFBQSxhQUFBLFNBZk1QLHFCQUFBO0FBQUEsZUFBQUMsTUFBQS9CLE1BQUEsTUFBQUMsU0FBQTtNQUFBO0lBQUEsRUFBQTtBQWlCTixXQUFPLE1BQU07QUFDWixZQUFNNkIsa0JBQWtCO0FBRXhCLFVBQUksQ0FBQ04sWUFBWTtBQUNoQjtNQUNEO0FBRUEsYUFBQSxHQUFNOUMsbUJBQUE0RCxPQUFNLElBQUksR0FBSTtJQUNyQjtFQUNELENBQUE7QUFBQSxTQUFBLFNBbkNNaEIsZ0JBQUE7QUFBQSxXQUFBQyxNQUFBdkIsTUFBQSxNQUFBQyxTQUFBO0VBQUE7QUFBQSxFQUFBOztBTUhOLElBQUl6QiwrQkFBK0JGLG9CQUFvQjtBQUN0RCxPQUFLZ0QsYUFBYTtBQUNuQjsiLAogICJuYW1lcyI6IFsiV0dfQUNUSU9OIiwgIm13IiwgImNvbmZpZyIsICJnZXQiLCAiV0dfQ1VSX1JFVklTSU9OX0lEIiwgIldHX1BBR0VfTkFNRSIsICJJU19XR19FRElUX09SX1NVQk1JVF9BQ1RJT04iLCAiaW5jbHVkZXMiLCAiaW1wb3J0X2V4dF9nYWRnZXQzIiwgInJlcXVpcmUiLCAidmVyc2lvbiIsICJpbXBvcnRfZXh0X2dhZGdldCIsICJhcGkiLCAiaW5pdE13QXBpIiwgImNvbmNhdCIsICJwYXJhbWV0ZXJzIiwgImFjdGlvbiIsICJmb3JtYXQiLCAiZm9ybWF0dmVyc2lvbiIsICJwcm9wIiwgInJ2cHJvcCIsICJxdWVyeVBhZ2VJbmZvIiwgIl9yZWYiLCAiX2FzeW5jVG9HZW5lcmF0b3IiLCAidGl0bGUiLCAicG9zdCIsICJ0aXRsZXMiLCAiZXJyb3IiLCAiY29uc29sZSIsICJfeCIsICJhcHBseSIsICJhcmd1bWVudHMiLCAiZ2V0Q3VycmVudFJldmlzaW9uSWQiLCAiX3JlZjIiLCAicGFnZUluZm8iLCAicXVlcnkiLCAicGFnZSIsICJwYWdlcyIsICJtaXNzaW5nIiwgInJldmlzaW9ucyIsICJyZXZpZCIsICJfeDIiLCAiaW1wb3J0X2V4dF9nYWRnZXQyIiwgImdldEkxOG5NZXNzYWdlcyIsICJOb3RpY2UiLCAibG9jYWxpemUiLCAiZW4iLCAiamEiLCAiaTE4bk1lc3NhZ2VzIiwgImdldE1lc3NhZ2UiLCAia2V5IiwgImltcG9ydF9leHRfZ2FkZ2V0NCIsICJlZGl0Q29uZmxpY3QiLCAiX3JlZjMiLCAiaXNDb250aW51ZSIsICJnZXRCb2R5IiwgInRoZW4iLCAiJGJvZHkiLCAiZmluZCIsICJvbiIsICJjaGVja0VkaXRDb25mbGljdCIsICJfcmVmNCIsICJwYWdlUmV2aXNpb25JZCIsICJ0b2FzdGlmeSIsICJub2RlIiwgIiQiLCAiY2xvc2UiLCAiZHVyYXRpb24iLCAiZGVsYXkiXQp9Cg==

2024年2月24日 (六) 03:24的版本

/**
 * SPDX-License-Identifier: GPL-3.0-or-later
 * _addText: '{{Gadget Header|license=GPL-3.0-or-later}}'
 *
 * @source {@link https://github.com/TopRealm/YsArxiv-Gadgets/tree/master/src/EditConflict}
 * @author 安忆 <i@anyi.in>
 * @license GPL-3.0-or-later {@link https://youshou.wiki/wiki/H:GPLV3}
 */
/**
 * +------------------------------------------------------------+
 * |            === WARNING: GLOBAL GADGET FILE ===             |
 * +------------------------------------------------------------+
 * |       All changes should be made in the repository,        |
 * |                otherwise they will be lost.                |
 * +------------------------------------------------------------+
 * |        Changes to this page may affect many users.         |
 * | Please discuss changes by opening an issue before editing. |
 * +------------------------------------------------------------+
 */
/* <nowiki> */

(() => {

"use strict";

// dist/EditConflict/EditConflict.js
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  try {
    var info = gen[key](arg);
    var value = info.value;
  } catch (error) {
    reject(error);
    return;
  }
  if (info.done) {
    resolve(value);
  } else {
    Promise.resolve(value).then(_next, _throw);
  }
}
function _asyncToGenerator(fn) {
  return function() {
    var self = this, args = arguments;
    return new Promise(function(resolve, reject) {
      var gen = fn.apply(self, args);
      function _next(value) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
      }
      function _throw(err) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
      }
      _next(void 0);
    });
  };
}
//! src/EditConflict/modules/constant.ts
var WG_ACTION = mw.config.get("wgAction");
var WG_CUR_REVISION_ID = mw.config.get("wgCurRevisionId");
var WG_PAGE_NAME = mw.config.get("wgPageName");
var IS_WG_EDIT_OR_SUBMIT_ACTION = ["edit", "submit"].includes(WG_ACTION);
//! src/EditConflict/modules/core.ts
var import_ext_gadget3 = require("ext.gadget.Util");
//! src/EditConflict/options.json
var version = "2.0";
//! src/EditConflict/modules/api.ts
var import_ext_gadget = require("ext.gadget.Util");
var api = (0, import_ext_gadget.initMwApi)("EditConflict/".concat(version));
//! src/EditConflict/modules/util/queryPageInfo.ts
var parameters = {
  action: "query",
  format: "json",
  formatversion: "2",
  prop: "revisions",
  rvprop: "ids"
};
var queryPageInfo = /* @__PURE__ */ function() {
  var _ref = _asyncToGenerator(function* (title) {
    try {
      return yield api.post({
        ...parameters,
        titles: title
      });
    } catch (error) {
      console.error("[EditConflict] Ajax error:", error);
      return {};
    }
  });
  return function queryPageInfo2(_x) {
    return _ref.apply(this, arguments);
  };
}();
//! src/EditConflict/modules/getCurrentRevisionId.ts
var getCurrentRevisionId = /* @__PURE__ */ function() {
  var _ref2 = _asyncToGenerator(function* (title) {
    const pageInfo = yield queryPageInfo(title);
    const {
      query
    } = pageInfo;
    if (!query) {
      return 0;
    }
    const [page] = query.pages;
    if (!page || page.missing) {
      return 0;
    }
    return page.revisions[0].revid;
  });
  return function getCurrentRevisionId2(_x2) {
    return _ref2.apply(this, arguments);
  };
}();
//! src/EditConflict/modules/i18n.ts
var import_ext_gadget2 = require("ext.gadget.i18n");
var getI18nMessages = () => {
  return {
    Notice: (0, import_ext_gadget2.localize)({
      en: '<span>This page has been changed by someone else after you started editing. Copy your changes, refresh and start over to avoid edit conflicts.<a href="#" onclick="location.reload();return false;">Refresh</a></span>',
      ja: '<span>このページは他の人によって変更されています。編集衝突を避けるため、編集内容をコピーしてページを再読み込みし、編集を続けてください。<a href="#" onclick="location.reload();return false;">再読み込み</a></span>',
      "zh-hans": '<span>此页面已被他人更改。请复制您的编辑,然后刷新页面,重新开始编辑,以避免编辑冲突。<a href="#" onclick="location.reload();return false;">刷新页面</a></span>',
      "zh-hant": '<span>本頁已被他人更改。請將您的編輯複製,並重新載入頁面,然後繼續編輯,來避免編輯衝突。<a href="#" onclick="location.reload();return false;">重新載入</a></span>'
    })
  };
};
var i18nMessages = getI18nMessages();
var getMessage = (key) => {
  return i18nMessages[key] || key;
};
//! src/EditConflict/modules/core.ts
var import_ext_gadget4 = require("ext.gadget.Toastify");
var editConflict = /* @__PURE__ */ function() {
  var _ref3 = _asyncToGenerator(function* () {
    let isContinue = true;
    void (0, import_ext_gadget3.getBody)().then(($body) => {
      $body.find('input[name="wpSave"]').on("click", () => {
        isContinue = false;
      });
    });
    const checkEditConflict = /* @__PURE__ */ function() {
      var _ref4 = _asyncToGenerator(function* () {
        const pageRevisionId = yield getCurrentRevisionId(WG_PAGE_NAME);
        if (!pageRevisionId) {
          isContinue = false;
        } else if (pageRevisionId > WG_CUR_REVISION_ID) {
          isContinue = false;
          (0, import_ext_gadget4.toastify)({
            node: $(getMessage("Notice")).get(0),
            close: true,
            duration: -1
          }, "info");
        }
      });
      return function checkEditConflict2() {
        return _ref4.apply(this, arguments);
      };
    }();
    while (true) {
      yield checkEditConflict();
      if (!isContinue) {
        break;
      }
      yield (0, import_ext_gadget3.delay)(3 * 1e3);
    }
  });
  return function editConflict2() {
    return _ref3.apply(this, arguments);
  };
}();
//! src/EditConflict/EditConflict.ts
if (IS_WG_EDIT_OR_SUBMIT_ACTION && WG_CUR_REVISION_ID) {
  void editConflict();
}

})();

/* </nowiki> */

//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL0VkaXRDb25mbGljdC9tb2R1bGVzL2NvbnN0YW50LnRzIiwgInNyYy9FZGl0Q29uZmxpY3QvbW9kdWxlcy9jb3JlLnRzIiwgInNyYy9FZGl0Q29uZmxpY3Qvb3B0aW9ucy5qc29uIiwgInNyYy9FZGl0Q29uZmxpY3QvbW9kdWxlcy9hcGkudHMiLCAic3JjL0VkaXRDb25mbGljdC9tb2R1bGVzL3V0aWwvcXVlcnlQYWdlSW5mby50cyIsICJzcmMvRWRpdENvbmZsaWN0L21vZHVsZXMvZ2V0Q3VycmVudFJldmlzaW9uSWQudHMiLCAic3JjL0VkaXRDb25mbGljdC9tb2R1bGVzL2kxOG4udHMiLCAic3JjL0VkaXRDb25mbGljdC9FZGl0Q29uZmxpY3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IFdHX0FDVElPTjogTWVkaWFXaWtpQ29uZmlnTWFwV2dBY3Rpb24gPSBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpO1xuY29uc3QgV0dfQ1VSX1JFVklTSU9OX0lEOiBudW1iZXIgPSBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKTtcbmNvbnN0IFdHX1BBR0VfTkFNRTogc3RyaW5nID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXG5jb25zdCBJU19XR19FRElUX09SX1NVQk1JVF9BQ1RJT046IGJvb2xlYW4gPSBbJ2VkaXQnLCAnc3VibWl0J10uaW5jbHVkZXMoV0dfQUNUSU9OKTtcblxuZXhwb3J0IHtXR19DVVJfUkVWSVNJT05fSUQsIFdHX1BBR0VfTkFNRSwgSVNfV0dfRURJVF9PUl9TVUJNSVRfQUNUSU9OfTtcbiIsICJpbXBvcnQge1dHX0NVUl9SRVZJU0lPTl9JRCwgV0dfUEFHRV9OQU1FfSBmcm9tICcuL2NvbnN0YW50JztcbmltcG9ydCB7ZGVsYXksIGdldEJvZHl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5pbXBvcnQge2dldEN1cnJlbnRSZXZpc2lvbklkfSBmcm9tICcuL2dldEN1cnJlbnRSZXZpc2lvbklkJztcbmltcG9ydCB7Z2V0TWVzc2FnZX0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB7dG9hc3RpZnl9IGZyb20gJ2V4dC5nYWRnZXQuVG9hc3RpZnknO1xuXG5jb25zdCBlZGl0Q29uZmxpY3QgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdGxldCBpc0NvbnRpbnVlOiBib29sZWFuID0gdHJ1ZTtcblxuXHR2b2lkIGdldEJvZHkoKS50aGVuKCgkYm9keTogSlF1ZXJ5PEhUTUxCb2R5RWxlbWVudD4pOiB2b2lkID0+IHtcblx0XHQkYm9keS5maW5kKCdpbnB1dFtuYW1lPVwid3BTYXZlXCJdJykub24oJ2NsaWNrJywgKCk6IHZvaWQgPT4ge1xuXHRcdFx0aXNDb250aW51ZSA9IGZhbHNlO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRjb25zdCBjaGVja0VkaXRDb25mbGljdCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRjb25zdCBwYWdlUmV2aXNpb25JZDogbnVtYmVyID0gYXdhaXQgZ2V0Q3VycmVudFJldmlzaW9uSWQoV0dfUEFHRV9OQU1FKTtcblx0XHRpZiAoIXBhZ2VSZXZpc2lvbklkKSB7XG5cdFx0XHRpc0NvbnRpbnVlID0gZmFsc2U7XG5cdFx0fSBlbHNlIGlmIChwYWdlUmV2aXNpb25JZCA+IFdHX0NVUl9SRVZJU0lPTl9JRCkge1xuXHRcdFx0aXNDb250aW51ZSA9IGZhbHNlO1xuXHRcdFx0dG9hc3RpZnkoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRub2RlOiAkKGdldE1lc3NhZ2UoJ05vdGljZScpKS5nZXQoMCksXG5cdFx0XHRcdFx0Y2xvc2U6IHRydWUsXG5cdFx0XHRcdFx0ZHVyYXRpb246IC0xLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW5mbydcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0YXdhaXQgY2hlY2tFZGl0Q29uZmxpY3QoKTtcblxuXHRcdGlmICghaXNDb250aW51ZSkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0YXdhaXQgZGVsYXkoMyAqIDEwMDApO1xuXHR9XG59O1xuXG5leHBvcnQge2VkaXRDb25mbGljdH07XG4iLCAie1xuXHRcInZlcnNpb25cIjogXCIyLjBcIlxufVxuIiwgImltcG9ydCAqIGFzIE9QVElPTlMgZnJvbSAnLi4vb3B0aW9ucy5qc29uJztcbmltcG9ydCB7aW5pdE13QXBpfSBmcm9tICdleHQuZ2FkZ2V0LlV0aWwnO1xuXG5jb25zdCBhcGk6IG13LkFwaSA9IGluaXRNd0FwaShgRWRpdENvbmZsaWN0LyR7T1BUSU9OUy52ZXJzaW9ufWApO1xuXG5leHBvcnQge2FwaX07XG4iLCAiaW1wb3J0IHthcGl9IGZyb20gJy4uL2FwaSc7XG5cbmludGVyZmFjZSBQYWdlSW5mbyB7XG5cdHF1ZXJ5Pzoge1xuXHRcdHBhZ2VzOiBBcnJheTx7XG5cdFx0XHRtaXNzaW5nPzogYm9vbGVhbjtcblx0XHRcdHJldmlzaW9uczogQXJyYXk8e1xuXHRcdFx0XHRyZXZpZDogbnVtYmVyO1xuXHRcdFx0fT47XG5cdFx0fT47XG5cdH07XG59XG5cbmNvbnN0IHBhcmFtZXRlcnM6IEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zID0ge1xuXHRhY3Rpb246ICdxdWVyeScsXG5cdGZvcm1hdDogJ2pzb24nLFxuXHRmb3JtYXR2ZXJzaW9uOiAnMicsXG5cdHByb3A6ICdyZXZpc2lvbnMnLFxuXHRydnByb3A6ICdpZHMnLFxufTtcblxuY29uc3QgcXVlcnlQYWdlSW5mbyA9IGFzeW5jICh0aXRsZTogc3RyaW5nKTogUHJvbWlzZTxQYWdlSW5mbz4gPT4ge1xuXHR0cnkge1xuXHRcdHJldHVybiAoYXdhaXQgYXBpLnBvc3Qoe1xuXHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdHRpdGxlczogdGl0bGUsXG5cdFx0fSkpIGFzIFBhZ2VJbmZvO1xuXHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdGNvbnNvbGUuZXJyb3IoJ1tFZGl0Q29uZmxpY3RdIEFqYXggZXJyb3I6JywgZXJyb3IpO1xuXHRcdHJldHVybiB7fTtcblx0fVxufTtcblxuZXhwb3J0IHtxdWVyeVBhZ2VJbmZvfTtcbiIsICJpbXBvcnQge3F1ZXJ5UGFnZUluZm99IGZyb20gJy4vdXRpbC9xdWVyeVBhZ2VJbmZvJztcblxuY29uc3QgZ2V0Q3VycmVudFJldmlzaW9uSWQgPSBhc3luYyAodGl0bGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG5cdGNvbnN0IHBhZ2VJbmZvOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHF1ZXJ5UGFnZUluZm8+PiA9IGF3YWl0IHF1ZXJ5UGFnZUluZm8odGl0bGUpO1xuXG5cdGNvbnN0IHtxdWVyeX0gPSBwYWdlSW5mbztcblx0aWYgKCFxdWVyeSkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgW3BhZ2VdID0gcXVlcnkucGFnZXM7XG5cdGlmICghcGFnZSB8fCBwYWdlLm1pc3NpbmcpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHJldHVybiBwYWdlLnJldmlzaW9uc1swXSEucmV2aWQ7XG59O1xuXG5leHBvcnQge2dldEN1cnJlbnRSZXZpc2lvbklkfTtcbiIsICJpbXBvcnQge2xvY2FsaXplfSBmcm9tICdleHQuZ2FkZ2V0LmkxOG4nO1xuXG5jb25zdCBnZXRJMThuTWVzc2FnZXMgPSAoKSA9PiB7XG5cdHJldHVybiB7XG5cdFx0Tm90aWNlOiBsb2NhbGl6ZSh7XG5cdFx0XHRlbjogJzxzcGFuPlRoaXMgcGFnZSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHNvbWVvbmUgZWxzZSBhZnRlciB5b3Ugc3RhcnRlZCBlZGl0aW5nLiBDb3B5IHlvdXIgY2hhbmdlcywgcmVmcmVzaCBhbmQgc3RhcnQgb3ZlciB0byBhdm9pZCBlZGl0IGNvbmZsaWN0cy48YSBocmVmPVwiI1wiIG9uY2xpY2s9XCJsb2NhdGlvbi5yZWxvYWQoKTtyZXR1cm4gZmFsc2U7XCI+UmVmcmVzaDwvYT48L3NwYW4+Jyxcblx0XHRcdGphOiAnPHNwYW4+44GT44Gu44Oa44O844K444Gv5LuW44Gu5Lq644Gr44KI44Gj44Gm5aSJ5pu044GV44KM44Gm44GE44G+44GZ44CC57eo6ZuG6KGd56qB44KS6YG/44GR44KL44Gf44KB44CB57eo6ZuG5YaF5a6544KS44Kz44OU44O844GX44Gm44Oa44O844K444KS5YaN6Kqt44G/6L6844G/44GX44CB57eo6ZuG44KS57aa44GR44Gm44GP44Gg44GV44GE44CCPGEgaHJlZj1cIiNcIiBvbmNsaWNrPVwibG9jYXRpb24ucmVsb2FkKCk7cmV0dXJuIGZhbHNlO1wiPuWGjeiqreOBv+i+vOOBvzwvYT48L3NwYW4+Jyxcblx0XHRcdCd6aC1oYW5zJzpcblx0XHRcdFx0JzxzcGFuPuatpOmhtemdouW3suiiq+S7luS6uuabtOaUueOAguivt+WkjeWItuaCqOeahOe8lui+ke+8jOeEtuWQjuWIt+aWsOmhtemdou+8jOmHjeaWsOW8gOWni+e8lui+ke+8jOS7pemBv+WFjee8lui+keWGsueqgeOAgjxhIGhyZWY9XCIjXCIgb25jbGljaz1cImxvY2F0aW9uLnJlbG9hZCgpO3JldHVybiBmYWxzZTtcIj7liLfmlrDpobXpnaI8L2E+PC9zcGFuPicsXG5cdFx0XHQnemgtaGFudCc6XG5cdFx0XHRcdCc8c3Bhbj7mnKzpoIHlt7Looqvku5bkurrmm7TmlLnjgILoq4vlsIfmgqjnmoTnt6jovK/opIfoo73vvIzkuKbph43mlrDovInlhaXpoIHpnaLvvIznhLblvoznubznuoznt6jovK/vvIzkvobpgb/lhY3nt6jovK/ooZ3nqoHjgII8YSBocmVmPVwiI1wiIG9uY2xpY2s9XCJsb2NhdGlvbi5yZWxvYWQoKTtyZXR1cm4gZmFsc2U7XCI+6YeN5paw6LyJ5YWlPC9hPjwvc3Bhbj4nLFxuXHRcdH0pLFxuXHR9O1xufTtcblxuY29uc3QgaTE4bk1lc3NhZ2VzID0gZ2V0STE4bk1lc3NhZ2VzKCk7XG5cbmNvbnN0IGdldE1lc3NhZ2U6IEdldE1lc3NhZ2VzPHR5cGVvZiBpMThuTWVzc2FnZXM+ID0gKGtleSkgPT4ge1xuXHRyZXR1cm4gaTE4bk1lc3NhZ2VzW2tleV0gfHwga2V5O1xufTtcblxuZXhwb3J0IHtnZXRNZXNzYWdlfTtcbiIsICJpbXBvcnQge0lTX1dHX0VESVRfT1JfU1VCTUlUX0FDVElPTiwgV0dfQ1VSX1JFVklTSU9OX0lEfSBmcm9tICcuL21vZHVsZXMvY29uc3RhbnQnO1xuaW1wb3J0IHtlZGl0Q29uZmxpY3R9IGZyb20gJy4vbW9kdWxlcy9jb3JlJztcblxuaWYgKElTX1dHX0VESVRfT1JfU1VCTUlUX0FDVElPTiAmJiBXR19DVVJfUkVWSVNJT05fSUQpIHtcblx0dm9pZCBlZGl0Q29uZmxpY3QoKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBTUEsWUFBd0NDLEdBQUdDLE9BQU9DLElBQUksVUFBVTtBQUN0RSxJQUFNQyxxQkFBNkJILEdBQUdDLE9BQU9DLElBQUksaUJBQWlCO0FBQ2xFLElBQU1FLGVBQXVCSixHQUFHQyxPQUFPQyxJQUFJLFlBQVk7QUFFdkQsSUFBTUcsOEJBQXVDLENBQUMsUUFBUSxRQUFRLEVBQUVDLFNBQVNQLFNBQVM7O0FDSGxGLElBQUFRLHFCQUE2QkMsUUFBQSxpQkFBQTs7QUNBNUIsSUFBQUMsVUFBVzs7QUNBWixJQUFBQyxvQkFBd0JGLFFBQUEsaUJBQUE7QUFFeEIsSUFBTUcsT0FBQSxHQUFjRCxrQkFBQUUsV0FBQSxnQkFBQUMsT0FBa0NKLE9BQU8sQ0FBRTs7QUNVL0QsSUFBTUssYUFBc0M7RUFDM0NDLFFBQVE7RUFDUkMsUUFBUTtFQUNSQyxlQUFlO0VBQ2ZDLE1BQU07RUFDTkMsUUFBUTtBQUNUO0FBRUEsSUFBTUMsZ0JBQUEsMkJBQUE7QUFBQSxNQUFBQyxPQUFBQyxrQkFBZ0IsV0FBT0MsT0FBcUM7QUFDakUsUUFBSTtBQUNILGFBQUEsTUFBY1osSUFBSWEsS0FBSztRQUN0QixHQUFHVjtRQUNIVyxRQUFRRjtNQUNULENBQUM7SUFDRixTQUFTRyxPQUFnQjtBQUN4QkMsY0FBUUQsTUFBTSw4QkFBOEJBLEtBQUs7QUFDakQsYUFBTyxDQUFDO0lBQ1Q7RUFDRCxDQUFBO0FBQUEsU0FBQSxTQVZNTixlQUFBUSxJQUFBO0FBQUEsV0FBQVAsS0FBQVEsTUFBQSxNQUFBQyxTQUFBO0VBQUE7QUFBQSxFQUFBOztBQ25CTixJQUFNQyx1QkFBQSwyQkFBQTtBQUFBLE1BQUFDLFFBQUFWLGtCQUF1QixXQUFPQyxPQUFtQztBQUN0RSxVQUFNVSxXQUFBLE1BQTREYixjQUFjRyxLQUFLO0FBRXJGLFVBQU07TUFBQ1c7SUFBSyxJQUFJRDtBQUNoQixRQUFJLENBQUNDLE9BQU87QUFDWCxhQUFPO0lBQ1I7QUFFQSxVQUFNLENBQUNDLElBQUksSUFBSUQsTUFBTUU7QUFDckIsUUFBSSxDQUFDRCxRQUFRQSxLQUFLRSxTQUFTO0FBQzFCLGFBQU87SUFDUjtBQUVBLFdBQU9GLEtBQUtHLFVBQVUsQ0FBQyxFQUFHQztFQUMzQixDQUFBO0FBQUEsU0FBQSxTQWRNUixzQkFBQVMsS0FBQTtBQUFBLFdBQUFSLE1BQUFILE1BQUEsTUFBQUMsU0FBQTtFQUFBO0FBQUEsRUFBQTs7QUNGTixJQUFBVyxxQkFBdUJqQyxRQUFBLGlCQUFBO0FBRXZCLElBQU1rQyxrQkFBa0JBLE1BQU07QUFDN0IsU0FBTztJQUNOQyxTQUFBLEdBQVFGLG1CQUFBRyxVQUFTO01BQ2hCQyxJQUFJO01BQ0pDLElBQUk7TUFDSixXQUNDO01BQ0QsV0FDQztJQUNGLENBQUM7RUFDRjtBQUNEO0FBRUEsSUFBTUMsZUFBZUwsZ0JBQWdCO0FBRXJDLElBQU1NLGFBQWdEQyxTQUFRO0FBQzdELFNBQU9GLGFBQWFFLEdBQUcsS0FBS0E7QUFDN0I7O0FMZkEsSUFBQUMscUJBQXVCMUMsUUFBQSxxQkFBQTtBQUV2QixJQUFNMkMsZUFBQSwyQkFBQTtBQUFBLE1BQUFDLFFBQUE5QixrQkFBZSxhQUEyQjtBQUMvQyxRQUFJK0IsYUFBc0I7QUFFMUIsVUFBQSxHQUFLOUMsbUJBQUErQyxTQUFRLEVBQUVDLEtBQU1DLFdBQXlDO0FBQzdEQSxZQUFNQyxLQUFLLHNCQUFzQixFQUFFQyxHQUFHLFNBQVMsTUFBWTtBQUMxREwscUJBQWE7TUFDZCxDQUFDO0lBQ0YsQ0FBQztBQUVELFVBQU1NLG9CQUFBLDJCQUFBO0FBQUEsVUFBQUMsUUFBQXRDLGtCQUFvQixhQUEyQjtBQUNwRCxjQUFNdUMsaUJBQUEsTUFBK0I5QixxQkFBcUIzQixZQUFZO0FBQ3RFLFlBQUksQ0FBQ3lELGdCQUFnQjtBQUNwQlIsdUJBQWE7UUFDZCxXQUFXUSxpQkFBaUIxRCxvQkFBb0I7QUFDL0NrRCx1QkFBYTtBQUNiLFdBQUEsR0FBQUgsbUJBQUFZLFVBQ0M7WUFDQ0MsTUFBTUMsRUFBRWhCLFdBQVcsUUFBUSxDQUFDLEVBQUU5QyxJQUFJLENBQUM7WUFDbkMrRCxPQUFPO1lBQ1BDLFVBQVU7VUFDWCxHQUNBLE1BQ0Q7UUFDRDtNQUNELENBQUE7QUFBQSxhQUFBLFNBZk1QLHFCQUFBO0FBQUEsZUFBQUMsTUFBQS9CLE1BQUEsTUFBQUMsU0FBQTtNQUFBO0lBQUEsRUFBQTtBQWlCTixXQUFPLE1BQU07QUFDWixZQUFNNkIsa0JBQWtCO0FBRXhCLFVBQUksQ0FBQ04sWUFBWTtBQUNoQjtNQUNEO0FBRUEsYUFBQSxHQUFNOUMsbUJBQUE0RCxPQUFNLElBQUksR0FBSTtJQUNyQjtFQUNELENBQUE7QUFBQSxTQUFBLFNBbkNNaEIsZ0JBQUE7QUFBQSxXQUFBQyxNQUFBdkIsTUFBQSxNQUFBQyxTQUFBO0VBQUE7QUFBQSxFQUFBOztBTUhOLElBQUl6QiwrQkFBK0JGLG9CQUFvQjtBQUN0RCxPQUFLZ0QsYUFBYTtBQUNuQjsiLAogICJuYW1lcyI6IFsiV0dfQUNUSU9OIiwgIm13IiwgImNvbmZpZyIsICJnZXQiLCAiV0dfQ1VSX1JFVklTSU9OX0lEIiwgIldHX1BBR0VfTkFNRSIsICJJU19XR19FRElUX09SX1NVQk1JVF9BQ1RJT04iLCAiaW5jbHVkZXMiLCAiaW1wb3J0X2V4dF9nYWRnZXQzIiwgInJlcXVpcmUiLCAidmVyc2lvbiIsICJpbXBvcnRfZXh0X2dhZGdldCIsICJhcGkiLCAiaW5pdE13QXBpIiwgImNvbmNhdCIsICJwYXJhbWV0ZXJzIiwgImFjdGlvbiIsICJmb3JtYXQiLCAiZm9ybWF0dmVyc2lvbiIsICJwcm9wIiwgInJ2cHJvcCIsICJxdWVyeVBhZ2VJbmZvIiwgIl9yZWYiLCAiX2FzeW5jVG9HZW5lcmF0b3IiLCAidGl0bGUiLCAicG9zdCIsICJ0aXRsZXMiLCAiZXJyb3IiLCAiY29uc29sZSIsICJfeCIsICJhcHBseSIsICJhcmd1bWVudHMiLCAiZ2V0Q3VycmVudFJldmlzaW9uSWQiLCAiX3JlZjIiLCAicGFnZUluZm8iLCAicXVlcnkiLCAicGFnZSIsICJwYWdlcyIsICJtaXNzaW5nIiwgInJldmlzaW9ucyIsICJyZXZpZCIsICJfeDIiLCAiaW1wb3J0X2V4dF9nYWRnZXQyIiwgImdldEkxOG5NZXNzYWdlcyIsICJOb3RpY2UiLCAibG9jYWxpemUiLCAiZW4iLCAiamEiLCAiaTE4bk1lc3NhZ2VzIiwgImdldE1lc3NhZ2UiLCAia2V5IiwgImltcG9ydF9leHRfZ2FkZ2V0NCIsICJlZGl0Q29uZmxpY3QiLCAiX3JlZjMiLCAiaXNDb250aW51ZSIsICJnZXRCb2R5IiwgInRoZW4iLCAiJGJvZHkiLCAiZmluZCIsICJvbiIsICJjaGVja0VkaXRDb25mbGljdCIsICJfcmVmNCIsICJwYWdlUmV2aXNpb25JZCIsICJ0b2FzdGlmeSIsICJub2RlIiwgIiQiLCAiY2xvc2UiLCAiZHVyYXRpb24iLCAiZGVsYXkiXQp9Cg==