From fd2846a93dd362a58b964bbcd7dafdbe266158be Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Fri, 23 Jul 2021 15:33:38 -0400 Subject: [PATCH] Add update scoreboard and challenge board functions to window global (#1957) * Closes #1841 * Adds update scoreboard and challenge board functions to window global * This is a stop gap measure before we start using CTFd.js more heavily --- CTFd/themes/core/assets/js/pages/challenges.js | 2 ++ CTFd/themes/core/assets/js/pages/scoreboard.js | 2 ++ CTFd/themes/core/static/js/pages/challenges.dev.js | 2 +- CTFd/themes/core/static/js/pages/challenges.min.js | 2 +- CTFd/themes/core/static/js/pages/scoreboard.dev.js | 2 +- CTFd/themes/core/static/js/pages/scoreboard.min.js | 2 +- 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CTFd/themes/core/assets/js/pages/challenges.js b/CTFd/themes/core/assets/js/pages/challenges.js index 23ace886..27014b6e 100644 --- a/CTFd/themes/core/assets/js/pages/challenges.js +++ b/CTFd/themes/core/assets/js/pages/challenges.js @@ -428,3 +428,5 @@ const loadHint = id => { displayUnlock(id); }); }; + +window.updateChallengeBoard = update; diff --git a/CTFd/themes/core/assets/js/pages/scoreboard.js b/CTFd/themes/core/assets/js/pages/scoreboard.js index 6fa5e843..6265f793 100644 --- a/CTFd/themes/core/assets/js/pages/scoreboard.js +++ b/CTFd/themes/core/assets/js/pages/scoreboard.js @@ -175,3 +175,5 @@ $(() => { setInterval(update, 300000); // Update scores every 5 minutes createGraph(); }); + +window.updateScoreboard = update; diff --git a/CTFd/themes/core/static/js/pages/challenges.dev.js b/CTFd/themes/core/static/js/pages/challenges.dev.js index 111ac1ae..115fd6f4 100644 --- a/CTFd/themes/core/static/js/pages/challenges.dev.js +++ b/CTFd/themes/core/static/js/pages/challenges.dev.js @@ -162,7 +162,7 @@ /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\n__webpack_require__(/*! bootstrap/js/dist/tab */ \"./node_modules/bootstrap/js/dist/tab.js\");\n\nvar _ezq = __webpack_require__(/*! ../ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _dayjs = _interopRequireDefault(__webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\"));\n\nvar _relativeTime = _interopRequireDefault(__webpack_require__(/*! dayjs/plugin/relativeTime */ \"./node_modules/dayjs/plugin/relativeTime.js\"));\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _config = _interopRequireDefault(__webpack_require__(/*! ../config */ \"./CTFd/themes/core/assets/js/config.js\"));\n\nvar _highlight = _interopRequireDefault(__webpack_require__(/*! highlight.js */ \"./node_modules/highlight.js/lib/index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_dayjs[\"default\"].extend(_relativeTime[\"default\"]);\n\n_CTFd[\"default\"]._internal.challenge = {};\nvar challenges = [];\nvar solves = [];\n\nvar loadChal = function loadChal(id) {\n var chal = _jquery[\"default\"].grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n if (chal.type === \"hidden\") {\n (0, _ezq.ezAlert)({\n title: \"Challenge Hidden!\",\n body: \"You haven't unlocked this challenge yet!\",\n button: \"Got it!\"\n });\n return;\n }\n\n displayChal(chal);\n};\n\nvar loadChalByName = function loadChalByName(name) {\n var idx = name.lastIndexOf(\"-\");\n var pieces = [name.slice(0, idx), name.slice(idx + 1)];\n var id = pieces[1];\n\n var chal = _jquery[\"default\"].grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n displayChal(chal);\n};\n\nvar displayChal = function displayChal(chal) {\n return Promise.all([_CTFd[\"default\"].api.get_challenge({\n challengeId: chal.id\n }), _jquery[\"default\"].getScript(_config[\"default\"].urlRoot + chal.script), _jquery[\"default\"].get(_config[\"default\"].urlRoot + chal.template)]).then(function (responses) {\n var challenge = _CTFd[\"default\"]._internal.challenge;\n (0, _jquery[\"default\"])(\"#challenge-window\").empty(); // Inject challenge data into the plugin\n\n challenge.data = responses[0].data; // Call preRender function in plugin\n\n challenge.preRender(); // Build HTML from the Jinja response in API\n\n (0, _jquery[\"default\"])(\"#challenge-window\").append(responses[0].data.view);\n (0, _jquery[\"default\"])(\"#challenge-window #challenge-input\").addClass(\"form-control\");\n (0, _jquery[\"default\"])(\"#challenge-window #challenge-submit\").addClass(\"btn btn-md btn-outline-secondary float-right\");\n var modal = (0, _jquery[\"default\"])(\"#challenge-window\").find(\".modal-dialog\");\n\n if (window.init.theme_settings && window.init.theme_settings.challenge_window_size) {\n switch (window.init.theme_settings.challenge_window_size) {\n case \"sm\":\n modal.addClass(\"modal-sm\");\n break;\n\n case \"lg\":\n modal.addClass(\"modal-lg\");\n break;\n\n case \"xl\":\n modal.addClass(\"modal-xl\");\n break;\n\n default:\n break;\n }\n }\n\n (0, _jquery[\"default\"])(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery[\"default\"])(\"#challenge-id\").val());\n });\n (0, _jquery[\"default\"])(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery[\"default\"])(this).tab(\"show\");\n }); // Handle modal toggling\n\n (0, _jquery[\"default\"])(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery[\"default\"])(\"#incorrect-key\").slideUp();\n (0, _jquery[\"default\"])(\"#correct-key\").slideUp();\n (0, _jquery[\"default\"])(\"#already-solved\").slideUp();\n (0, _jquery[\"default\"])(\"#too-fast\").slideUp();\n });\n (0, _jquery[\"default\"])(\".load-hint\").on(\"click\", function (_event) {\n loadHint((0, _jquery[\"default\"])(this).data(\"hint-id\"));\n });\n (0, _jquery[\"default\"])(\"#challenge-submit\").click(function (event) {\n event.preventDefault();\n (0, _jquery[\"default\"])(\"#challenge-submit\").addClass(\"disabled-button\");\n (0, _jquery[\"default\"])(\"#challenge-submit\").prop(\"disabled\", true);\n\n _CTFd[\"default\"]._internal.challenge.submit().then(renderSubmissionResponse).then(loadChals).then(markSolves);\n });\n (0, _jquery[\"default\"])(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery[\"default\"])(\"#challenge-submit\").click();\n }\n });\n challenge.postRender();\n (0, _jquery[\"default\"])(\"#challenge-window\").find(\"pre code\").each(function (_idx) {\n _highlight[\"default\"].highlightBlock(this);\n });\n window.location.replace(window.location.href.split(\"#\")[0] + \"#\".concat(chal.name, \"-\").concat(chal.id));\n (0, _jquery[\"default\"])(\"#challenge-window\").modal();\n });\n};\n\nfunction renderSubmissionResponse(response) {\n var result = response.data;\n var result_message = (0, _jquery[\"default\"])(\"#result-message\");\n var result_notification = (0, _jquery[\"default\"])(\"#result-notification\");\n var answer_input = (0, _jquery[\"default\"])(\"#challenge-input\");\n result_notification.removeClass();\n result_message.text(result.message);\n\n if (result.status === \"authentication_required\") {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/login?next=\" + _CTFd[\"default\"].config.urlRoot + window.location.pathname + window.location.hash;\n return;\n } else if (result.status === \"incorrect\") {\n // Incorrect key\n result_notification.addClass(\"alert alert-danger alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.removeClass(\"correct\");\n answer_input.addClass(\"wrong\");\n setTimeout(function () {\n answer_input.removeClass(\"wrong\");\n }, 3000);\n } else if (result.status === \"correct\") {\n // Challenge Solved\n result_notification.addClass(\"alert alert-success alert-dismissable text-center\");\n result_notification.slideDown();\n\n if ((0, _jquery[\"default\"])(\".challenge-solves\").text().trim()) {\n // Only try to increment solves if the text isn't hidden\n (0, _jquery[\"default\"])(\".challenge-solves\").text(parseInt((0, _jquery[\"default\"])(\".challenge-solves\").text().split(\" \")[0]) + 1 + \" Solves\");\n }\n\n answer_input.val(\"\");\n answer_input.removeClass(\"wrong\");\n answer_input.addClass(\"correct\");\n } else if (result.status === \"already_solved\") {\n // Challenge already solved\n result_notification.addClass(\"alert alert-info alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"correct\");\n } else if (result.status === \"paused\") {\n // CTF is paused\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n } else if (result.status === \"ratelimited\") {\n // Keys per minute too high\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"too-fast\");\n setTimeout(function () {\n answer_input.removeClass(\"too-fast\");\n }, 3000);\n }\n\n setTimeout(function () {\n (0, _jquery[\"default\"])(\".alert\").slideUp();\n (0, _jquery[\"default\"])(\"#challenge-submit\").removeClass(\"disabled-button\");\n (0, _jquery[\"default\"])(\"#challenge-submit\").prop(\"disabled\", false);\n }, 3000);\n}\n\nfunction markSolves() {\n challenges.map(function (challenge) {\n if (challenge.solved_by_me) {\n var btn = (0, _jquery[\"default\"])(\"button[value=\\\"\".concat(challenge.id, \"\\\"]\"));\n btn.addClass(\"solved-challenge\");\n btn.prepend(\"\");\n }\n });\n}\n\nfunction getSolves(id) {\n return _CTFd[\"default\"].api.get_challenge_solves({\n challengeId: id\n }).then(function (response) {\n var data = response.data;\n (0, _jquery[\"default\"])(\".challenge-solves\").text(parseInt(data.length) + \" Solves\");\n var box = (0, _jquery[\"default\"])(\"#challenge-solves-names\");\n box.empty();\n\n for (var i = 0; i < data.length; i++) {\n var _id = data[i].account_id;\n var name = data[i].name;\n var date = (0, _dayjs[\"default\"])(data[i].date).fromNow();\n var account_url = data[i].account_url;\n box.append('{2}{3}'.format(account_url, _id, (0, _utils.htmlEntities)(name), date));\n }\n });\n}\n\nfunction loadChals() {\n return _CTFd[\"default\"].api.get_challenge_list().then(function (response) {\n var categories = [];\n var $challenges_board = (0, _jquery[\"default\"])(\"#challenges-board\");\n challenges = response.data;\n\n if (window.BETA_sortChallenges) {\n challenges = window.BETA_sortChallenges(challenges);\n }\n\n $challenges_board.empty();\n\n for (var i = challenges.length - 1; i >= 0; i--) {\n if (_jquery[\"default\"].inArray(challenges[i].category, categories) == -1) {\n var category = challenges[i].category;\n categories.push(category);\n var categoryid = category.replace(/ /g, \"-\").hashCode();\n var categoryrow = (0, _jquery[\"default\"])(\"\" + '
'.format(categoryid) + '
' + \"
\" + '
' + '
' + \"
\" + \"
\");\n categoryrow.find(\".category-header\").append((0, _jquery[\"default\"])(\"

\" + category + \"

\"));\n $challenges_board.append(categoryrow);\n }\n }\n\n for (var _i = 0; _i <= challenges.length - 1; _i++) {\n var chalinfo = challenges[_i];\n var chalid = chalinfo.name.replace(/ /g, \"-\").hashCode();\n var catid = chalinfo.category.replace(/ /g, \"-\").hashCode();\n var chalwrap = (0, _jquery[\"default\"])(\"
\".format(chalid));\n var chalbutton = void 0;\n\n if (solves.indexOf(chalinfo.id) == -1) {\n chalbutton = (0, _jquery[\"default\"])(\"\".format(chalinfo.id));\n } else {\n chalbutton = (0, _jquery[\"default\"])(\"\".format(chalinfo.id));\n }\n\n var chalheader = (0, _jquery[\"default\"])(\"

{0}

\".format(chalinfo.name));\n var chalscore = (0, _jquery[\"default\"])(\"{0}\".format(chalinfo.value));\n\n for (var j = 0; j < chalinfo.tags.length; j++) {\n var tag = \"tag-\" + chalinfo.tags[j].value.replace(/ /g, \"-\");\n chalwrap.addClass(tag);\n }\n\n chalbutton.append(chalheader);\n chalbutton.append(chalscore);\n chalwrap.append(chalbutton);\n (0, _jquery[\"default\"])(\"#\" + catid + \"-row\").find(\".category-challenges > .challenges-row\").append(chalwrap);\n }\n\n (0, _jquery[\"default\"])(\".challenge-button\").click(function (_event) {\n loadChal(this.value);\n });\n });\n}\n\nfunction update() {\n return loadChals().then(markSolves);\n}\n\n(0, _jquery[\"default\"])(function () {\n update().then(function () {\n if (window.location.hash.length > 0) {\n loadChalByName(decodeURIComponent(window.location.hash.substring(1)));\n }\n });\n (0, _jquery[\"default\"])(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery[\"default\"])(\"#challenge-submit\").click();\n }\n });\n (0, _jquery[\"default\"])(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery[\"default\"])(this).tab(\"show\");\n });\n (0, _jquery[\"default\"])(\"#challenge-window\").on(\"hidden.bs.modal\", function (_event) {\n (0, _jquery[\"default\"])(\".nav-tabs a:first\").tab(\"show\");\n history.replaceState(\"\", window.document.title, window.location.pathname);\n });\n (0, _jquery[\"default\"])(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery[\"default\"])(\"#challenge-id\").val());\n });\n (0, _jquery[\"default\"])(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery[\"default\"])(\"#incorrect-key\").slideUp();\n (0, _jquery[\"default\"])(\"#correct-key\").slideUp();\n (0, _jquery[\"default\"])(\"#already-solved\").slideUp();\n (0, _jquery[\"default\"])(\"#too-fast\").slideUp();\n });\n});\nsetInterval(update, 300000); // Update every 5 minutes.\n\nvar displayHint = function displayHint(data) {\n (0, _ezq.ezAlert)({\n title: \"Hint\",\n body: data.html,\n button: \"Got it!\"\n });\n};\n\nvar displayUnlock = function displayUnlock(id) {\n (0, _ezq.ezQuery)({\n title: \"Unlock Hint?\",\n body: \"Are you sure you want to open this hint?\",\n success: function success() {\n var params = {\n target: id,\n type: \"hints\"\n };\n\n _CTFd[\"default\"].api.post_unlock_list({}, params).then(function (response) {\n if (response.success) {\n _CTFd[\"default\"].api.get_hint({\n hintId: id\n }).then(function (response) {\n displayHint(response.data);\n });\n\n return;\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: response.errors.score,\n button: \"Got it!\"\n });\n });\n }\n });\n};\n\nvar loadHint = function loadHint(id) {\n _CTFd[\"default\"].api.get_hint({\n hintId: id\n }).then(function (response) {\n if (response.data.content) {\n displayHint(response.data);\n return;\n }\n\n displayUnlock(id);\n });\n};\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/challenges.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\n__webpack_require__(/*! bootstrap/js/dist/tab */ \"./node_modules/bootstrap/js/dist/tab.js\");\n\nvar _ezq = __webpack_require__(/*! ../ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _dayjs = _interopRequireDefault(__webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\"));\n\nvar _relativeTime = _interopRequireDefault(__webpack_require__(/*! dayjs/plugin/relativeTime */ \"./node_modules/dayjs/plugin/relativeTime.js\"));\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _config = _interopRequireDefault(__webpack_require__(/*! ../config */ \"./CTFd/themes/core/assets/js/config.js\"));\n\nvar _highlight = _interopRequireDefault(__webpack_require__(/*! highlight.js */ \"./node_modules/highlight.js/lib/index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n_dayjs[\"default\"].extend(_relativeTime[\"default\"]);\n\n_CTFd[\"default\"]._internal.challenge = {};\nvar challenges = [];\nvar solves = [];\n\nvar loadChal = function loadChal(id) {\n var chal = _jquery[\"default\"].grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n if (chal.type === \"hidden\") {\n (0, _ezq.ezAlert)({\n title: \"Challenge Hidden!\",\n body: \"You haven't unlocked this challenge yet!\",\n button: \"Got it!\"\n });\n return;\n }\n\n displayChal(chal);\n};\n\nvar loadChalByName = function loadChalByName(name) {\n var idx = name.lastIndexOf(\"-\");\n var pieces = [name.slice(0, idx), name.slice(idx + 1)];\n var id = pieces[1];\n\n var chal = _jquery[\"default\"].grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n displayChal(chal);\n};\n\nvar displayChal = function displayChal(chal) {\n return Promise.all([_CTFd[\"default\"].api.get_challenge({\n challengeId: chal.id\n }), _jquery[\"default\"].getScript(_config[\"default\"].urlRoot + chal.script), _jquery[\"default\"].get(_config[\"default\"].urlRoot + chal.template)]).then(function (responses) {\n var challenge = _CTFd[\"default\"]._internal.challenge;\n (0, _jquery[\"default\"])(\"#challenge-window\").empty(); // Inject challenge data into the plugin\n\n challenge.data = responses[0].data; // Call preRender function in plugin\n\n challenge.preRender(); // Build HTML from the Jinja response in API\n\n (0, _jquery[\"default\"])(\"#challenge-window\").append(responses[0].data.view);\n (0, _jquery[\"default\"])(\"#challenge-window #challenge-input\").addClass(\"form-control\");\n (0, _jquery[\"default\"])(\"#challenge-window #challenge-submit\").addClass(\"btn btn-md btn-outline-secondary float-right\");\n var modal = (0, _jquery[\"default\"])(\"#challenge-window\").find(\".modal-dialog\");\n\n if (window.init.theme_settings && window.init.theme_settings.challenge_window_size) {\n switch (window.init.theme_settings.challenge_window_size) {\n case \"sm\":\n modal.addClass(\"modal-sm\");\n break;\n\n case \"lg\":\n modal.addClass(\"modal-lg\");\n break;\n\n case \"xl\":\n modal.addClass(\"modal-xl\");\n break;\n\n default:\n break;\n }\n }\n\n (0, _jquery[\"default\"])(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery[\"default\"])(\"#challenge-id\").val());\n });\n (0, _jquery[\"default\"])(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery[\"default\"])(this).tab(\"show\");\n }); // Handle modal toggling\n\n (0, _jquery[\"default\"])(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery[\"default\"])(\"#incorrect-key\").slideUp();\n (0, _jquery[\"default\"])(\"#correct-key\").slideUp();\n (0, _jquery[\"default\"])(\"#already-solved\").slideUp();\n (0, _jquery[\"default\"])(\"#too-fast\").slideUp();\n });\n (0, _jquery[\"default\"])(\".load-hint\").on(\"click\", function (_event) {\n loadHint((0, _jquery[\"default\"])(this).data(\"hint-id\"));\n });\n (0, _jquery[\"default\"])(\"#challenge-submit\").click(function (event) {\n event.preventDefault();\n (0, _jquery[\"default\"])(\"#challenge-submit\").addClass(\"disabled-button\");\n (0, _jquery[\"default\"])(\"#challenge-submit\").prop(\"disabled\", true);\n\n _CTFd[\"default\"]._internal.challenge.submit().then(renderSubmissionResponse).then(loadChals).then(markSolves);\n });\n (0, _jquery[\"default\"])(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery[\"default\"])(\"#challenge-submit\").click();\n }\n });\n challenge.postRender();\n (0, _jquery[\"default\"])(\"#challenge-window\").find(\"pre code\").each(function (_idx) {\n _highlight[\"default\"].highlightBlock(this);\n });\n window.location.replace(window.location.href.split(\"#\")[0] + \"#\".concat(chal.name, \"-\").concat(chal.id));\n (0, _jquery[\"default\"])(\"#challenge-window\").modal();\n });\n};\n\nfunction renderSubmissionResponse(response) {\n var result = response.data;\n var result_message = (0, _jquery[\"default\"])(\"#result-message\");\n var result_notification = (0, _jquery[\"default\"])(\"#result-notification\");\n var answer_input = (0, _jquery[\"default\"])(\"#challenge-input\");\n result_notification.removeClass();\n result_message.text(result.message);\n\n if (result.status === \"authentication_required\") {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/login?next=\" + _CTFd[\"default\"].config.urlRoot + window.location.pathname + window.location.hash;\n return;\n } else if (result.status === \"incorrect\") {\n // Incorrect key\n result_notification.addClass(\"alert alert-danger alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.removeClass(\"correct\");\n answer_input.addClass(\"wrong\");\n setTimeout(function () {\n answer_input.removeClass(\"wrong\");\n }, 3000);\n } else if (result.status === \"correct\") {\n // Challenge Solved\n result_notification.addClass(\"alert alert-success alert-dismissable text-center\");\n result_notification.slideDown();\n\n if ((0, _jquery[\"default\"])(\".challenge-solves\").text().trim()) {\n // Only try to increment solves if the text isn't hidden\n (0, _jquery[\"default\"])(\".challenge-solves\").text(parseInt((0, _jquery[\"default\"])(\".challenge-solves\").text().split(\" \")[0]) + 1 + \" Solves\");\n }\n\n answer_input.val(\"\");\n answer_input.removeClass(\"wrong\");\n answer_input.addClass(\"correct\");\n } else if (result.status === \"already_solved\") {\n // Challenge already solved\n result_notification.addClass(\"alert alert-info alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"correct\");\n } else if (result.status === \"paused\") {\n // CTF is paused\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n } else if (result.status === \"ratelimited\") {\n // Keys per minute too high\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"too-fast\");\n setTimeout(function () {\n answer_input.removeClass(\"too-fast\");\n }, 3000);\n }\n\n setTimeout(function () {\n (0, _jquery[\"default\"])(\".alert\").slideUp();\n (0, _jquery[\"default\"])(\"#challenge-submit\").removeClass(\"disabled-button\");\n (0, _jquery[\"default\"])(\"#challenge-submit\").prop(\"disabled\", false);\n }, 3000);\n}\n\nfunction markSolves() {\n challenges.map(function (challenge) {\n if (challenge.solved_by_me) {\n var btn = (0, _jquery[\"default\"])(\"button[value=\\\"\".concat(challenge.id, \"\\\"]\"));\n btn.addClass(\"solved-challenge\");\n btn.prepend(\"\");\n }\n });\n}\n\nfunction getSolves(id) {\n return _CTFd[\"default\"].api.get_challenge_solves({\n challengeId: id\n }).then(function (response) {\n var data = response.data;\n (0, _jquery[\"default\"])(\".challenge-solves\").text(parseInt(data.length) + \" Solves\");\n var box = (0, _jquery[\"default\"])(\"#challenge-solves-names\");\n box.empty();\n\n for (var i = 0; i < data.length; i++) {\n var _id = data[i].account_id;\n var name = data[i].name;\n var date = (0, _dayjs[\"default\"])(data[i].date).fromNow();\n var account_url = data[i].account_url;\n box.append('
{2}{3}'.format(account_url, _id, (0, _utils.htmlEntities)(name), date));\n }\n });\n}\n\nfunction loadChals() {\n return _CTFd[\"default\"].api.get_challenge_list().then(function (response) {\n var categories = [];\n var $challenges_board = (0, _jquery[\"default\"])(\"#challenges-board\");\n challenges = response.data;\n\n if (window.BETA_sortChallenges) {\n challenges = window.BETA_sortChallenges(challenges);\n }\n\n $challenges_board.empty();\n\n for (var i = challenges.length - 1; i >= 0; i--) {\n if (_jquery[\"default\"].inArray(challenges[i].category, categories) == -1) {\n var category = challenges[i].category;\n categories.push(category);\n var categoryid = category.replace(/ /g, \"-\").hashCode();\n var categoryrow = (0, _jquery[\"default\"])(\"\" + '
'.format(categoryid) + '
' + \"
\" + '
' + '
' + \"
\" + \"
\");\n categoryrow.find(\".category-header\").append((0, _jquery[\"default\"])(\"

\" + category + \"

\"));\n $challenges_board.append(categoryrow);\n }\n }\n\n for (var _i = 0; _i <= challenges.length - 1; _i++) {\n var chalinfo = challenges[_i];\n var chalid = chalinfo.name.replace(/ /g, \"-\").hashCode();\n var catid = chalinfo.category.replace(/ /g, \"-\").hashCode();\n var chalwrap = (0, _jquery[\"default\"])(\"
\".format(chalid));\n var chalbutton = void 0;\n\n if (solves.indexOf(chalinfo.id) == -1) {\n chalbutton = (0, _jquery[\"default\"])(\"\".format(chalinfo.id));\n } else {\n chalbutton = (0, _jquery[\"default\"])(\"\".format(chalinfo.id));\n }\n\n var chalheader = (0, _jquery[\"default\"])(\"

{0}

\".format(chalinfo.name));\n var chalscore = (0, _jquery[\"default\"])(\"{0}\".format(chalinfo.value));\n\n for (var j = 0; j < chalinfo.tags.length; j++) {\n var tag = \"tag-\" + chalinfo.tags[j].value.replace(/ /g, \"-\");\n chalwrap.addClass(tag);\n }\n\n chalbutton.append(chalheader);\n chalbutton.append(chalscore);\n chalwrap.append(chalbutton);\n (0, _jquery[\"default\"])(\"#\" + catid + \"-row\").find(\".category-challenges > .challenges-row\").append(chalwrap);\n }\n\n (0, _jquery[\"default\"])(\".challenge-button\").click(function (_event) {\n loadChal(this.value);\n });\n });\n}\n\nfunction update() {\n return loadChals().then(markSolves);\n}\n\n(0, _jquery[\"default\"])(function () {\n update().then(function () {\n if (window.location.hash.length > 0) {\n loadChalByName(decodeURIComponent(window.location.hash.substring(1)));\n }\n });\n (0, _jquery[\"default\"])(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery[\"default\"])(\"#challenge-submit\").click();\n }\n });\n (0, _jquery[\"default\"])(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery[\"default\"])(this).tab(\"show\");\n });\n (0, _jquery[\"default\"])(\"#challenge-window\").on(\"hidden.bs.modal\", function (_event) {\n (0, _jquery[\"default\"])(\".nav-tabs a:first\").tab(\"show\");\n history.replaceState(\"\", window.document.title, window.location.pathname);\n });\n (0, _jquery[\"default\"])(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery[\"default\"])(\"#challenge-id\").val());\n });\n (0, _jquery[\"default\"])(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery[\"default\"])(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery[\"default\"])(\"#incorrect-key\").slideUp();\n (0, _jquery[\"default\"])(\"#correct-key\").slideUp();\n (0, _jquery[\"default\"])(\"#already-solved\").slideUp();\n (0, _jquery[\"default\"])(\"#too-fast\").slideUp();\n });\n});\nsetInterval(update, 300000); // Update every 5 minutes.\n\nvar displayHint = function displayHint(data) {\n (0, _ezq.ezAlert)({\n title: \"Hint\",\n body: data.html,\n button: \"Got it!\"\n });\n};\n\nvar displayUnlock = function displayUnlock(id) {\n (0, _ezq.ezQuery)({\n title: \"Unlock Hint?\",\n body: \"Are you sure you want to open this hint?\",\n success: function success() {\n var params = {\n target: id,\n type: \"hints\"\n };\n\n _CTFd[\"default\"].api.post_unlock_list({}, params).then(function (response) {\n if (response.success) {\n _CTFd[\"default\"].api.get_hint({\n hintId: id\n }).then(function (response) {\n displayHint(response.data);\n });\n\n return;\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: response.errors.score,\n button: \"Got it!\"\n });\n });\n }\n });\n};\n\nvar loadHint = function loadHint(id) {\n _CTFd[\"default\"].api.get_hint({\n hintId: id\n }).then(function (response) {\n if (response.data.content) {\n displayHint(response.data);\n return;\n }\n\n displayUnlock(id);\n });\n};\n\nwindow.updateChallengeBoard = update;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/challenges.js?"); /***/ }) diff --git a/CTFd/themes/core/static/js/pages/challenges.min.js b/CTFd/themes/core/static/js/pages/challenges.min.js index 31e28605..e2305240 100644 --- a/CTFd/themes/core/static/js/pages/challenges.min.js +++ b/CTFd/themes/core/static/js/pages/challenges.min.js @@ -1 +1 @@ -!function(d){function e(e){for(var t,i,n=e[0],o=e[1],a=e[2],r=0,s=[];r".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var n=(0,s.default)(p.format(e.button));return e.success&&(0,s.default)(n).click(function(){e.success()}),e.large&&i.find(".modal-dialog").addClass("modal-lg"),i.find(".modal-footer").append(n),i.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(i),i.modal("show"),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),i}function m(e){(0,s.default)("#ezq--notifications-toast-container").length||(0,s.default)("body").append((0,s.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t,i=d.format(e.title,e.body),n=(0,s.default)(i);e.onclose&&(0,s.default)(n).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick&&((t=(0,s.default)(n).find(".toast-body")).addClass("cursor-pointer"),t.click(function(){e.onclick()}));var o=!1!==e.autohide,a=!1!==e.animation,r=e.delay||1e4;return(0,s.default)("#ezq--notifications-toast-container").prepend(n),n.toast({autohide:o,delay:r,animation:a}),n.toast("show"),n}function g(e){var t=r.format(e.title),i=(0,s.default)(t);"string"==typeof e.body?i.find(".modal-body").append("

".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var n=(0,s.default)(f),o=(0,s.default)(u);return i.find(".modal-footer").append(o),i.find(".modal-footer").append(n),i.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(i),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(n).click(function(){e.success()}),i.modal("show"),i}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var i=l.format(e.width),n=r.format(e.title),o=(0,s.default)(n);return o.find(".modal-body").append((0,s.default)(i)),(0,s.default)("main").append(o),o.modal("show")}function y(e){var t={success:c,error:o}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:h,ezToast:m,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,i("./node_modules/whatwg-fetch/fetch.js");var n,o=(n=i("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=o.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=o.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/pages/challenges.js":function(e,t,i){i("./CTFd/themes/core/assets/js/pages/main.js"),i("./node_modules/bootstrap/js/dist/tab.js");var n=i("./CTFd/themes/core/assets/js/ezq.js"),d=i("./CTFd/themes/core/assets/js/utils.js"),l=c(i("./node_modules/dayjs/dayjs.min.js")),o=c(i("./node_modules/dayjs/plugin/relativeTime.js")),v=c(i("./node_modules/jquery/dist/jquery.js")),a=c(i("./CTFd/themes/core/assets/js/CTFd.js")),r=c(i("./CTFd/themes/core/assets/js/config.js")),s=c(i("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}l.default.extend(o.default),a.default._internal.challenge={};var y=[],j=[],_=function(t){var e=v.default.grep(y,function(e){return e.id==t})[0];"hidden"!==e.type?p(e):(0,n.ezAlert)({title:"Challenge Hidden!",body:"You haven't unlocked this challenge yet!",button:"Got it!"})},p=function(n){return Promise.all([a.default.api.get_challenge({challengeId:n.id}),v.default.getScript(r.default.urlRoot+n.script),v.default.get(r.default.urlRoot+n.template)]).then(function(e){var t=a.default._internal.challenge;(0,v.default)("#challenge-window").empty(),t.data=e[0].data,t.preRender(),(0,v.default)("#challenge-window").append(e[0].data.view),(0,v.default)("#challenge-window #challenge-input").addClass("form-control"),(0,v.default)("#challenge-window #challenge-submit").addClass("btn btn-md btn-outline-secondary float-right");var i=(0,v.default)("#challenge-window").find(".modal-dialog");if(window.init.theme_settings&&window.init.theme_settings.challenge_window_size)switch(window.init.theme_settings.challenge_window_size){case"sm":i.addClass("modal-sm");break;case"lg":i.addClass("modal-lg");break;case"xl":i.addClass("modal-xl")}(0,v.default)(".challenge-solves").click(function(e){h((0,v.default)("#challenge-id").val())}),(0,v.default)(".nav-tabs a").click(function(e){e.preventDefault(),(0,v.default)(this).tab("show")}),(0,v.default)("#challenge-window").on("hide.bs.modal",function(e){(0,v.default)("#challenge-input").removeClass("wrong"),(0,v.default)("#challenge-input").removeClass("correct"),(0,v.default)("#incorrect-key").slideUp(),(0,v.default)("#correct-key").slideUp(),(0,v.default)("#already-solved").slideUp(),(0,v.default)("#too-fast").slideUp()}),(0,v.default)(".load-hint").on("click",function(e){T((0,v.default)(this).data("hint-id"))}),(0,v.default)("#challenge-submit").click(function(e){e.preventDefault(),(0,v.default)("#challenge-submit").addClass("disabled-button"),(0,v.default)("#challenge-submit").prop("disabled",!0),a.default._internal.challenge.submit().then(u).then(m).then(f)}),(0,v.default)("#challenge-input").keyup(function(e){13==e.keyCode&&(0,v.default)("#challenge-submit").click()}),t.postRender(),(0,v.default)("#challenge-window").find("pre code").each(function(e){s.default.highlightBlock(this)}),window.location.replace(window.location.href.split("#")[0]+"#".concat(n.name,"-").concat(n.id)),(0,v.default)("#challenge-window").modal()})};function u(e){var t=e.data,i=(0,v.default)("#result-message"),n=(0,v.default)("#result-notification"),o=(0,v.default)("#challenge-input");n.removeClass(),i.text(t.message),"authentication_required"!==t.status?("incorrect"===t.status?(n.addClass("alert alert-danger alert-dismissable text-center"),n.slideDown(),o.removeClass("correct"),o.addClass("wrong"),setTimeout(function(){o.removeClass("wrong")},3e3)):"correct"===t.status?(n.addClass("alert alert-success alert-dismissable text-center"),n.slideDown(),(0,v.default)(".challenge-solves").text().trim()&&(0,v.default)(".challenge-solves").text(parseInt((0,v.default)(".challenge-solves").text().split(" ")[0])+1+" Solves"),o.val(""),o.removeClass("wrong"),o.addClass("correct")):"already_solved"===t.status?(n.addClass("alert alert-info alert-dismissable text-center"),n.slideDown(),o.addClass("correct")):"paused"===t.status?(n.addClass("alert alert-warning alert-dismissable text-center"),n.slideDown()):"ratelimited"===t.status&&(n.addClass("alert alert-warning alert-dismissable text-center"),n.slideDown(),o.addClass("too-fast"),setTimeout(function(){o.removeClass("too-fast")},3e3)),setTimeout(function(){(0,v.default)(".alert").slideUp(),(0,v.default)("#challenge-submit").removeClass("disabled-button"),(0,v.default)("#challenge-submit").prop("disabled",!1)},3e3)):window.location=a.default.config.urlRoot+"/login?next="+a.default.config.urlRoot+window.location.pathname+window.location.hash}function f(){y.map(function(e){var t;e.solved_by_me&&((t=(0,v.default)('button[value="'.concat(e.id,'"]'))).addClass("solved-challenge"),t.prepend(""))})}function h(e){return a.default.api.get_challenge_solves({challengeId:e}).then(function(e){var t=e.data;(0,v.default)(".challenge-solves").text(parseInt(t.length)+" Solves");var i=(0,v.default)("#challenge-solves-names");i.empty();for(var n=0;n
{2}{3}'.format(s,o,(0,d.htmlEntities)(a),r))}})}function m(){return a.default.api.get_challenge_list().then(function(e){var t=[],i=(0,v.default)("#challenges-board");y=e.data,window.BETA_sortChallenges&&(y=window.BETA_sortChallenges(y)),i.empty();for(var n,o,a,r=y.length-1;0<=r;r--){-1==v.default.inArray(y[r].category,t)&&(n=y[r].category,t.push(n),o=n.replace(/ /g,"-").hashCode(),(a=(0,v.default)('
'.format(o)+'
')).find(".category-header").append((0,v.default)("

"+n+"

")),i.append(a))}for(var s=0;s<=y.length-1;s++){for(var d=y[s],l=d.name.replace(/ /g,"-").hashCode(),c=d.category.replace(/ /g,"-").hashCode(),p=(0,v.default)("
".format(l)),u=void 0,u=-1==j.indexOf(d.id)?(0,v.default)("".format(d.id)):(0,v.default)("".format(d.id)),f=(0,v.default)("

{0}

".format(d.name)),h=(0,v.default)("{0}".format(d.value)),m=0;m .challenges-row").append(p)}(0,v.default)(".challenge-button").click(function(e){_(this.value)})})}function g(){return m().then(f)}(0,v.default)(function(){g().then(function(){var e,t,i,n;0").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),i=0;i'),(0,r.default)("th.sort-col").click(function(){var o,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((o=(0,r.default)(this).index(),function(e,t){var i=a(e,o),n=a(t,o);return r.default.isNumeric(i)&&r.default.isNumeric(n)?i-n:i.toString().localeCompare(n)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var i=0;i".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var n=(0,s.default)(p.format(e.button));return e.success&&(0,s.default)(n).click(function(){e.success()}),e.large&&i.find(".modal-dialog").addClass("modal-lg"),i.find(".modal-footer").append(n),i.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(i),i.modal("show"),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),i}function m(e){(0,s.default)("#ezq--notifications-toast-container").length||(0,s.default)("body").append((0,s.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t,i=d.format(e.title,e.body),n=(0,s.default)(i);e.onclose&&(0,s.default)(n).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick&&((t=(0,s.default)(n).find(".toast-body")).addClass("cursor-pointer"),t.click(function(){e.onclick()}));var o=!1!==e.autohide,a=!1!==e.animation,r=e.delay||1e4;return(0,s.default)("#ezq--notifications-toast-container").prepend(n),n.toast({autohide:o,delay:r,animation:a}),n.toast("show"),n}function g(e){var t=r.format(e.title),i=(0,s.default)(t);"string"==typeof e.body?i.find(".modal-body").append("

".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var n=(0,s.default)(f),o=(0,s.default)(u);return i.find(".modal-footer").append(o),i.find(".modal-footer").append(n),i.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(i),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(n).click(function(){e.success()}),i.modal("show"),i}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var i=l.format(e.width),n=r.format(e.title),o=(0,s.default)(n);return o.find(".modal-body").append((0,s.default)(i)),(0,s.default)("main").append(o),o.modal("show")}function y(e){var t={success:c,error:o}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:h,ezToast:m,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,i("./node_modules/whatwg-fetch/fetch.js");var n,o=(n=i("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=o.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=o.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/pages/challenges.js":function(e,t,i){i("./CTFd/themes/core/assets/js/pages/main.js"),i("./node_modules/bootstrap/js/dist/tab.js");var n=i("./CTFd/themes/core/assets/js/ezq.js"),d=i("./CTFd/themes/core/assets/js/utils.js"),l=c(i("./node_modules/dayjs/dayjs.min.js")),o=c(i("./node_modules/dayjs/plugin/relativeTime.js")),v=c(i("./node_modules/jquery/dist/jquery.js")),a=c(i("./CTFd/themes/core/assets/js/CTFd.js")),r=c(i("./CTFd/themes/core/assets/js/config.js")),s=c(i("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}l.default.extend(o.default),a.default._internal.challenge={};var y=[],j=[],_=function(t){var e=v.default.grep(y,function(e){return e.id==t})[0];"hidden"!==e.type?p(e):(0,n.ezAlert)({title:"Challenge Hidden!",body:"You haven't unlocked this challenge yet!",button:"Got it!"})},p=function(n){return Promise.all([a.default.api.get_challenge({challengeId:n.id}),v.default.getScript(r.default.urlRoot+n.script),v.default.get(r.default.urlRoot+n.template)]).then(function(e){var t=a.default._internal.challenge;(0,v.default)("#challenge-window").empty(),t.data=e[0].data,t.preRender(),(0,v.default)("#challenge-window").append(e[0].data.view),(0,v.default)("#challenge-window #challenge-input").addClass("form-control"),(0,v.default)("#challenge-window #challenge-submit").addClass("btn btn-md btn-outline-secondary float-right");var i=(0,v.default)("#challenge-window").find(".modal-dialog");if(window.init.theme_settings&&window.init.theme_settings.challenge_window_size)switch(window.init.theme_settings.challenge_window_size){case"sm":i.addClass("modal-sm");break;case"lg":i.addClass("modal-lg");break;case"xl":i.addClass("modal-xl")}(0,v.default)(".challenge-solves").click(function(e){h((0,v.default)("#challenge-id").val())}),(0,v.default)(".nav-tabs a").click(function(e){e.preventDefault(),(0,v.default)(this).tab("show")}),(0,v.default)("#challenge-window").on("hide.bs.modal",function(e){(0,v.default)("#challenge-input").removeClass("wrong"),(0,v.default)("#challenge-input").removeClass("correct"),(0,v.default)("#incorrect-key").slideUp(),(0,v.default)("#correct-key").slideUp(),(0,v.default)("#already-solved").slideUp(),(0,v.default)("#too-fast").slideUp()}),(0,v.default)(".load-hint").on("click",function(e){T((0,v.default)(this).data("hint-id"))}),(0,v.default)("#challenge-submit").click(function(e){e.preventDefault(),(0,v.default)("#challenge-submit").addClass("disabled-button"),(0,v.default)("#challenge-submit").prop("disabled",!0),a.default._internal.challenge.submit().then(u).then(m).then(f)}),(0,v.default)("#challenge-input").keyup(function(e){13==e.keyCode&&(0,v.default)("#challenge-submit").click()}),t.postRender(),(0,v.default)("#challenge-window").find("pre code").each(function(e){s.default.highlightBlock(this)}),window.location.replace(window.location.href.split("#")[0]+"#".concat(n.name,"-").concat(n.id)),(0,v.default)("#challenge-window").modal()})};function u(e){var t=e.data,i=(0,v.default)("#result-message"),n=(0,v.default)("#result-notification"),o=(0,v.default)("#challenge-input");n.removeClass(),i.text(t.message),"authentication_required"!==t.status?("incorrect"===t.status?(n.addClass("alert alert-danger alert-dismissable text-center"),n.slideDown(),o.removeClass("correct"),o.addClass("wrong"),setTimeout(function(){o.removeClass("wrong")},3e3)):"correct"===t.status?(n.addClass("alert alert-success alert-dismissable text-center"),n.slideDown(),(0,v.default)(".challenge-solves").text().trim()&&(0,v.default)(".challenge-solves").text(parseInt((0,v.default)(".challenge-solves").text().split(" ")[0])+1+" Solves"),o.val(""),o.removeClass("wrong"),o.addClass("correct")):"already_solved"===t.status?(n.addClass("alert alert-info alert-dismissable text-center"),n.slideDown(),o.addClass("correct")):"paused"===t.status?(n.addClass("alert alert-warning alert-dismissable text-center"),n.slideDown()):"ratelimited"===t.status&&(n.addClass("alert alert-warning alert-dismissable text-center"),n.slideDown(),o.addClass("too-fast"),setTimeout(function(){o.removeClass("too-fast")},3e3)),setTimeout(function(){(0,v.default)(".alert").slideUp(),(0,v.default)("#challenge-submit").removeClass("disabled-button"),(0,v.default)("#challenge-submit").prop("disabled",!1)},3e3)):window.location=a.default.config.urlRoot+"/login?next="+a.default.config.urlRoot+window.location.pathname+window.location.hash}function f(){y.map(function(e){var t;e.solved_by_me&&((t=(0,v.default)('button[value="'.concat(e.id,'"]'))).addClass("solved-challenge"),t.prepend(""))})}function h(e){return a.default.api.get_challenge_solves({challengeId:e}).then(function(e){var t=e.data;(0,v.default)(".challenge-solves").text(parseInt(t.length)+" Solves");var i=(0,v.default)("#challenge-solves-names");i.empty();for(var n=0;n
{2}{3}'.format(s,o,(0,d.htmlEntities)(a),r))}})}function m(){return a.default.api.get_challenge_list().then(function(e){var t=[],i=(0,v.default)("#challenges-board");y=e.data,window.BETA_sortChallenges&&(y=window.BETA_sortChallenges(y)),i.empty();for(var n,o,a,r=y.length-1;0<=r;r--){-1==v.default.inArray(y[r].category,t)&&(n=y[r].category,t.push(n),o=n.replace(/ /g,"-").hashCode(),(a=(0,v.default)('
'.format(o)+'
')).find(".category-header").append((0,v.default)("

"+n+"

")),i.append(a))}for(var s=0;s<=y.length-1;s++){for(var d=y[s],l=d.name.replace(/ /g,"-").hashCode(),c=d.category.replace(/ /g,"-").hashCode(),p=(0,v.default)("
".format(l)),u=void 0,u=-1==j.indexOf(d.id)?(0,v.default)("".format(d.id)):(0,v.default)("".format(d.id)),f=(0,v.default)("

{0}

".format(d.name)),h=(0,v.default)("{0}".format(d.value)),m=0;m .challenges-row").append(p)}(0,v.default)(".challenge-button").click(function(e){_(this.value)})})}function g(){return m().then(f)}(0,v.default)(function(){g().then(function(){var e,t,i,n;0").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),i=0;i'),(0,r.default)("th.sort-col").click(function(){var o,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((o=(0,r.default)(this).index(),function(e,t){var i=a(e,o),n=a(t,o);return r.default.isNumeric(i)&&r.default.isNumeric(n)?i-n:i.toString().localeCompare(n)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var i=0;i\", '', i + 1, \"\", '
'.format(_CTFd[\"default\"].config.urlRoot, teams[i].account_id), (0, _utils.htmlEntities)(teams[i].name), \"\", \"\", teams[i].score, \"\", \"\"].join(\"\");\n table.append(row);\n }\n });\n};\n\nvar buildGraphData = function buildGraphData() {\n return _CTFd[\"default\"].api.get_scoreboard_detail({\n count: 10\n }).then(function (response) {\n var places = response.data;\n var teams = Object.keys(places);\n\n if (teams.length === 0) {\n return false;\n }\n\n var option = {\n title: {\n left: \"center\",\n text: \"Top 10 \" + (_CTFd[\"default\"].config.userMode === \"teams\" ? \"Teams\" : \"Users\")\n },\n tooltip: {\n trigger: \"axis\",\n axisPointer: {\n type: \"cross\"\n }\n },\n legend: {\n type: \"scroll\",\n orient: \"horizontal\",\n align: \"left\",\n bottom: 35,\n data: []\n },\n toolbox: {\n feature: {\n dataZoom: {\n yAxisIndex: \"none\"\n },\n saveAsImage: {}\n }\n },\n grid: {\n containLabel: true\n },\n xAxis: [{\n type: \"time\",\n boundaryGap: false,\n data: []\n }],\n yAxis: [{\n type: \"value\"\n }],\n dataZoom: [{\n id: \"dataZoomX\",\n type: \"slider\",\n xAxisIndex: [0],\n filterMode: \"filter\",\n height: 20,\n top: 35,\n fillerColor: \"rgba(233, 236, 241, 0.4)\"\n }],\n series: []\n };\n\n var _loop = function _loop(i) {\n var team_score = [];\n var times = [];\n\n for (var j = 0; j < places[teams[i]][\"solves\"].length; j++) {\n team_score.push(places[teams[i]][\"solves\"][j].value);\n var date = (0, _dayjs[\"default\"])(places[teams[i]][\"solves\"][j].date);\n times.push(date.toDate());\n }\n\n var total_scores = (0, _utils.cumulativeSum)(team_score);\n scores = times.map(function (e, i) {\n return [e, total_scores[i]];\n });\n option.legend.data.push(places[teams[i]][\"name\"]);\n var data = {\n name: places[teams[i]][\"name\"],\n type: \"line\",\n label: {\n normal: {\n position: \"top\"\n }\n },\n itemStyle: {\n normal: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n }\n },\n data: scores\n };\n option.series.push(data);\n };\n\n for (var i = 0; i < teams.length; i++) {\n var scores;\n\n _loop(i);\n }\n\n return option;\n });\n};\n\nvar createGraph = function createGraph() {\n buildGraphData().then(function (option) {\n if (option === false) {\n // Replace spinner\n graph.html('

No solves yet

');\n return;\n }\n\n graph.empty(); // Remove spinners\n\n var chart = _echartsEn[\"default\"].init(document.querySelector(\"#score-graph\"));\n\n chart.setOption(option);\n (0, _jquery[\"default\"])(window).on(\"resize\", function () {\n if (chart != null && chart != undefined) {\n chart.resize();\n }\n });\n });\n};\n\nvar updateGraph = function updateGraph() {\n buildGraphData().then(function (option) {\n var chart = _echartsEn[\"default\"].init(document.querySelector(\"#score-graph\"));\n\n chart.setOption(option);\n });\n};\n\nfunction update() {\n updateScores();\n updateGraph();\n}\n\n(0, _jquery[\"default\"])(function () {\n setInterval(update, 300000); // Update scores every 5 minutes\n\n createGraph();\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/scoreboard.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _echartsEn = _interopRequireDefault(__webpack_require__(/*! echarts/dist/echarts-en.common */ \"./node_modules/echarts/dist/echarts-en.common.js\"));\n\nvar _dayjs = _interopRequireDefault(__webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\"));\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar graph = (0, _jquery[\"default\"])(\"#score-graph\");\nvar table = (0, _jquery[\"default\"])(\"#scoreboard tbody\");\n\nvar updateScores = function updateScores() {\n _CTFd[\"default\"].api.get_scoreboard_list().then(function (response) {\n var teams = response.data;\n table.empty();\n\n for (var i = 0; i < teams.length; i++) {\n var row = [\"\", '', i + 1, \"\", ''.format(_CTFd[\"default\"].config.urlRoot, teams[i].account_id), (0, _utils.htmlEntities)(teams[i].name), \"\", \"\", teams[i].score, \"\", \"\"].join(\"\");\n table.append(row);\n }\n });\n};\n\nvar buildGraphData = function buildGraphData() {\n return _CTFd[\"default\"].api.get_scoreboard_detail({\n count: 10\n }).then(function (response) {\n var places = response.data;\n var teams = Object.keys(places);\n\n if (teams.length === 0) {\n return false;\n }\n\n var option = {\n title: {\n left: \"center\",\n text: \"Top 10 \" + (_CTFd[\"default\"].config.userMode === \"teams\" ? \"Teams\" : \"Users\")\n },\n tooltip: {\n trigger: \"axis\",\n axisPointer: {\n type: \"cross\"\n }\n },\n legend: {\n type: \"scroll\",\n orient: \"horizontal\",\n align: \"left\",\n bottom: 35,\n data: []\n },\n toolbox: {\n feature: {\n dataZoom: {\n yAxisIndex: \"none\"\n },\n saveAsImage: {}\n }\n },\n grid: {\n containLabel: true\n },\n xAxis: [{\n type: \"time\",\n boundaryGap: false,\n data: []\n }],\n yAxis: [{\n type: \"value\"\n }],\n dataZoom: [{\n id: \"dataZoomX\",\n type: \"slider\",\n xAxisIndex: [0],\n filterMode: \"filter\",\n height: 20,\n top: 35,\n fillerColor: \"rgba(233, 236, 241, 0.4)\"\n }],\n series: []\n };\n\n var _loop = function _loop(i) {\n var team_score = [];\n var times = [];\n\n for (var j = 0; j < places[teams[i]][\"solves\"].length; j++) {\n team_score.push(places[teams[i]][\"solves\"][j].value);\n var date = (0, _dayjs[\"default\"])(places[teams[i]][\"solves\"][j].date);\n times.push(date.toDate());\n }\n\n var total_scores = (0, _utils.cumulativeSum)(team_score);\n scores = times.map(function (e, i) {\n return [e, total_scores[i]];\n });\n option.legend.data.push(places[teams[i]][\"name\"]);\n var data = {\n name: places[teams[i]][\"name\"],\n type: \"line\",\n label: {\n normal: {\n position: \"top\"\n }\n },\n itemStyle: {\n normal: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n }\n },\n data: scores\n };\n option.series.push(data);\n };\n\n for (var i = 0; i < teams.length; i++) {\n var scores;\n\n _loop(i);\n }\n\n return option;\n });\n};\n\nvar createGraph = function createGraph() {\n buildGraphData().then(function (option) {\n if (option === false) {\n // Replace spinner\n graph.html('

No solves yet

');\n return;\n }\n\n graph.empty(); // Remove spinners\n\n var chart = _echartsEn[\"default\"].init(document.querySelector(\"#score-graph\"));\n\n chart.setOption(option);\n (0, _jquery[\"default\"])(window).on(\"resize\", function () {\n if (chart != null && chart != undefined) {\n chart.resize();\n }\n });\n });\n};\n\nvar updateGraph = function updateGraph() {\n buildGraphData().then(function (option) {\n var chart = _echartsEn[\"default\"].init(document.querySelector(\"#score-graph\"));\n\n chart.setOption(option);\n });\n};\n\nfunction update() {\n updateScores();\n updateGraph();\n}\n\n(0, _jquery[\"default\"])(function () {\n setInterval(update, 300000); // Update scores every 5 minutes\n\n createGraph();\n});\nwindow.updateScoreboard = update;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/scoreboard.js?"); /***/ }) diff --git a/CTFd/themes/core/static/js/pages/scoreboard.min.js b/CTFd/themes/core/static/js/pages/scoreboard.min.js index 40a3be15..4bf67c69 100644 --- a/CTFd/themes/core/static/js/pages/scoreboard.min.js +++ b/CTFd/themes/core/static/js/pages/scoreboard.min.js @@ -1 +1 @@ -!function(d){function e(e){for(var t,i,o=e[0],n=e[1],r=e[2],a=0,s=[];a".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var o=(0,s.default)(l.format(e.button));return e.success&&(0,s.default)(o).click(function(){e.success()}),e.large&&i.find(".modal-dialog").addClass("modal-lg"),i.find(".modal-footer").append(o),i.find("pre code").each(function(e){r.default.highlightBlock(this)}),(0,s.default)("main").append(i),i.modal("show"),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),i}function h(e){(0,s.default)("#ezq--notifications-toast-container").length||(0,s.default)("body").append((0,s.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t,i=d.format(e.title,e.body),o=(0,s.default)(i);e.onclose&&(0,s.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick&&((t=(0,s.default)(o).find(".toast-body")).addClass("cursor-pointer"),t.click(function(){e.onclick()}));var n=!1!==e.autohide,r=!1!==e.animation,a=e.delay||1e4;return(0,s.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:n,delay:a,animation:r}),o.toast("show"),o}function g(e){var t=a.format(e.title),i=(0,s.default)(t);"string"==typeof e.body?i.find(".modal-body").append("

".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var o=(0,s.default)(f),n=(0,s.default)(u);return i.find(".modal-footer").append(n),i.find(".modal-footer").append(o),i.find("pre code").each(function(e){r.default.highlightBlock(this)}),(0,s.default)("main").append(i),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(o).click(function(){e.success()}),i.modal("show"),i}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var i=p.format(e.width),o=a.format(e.title),n=(0,s.default)(o);return n.find(".modal-body").append((0,s.default)(i)),(0,s.default)("main").append(n),n.modal("show")}function j(e){var t={success:c,error:n}[e.type].format(e.body);return(0,s.default)(t)}var y={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:j};t.default=y},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,i("./node_modules/whatwg-fetch/fetch.js");var o,n=(o=i("./CTFd/themes/core/assets/js/config.js"))&&o.__esModule?o:{default:o};var r=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=n.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=n.default.csrfNonce,r(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,i){var o=m(i("./CTFd/themes/core/assets/js/CTFd.js")),n=m(i("./node_modules/jquery/dist/jquery.js")),r=m(i("./node_modules/dayjs/dayjs.min.js")),a=m(i("./node_modules/dayjs/plugin/advancedFormat.js")),s=m(i("./node_modules/nunjucks/browser/nunjucks.js")),d=i("./node_modules/howler/dist/howler.js"),p=m(i("./CTFd/themes/core/assets/js/events.js")),c=m(i("./CTFd/themes/core/assets/js/config.js")),l=m(i("./CTFd/themes/core/assets/js/styles.js")),u=m(i("./CTFd/themes/core/assets/js/times.js")),f=m(i("./CTFd/themes/core/assets/js/helpers.js"));function m(e){return e&&e.__esModule?e:{default:e}}r.default.extend(a.default),o.default.init(window.init),window.CTFd=o.default,window.helpers=f.default,window.$=n.default,window.dayjs=r.default,window.nunjucks=s.default,window.Howl=d.Howl,(0,n.default)(function(){(0,l.default)(),(0,u.default)(),(0,p.default)(c.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/scoreboard.js":function(e,t,i){i("./CTFd/themes/core/assets/js/pages/main.js");var o=a(i("./node_modules/jquery/dist/jquery.js")),n=a(i("./CTFd/themes/core/assets/js/CTFd.js")),r=a(i("./node_modules/echarts/dist/echarts-en.common.js")),l=a(i("./node_modules/dayjs/dayjs.min.js")),u=i("./CTFd/themes/core/assets/js/utils.js");function a(e){return e&&e.__esModule?e:{default:e}}function s(){return n.default.api.get_scoreboard_detail({count:10}).then(function(e){var s=e.data,d=Object.keys(s);if(0===d.length)return!1;for(var p,c={title:{left:"center",text:"Top 10 "+("teams"===n.default.config.userMode?"Teams":"Users")},tooltip:{trigger:"axis",axisPointer:{type:"cross"}},legend:{type:"scroll",orient:"horizontal",align:"left",bottom:35,data:[]},toolbox:{feature:{dataZoom:{yAxisIndex:"none"},saveAsImage:{}}},grid:{containLabel:!0},xAxis:[{type:"time",boundaryGap:!1,data:[]}],yAxis:[{type:"value"}],dataZoom:[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter",height:20,top:35,fillerColor:"rgba(233, 236, 241, 0.4)"}],series:[]},t=0;t",'',i+1,"",''.format(n.default.config.urlRoot,t[i].account_id),(0,u.htmlEntities)(t[i].name),"","",t[i].score,"",""].join("");p.append(o)}}),s().then(function(e){r.default.init(document.querySelector("#score-graph")).setOption(e)})}(0,o.default)(function(){setInterval(c,3e5),s().then(function(e){var t;!1!==e?(d.empty(),(t=r.default.init(document.querySelector("#score-graph"))).setOption(e),(0,o.default)(window).on("resize",function(){null!=t&&null!=t&&t.resize()})):d.html('

No solves yet

')})})},"./CTFd/themes/core/assets/js/patch.js":function(e,t,i){var o,s=(o=i("./node_modules/q/q.js"))&&o.__esModule?o:{default:o},n=i("./CTFd/themes/core/assets/js/api.js");function a(t,e){var i,o=Object.keys(t);return Object.getOwnPropertySymbols&&(i=Object.getOwnPropertySymbols(t),e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),o.push.apply(o,i)),o}function r(n){for(var e=1;e").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),i=0;i'),(0,a.default)("th.sort-col").click(function(){var n,e=(0,a.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((n=(0,a.default)(this).index(),function(e,t){var i=r(e,n),o=r(t,n);return a.default.isNumeric(i)&&a.default.isNumeric(o)?i-o:i.toString().localeCompare(o)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var i=0;i".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var o=(0,s.default)(l.format(e.button));return e.success&&(0,s.default)(o).click(function(){e.success()}),e.large&&i.find(".modal-dialog").addClass("modal-lg"),i.find(".modal-footer").append(o),i.find("pre code").each(function(e){r.default.highlightBlock(this)}),(0,s.default)("main").append(i),i.modal("show"),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),i}function h(e){(0,s.default)("#ezq--notifications-toast-container").length||(0,s.default)("body").append((0,s.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t,i=d.format(e.title,e.body),o=(0,s.default)(i);e.onclose&&(0,s.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick&&((t=(0,s.default)(o).find(".toast-body")).addClass("cursor-pointer"),t.click(function(){e.onclick()}));var n=!1!==e.autohide,r=!1!==e.animation,a=e.delay||1e4;return(0,s.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:n,delay:a,animation:r}),o.toast("show"),o}function g(e){var t=a.format(e.title),i=(0,s.default)(t);"string"==typeof e.body?i.find(".modal-body").append("

".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var o=(0,s.default)(f),n=(0,s.default)(u);return i.find(".modal-footer").append(n),i.find(".modal-footer").append(o),i.find("pre code").each(function(e){r.default.highlightBlock(this)}),(0,s.default)("main").append(i),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(o).click(function(){e.success()}),i.modal("show"),i}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var i=p.format(e.width),o=a.format(e.title),n=(0,s.default)(o);return n.find(".modal-body").append((0,s.default)(i)),(0,s.default)("main").append(n),n.modal("show")}function j(e){var t={success:c,error:n}[e.type].format(e.body);return(0,s.default)(t)}var y={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:j};t.default=y},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,i("./node_modules/whatwg-fetch/fetch.js");var o,n=(o=i("./CTFd/themes/core/assets/js/config.js"))&&o.__esModule?o:{default:o};var r=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=n.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=n.default.csrfNonce,r(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,i){var o=m(i("./CTFd/themes/core/assets/js/CTFd.js")),n=m(i("./node_modules/jquery/dist/jquery.js")),r=m(i("./node_modules/dayjs/dayjs.min.js")),a=m(i("./node_modules/dayjs/plugin/advancedFormat.js")),s=m(i("./node_modules/nunjucks/browser/nunjucks.js")),d=i("./node_modules/howler/dist/howler.js"),p=m(i("./CTFd/themes/core/assets/js/events.js")),c=m(i("./CTFd/themes/core/assets/js/config.js")),l=m(i("./CTFd/themes/core/assets/js/styles.js")),u=m(i("./CTFd/themes/core/assets/js/times.js")),f=m(i("./CTFd/themes/core/assets/js/helpers.js"));function m(e){return e&&e.__esModule?e:{default:e}}r.default.extend(a.default),o.default.init(window.init),window.CTFd=o.default,window.helpers=f.default,window.$=n.default,window.dayjs=r.default,window.nunjucks=s.default,window.Howl=d.Howl,(0,n.default)(function(){(0,l.default)(),(0,u.default)(),(0,p.default)(c.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/scoreboard.js":function(e,t,i){i("./CTFd/themes/core/assets/js/pages/main.js");var o=a(i("./node_modules/jquery/dist/jquery.js")),n=a(i("./CTFd/themes/core/assets/js/CTFd.js")),r=a(i("./node_modules/echarts/dist/echarts-en.common.js")),l=a(i("./node_modules/dayjs/dayjs.min.js")),u=i("./CTFd/themes/core/assets/js/utils.js");function a(e){return e&&e.__esModule?e:{default:e}}function s(){return n.default.api.get_scoreboard_detail({count:10}).then(function(e){var s=e.data,d=Object.keys(s);if(0===d.length)return!1;for(var p,c={title:{left:"center",text:"Top 10 "+("teams"===n.default.config.userMode?"Teams":"Users")},tooltip:{trigger:"axis",axisPointer:{type:"cross"}},legend:{type:"scroll",orient:"horizontal",align:"left",bottom:35,data:[]},toolbox:{feature:{dataZoom:{yAxisIndex:"none"},saveAsImage:{}}},grid:{containLabel:!0},xAxis:[{type:"time",boundaryGap:!1,data:[]}],yAxis:[{type:"value"}],dataZoom:[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter",height:20,top:35,fillerColor:"rgba(233, 236, 241, 0.4)"}],series:[]},t=0;t",'',i+1,"",''.format(n.default.config.urlRoot,t[i].account_id),(0,u.htmlEntities)(t[i].name),"","",t[i].score,"",""].join("");p.append(o)}}),s().then(function(e){r.default.init(document.querySelector("#score-graph")).setOption(e)})}(0,o.default)(function(){setInterval(c,3e5),s().then(function(e){var t;!1!==e?(d.empty(),(t=r.default.init(document.querySelector("#score-graph"))).setOption(e),(0,o.default)(window).on("resize",function(){null!=t&&null!=t&&t.resize()})):d.html('

No solves yet

')})}),window.updateScoreboard=c},"./CTFd/themes/core/assets/js/patch.js":function(e,t,i){var o,s=(o=i("./node_modules/q/q.js"))&&o.__esModule?o:{default:o},n=i("./CTFd/themes/core/assets/js/api.js");function a(t,e){var i,o=Object.keys(t);return Object.getOwnPropertySymbols&&(i=Object.getOwnPropertySymbols(t),e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),o.push.apply(o,i)),o}function r(n){for(var e=1;e").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),i=0;i'),(0,a.default)("th.sort-col").click(function(){var n,e=(0,a.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((n=(0,a.default)(this).index(),function(e,t){var i=r(e,n),o=r(t,n);return a.default.isNumeric(i)&&a.default.isNumeric(o)?i-o:i.toString().localeCompare(o)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var i=0;i