diff --git a/.eslintrc.js b/.eslintrc.js index edadc674..d389b9f4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,5 +13,6 @@ module.exports = { "sourceType": "module" }, "rules": { + "no-unused-vars": ["error", { "argsIgnorePattern": "^_" }] } }; \ No newline at end of file diff --git a/CTFd/themes/admin/assets/js/challenges/challenge.js b/CTFd/themes/admin/assets/js/challenges/challenge.js index a9904221..05c9deee 100644 --- a/CTFd/themes/admin/assets/js/challenges/challenge.js +++ b/CTFd/themes/admin/assets/js/challenges/challenge.js @@ -1,5 +1,6 @@ import $ from "jquery"; -import { ezToast } from "core/ezq"; +import { ezToast, ezQuery } from "core/ezq"; +import { htmlEntities } from "core/utils"; import CTFd from "core/CTFd"; import nunjucks from "nunjucks"; @@ -90,105 +91,85 @@ function renderSubmissionResponse(response, cb) { } $(() => { - $(".preview-challenge").click(function(event) { + $(".preview-challenge").click(function(_event) { window.challenge = new Object(); - $.get(CTFd.config.urlRoot + "/api/v1/challenges/" + CHALLENGE_ID, function( - response - ) { - const challenge_data = response.data; - challenge_data["solves"] = null; + $.get( + CTFd.config.urlRoot + "/api/v1/challenges/" + window.CHALLENGE_ID, + function(response) { + const challenge_data = response.data; + challenge_data["solves"] = null; - $.getScript( - CTFd.config.urlRoot + challenge_data.type_data.scripts.view, - function() { - $.get( - CTFd.config.urlRoot + challenge_data.type_data.templates.view, - function(template_data) { - $("#challenge-window").empty(); - const template = nunjucks.compile(template_data); - window.challenge.data = challenge_data; - window.challenge.preRender(); + $.getScript( + CTFd.config.urlRoot + challenge_data.type_data.scripts.view, + function() { + $.get( + CTFd.config.urlRoot + challenge_data.type_data.templates.view, + function(template_data) { + $("#challenge-window").empty(); + const template = nunjucks.compile(template_data); + window.challenge.data = challenge_data; + window.challenge.preRender(); - challenge_data["description"] = window.challenge.render( - challenge_data["description"] - ); - challenge_data["script_root"] = CTFd.config.urlRoot; + challenge_data["description"] = window.challenge.render( + challenge_data["description"] + ); + challenge_data["script_root"] = CTFd.config.urlRoot; - $("#challenge-window").append(template.render(challenge_data)); + $("#challenge-window").append(template.render(challenge_data)); - $(".challenge-solves").click(function(event) { - getsolves($("#challenge-id").val()); - }); - $(".nav-tabs a").click(function(event) { - event.preventDefault(); - $(this).tab("show"); - }); + $(".nav-tabs a").click(function(event) { + event.preventDefault(); + $(this).tab("show"); + }); - // Handle modal toggling - $("#challenge-window").on("hide.bs.modal", function(event) { - $("#submission-input").removeClass("wrong"); - $("#submission-input").removeClass("correct"); - $("#incorrect-key").slideUp(); - $("#correct-key").slideUp(); - $("#already-solved").slideUp(); - $("#too-fast").slideUp(); - }); + // Handle modal toggling + $("#challenge-window").on("hide.bs.modal", function(_event) { + $("#submission-input").removeClass("wrong"); + $("#submission-input").removeClass("correct"); + $("#incorrect-key").slideUp(); + $("#correct-key").slideUp(); + $("#already-solved").slideUp(); + $("#too-fast").slideUp(); + }); - $("#submit-key").click(function(event) { - event.preventDefault(); - $("#submit-key").addClass("disabled-button"); - $("#submit-key").prop("disabled", true); - window.challenge.submit(function(data) { - renderSubmissionResponse(data); - }, true); - // Preview passed as true - }); + $("#submit-key").click(function(event) { + event.preventDefault(); + $("#submit-key").addClass("disabled-button"); + $("#submit-key").prop("disabled", true); + window.challenge.submit(function(data) { + renderSubmissionResponse(data); + }, true); + // Preview passed as true + }); - $("#submission-input").keyup(function(event) { - if (event.keyCode == 13) { - $("#submit-key").click(); - } - }); - - $(".input-field").bind({ - focus: function() { - $(this) - .parent() - .addClass("input--filled"); - $label = $(this).siblings(".input-label"); - }, - blur: function() { - if ($(this).val() === "") { - $(this) - .parent() - .removeClass("input--filled"); - $label = $(this).siblings(".input-label"); - $label.removeClass("input--hide"); + $("#submission-input").keyup(function(event) { + if (event.keyCode == 13) { + $("#submit-key").click(); } - } - }); + }); - window.challenge.postRender(); - window.location.replace( - window.location.href.split("#")[0] + "#preview" - ); + window.challenge.postRender(); + window.location.replace( + window.location.href.split("#")[0] + "#preview" + ); - $("#challenge-window").modal(); - } - ); - } - ); - }); + $("#challenge-window").modal(); + } + ); + } + ); + } + ); }); - $(".delete-challenge").click(function(event) { + $(".delete-challenge").click(function(_event) { ezQuery({ title: "Delete Challenge", body: "Are you sure you want to delete {0}".format( - "" + htmlentities(CHALLENGE_NAME) + "" + "" + htmlEntities(window.CHALLENGE_NAME) + "" ), success: function() { - CTFd.fetch("/api/v1/challenges/" + CHALLENGE_ID, { + CTFd.fetch("/api/v1/challenges/" + window.CHALLENGE_ID, { method: "DELETE" }).then(function(response) { if (response.success) { @@ -203,7 +184,7 @@ $(() => { event.preventDefault(); const params = $(event.target).serializeJSON(true); - CTFd.fetch("/api/v1/challenges/" + CHALLENGE_ID, { + CTFd.fetch("/api/v1/challenges/" + window.CHALLENGE_ID, { method: "PATCH", credentials: "same-origin", headers: { diff --git a/CTFd/themes/admin/assets/js/challenges/files.js b/CTFd/themes/admin/assets/js/challenges/files.js index 6829669d..a66ca657 100644 --- a/CTFd/themes/admin/assets/js/challenges/files.js +++ b/CTFd/themes/admin/assets/js/challenges/files.js @@ -7,17 +7,17 @@ export function addFile(event) { event.preventDefault(); let form = event.target; let data = { - challenge: CHALLENGE_ID, + challenge: window.CHALLENGE_ID, type: "challenge" }; - helpers.files.upload(form, data, function(response) { + helpers.files.upload(form, data, function(_response) { setTimeout(function() { window.location.reload(); }, 700); }); } -export function deleteFile(event) { +export function deleteFile(_event) { const file_id = $(this).attr("file-id"); const row = $(this) .parent() diff --git a/CTFd/themes/admin/assets/js/challenges/flags.js b/CTFd/themes/admin/assets/js/challenges/flags.js index b9d30838..057e77a1 100644 --- a/CTFd/themes/admin/assets/js/challenges/flags.js +++ b/CTFd/themes/admin/assets/js/challenges/flags.js @@ -29,7 +29,7 @@ export function deleteFlag(event) { }); } -export function addFlagModal(event) { +export function addFlagModal(_event) { $.get(CTFd.config.urlRoot + "/api/v1/flags/types", function(response) { const data = response.data; const flag_type_select = $("#flags-create-select"); @@ -52,7 +52,7 @@ export function addFlagModal(event) { $("#flag-edit-modal form").submit(function(event) { event.preventDefault(); const params = $(this).serializeJSON(true); - params["challenge"] = CHALLENGE_ID; + params["challenge"] = window.CHALLENGE_ID; CTFd.fetch("/api/v1/flags", { method: "POST", credentials: "same-origin", @@ -65,7 +65,7 @@ export function addFlagModal(event) { .then(function(response) { return response.json(); }) - .then(function(response) { + .then(function(_response) { window.location.reload(); }); }); diff --git a/CTFd/themes/admin/assets/js/challenges/hints.js b/CTFd/themes/admin/assets/js/challenges/hints.js index 228aaac7..6da074f9 100644 --- a/CTFd/themes/admin/assets/js/challenges/hints.js +++ b/CTFd/themes/admin/assets/js/challenges/hints.js @@ -1,37 +1,6 @@ import $ from "jquery"; import CTFd from "core/CTFd"; -import { ezQuery, ezAlert } from "core/ezq"; - -function hint(id) { - return CTFd.fetch("/api/v1/hints/" + id + "?preview=true", { - method: "GET", - credentials: "same-origin", - headers: { - Accept: "application/json", - "Content-Type": "application/json" - } - }); -} - -function loadhint(hintid) { - const md = CTFd.lib.markdown(); - - hint(hintid).then(function(response) { - if (response.data.content) { - ezAlert({ - title: "Hint", - body: md.render(response.data.content), - button: "Got it!" - }); - } else { - ezAlert({ - title: "Error", - body: "Error loading hint!", - button: "OK" - }); - } - }); -} +import { ezQuery } from "core/ezq"; export function showHintModal(event) { event.preventDefault(); @@ -116,7 +85,7 @@ export function deleteHint(event) { export function editHint(event) { event.preventDefault(); const params = $(this).serializeJSON(true); - params["challenge"] = CHALLENGE_ID; + params["challenge"] = window.CHALLENGE_ID; let method = "POST"; let url = "/api/v1/hints"; diff --git a/CTFd/themes/admin/assets/js/challenges/new.js b/CTFd/themes/admin/assets/js/challenges/new.js index 90240db7..18995862 100644 --- a/CTFd/themes/admin/assets/js/challenges/new.js +++ b/CTFd/themes/admin/assets/js/challenges/new.js @@ -1,4 +1,5 @@ import CTFd from "core/CTFd"; +import nunjucks from "nunjucks"; import $ from "jquery"; window.challenge = new Object(); @@ -63,7 +64,7 @@ $.get(CTFd.config.urlRoot + "/api/v1/challenges/types", function(response) { } }); -function createChallenge(event) { +function createChallenge(_event) { const challenge = $(this) .find("option:selected") .data("meta"); diff --git a/CTFd/themes/admin/assets/js/challenges/requirements.js b/CTFd/themes/admin/assets/js/challenges/requirements.js index 3232134f..d5a6561b 100644 --- a/CTFd/themes/admin/assets/js/challenges/requirements.js +++ b/CTFd/themes/admin/assets/js/challenges/requirements.js @@ -10,15 +10,15 @@ export function addRequirement(event) { return; } - CHALLENGE_REQUIREMENTS.prerequisites.push( + window.CHALLENGE_REQUIREMENTS.prerequisites.push( parseInt(requirements["prerequisite"]) ); const params = { - requirements: CHALLENGE_REQUIREMENTS + requirements: window.CHALLENGE_REQUIREMENTS }; - CTFd.fetch("/api/v1/challenges/" + CHALLENGE_ID, { + CTFd.fetch("/api/v1/challenges/" + window.CHALLENGE_ID, { method: "PATCH", credentials: "same-origin", headers: { @@ -38,18 +38,18 @@ export function addRequirement(event) { }); } -export function deleteRequirement(event) { +export function deleteRequirement(_event) { const challenge_id = $(this).attr("challenge-id"); const row = $(this) .parent() .parent(); - CHALLENGE_REQUIREMENTS.prerequisites.pop(challenge_id); + window.CHALLENGE_REQUIREMENTS.prerequisites.pop(challenge_id); const params = { - requirements: CHALLENGE_REQUIREMENTS + requirements: window.CHALLENGE_REQUIREMENTS }; - CTFd.fetch("/api/v1/challenges/" + CHALLENGE_ID, { + CTFd.fetch("/api/v1/challenges/" + window.CHALLENGE_ID, { method: "PATCH", credentials: "same-origin", headers: { diff --git a/CTFd/themes/admin/assets/js/challenges/tags.js b/CTFd/themes/admin/assets/js/challenges/tags.js index d31cae29..e0d8d173 100644 --- a/CTFd/themes/admin/assets/js/challenges/tags.js +++ b/CTFd/themes/admin/assets/js/challenges/tags.js @@ -1,7 +1,7 @@ import $ from "jquery"; import CTFd from "core/CTFd"; -export function deleteTag(event) { +export function deleteTag(_event) { const $elem = $(this); const tag_id = $elem.attr("tag-id"); @@ -22,7 +22,7 @@ export function addTag(event) { const tag = $elem.val(); const params = { value: tag, - challenge: CHALLENGE_ID + challenge: window.CHALLENGE_ID }; CTFd.api.post_tag_list({}, params).then(response => { diff --git a/CTFd/themes/admin/assets/js/pages/challenge.js b/CTFd/themes/admin/assets/js/pages/challenge.js index f89cb7eb..7a406ad5 100644 --- a/CTFd/themes/admin/assets/js/pages/challenge.js +++ b/CTFd/themes/admin/assets/js/pages/challenge.js @@ -5,7 +5,6 @@ import "bootstrap/js/dist/tab"; import CTFd from "core/CTFd"; import { htmlEntities } from "core/utils"; import { ezQuery, ezAlert, ezToast } from "core/ezq"; -import nunjucks from "nunjucks"; import { default as helpers } from "core/helpers"; import { addFile, deleteFile } from "../challenges/files"; import { addTag, deleteTag } from "../challenges/tags"; @@ -39,7 +38,7 @@ const loadHint = id => { displayHint(response.data); return; } - displayUnlock(id); + // displayUnlock(id); }); }; @@ -201,7 +200,7 @@ function handleChallengeOptions(event) { Promise.all([ // Save flag - new Promise(function(resolve, reject) { + new Promise(function(resolve, _reject) { if (flag_params.content.length == 0) { resolve(); return; @@ -219,7 +218,7 @@ function handleChallengeOptions(event) { }); }), // Upload files - new Promise(function(resolve, reject) { + new Promise(function(resolve, _reject) { let form = event.target; let data = { challenge: params.challenge_id, @@ -231,12 +230,12 @@ function handleChallengeOptions(event) { } resolve(); }) - ]).then(responses => { + ]).then(_responses => { save_challenge(); }); } -function createChallenge(event) { +function createChallenge(_event) { const challenge = $(this) .find("option:selected") .data("meta"); @@ -248,83 +247,84 @@ function createChallenge(event) { } $(() => { - $(".preview-challenge").click(function(e) { + $(".preview-challenge").click(function(_e) { window.challenge = new Object(); CTFd._internal.challenge = {}; - $.get(CTFd.config.urlRoot + "/api/v1/challenges/" + CHALLENGE_ID, function( - response - ) { - const challenge = CTFd._internal.challenge; - var challenge_data = response.data; - challenge_data["solves"] = null; + $.get( + CTFd.config.urlRoot + "/api/v1/challenges/" + window.CHALLENGE_ID, + function(response) { + const challenge = CTFd._internal.challenge; + var challenge_data = response.data; + challenge_data["solves"] = null; - $.getScript( - CTFd.config.urlRoot + challenge_data.type_data.scripts.view, - function() { - $("#challenge-window").empty(); + $.getScript( + CTFd.config.urlRoot + challenge_data.type_data.scripts.view, + function() { + $("#challenge-window").empty(); - $("#challenge-window").append(challenge_data.view); + $("#challenge-window").append(challenge_data.view); - $("#challenge-window #challenge-input").addClass("form-control"); - $("#challenge-window #challenge-submit").addClass( - "btn btn-md btn-outline-secondary float-right" - ); + $("#challenge-window #challenge-input").addClass("form-control"); + $("#challenge-window #challenge-submit").addClass( + "btn btn-md btn-outline-secondary float-right" + ); - $(".challenge-solves").hide(); - $(".nav-tabs a").click(function(e) { - e.preventDefault(); - $(this).tab("show"); - }); + $(".challenge-solves").hide(); + $(".nav-tabs a").click(function(e) { + e.preventDefault(); + $(this).tab("show"); + }); - // Handle modal toggling - $("#challenge-window").on("hide.bs.modal", function(event) { - $("#challenge-input").removeClass("wrong"); - $("#challenge-input").removeClass("correct"); - $("#incorrect-key").slideUp(); - $("#correct-key").slideUp(); - $("#already-solved").slideUp(); - $("#too-fast").slideUp(); - }); + // Handle modal toggling + $("#challenge-window").on("hide.bs.modal", function(_event) { + $("#challenge-input").removeClass("wrong"); + $("#challenge-input").removeClass("correct"); + $("#incorrect-key").slideUp(); + $("#correct-key").slideUp(); + $("#already-solved").slideUp(); + $("#too-fast").slideUp(); + }); - $(".load-hint").on("click", function(event) { - loadHint($(this).data("hint-id")); - }); + $(".load-hint").on("click", function(_event) { + loadHint($(this).data("hint-id")); + }); - $("#challenge-submit").click(function(e) { - e.preventDefault(); - $("#challenge-submit").addClass("disabled-button"); - $("#challenge-submit").prop("disabled", true); - CTFd._internal.challenge - .submit(true) - .then(renderSubmissionResponse); - // Preview passed as true - }); + $("#challenge-submit").click(function(e) { + e.preventDefault(); + $("#challenge-submit").addClass("disabled-button"); + $("#challenge-submit").prop("disabled", true); + CTFd._internal.challenge + .submit(true) + .then(renderSubmissionResponse); + // Preview passed as true + }); - $("#challenge-input").keyup(function(event) { - if (event.keyCode == 13) { - $("#challenge-submit").click(); - } - }); + $("#challenge-input").keyup(function(event) { + if (event.keyCode == 13) { + $("#challenge-submit").click(); + } + }); - challenge.postRender(); - window.location.replace( - window.location.href.split("#")[0] + "#preview" - ); + challenge.postRender(); + window.location.replace( + window.location.href.split("#")[0] + "#preview" + ); - $("#challenge-window").modal(); - } - ); - }); + $("#challenge-window").modal(); + } + ); + } + ); }); - $(".delete-challenge").click(function(e) { + $(".delete-challenge").click(function(_e) { ezQuery({ title: "Delete Challenge", body: "Are you sure you want to delete {0}".format( - "" + htmlEntities(CHALLENGE_NAME) + "" + "" + htmlEntities(window.CHALLENGE_NAME) + "" ), success: function() { - CTFd.fetch("/api/v1/challenges/" + CHALLENGE_ID, { + CTFd.fetch("/api/v1/challenges/" + window.CHALLENGE_ID, { method: "DELETE" }) .then(function(response) { @@ -343,7 +343,7 @@ $(() => { e.preventDefault(); var params = $(e.target).serializeJSON(true); - CTFd.fetch("/api/v1/challenges/" + CHALLENGE_ID + "/flags", { + CTFd.fetch("/api/v1/challenges/" + window.CHALLENGE_ID + "/flags", { method: "GET", credentials: "same-origin", headers: { @@ -356,7 +356,7 @@ $(() => { }) .then(function(response) { let update_challenge = function() { - CTFd.fetch("/api/v1/challenges/" + CHALLENGE_ID, { + CTFd.fetch("/api/v1/challenges/" + window.CHALLENGE_ID, { method: "PATCH", credentials: "same-origin", headers: { diff --git a/CTFd/themes/admin/assets/js/pages/challenges.js b/CTFd/themes/admin/assets/js/pages/challenges.js index bb1ae451..f100c2c6 100644 --- a/CTFd/themes/admin/assets/js/pages/challenges.js +++ b/CTFd/themes/admin/assets/js/pages/challenges.js @@ -3,7 +3,7 @@ import CTFd from "core/CTFd"; import $ from "jquery"; import { ezAlert, ezQuery } from "core/ezq"; -function deleteSelectedChallenges(event) { +function deleteSelectedChallenges(_event) { let challengeIDs = $("input[data-challenge-id]:checked").map(function() { return $(this).data("challenge-id"); }); @@ -21,14 +21,14 @@ function deleteSelectedChallenges(event) { }) ); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } }); } -function bulkEditChallenges(event) { +function bulkEditChallenges(_event) { let challengeIDs = $("input[data-challenge-id]:checked").map(function() { return $(this).data("challenge-id"); }); @@ -67,7 +67,7 @@ function bulkEditChallenges(event) { }) ); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } diff --git a/CTFd/themes/admin/assets/js/pages/configs.js b/CTFd/themes/admin/assets/js/pages/configs.js index 2840e1a0..d8f8d5bd 100644 --- a/CTFd/themes/admin/assets/js/pages/configs.js +++ b/CTFd/themes/admin/assets/js/pages/configs.js @@ -6,7 +6,7 @@ import moment from "moment-timezone"; import CTFd from "core/CTFd"; import { default as helpers } from "core/helpers"; import $ from "jquery"; -import { ezQuery, ezProgressBar } from "core/ezq"; +import { ezQuery, ezProgressBar, ezAlert } from "core/ezq"; import CodeMirror from "codemirror"; import "codemirror/mode/htmlmixed/htmlmixed.js"; @@ -110,7 +110,7 @@ function updateConfigs(event) { } }); - CTFd.api.patch_config_list({}, params).then(response => { + CTFd.api.patch_config_list({}, params).then(_response => { window.location.reload(); }); } @@ -154,7 +154,7 @@ function removeLogo() { }; CTFd.api .patch_config({ configKey: "ctf_logo" }, params) - .then(response => { + .then(_response => { window.location.reload(); }); } @@ -182,7 +182,6 @@ function importConfig(event) { contentType: false, statusCode: { 500: function(resp) { - console.log(resp.responseText); alert(resp.responseText); } }, @@ -199,7 +198,7 @@ function importConfig(event) { }; return xhr; }, - success: function(data) { + success: function(_data) { pg = ezProgressBar({ target: pg, width: 100 @@ -216,7 +215,6 @@ function importConfig(event) { function exportConfig(event) { event.preventDefault(); - const href = CTFd.config.urlRoot + "/admin/export"; window.location.href = $(this).attr("href"); } @@ -262,7 +260,7 @@ $(() => { // Handle refreshing codemirror when switching tabs. // Better than the autorefresh approach b/c there's no flicker - $("a[href='#theme']").on("shown.bs.tab", function(e) { + $("a[href='#theme']").on("shown.bs.tab", function(_e) { theme_header_editor.refresh(); theme_footer_editor.refresh(); theme_settings_editor.refresh(); diff --git a/CTFd/themes/admin/assets/js/pages/editor.js b/CTFd/themes/admin/assets/js/pages/editor.js index fb34b7a5..1f4fa71c 100644 --- a/CTFd/themes/admin/assets/js/pages/editor.js +++ b/CTFd/themes/admin/assets/js/pages/editor.js @@ -93,7 +93,7 @@ function show_files(data) { .text(fname) ); - link.click(function(e) { + link.click(function(_e) { var media_div = $(this).parent(); var icon = $(this).find("i")[0]; var f_loc = media_div.attr("data-location"); @@ -190,14 +190,14 @@ function submit_form() { } function preview_page() { - editor.save(); // Save the CodeMirror data to the Textarea + window.editor.save(); // Save the CodeMirror data to the Textarea $("#page-edit").attr("action", CTFd.config.urlRoot + "/admin/pages/preview"); $("#page-edit").attr("target", "_blank"); $("#page-edit").submit(); } function upload_media() { - helpers.files.upload($("#media-library-upload"), {}, function(data) { + helpers.files.upload($("#media-library-upload"), {}, function(_data) { refresh_files(); }); } @@ -213,7 +213,7 @@ $(() => { } ); - $("#media-insert").click(function(e) { + $("#media-insert").click(function(_e) { var tag = ""; try { tag = $("#media-icon") @@ -230,15 +230,15 @@ $(() => { } else { entry = "[{0}]({1})".format(fname, link); } - insert_at_cursor(editor, entry); + insert_at_cursor(window.editor, entry); }); - $("#media-download").click(function(e) { + $("#media-download").click(function(_e) { var link = $("#media-link").val(); window.open(link, "_blank"); }); - $("#media-delete").click(function(e) { + $("#media-delete").click(function(_e) { var file_id = $(this).attr("data-id"); ezQuery({ title: "Delete File?", diff --git a/CTFd/themes/admin/assets/js/pages/pages.js b/CTFd/themes/admin/assets/js/pages/pages.js index 4b6eab85..3abbe530 100644 --- a/CTFd/themes/admin/assets/js/pages/pages.js +++ b/CTFd/themes/admin/assets/js/pages/pages.js @@ -3,7 +3,7 @@ import CTFd from "core/CTFd"; import $ from "jquery"; import { ezQuery } from "core/ezq"; -function deleteSelectedUsers(event) { +function deleteSelectedUsers(_event) { let pageIDs = $("input[data-page-id]:checked").map(function() { return $(this).data("page-id"); }); @@ -21,7 +21,7 @@ function deleteSelectedUsers(event) { }) ); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } diff --git a/CTFd/themes/admin/assets/js/pages/scoreboard.js b/CTFd/themes/admin/assets/js/pages/scoreboard.js index 436523b0..01c8ab48 100644 --- a/CTFd/themes/admin/assets/js/pages/scoreboard.js +++ b/CTFd/themes/admin/assets/js/pages/scoreboard.js @@ -1,7 +1,7 @@ import "./main"; import CTFd from "core/CTFd"; import $ from "jquery"; -import { ezAlert, ezQuery } from "core/ezq"; +import { ezAlert } from "core/ezq"; const api_func = { users: (x, y) => CTFd.api.patch_user_public({ userId: x }, y), @@ -46,12 +46,12 @@ function toggleSelectedAccounts(accountIDs, action) { for (var accId of accountIDs) { reqs.push(api_func[CTFd.config.userMode](accId, params)); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } -function bulkToggleAccounts(event) { +function bulkToggleAccounts(_event) { let accountIDs = $("input[data-account-id]:checked").map(function() { return $(this).data("account-id"); }); diff --git a/CTFd/themes/admin/assets/js/pages/statistics.js b/CTFd/themes/admin/assets/js/pages/statistics.js index e6f1faaa..f93478d0 100644 --- a/CTFd/themes/admin/assets/js/pages/statistics.js +++ b/CTFd/themes/admin/assets/js/pages/statistics.js @@ -3,6 +3,7 @@ import "core/utils"; import CTFd from "core/CTFd"; import $ from "jquery"; import Plotly from "plotly.js-basic-dist"; +// eslint-disable-next-line no-unused-vars import { createGraph, updateGraph } from "core/graphs"; const graph_configs = { diff --git a/CTFd/themes/admin/assets/js/pages/submissions.js b/CTFd/themes/admin/assets/js/pages/submissions.js index 82c6fb3f..d0f4fd2b 100644 --- a/CTFd/themes/admin/assets/js/pages/submissions.js +++ b/CTFd/themes/admin/assets/js/pages/submissions.js @@ -4,7 +4,7 @@ import $ from "jquery"; import { htmlEntities } from "core/utils"; import { ezQuery } from "core/ezq"; -function deleteCorrectSubmission(event) { +function deleteCorrectSubmission(_event) { const key_id = $(this).data("submission-id"); const $elem = $(this) .parent() @@ -40,7 +40,7 @@ function deleteCorrectSubmission(event) { }); } -function deleteSelectedSubmissions(event) { +function deleteSelectedSubmissions(_event) { let submissionIDs = $("input[data-submission-id]:checked").map(function() { return $(this).data("submission-id"); }); @@ -54,7 +54,7 @@ function deleteSelectedSubmissions(event) { for (var subId of submissionIDs) { reqs.push(CTFd.api.delete_submission({ submissionId: subId })); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } diff --git a/CTFd/themes/admin/assets/js/pages/team.js b/CTFd/themes/admin/assets/js/pages/team.js index c7c3356b..3a43b9c9 100644 --- a/CTFd/themes/admin/assets/js/pages/team.js +++ b/CTFd/themes/admin/assets/js/pages/team.js @@ -27,7 +27,7 @@ function createTeam(event) { window.location = CTFd.config.urlRoot + "/admin/teams/" + team_id; } else { $("#team-info-form > #results").empty(); - Object.keys(response.errors).forEach(function(key, index) { + Object.keys(response.errors).forEach(function(key, _index) { $("#team-info-form > #results").append( ezBadge({ type: "error", @@ -47,7 +47,7 @@ function updateTeam(event) { event.preventDefault(); const params = $("#team-info-edit-form").serializeJSON(true); - CTFd.fetch("/api/v1/teams/" + TEAM_ID, { + CTFd.fetch("/api/v1/teams/" + window.TEAM_ID, { method: "PATCH", credentials: "same-origin", headers: { @@ -64,7 +64,7 @@ function updateTeam(event) { window.location.reload(); } else { $("#team-info-form > #results").empty(); - Object.keys(response.errors).forEach(function(key, index) { + Object.keys(response.errors).forEach(function(key, _index) { $("#team-info-form > #results").append( ezBadge({ type: "error", @@ -114,14 +114,14 @@ function deleteSelectedSubmissions(event, target) { for (var subId of submissionIDs) { reqs.push(CTFd.api.delete_submission({ submissionId: subId })); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } }); } -function deleteSelectedAwards(event) { +function deleteSelectedAwards(_event) { let awardIDs = $("input[data-award-id]:checked").map(function() { return $(this).data("award-id"); }); @@ -143,7 +143,7 @@ function deleteSelectedAwards(event) { }); reqs.push(req); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } @@ -163,12 +163,12 @@ function solveSelectedMissingChallenges(event) { title: `Mark Correct`, body: `Are you sure you want to mark ${ challengeIDs.length - } challenges correct for ${htmlEntities(TEAM_NAME)}?`, + } ${target} correct for ${htmlEntities(window.TEAM_NAME)}?`, success: function() { ezAlert({ title: `User Attribution`, body: ` - Which user on ${htmlEntities(TEAM_NAME)} solved these challenges? + Which user on ${htmlEntities(window.TEAM_NAME)} solved these challenges?
${$("#team-member-select").html()}
@@ -181,7 +181,7 @@ function solveSelectedMissingChallenges(event) { let params = { provided: "MARKED AS SOLVED BY ADMIN", user_id: USER_ID, - team_id: TEAM_ID, + team_id: window.TEAM_ID, challenge_id: challengeID, type: "correct" }; @@ -197,7 +197,7 @@ function solveSelectedMissingChallenges(event) { }); reqs.push(req); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } @@ -300,7 +300,7 @@ $(() => { e.preventDefault(); const params = $("#team-captain-form").serializeJSON(true); - CTFd.fetch("/api/v1/teams/" + TEAM_ID, { + CTFd.fetch("/api/v1/teams/" + window.TEAM_ID, { method: "PATCH", credentials: "same-origin", headers: { @@ -317,7 +317,7 @@ $(() => { window.location.reload(); } else { $("#team-captain-form > #results").empty(); - Object.keys(response.errors).forEach(function(key, index) { + Object.keys(response.errors).forEach(function(key, _index) { $("#team-captain-form > #results").append( ezBadge({ type: "error", @@ -335,19 +335,19 @@ $(() => { }); }); - $(".edit-team").click(function(e) { + $(".edit-team").click(function(_e) { $("#team-info-edit-modal").modal("toggle"); }); - $(".edit-captain").click(function(e) { + $(".edit-captain").click(function(_e) { $("#team-captain-modal").modal("toggle"); }); - $(".award-team").click(function(e) { + $(".award-team").click(function(_e) { $("#team-award-modal").modal("toggle"); }); - $(".addresses-team").click(function(event) { + $(".addresses-team").click(function(_event) { $("#team-addresses-modal").modal("toggle"); }); @@ -355,7 +355,7 @@ $(() => { e.preventDefault(); const params = $("#user-award-form").serializeJSON(true); params["user_id"] = $("#award-member-input").val(); - params["team_id"] = TEAM_ID; + params["team_id"] = window.TEAM_ID; $("#user-award-form > #results").empty(); @@ -387,7 +387,7 @@ $(() => { window.location.reload(); } else { $("#user-award-form > #results").empty(); - Object.keys(response.errors).forEach(function(key, index) { + Object.keys(response.errors).forEach(function(key, _index) { $("#user-award-form > #results").append( ezBadge({ type: "error", @@ -420,10 +420,10 @@ $(() => { title: "Remove Member", body: "Are you sure you want to remove {0} from {1}?

All of their challenges solves, attempts, awards, and unlocked hints will also be deleted!".format( "" + htmlEntities(member_name) + "", - "" + htmlEntities(TEAM_NAME) + "" + "" + htmlEntities(window.TEAM_NAME) + "" ), success: function() { - CTFd.fetch("/api/v1/teams/" + TEAM_ID + "/members", { + CTFd.fetch("/api/v1/teams/" + window.TEAM_ID + "/members", { method: "DELETE", body: JSON.stringify(params) }) @@ -439,14 +439,14 @@ $(() => { }); }); - $(".delete-team").click(function(e) { + $(".delete-team").click(function(_e) { ezQuery({ title: "Delete Team", body: "Are you sure you want to delete {0}".format( - "" + htmlEntities(TEAM_NAME) + "" + "" + htmlEntities(window.TEAM_NAME) + "" ), success: function() { - CTFd.fetch("/api/v1/teams/" + TEAM_ID, { + CTFd.fetch("/api/v1/teams/" + window.TEAM_ID, { method: "DELETE" }) .then(function(response) { diff --git a/CTFd/themes/admin/assets/js/pages/teams.js b/CTFd/themes/admin/assets/js/pages/teams.js index 2a5e1fb4..8c0af21e 100644 --- a/CTFd/themes/admin/assets/js/pages/teams.js +++ b/CTFd/themes/admin/assets/js/pages/teams.js @@ -3,7 +3,7 @@ import CTFd from "core/CTFd"; import $ from "jquery"; import { ezAlert, ezQuery } from "core/ezq"; -function deleteSelectedTeams(event) { +function deleteSelectedTeams(_event) { let teamIDs = $("input[data-team-id]:checked").map(function() { return $(this).data("team-id"); }); @@ -21,14 +21,14 @@ function deleteSelectedTeams(event) { }) ); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } }); } -function bulkEditTeams(event) { +function bulkEditTeams(_event) { let teamIDs = $("input[data-team-id]:checked").map(function() { return $(this).data("team-id"); }); @@ -67,7 +67,7 @@ function bulkEditTeams(event) { }) ); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } diff --git a/CTFd/themes/admin/assets/js/pages/user.js b/CTFd/themes/admin/assets/js/pages/user.js index 2545c4a8..c146ed19 100644 --- a/CTFd/themes/admin/assets/js/pages/user.js +++ b/CTFd/themes/admin/assets/js/pages/user.js @@ -35,7 +35,7 @@ function createUser(event) { window.location = CTFd.config.urlRoot + "/admin/users/" + user_id; } else { $("#user-info-create-form > #results").empty(); - Object.keys(response.errors).forEach(function(key, index) { + Object.keys(response.errors).forEach(function(key, _index) { $("#user-info-create-form > #results").append( ezBadge({ type: "error", @@ -55,7 +55,7 @@ function updateUser(event) { event.preventDefault(); const params = $("#user-info-edit-form").serializeJSON(true); - CTFd.fetch("/api/v1/users/" + USER_ID, { + CTFd.fetch("/api/v1/users/" + window.USER_ID, { method: "PATCH", credentials: "same-origin", headers: { @@ -72,7 +72,7 @@ function updateUser(event) { window.location.reload(); } else { $("#user-info-edit-form > #results").empty(); - Object.keys(response.errors).forEach(function(key, index) { + Object.keys(response.errors).forEach(function(key, _index) { $("#user-info-edit-form > #results").append( ezBadge({ type: "error", @@ -95,10 +95,10 @@ function deleteUser(event) { ezQuery({ title: "Delete User", body: "Are you sure you want to delete {0}".format( - "" + htmlEntities(USER_NAME) + "" + "" + htmlEntities(window.USER_NAME) + "" ), success: function() { - CTFd.fetch("/api/v1/users/" + USER_ID, { + CTFd.fetch("/api/v1/users/" + window.USER_ID, { method: "DELETE" }) .then(function(response) { @@ -116,7 +116,7 @@ function deleteUser(event) { function awardUser(event) { event.preventDefault(); const params = $("#user-award-form").serializeJSON(true); - params["user_id"] = USER_ID; + params["user_id"] = window.USER_ID; CTFd.fetch("/api/v1/awards", { method: "POST", @@ -135,7 +135,7 @@ function awardUser(event) { window.location.reload(); } else { $("#user-award-form > #results").empty(); - Object.keys(response.errors).forEach(function(key, index) { + Object.keys(response.errors).forEach(function(key, _index) { $("#user-award-form > #results").append( ezBadge({ type: "error", @@ -154,7 +154,7 @@ function awardUser(event) { function emailUser(event) { event.preventDefault(); var params = $("#user-mail-form").serializeJSON(true); - CTFd.fetch("/api/v1/users/" + USER_ID + "/email", { + CTFd.fetch("/api/v1/users/" + window.USER_ID + "/email", { method: "POST", credentials: "same-origin", headers: { @@ -179,7 +179,7 @@ function emailUser(event) { .val(""); } else { $("#user-mail-form > #results").empty(); - Object.keys(response.errors).forEach(function(key, index) { + Object.keys(response.errors).forEach(function(key, _index) { $("#user-mail-form > #results").append( ezBadge({ type: "error", @@ -231,14 +231,14 @@ function deleteSelectedSubmissions(event, target) { for (var subId of submissionIDs) { reqs.push(CTFd.api.delete_submission({ submissionId: subId })); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } }); } -function deleteSelectedAwards(event) { +function deleteSelectedAwards(_event) { let awardIDs = $("input[data-award-id]:checked").map(function() { return $(this).data("award-id"); }); @@ -260,7 +260,7 @@ function deleteSelectedAwards(event) { }); reqs.push(req); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } @@ -280,14 +280,14 @@ function solveSelectedMissingChallenges(event) { title: `Mark Correct`, body: `Are you sure you want to mark ${ challengeIDs.length - } correct for ${htmlEntities(USER_NAME)}?`, + } ${target} correct for ${htmlEntities(window.USER_NAME)}?`, success: function() { const reqs = []; for (var challengeID of challengeIDs) { let params = { provided: "MARKED AS SOLVED BY ADMIN", - user_id: USER_ID, - team_id: TEAM_ID, + user_id: window.USER_ID, + team_id: window.TEAM_ID, challenge_id: challengeID, type: "correct" }; @@ -303,7 +303,7 @@ function solveSelectedMissingChallenges(event) { }); reqs.push(req); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } @@ -402,19 +402,19 @@ const updateGraphs = (type, id, name, account_id) => { $(() => { $(".delete-user").click(deleteUser); - $(".edit-user").click(function(event) { + $(".edit-user").click(function(_event) { $("#user-info-modal").modal("toggle"); }); - $(".award-user").click(function(event) { + $(".award-user").click(function(_event) { $("#user-award-modal").modal("toggle"); }); - $(".email-user").click(function(event) { + $(".email-user").click(function(_event) { $("#user-email-modal").modal("toggle"); }); - $(".addresses-user").click(function(event) { + $(".addresses-user").click(function(_event) { $("#user-addresses-modal").modal("toggle"); }); diff --git a/CTFd/themes/admin/assets/js/pages/users.js b/CTFd/themes/admin/assets/js/pages/users.js index 47dea5a0..77d46649 100644 --- a/CTFd/themes/admin/assets/js/pages/users.js +++ b/CTFd/themes/admin/assets/js/pages/users.js @@ -3,7 +3,7 @@ import CTFd from "core/CTFd"; import $ from "jquery"; import { ezAlert, ezQuery } from "core/ezq"; -function deleteSelectedUsers(event) { +function deleteSelectedUsers(_event) { let userIDs = $("input[data-user-id]:checked").map(function() { return $(this).data("user-id"); }); @@ -21,14 +21,14 @@ function deleteSelectedUsers(event) { }) ); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } }); } -function bulkEditUsers(event) { +function bulkEditUsers(_event) { let userIDs = $("input[data-user-id]:checked").map(function() { return $(this).data("user-id"); }); @@ -75,7 +75,7 @@ function bulkEditUsers(event) { }) ); } - Promise.all(reqs).then(responses => { + Promise.all(reqs).then(_responses => { window.location.reload(); }); } diff --git a/CTFd/themes/admin/assets/js/styles.js b/CTFd/themes/admin/assets/js/styles.js index cd33ed5c..67d624b9 100644 --- a/CTFd/themes/admin/assets/js/styles.js +++ b/CTFd/themes/admin/assets/js/styles.js @@ -20,7 +20,7 @@ export default () => { } }); - $(".modal").on("show.bs.modal", function(e) { + $(".modal").on("show.bs.modal", function(_e) { $(".form-control").each(function() { if ($(this).val()) { $(this).addClass("input-filled-valid"); diff --git a/CTFd/themes/admin/static/js/core.dev.js b/CTFd/themes/admin/static/js/core.dev.js index fde0d8f2..2d387b9a 100644 --- a/CTFd/themes/admin/static/js/core.dev.js +++ b/CTFd/themes/admin/static/js/core.dev.js @@ -20,7 +20,7 @@ eval("\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd * /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n__webpack_require__(/*! bootstrap/dist/js/bootstrap.bundle */ \"./node_modules/bootstrap/dist/js/bootstrap.bundle.js\");\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = function _default() {\n // TODO: This is kind of a hack to mimic a React-like state construct.\n // It should be removed once we have a real front-end framework in place.\n (0, _jquery.default)(\":input\").each(function () {\n (0, _jquery.default)(this).data(\"initial\", (0, _jquery.default)(this).val());\n });\n (0, _jquery.default)(\".form-control\").bind({\n focus: function focus() {\n (0, _jquery.default)(this).addClass(\"input-filled-valid\");\n },\n blur: function blur() {\n if ((0, _jquery.default)(this).val() === \"\") {\n (0, _jquery.default)(this).removeClass(\"input-filled-valid\");\n }\n }\n });\n (0, _jquery.default)(\".modal\").on(\"show.bs.modal\", function (e) {\n (0, _jquery.default)(\".form-control\").each(function () {\n if ((0, _jquery.default)(this).val()) {\n (0, _jquery.default)(this).addClass(\"input-filled-valid\");\n }\n });\n });\n (0, _jquery.default)(function () {\n (0, _jquery.default)(\".form-control\").each(function () {\n if ((0, _jquery.default)(this).val()) {\n (0, _jquery.default)(this).addClass(\"input-filled-valid\");\n }\n });\n (0, _jquery.default)(\"tr[data-href], td[data-href]\").click(function () {\n var sel = getSelection().toString();\n\n if (!sel) {\n var href = (0, _jquery.default)(this).attr(\"data-href\");\n\n if (href) {\n window.location = href;\n }\n }\n\n return false;\n });\n (0, _jquery.default)(\"[data-checkbox]\").click(function (e) {\n if ((0, _jquery.default)(e.target).is(\"input[type=checkbox]\")) {\n e.stopImmediatePropagation();\n return;\n }\n\n var checkbox = (0, _jquery.default)(this).find(\"input[type=checkbox]\"); // Doing it this way with an event allows data-checkbox-all to work\n\n checkbox.click();\n e.stopImmediatePropagation();\n });\n (0, _jquery.default)(\"[data-checkbox-all]\").on(\"click change\", function (e) {\n var checked = (0, _jquery.default)(this).prop(\"checked\");\n var idx = (0, _jquery.default)(this).index() + 1;\n (0, _jquery.default)(this).closest(\"table\").find(\"tr td:nth-child(\".concat(idx, \") input[type=checkbox]\")).prop(\"checked\", checked);\n e.stopImmediatePropagation();\n });\n (0, _jquery.default)(\"tr[data-href] a, tr[data-href] button\").click(function (e) {\n // TODO: This is a hack to allow modal close buttons to work\n if (!(0, _jquery.default)(this).attr(\"data-dismiss\")) {\n e.stopPropagation();\n }\n });\n (0, _jquery.default)(\".page-select\").change(function () {\n var url = new URL(window.location);\n url.searchParams.set(\"page\", this.value);\n window.location.href = url.toString();\n });\n (0, _jquery.default)('a[data-toggle=\"tab\"]').on(\"shown.bs.tab\", function (e) {\n sessionStorage.setItem(\"activeTab\", (0, _jquery.default)(e.target).attr(\"href\"));\n });\n var activeTab = sessionStorage.getItem(\"activeTab\");\n\n if (activeTab) {\n var target = (0, _jquery.default)(\".nav-tabs a[href=\\\"\".concat(activeTab, \"\\\"], .nav-pills a[href=\\\"\").concat(activeTab, \"\\\"]\"));\n\n if (target.length) {\n target.tab(\"show\");\n } else {\n sessionStorage.removeItem(\"activeTab\");\n }\n }\n\n (0, _utils.makeSortableTables)();\n (0, _jquery.default)('[data-toggle=\"tooltip\"]').tooltip();\n });\n};\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/styles.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\n__webpack_require__(/*! bootstrap/dist/js/bootstrap.bundle */ \"./node_modules/bootstrap/dist/js/bootstrap.bundle.js\");\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = function _default() {\n // TODO: This is kind of a hack to mimic a React-like state construct.\n // It should be removed once we have a real front-end framework in place.\n (0, _jquery.default)(\":input\").each(function () {\n (0, _jquery.default)(this).data(\"initial\", (0, _jquery.default)(this).val());\n });\n (0, _jquery.default)(\".form-control\").bind({\n focus: function focus() {\n (0, _jquery.default)(this).addClass(\"input-filled-valid\");\n },\n blur: function blur() {\n if ((0, _jquery.default)(this).val() === \"\") {\n (0, _jquery.default)(this).removeClass(\"input-filled-valid\");\n }\n }\n });\n (0, _jquery.default)(\".modal\").on(\"show.bs.modal\", function (_e) {\n (0, _jquery.default)(\".form-control\").each(function () {\n if ((0, _jquery.default)(this).val()) {\n (0, _jquery.default)(this).addClass(\"input-filled-valid\");\n }\n });\n });\n (0, _jquery.default)(function () {\n (0, _jquery.default)(\".form-control\").each(function () {\n if ((0, _jquery.default)(this).val()) {\n (0, _jquery.default)(this).addClass(\"input-filled-valid\");\n }\n });\n (0, _jquery.default)(\"tr[data-href], td[data-href]\").click(function () {\n var sel = getSelection().toString();\n\n if (!sel) {\n var href = (0, _jquery.default)(this).attr(\"data-href\");\n\n if (href) {\n window.location = href;\n }\n }\n\n return false;\n });\n (0, _jquery.default)(\"[data-checkbox]\").click(function (e) {\n if ((0, _jquery.default)(e.target).is(\"input[type=checkbox]\")) {\n e.stopImmediatePropagation();\n return;\n }\n\n var checkbox = (0, _jquery.default)(this).find(\"input[type=checkbox]\"); // Doing it this way with an event allows data-checkbox-all to work\n\n checkbox.click();\n e.stopImmediatePropagation();\n });\n (0, _jquery.default)(\"[data-checkbox-all]\").on(\"click change\", function (e) {\n var checked = (0, _jquery.default)(this).prop(\"checked\");\n var idx = (0, _jquery.default)(this).index() + 1;\n (0, _jquery.default)(this).closest(\"table\").find(\"tr td:nth-child(\".concat(idx, \") input[type=checkbox]\")).prop(\"checked\", checked);\n e.stopImmediatePropagation();\n });\n (0, _jquery.default)(\"tr[data-href] a, tr[data-href] button\").click(function (e) {\n // TODO: This is a hack to allow modal close buttons to work\n if (!(0, _jquery.default)(this).attr(\"data-dismiss\")) {\n e.stopPropagation();\n }\n });\n (0, _jquery.default)(\".page-select\").change(function () {\n var url = new URL(window.location);\n url.searchParams.set(\"page\", this.value);\n window.location.href = url.toString();\n });\n (0, _jquery.default)('a[data-toggle=\"tab\"]').on(\"shown.bs.tab\", function (e) {\n sessionStorage.setItem(\"activeTab\", (0, _jquery.default)(e.target).attr(\"href\"));\n });\n var activeTab = sessionStorage.getItem(\"activeTab\");\n\n if (activeTab) {\n var target = (0, _jquery.default)(\".nav-tabs a[href=\\\"\".concat(activeTab, \"\\\"], .nav-pills a[href=\\\"\").concat(activeTab, \"\\\"]\"));\n\n if (target.length) {\n target.tab(\"show\");\n } else {\n sessionStorage.removeItem(\"activeTab\");\n }\n }\n\n (0, _utils.makeSortableTables)();\n (0, _jquery.default)('[data-toggle=\"tooltip\"]').tooltip();\n });\n};\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/styles.js?"); /***/ }), @@ -44,7 +44,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nvar _fetch = _interopRequireDefault(__webpack_require__(/*! ./fetch */ \"./CTFd/themes/core/assets/js/fetch.js\"));\n\nvar _q = _interopRequireDefault(__webpack_require__(/*! q */ \"./node_modules/q/q.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n *\n * @class API\n * @param {(string|object)} [domainOrOptions] - The project domain or options object. If object, see the object's optional properties.\n * @param {string} [domainOrOptions.domain] - The project domain\n * @param {object} [domainOrOptions.token] - auth token - object with value property and optional headerOrQueryName and isQuery properties\n */\nvar API = function () {\n \"use strict\";\n\n function API(options) {\n var domain = _typeof(options) === \"object\" ? options.domain : options;\n this.domain = domain ? domain : \"\";\n\n if (this.domain.length === 0) {\n throw new Error(\"Domain parameter must be specified as a string.\");\n }\n }\n\n function serializeQueryParams(parameters) {\n var str = [];\n\n for (var p in parameters) {\n if (parameters.hasOwnProperty(p)) {\n str.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(parameters[p]));\n }\n }\n\n return str.join(\"&\");\n }\n\n function mergeQueryParams(parameters, queryParameters) {\n if (parameters.$queryParameters) {\n Object.keys(parameters.$queryParameters).forEach(function (parameterName) {\n var parameter = parameters.$queryParameters[parameterName];\n queryParameters[parameterName] = parameter;\n });\n }\n\n return queryParameters;\n }\n /**\n * HTTP Request\n * @method\n * @name API#request\n * @param {string} method - http method\n * @param {string} url - url to do request\n * @param {object} parameters\n * @param {object} body - body parameters / object\n * @param {object} headers - header parameters\n * @param {object} queryParameters - querystring parameters\n * @param {object} form - form data object\n * @param {object} deferred - promise object\n */\n\n\n API.prototype.request = function (method, url, parameters, body, headers, queryParameters, form, deferred) {\n var queryParams = queryParameters && Object.keys(queryParameters).length ? serializeQueryParams(queryParameters) : null;\n var urlWithParams = url + (queryParams ? \"?\" + queryParams : \"\");\n\n if (body && !Object.keys(body).length) {\n body = undefined;\n }\n\n (0, _fetch.default)(urlWithParams, {\n method: method,\n headers: headers,\n body: JSON.stringify(body)\n }).then(function (response) {\n return response.json();\n }).then(function (body) {\n deferred.resolve(body);\n }).catch(function (error) {\n deferred.reject(error);\n });\n };\n /**\n *\n * @method\n * @name API#post_award_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_award_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_award\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.awardId - An Award ID\n */\n\n\n API.prototype.delete_award = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards/{award_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{award_id}\", parameters[\"awardId\"]);\n\n if (parameters[\"awardId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: awardId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_award\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.awardId - An Award ID\n */\n\n\n API.prototype.get_award = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards/{award_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{award_id}\", parameters[\"awardId\"]);\n\n if (parameters[\"awardId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: awardId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_challenge_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_challenge_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_challenge_attempt\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_challenge_attempt = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/attempt\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_types\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_types = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/types\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.patch_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.delete_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.get_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_files\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_files = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_flags\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_flags = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_hints\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_hints = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_tags\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_tags = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.patch_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.patch_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.delete_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.get_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_files_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_files_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_files_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_files_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_files_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.fileId -\n */\n\n\n API.prototype.delete_files_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files/{file_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{file_id}\", parameters[\"fileId\"]);\n\n if (parameters[\"fileId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: fileId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_files_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.fileId -\n */\n\n\n API.prototype.get_files_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files/{file_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{file_id}\", parameters[\"fileId\"]);\n\n if (parameters[\"fileId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: fileId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_flag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_flag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_flag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_types\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_flag_types = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/types\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_types_1\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.typeName -\n */\n\n\n API.prototype.get_flag_types_1 = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/types/{type_name}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{type_name}\", parameters[\"typeName\"]);\n\n if (parameters[\"typeName\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: typeName\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.patch_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.delete_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.get_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_hint_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_hint_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_hint_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_hint_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.patch_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.delete_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.get_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_notification_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_notification_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_notification_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_notification_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_notification\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.notificationId - A Notification ID\n */\n\n\n API.prototype.delete_notification = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications/{notification_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{notification_id}\", parameters[\"notificationId\"]);\n\n if (parameters[\"notificationId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: notificationId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_notification\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.notificationId - A Notification ID\n */\n\n\n API.prototype.get_notification = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications/{notification_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{notification_id}\", parameters[\"notificationId\"]);\n\n if (parameters[\"notificationId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: notificationId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_page_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_page_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_page_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_page_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.patch_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.delete_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.get_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_scoreboard_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_scoreboard_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/scoreboard\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_scoreboard_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.count - How many top teams to return\n */\n\n\n API.prototype.get_scoreboard_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/scoreboard/top/{count}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{count}\", parameters[\"count\"]);\n\n if (parameters[\"count\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: count\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solve_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_solve_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solve_percentages\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_solve_percentages = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/solves/percentages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_challenge_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submission_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_submission_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/submissions/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_team_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_user_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/users/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_submissions_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_submissions_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submissions_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_submissions_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_submission\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.submissionId - A Submission ID\n */\n\n\n API.prototype.delete_submission = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions/{submission_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{submission_id}\", parameters[\"submissionId\"]);\n\n if (parameters[\"submissionId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: submissionId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submission\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.submissionId - A Submission ID\n */\n\n\n API.prototype.get_submission = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions/{submission_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{submission_id}\", parameters[\"submissionId\"]);\n\n if (parameters[\"submissionId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: submissionId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_tag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_tag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_tag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_tag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.patch_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.delete_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.get_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_team_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_team_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_team_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_team_private\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Current Team\n */\n\n\n API.prototype.patch_team_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"teamId\"] !== undefined) {\n queryParameters[\"team_id\"] = parameters[\"teamId\"];\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_private\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Current Team\n */\n\n\n API.prototype.get_team_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"teamId\"] !== undefined) {\n queryParameters[\"team_id\"] = parameters[\"teamId\"];\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.patch_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.delete_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.get_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_awards\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_awards = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_fails\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_fails = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/fails\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_unlock_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_unlock_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/unlocks\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_unlock_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_unlock_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/unlocks\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_user_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_user_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_user_private\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.patch_user_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_private\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.patch_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.delete_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.get_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_awards\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_awards = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_fails\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_fails = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/fails\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n\n return API;\n}();\n\nexports.API = API;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/api.js?"); +eval("\n\nvar _fetch = _interopRequireDefault(__webpack_require__(/*! ./fetch */ \"./CTFd/themes/core/assets/js/fetch.js\"));\n\nvar _q = _interopRequireDefault(__webpack_require__(/*! q */ \"./node_modules/q/q.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n *\n * @class API\n * @param {(string|object)} [domainOrOptions] - The project domain or options object. If object, see the object's optional properties.\n * @param {string} [domainOrOptions.domain] - The project domain\n * @param {object} [domainOrOptions.token] - auth token - object with value property and optional headerOrQueryName and isQuery properties\n */\nvar API = function () {\n \"use strict\";\n\n function API(options) {\n var domain = _typeof(options) === \"object\" ? options.domain : options;\n this.domain = domain ? domain : \"\";\n\n if (this.domain.length === 0) {\n throw new Error(\"Domain parameter must be specified as a string.\");\n }\n }\n\n function serializeQueryParams(parameters) {\n var str = [];\n\n for (var p in parameters) {\n if (parameters.hasOwnProperty(p)) {\n str.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(parameters[p]));\n }\n }\n\n return str.join(\"&\");\n }\n\n function mergeQueryParams(parameters, queryParameters) {\n if (parameters.$queryParameters) {\n Object.keys(parameters.$queryParameters).forEach(function (parameterName) {\n var parameter = parameters.$queryParameters[parameterName];\n queryParameters[parameterName] = parameter;\n });\n }\n\n return queryParameters;\n }\n /**\n * HTTP Request\n * @method\n * @name API#request\n * @param {string} method - http method\n * @param {string} url - url to do request\n * @param {object} parameters\n * @param {object} body - body parameters / object\n * @param {object} headers - header parameters\n * @param {object} queryParameters - querystring parameters\n * @param {object} form - form data object\n * @param {object} deferred - promise object\n */\n\n\n API.prototype.request = function (method, url, parameters, body, headers, queryParameters, form, deferred) {\n var queryParams = queryParameters && Object.keys(queryParameters).length ? serializeQueryParams(queryParameters) : null;\n var urlWithParams = url + (queryParams ? \"?\" + queryParams : \"\");\n\n if (body && !Object.keys(body).length) {\n body = undefined;\n }\n\n (0, _fetch.default)(urlWithParams, {\n method: method,\n headers: headers,\n body: JSON.stringify(body)\n }).then(function (response) {\n return response.json();\n }).then(function (body) {\n deferred.resolve(body);\n }).catch(function (error) {\n deferred.reject(error);\n });\n };\n /**\n *\n * @method\n * @name API#post_award_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_award_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_award\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.awardId - An Award ID\n */\n\n\n API.prototype.delete_award = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards/{award_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{award_id}\", parameters[\"awardId\"]);\n\n if (parameters[\"awardId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: awardId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_award\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.awardId - An Award ID\n */\n\n\n API.prototype.get_award = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards/{award_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{award_id}\", parameters[\"awardId\"]);\n\n if (parameters[\"awardId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: awardId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_challenge_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_challenge_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_challenge_attempt\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_challenge_attempt = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/attempt\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_types\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_types = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/types\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.patch_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.delete_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.get_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_files\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_files = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_flags\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_flags = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_hints\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_hints = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_tags\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_tags = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.patch_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.patch_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.delete_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.get_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_files_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_files_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_files_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_files_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_files_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.fileId -\n */\n\n\n API.prototype.delete_files_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files/{file_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{file_id}\", parameters[\"fileId\"]);\n\n if (parameters[\"fileId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: fileId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_files_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.fileId -\n */\n\n\n API.prototype.get_files_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files/{file_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{file_id}\", parameters[\"fileId\"]);\n\n if (parameters[\"fileId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: fileId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_flag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_flag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_flag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_types\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_flag_types = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/types\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_types_1\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.typeName -\n */\n\n\n API.prototype.get_flag_types_1 = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/types/{type_name}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{type_name}\", parameters[\"typeName\"]);\n\n if (parameters[\"typeName\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: typeName\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.patch_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.delete_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.get_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_hint_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_hint_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_hint_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_hint_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.patch_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.delete_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.get_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_notification_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_notification_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_notification_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_notification_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_notification\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.notificationId - A Notification ID\n */\n\n\n API.prototype.delete_notification = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications/{notification_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{notification_id}\", parameters[\"notificationId\"]);\n\n if (parameters[\"notificationId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: notificationId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_notification\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.notificationId - A Notification ID\n */\n\n\n API.prototype.get_notification = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications/{notification_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{notification_id}\", parameters[\"notificationId\"]);\n\n if (parameters[\"notificationId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: notificationId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_page_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_page_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_page_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_page_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.patch_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.delete_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.get_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_scoreboard_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_scoreboard_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/scoreboard\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_scoreboard_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.count - How many top teams to return\n */\n\n\n API.prototype.get_scoreboard_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/scoreboard/top/{count}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{count}\", parameters[\"count\"]);\n\n if (parameters[\"count\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: count\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solve_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_solve_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solve_percentages\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_solve_percentages = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/solves/percentages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_challenge_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submission_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_submission_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/submissions/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_team_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_user_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/users/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_submissions_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_submissions_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submissions_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_submissions_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_submission\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.submissionId - A Submission ID\n */\n\n\n API.prototype.delete_submission = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions/{submission_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{submission_id}\", parameters[\"submissionId\"]);\n\n if (parameters[\"submissionId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: submissionId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submission\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.submissionId - A Submission ID\n */\n\n\n API.prototype.get_submission = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions/{submission_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{submission_id}\", parameters[\"submissionId\"]);\n\n if (parameters[\"submissionId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: submissionId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_tag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_tag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_tag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_tag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.patch_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.delete_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.get_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_team_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_team_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_team_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_team_private\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Current Team\n */\n\n\n API.prototype.patch_team_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"teamId\"] !== undefined) {\n queryParameters[\"team_id\"] = parameters[\"teamId\"];\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_private\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Current Team\n */\n\n\n API.prototype.get_team_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"teamId\"] !== undefined) {\n queryParameters[\"team_id\"] = parameters[\"teamId\"];\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.patch_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.delete_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.get_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_awards\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_awards = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_fails\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_fails = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/fails\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_unlock_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_unlock_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/unlocks\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_unlock_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_unlock_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/unlocks\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_user_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_user_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_user_private\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.patch_user_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_private\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.patch_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.delete_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.get_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_awards\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_awards = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_fails\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_fails = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/fails\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n\n return API;\n}(); // eslint-disable-next-line no-undef\n\n\nexports.API = API;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/api.js?"); /***/ }), @@ -68,7 +68,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _howler = __webpack_require__(/*! howler */ \"./node_modules/howler/dist/howler.js\");\n\nvar _eventSourcePolyfill = __webpack_require__(/*! event-source-polyfill */ \"./node_modules/event-source-polyfill/src/eventsource.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 EventSource = _eventSourcePolyfill.NativeEventSource || _eventSourcePolyfill.EventSourcePolyfill;\n\nvar _default = function _default(root) {\n var source = new EventSource(root + \"/events\");\n var wc = new _utils.WindowController();\n var howl = new _howler.Howl({\n src: [root + \"/themes/core/static/sounds/notification.webm\", root + \"/themes/core/static/sounds/notification.mp3\"]\n });\n (0, _utils.init_notification_counter)();\n\n function connect() {\n source.addEventListener(\"notification\", function (event) {\n var data = JSON.parse(event.data);\n wc.broadcast(\"notification\", data);\n render(data);\n }, false);\n }\n\n function disconnect() {\n if (source) {\n source.close();\n }\n }\n\n function render(data) {\n switch (data.type) {\n case \"toast\":\n (0, _utils.inc_notification_counter)(); // Trim toast body to length\n\n var length = 50;\n var trimmed_content = data.content.length > length ? data.content.substring(0, length - 3) + \"...\" : data.content;\n var clicked = false;\n (0, _ezq.ezToast)({\n title: data.title,\n body: trimmed_content,\n onclick: function onclick() {\n (0, _ezq.ezAlert)({\n title: data.title,\n body: data.content,\n button: \"Got it!\",\n success: function success() {\n clicked = true;\n (0, _utils.dec_notification_counter)();\n }\n });\n },\n onclose: function onclose() {\n if (!clicked) {\n (0, _utils.dec_notification_counter)();\n }\n }\n });\n break;\n\n case \"alert\":\n (0, _utils.inc_notification_counter)();\n (0, _ezq.ezAlert)({\n title: data.title,\n body: data.content,\n button: \"Got it!\",\n success: function success() {\n (0, _utils.dec_notification_counter)();\n }\n });\n break;\n\n case \"background\":\n (0, _utils.inc_notification_counter)();\n break;\n\n default:\n (0, _utils.inc_notification_counter)();\n break;\n }\n\n if (data.sound) {\n howl.play();\n }\n }\n\n wc.notification = function (data) {\n render(data);\n };\n\n wc.masterDidChange = function () {\n if (this.isMaster) {\n connect();\n } else {\n disconnect();\n }\n };\n};\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/events.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _howler = __webpack_require__(/*! howler */ \"./node_modules/howler/dist/howler.js\");\n\nvar _eventSourcePolyfill = __webpack_require__(/*! event-source-polyfill */ \"./node_modules/event-source-polyfill/src/eventsource.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 EventSource = _eventSourcePolyfill.NativeEventSource || _eventSourcePolyfill.EventSourcePolyfill;\n\nvar _default = function _default(root) {\n var source = new EventSource(root + \"/events\");\n var wc = new _utils.WindowController();\n var howl = new _howler.Howl({\n src: [root + \"/themes/core/static/sounds/notification.webm\", root + \"/themes/core/static/sounds/notification.mp3\"]\n });\n (0, _utils.init_notification_counter)();\n\n function connect() {\n source.addEventListener(\"notification\", function (event) {\n var data = JSON.parse(event.data);\n wc.broadcast(\"notification\", data);\n render(data);\n }, false);\n }\n\n function disconnect() {\n if (source) {\n source.close();\n }\n }\n\n function render(data) {\n switch (data.type) {\n case \"toast\":\n {\n (0, _utils.inc_notification_counter)(); // Trim toast body to length\n\n var length = 50;\n var trimmed_content = data.content.length > length ? data.content.substring(0, length - 3) + \"...\" : data.content;\n var clicked = false;\n (0, _ezq.ezToast)({\n title: data.title,\n body: trimmed_content,\n onclick: function onclick() {\n (0, _ezq.ezAlert)({\n title: data.title,\n body: data.content,\n button: \"Got it!\",\n success: function success() {\n clicked = true;\n (0, _utils.dec_notification_counter)();\n }\n });\n },\n onclose: function onclose() {\n if (!clicked) {\n (0, _utils.dec_notification_counter)();\n }\n }\n });\n break;\n }\n\n case \"alert\":\n {\n (0, _utils.inc_notification_counter)();\n (0, _ezq.ezAlert)({\n title: data.title,\n body: data.content,\n button: \"Got it!\",\n success: function success() {\n (0, _utils.dec_notification_counter)();\n }\n });\n break;\n }\n\n case \"background\":\n {\n (0, _utils.inc_notification_counter)();\n break;\n }\n\n default:\n {\n (0, _utils.inc_notification_counter)();\n break;\n }\n }\n\n if (data.sound) {\n howl.play();\n }\n }\n\n wc.notification = function (data) {\n render(data);\n };\n\n wc.masterDidChange = function () {\n if (this.isMaster) {\n connect();\n } else {\n disconnect();\n }\n };\n};\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/events.js?"); /***/ }), @@ -128,7 +128,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.WindowController = WindowController;\nexports.colorHash = colorHash;\nexports.htmlEntities = htmlEntities;\nexports.cumulativeSum = cumulativeSum;\nexports.init_notification_counter = init_notification_counter;\nexports.set_notification_counter = set_notification_counter;\nexports.inc_notification_counter = inc_notification_counter;\nexports.dec_notification_counter = dec_notification_counter;\nexports.clear_notification_counter = clear_notification_counter;\nexports.copyToClipboard = copyToClipboard;\nexports.makeSortableTables = makeSortableTables;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_jquery.default.fn.serializeJSON = function (omit_nulls) {\n var params = {};\n var form = (0, _jquery.default)(this);\n var values = form.serializeArray();\n values = values.concat(form.find(\"input[type=checkbox]:checked\").map(function () {\n return {\n name: this.name,\n value: true\n };\n }).get());\n values = values.concat(form.find(\"input[type=checkbox]:not(:checked)\").map(function () {\n return {\n name: this.name,\n value: false\n };\n }).get());\n values.map(function (x) {\n if (omit_nulls) {\n if (x.value !== null && x.value !== \"\") {\n params[x.name] = x.value;\n } else {\n var input = form.find(\":input[name=\".concat(x.name, \"]\"));\n\n if (input.data(\"initial\") !== input.val()) {\n params[x.name] = x.value;\n }\n }\n } else {\n params[x.name] = x.value;\n }\n });\n return params;\n}; //http://stackoverflow.com/a/2648463 - wizardry!\n\n\nString.prototype.format = String.prototype.f = function () {\n var s = this,\n i = arguments.length;\n\n while (i--) {\n s = s.replace(new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\"), arguments[i]);\n }\n\n return s;\n}; //http://stackoverflow.com/a/7616484\n\n\nString.prototype.hashCode = function () {\n var hash = 0,\n i,\n chr,\n len;\n if (this.length == 0) return hash;\n\n for (i = 0, len = this.length; i < len; i++) {\n chr = this.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n\n return hash;\n}; // https://gist.github.com/neilj/4146038\n// https://fastmail.blog/2012/11/26/inter-tab-communication-using-local-storage/\n\n\nfunction WindowController() {\n this.id = Math.random();\n this.isMaster = false;\n this.others = {};\n window.addEventListener(\"storage\", this, false);\n window.addEventListener(\"unload\", this, false);\n this.broadcast(\"hello\");\n var that = this;\n\n var check = function check() {\n that.check();\n that._checkTimeout = setTimeout(check, 9000);\n };\n\n var ping = function ping() {\n that.sendPing();\n that._pingTimeout = setTimeout(ping, 17000);\n };\n\n this._checkTimeout = setTimeout(check, 500);\n this._pingTimeout = setTimeout(ping, 17000);\n}\n\nWindowController.prototype.destroy = function () {\n clearTimeout(this._pingTimeout);\n clearTimeout(this._checkTimeout);\n window.removeEventListener(\"storage\", this, false);\n window.removeEventListener(\"unload\", this, false);\n this.broadcast(\"bye\");\n};\n\nWindowController.prototype.handleEvent = function (event) {\n if (event.type === \"unload\") {\n this.destroy();\n } else if (event.key === \"broadcast\") {\n try {\n var data = JSON.parse(event.newValue);\n\n if (data.id !== this.id) {\n this[data.type](data);\n }\n } catch (error) {}\n }\n};\n\nWindowController.prototype.sendPing = function () {\n this.broadcast(\"ping\");\n};\n\nWindowController.prototype.hello = function (event) {\n this.ping(event);\n\n if (event.id < this.id) {\n this.check();\n } else {\n this.sendPing();\n }\n};\n\nWindowController.prototype.ping = function (event) {\n this.others[event.id] = +new Date();\n};\n\nWindowController.prototype.bye = function (event) {\n delete this.others[event.id];\n this.check();\n};\n\nWindowController.prototype.check = function (event) {\n var now = +new Date(),\n takeMaster = true,\n id;\n\n for (id in this.others) {\n if (this.others[id] + 23000 < now) {\n delete this.others[id];\n } else if (id < this.id) {\n takeMaster = false;\n }\n }\n\n if (this.isMaster !== takeMaster) {\n this.isMaster = takeMaster;\n this.masterDidChange();\n }\n};\n\nWindowController.prototype.masterDidChange = function () {};\n\nWindowController.prototype.broadcast = function (type, data) {\n var event = {\n id: this.id,\n type: type\n };\n\n for (var x in data) {\n event[x] = data[x];\n }\n\n try {\n localStorage.setItem(\"broadcast\", JSON.stringify(event));\n } catch (error) {\n console.log(error);\n }\n};\n\nfunction colorHash(str) {\n var hash = 0;\n\n for (var i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n var colour = \"#\";\n\n for (var _i = 0; _i < 3; _i++) {\n var value = hash >> _i * 8 & 0xff;\n colour += (\"00\" + value.toString(16)).substr(-2);\n }\n\n return colour;\n}\n\nfunction htmlEntities(string) {\n return (0, _jquery.default)(\"
\").text(string).html();\n}\n\nfunction cumulativeSum(arr) {\n var result = arr.concat();\n\n for (var i = 0; i < arr.length; i++) {\n result[i] = arr.slice(0, i + 1).reduce(function (p, i) {\n return p + i;\n });\n }\n\n return result;\n}\n\nvar storage = window.localStorage;\nvar counter_key = \"unread_notifications\";\n\nfunction init_notification_counter() {\n var count = storage.getItem(counter_key);\n\n if (count === null) {\n storage.setItem(counter_key, 0);\n } else {\n if (count > 0) {\n (0, _jquery.default)(\".badge-notification\").text(count);\n }\n }\n}\n\nfunction set_notification_counter(count) {\n storage.setItem(counter_key, count);\n}\n\nfunction inc_notification_counter() {\n var count = storage.getItem(counter_key) || 0;\n storage.setItem(counter_key, ++count);\n (0, _jquery.default)(\".badge-notification\").text(count);\n}\n\nfunction dec_notification_counter() {\n var count = storage.getItem(counter_key) || 0;\n\n if (count > 0) {\n storage.setItem(counter_key, --count);\n (0, _jquery.default)(\".badge-notification\").text(count);\n } // Always clear if count is 0\n\n\n if (count == 0) {\n clear_notification_counter();\n }\n}\n\nfunction clear_notification_counter() {\n storage.setItem(counter_key, 0);\n (0, _jquery.default)(\".badge-notification\").empty();\n}\n\nfunction copyToClipboard(event, selector) {\n // Select element\n (0, _jquery.default)(selector).select(); // Copy to clipboard\n\n document.execCommand(\"copy\"); // Show tooltip to user\n\n (0, _jquery.default)(event.target).tooltip({\n title: \"Copied!\",\n trigger: \"manual\"\n });\n (0, _jquery.default)(event.target).tooltip(\"show\");\n setTimeout(function () {\n (0, _jquery.default)(event.target).tooltip(\"hide\");\n }, 1500);\n}\n\nfunction makeSortableTables() {\n (0, _jquery.default)(\"th.sort-col\").append(\" \");\n (0, _jquery.default)(\"th.sort-col\").click(function () {\n var table = (0, _jquery.default)(this).parents(\"table\").eq(0);\n var rows = table.find(\"tr:gt(0)\").toArray().sort(comparer((0, _jquery.default)(this).index()));\n this.asc = !this.asc;\n\n if (!this.asc) {\n rows = rows.reverse();\n }\n\n for (var i = 0; i < rows.length; i++) {\n table.append(rows[i]);\n }\n });\n\n function comparer(index) {\n return function (a, b) {\n var valA = getCellValue(a, index),\n valB = getCellValue(b, index);\n return _jquery.default.isNumeric(valA) && _jquery.default.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB);\n };\n }\n\n function getCellValue(row, index) {\n return (0, _jquery.default)(row).children(\"td\").eq(index).text();\n }\n}\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/utils.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.WindowController = WindowController;\nexports.colorHash = colorHash;\nexports.htmlEntities = htmlEntities;\nexports.cumulativeSum = cumulativeSum;\nexports.init_notification_counter = init_notification_counter;\nexports.set_notification_counter = set_notification_counter;\nexports.inc_notification_counter = inc_notification_counter;\nexports.dec_notification_counter = dec_notification_counter;\nexports.clear_notification_counter = clear_notification_counter;\nexports.copyToClipboard = copyToClipboard;\nexports.makeSortableTables = makeSortableTables;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_jquery.default.fn.serializeJSON = function (omit_nulls) {\n var params = {};\n var form = (0, _jquery.default)(this);\n var values = form.serializeArray();\n values = values.concat(form.find(\"input[type=checkbox]:checked\").map(function () {\n return {\n name: this.name,\n value: true\n };\n }).get());\n values = values.concat(form.find(\"input[type=checkbox]:not(:checked)\").map(function () {\n return {\n name: this.name,\n value: false\n };\n }).get());\n values.map(function (x) {\n if (omit_nulls) {\n if (x.value !== null && x.value !== \"\") {\n params[x.name] = x.value;\n } else {\n var input = form.find(\":input[name=\".concat(x.name, \"]\"));\n\n if (input.data(\"initial\") !== input.val()) {\n params[x.name] = x.value;\n }\n }\n } else {\n params[x.name] = x.value;\n }\n });\n return params;\n}; //http://stackoverflow.com/a/2648463 - wizardry!\n\n\nString.prototype.format = String.prototype.f = function () {\n var s = this,\n i = arguments.length;\n\n while (i--) {\n s = s.replace(new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\"), arguments[i]);\n }\n\n return s;\n}; //http://stackoverflow.com/a/7616484\n\n\nString.prototype.hashCode = function () {\n var hash = 0,\n i,\n chr,\n len;\n if (this.length == 0) return hash;\n\n for (i = 0, len = this.length; i < len; i++) {\n chr = this.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n\n return hash;\n}; // https://gist.github.com/neilj/4146038\n// https://fastmail.blog/2012/11/26/inter-tab-communication-using-local-storage/\n\n\nfunction WindowController() {\n this.id = Math.random();\n this.isMaster = false;\n this.others = {};\n window.addEventListener(\"storage\", this, false);\n window.addEventListener(\"unload\", this, false);\n this.broadcast(\"hello\");\n var that = this;\n\n var check = function check() {\n that.check();\n that._checkTimeout = setTimeout(check, 9000);\n };\n\n var ping = function ping() {\n that.sendPing();\n that._pingTimeout = setTimeout(ping, 17000);\n };\n\n this._checkTimeout = setTimeout(check, 500);\n this._pingTimeout = setTimeout(ping, 17000);\n}\n\nWindowController.prototype.destroy = function () {\n clearTimeout(this._pingTimeout);\n clearTimeout(this._checkTimeout);\n window.removeEventListener(\"storage\", this, false);\n window.removeEventListener(\"unload\", this, false);\n this.broadcast(\"bye\");\n};\n\nWindowController.prototype.handleEvent = function (event) {\n if (event.type === \"unload\") {\n this.destroy();\n } else if (event.key === \"broadcast\") {\n try {\n var data = JSON.parse(event.newValue);\n\n if (data.id !== this.id) {\n this[data.type](data);\n }\n } catch (error) {// Ignore error\n }\n }\n};\n\nWindowController.prototype.sendPing = function () {\n this.broadcast(\"ping\");\n};\n\nWindowController.prototype.hello = function (event) {\n this.ping(event);\n\n if (event.id < this.id) {\n this.check();\n } else {\n this.sendPing();\n }\n};\n\nWindowController.prototype.ping = function (event) {\n this.others[event.id] = +new Date();\n};\n\nWindowController.prototype.bye = function (event) {\n delete this.others[event.id];\n this.check();\n};\n\nWindowController.prototype.check = function (_event) {\n var now = +new Date(),\n takeMaster = true,\n id;\n\n for (id in this.others) {\n if (this.others[id] + 23000 < now) {\n delete this.others[id];\n } else if (id < this.id) {\n takeMaster = false;\n }\n }\n\n if (this.isMaster !== takeMaster) {\n this.isMaster = takeMaster;\n this.masterDidChange();\n }\n};\n\nWindowController.prototype.masterDidChange = function () {};\n\nWindowController.prototype.broadcast = function (type, data) {\n var event = {\n id: this.id,\n type: type\n };\n\n for (var x in data) {\n event[x] = data[x];\n }\n\n try {\n localStorage.setItem(\"broadcast\", JSON.stringify(event));\n } catch (error) {\n // eslint-disable-next-line no-console\n console.log(error);\n }\n};\n\nfunction colorHash(str) {\n var hash = 0;\n\n for (var i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n var colour = \"#\";\n\n for (var _i = 0; _i < 3; _i++) {\n var value = hash >> _i * 8 & 0xff;\n colour += (\"00\" + value.toString(16)).substr(-2);\n }\n\n return colour;\n}\n\nfunction htmlEntities(string) {\n return (0, _jquery.default)(\"
\").text(string).html();\n}\n\nfunction cumulativeSum(arr) {\n var result = arr.concat();\n\n for (var i = 0; i < arr.length; i++) {\n result[i] = arr.slice(0, i + 1).reduce(function (p, i) {\n return p + i;\n });\n }\n\n return result;\n}\n\nvar storage = window.localStorage;\nvar counter_key = \"unread_notifications\";\n\nfunction init_notification_counter() {\n var count = storage.getItem(counter_key);\n\n if (count === null) {\n storage.setItem(counter_key, 0);\n } else {\n if (count > 0) {\n (0, _jquery.default)(\".badge-notification\").text(count);\n }\n }\n}\n\nfunction set_notification_counter(count) {\n storage.setItem(counter_key, count);\n}\n\nfunction inc_notification_counter() {\n var count = storage.getItem(counter_key) || 0;\n storage.setItem(counter_key, ++count);\n (0, _jquery.default)(\".badge-notification\").text(count);\n}\n\nfunction dec_notification_counter() {\n var count = storage.getItem(counter_key) || 0;\n\n if (count > 0) {\n storage.setItem(counter_key, --count);\n (0, _jquery.default)(\".badge-notification\").text(count);\n } // Always clear if count is 0\n\n\n if (count == 0) {\n clear_notification_counter();\n }\n}\n\nfunction clear_notification_counter() {\n storage.setItem(counter_key, 0);\n (0, _jquery.default)(\".badge-notification\").empty();\n}\n\nfunction copyToClipboard(event, selector) {\n // Select element\n (0, _jquery.default)(selector).select(); // Copy to clipboard\n\n document.execCommand(\"copy\"); // Show tooltip to user\n\n (0, _jquery.default)(event.target).tooltip({\n title: \"Copied!\",\n trigger: \"manual\"\n });\n (0, _jquery.default)(event.target).tooltip(\"show\");\n setTimeout(function () {\n (0, _jquery.default)(event.target).tooltip(\"hide\");\n }, 1500);\n}\n\nfunction makeSortableTables() {\n (0, _jquery.default)(\"th.sort-col\").append(\" \");\n (0, _jquery.default)(\"th.sort-col\").click(function () {\n var table = (0, _jquery.default)(this).parents(\"table\").eq(0);\n var rows = table.find(\"tr:gt(0)\").toArray().sort(comparer((0, _jquery.default)(this).index()));\n this.asc = !this.asc;\n\n if (!this.asc) {\n rows = rows.reverse();\n }\n\n for (var i = 0; i < rows.length; i++) {\n table.append(rows[i]);\n }\n });\n\n function comparer(index) {\n return function (a, b) {\n var valA = getCellValue(a, index),\n valB = getCellValue(b, index);\n return _jquery.default.isNumeric(valA) && _jquery.default.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB);\n };\n }\n\n function getCellValue(row, index) {\n return (0, _jquery.default)(row).children(\"td\").eq(index).text();\n }\n}\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/utils.js?"); /***/ }), diff --git a/CTFd/themes/admin/static/js/graphs.dev.js b/CTFd/themes/admin/static/js/graphs.dev.js index ff29eac7..8aae85b6 100644 --- a/CTFd/themes/admin/static/js/graphs.dev.js +++ b/CTFd/themes/admin/static/js/graphs.dev.js @@ -8,7 +8,7 @@ /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.createGraph = createGraph;\nexports.updateGraph = updateGraph;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _plotly = _interopRequireDefault(__webpack_require__(/*! plotly.js-basic-dist */ \"./node_modules/plotly.js-basic-dist/plotly-basic.js\"));\n\nvar _moment = _interopRequireDefault(__webpack_require__(/*! moment */ \"./node_modules/moment/moment.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_configs = {\n score_graph: {\n layout: {\n title: \"Score over Time\",\n paper_bgcolor: \"rgba(0,0,0,0)\",\n plot_bgcolor: \"rgba(0,0,0,0)\",\n hovermode: \"closest\",\n xaxis: {\n showgrid: false,\n showspikes: true\n },\n yaxis: {\n showgrid: false,\n showspikes: true\n },\n legend: {\n orientation: \"h\"\n }\n },\n fn: function fn(type, id, name, account_id) {\n return \"CTFd_score_\".concat(type, \"_\").concat(name, \"_\").concat(id, \"_\").concat(new Date().toISOString().slice(0, 19));\n },\n format: function format(type, id, name, account_id, responses) {\n var times = [];\n var scores = [];\n var solves = responses[0].data;\n var awards = responses[2].data;\n var total = solves.concat(awards);\n total.sort(function (a, b) {\n return new Date(a.date) - new Date(b.date);\n });\n\n for (var i = 0; i < total.length; i++) {\n var date = (0, _moment.default)(total[i].date);\n times.push(date.toDate());\n\n try {\n scores.push(total[i].challenge.value);\n } catch (e) {\n scores.push(total[i].value);\n }\n }\n\n return [{\n x: times,\n y: (0, _utils.cumulativeSum)(scores),\n type: \"scatter\",\n marker: {\n color: (0, _utils.colorHash)(name + id)\n },\n line: {\n color: (0, _utils.colorHash)(name + id)\n },\n fill: \"tozeroy\"\n }];\n }\n },\n category_breakdown: {\n layout: {\n title: \"Category Breakdown\",\n paper_bgcolor: \"rgba(0,0,0,0)\",\n plot_bgcolor: \"rgba(0,0,0,0)\",\n legend: {\n orientation: \"v\"\n },\n height: \"400px\"\n },\n fn: function fn(type, id, name, account_id) {\n return \"CTFd_submissions_\".concat(type, \"_\").concat(name, \"_\").concat(id, \"_\").concat(new Date().toISOString().slice(0, 19));\n },\n format: function format(type, id, name, account_id, responses) {\n var solves = responses[0].data;\n var categories = [];\n\n for (var i = 0; i < solves.length; i++) {\n categories.push(solves[i].challenge.category);\n }\n\n var keys = categories.filter(function (elem, pos) {\n return categories.indexOf(elem) == pos;\n });\n var counts = [];\n\n for (var _i = 0; _i < keys.length; _i++) {\n var count = 0;\n\n for (var x = 0; x < categories.length; x++) {\n if (categories[x] == keys[_i]) {\n count++;\n }\n }\n\n counts.push(count);\n }\n\n return [{\n values: counts,\n labels: keys,\n hole: 0.4,\n type: \"pie\"\n }];\n }\n },\n solve_percentages: {\n layout: {\n title: \"Solve Percentages\",\n paper_bgcolor: \"rgba(0,0,0,0)\",\n plot_bgcolor: \"rgba(0,0,0,0)\",\n legend: {\n orientation: \"h\"\n },\n height: \"400px\"\n },\n fn: function fn(type, id, name, account_id) {\n return \"CTFd_submissions_\".concat(type, \"_\").concat(name, \"_\").concat(id, \"_\").concat(new Date().toISOString().slice(0, 19));\n },\n format: function format(type, id, name, account_id, responses) {\n var solves_count = responses[0].data.length;\n var fails_count = responses[1].meta.count;\n return [{\n values: [solves_count, fails_count],\n labels: [\"Solves\", \"Fails\"],\n marker: {\n colors: [\"rgb(0, 209, 64)\", \"rgb(207, 38, 0)\"]\n },\n hole: 0.4,\n type: \"pie\"\n }];\n }\n }\n};\nvar config = {\n displaylogo: false,\n responsive: true\n};\n\nfunction createGraph(graph_type, target, data, type, id, name, account_id) {\n var cfg = graph_configs[graph_type];\n var $elem = (0, _jquery.default)(target);\n $elem.empty();\n\n if ($elem[0] === undefined) {\n console.log(\"Couldn't find graph target: \" + target);\n return;\n }\n\n $elem[0].fn = cfg.fn(type, id, name, account_id);\n var graph_data = cfg.format(type, id, name, account_id, data);\n\n _plotly.default.newPlot($elem[0], graph_data, cfg.layout, config);\n}\n\nfunction updateGraph(graph_type, target, data, type, id, name, account_id) {\n var cfg = graph_configs[graph_type];\n var $elem = (0, _jquery.default)(target);\n var graph_data = cfg.format(type, id, name, account_id, data);\n\n _plotly.default.update($elem[0], graph_data, cfg.layout, config);\n}\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/graphs.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.createGraph = createGraph;\nexports.updateGraph = updateGraph;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _plotly = _interopRequireDefault(__webpack_require__(/*! plotly.js-basic-dist */ \"./node_modules/plotly.js-basic-dist/plotly-basic.js\"));\n\nvar _moment = _interopRequireDefault(__webpack_require__(/*! moment */ \"./node_modules/moment/moment.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_configs = {\n score_graph: {\n layout: {\n title: \"Score over Time\",\n paper_bgcolor: \"rgba(0,0,0,0)\",\n plot_bgcolor: \"rgba(0,0,0,0)\",\n hovermode: \"closest\",\n xaxis: {\n showgrid: false,\n showspikes: true\n },\n yaxis: {\n showgrid: false,\n showspikes: true\n },\n legend: {\n orientation: \"h\"\n }\n },\n fn: function fn(type, id, name, _account_id) {\n return \"CTFd_score_\".concat(type, \"_\").concat(name, \"_\").concat(id, \"_\").concat(new Date().toISOString().slice(0, 19));\n },\n format: function format(type, id, name, _account_id, responses) {\n var times = [];\n var scores = [];\n var solves = responses[0].data;\n var awards = responses[2].data;\n var total = solves.concat(awards);\n total.sort(function (a, b) {\n return new Date(a.date) - new Date(b.date);\n });\n\n for (var i = 0; i < total.length; i++) {\n var date = (0, _moment.default)(total[i].date);\n times.push(date.toDate());\n\n try {\n scores.push(total[i].challenge.value);\n } catch (e) {\n scores.push(total[i].value);\n }\n }\n\n return [{\n x: times,\n y: (0, _utils.cumulativeSum)(scores),\n type: \"scatter\",\n marker: {\n color: (0, _utils.colorHash)(name + id)\n },\n line: {\n color: (0, _utils.colorHash)(name + id)\n },\n fill: \"tozeroy\"\n }];\n }\n },\n category_breakdown: {\n layout: {\n title: \"Category Breakdown\",\n paper_bgcolor: \"rgba(0,0,0,0)\",\n plot_bgcolor: \"rgba(0,0,0,0)\",\n legend: {\n orientation: \"v\"\n },\n height: \"400px\"\n },\n fn: function fn(type, id, name, _account_id) {\n return \"CTFd_submissions_\".concat(type, \"_\").concat(name, \"_\").concat(id, \"_\").concat(new Date().toISOString().slice(0, 19));\n },\n format: function format(type, id, name, account_id, responses) {\n var solves = responses[0].data;\n var categories = [];\n\n for (var i = 0; i < solves.length; i++) {\n categories.push(solves[i].challenge.category);\n }\n\n var keys = categories.filter(function (elem, pos) {\n return categories.indexOf(elem) == pos;\n });\n var counts = [];\n\n for (var _i = 0; _i < keys.length; _i++) {\n var count = 0;\n\n for (var x = 0; x < categories.length; x++) {\n if (categories[x] == keys[_i]) {\n count++;\n }\n }\n\n counts.push(count);\n }\n\n return [{\n values: counts,\n labels: keys,\n hole: 0.4,\n type: \"pie\"\n }];\n }\n },\n solve_percentages: {\n layout: {\n title: \"Solve Percentages\",\n paper_bgcolor: \"rgba(0,0,0,0)\",\n plot_bgcolor: \"rgba(0,0,0,0)\",\n legend: {\n orientation: \"h\"\n },\n height: \"400px\"\n },\n fn: function fn(type, id, name, _account_id) {\n return \"CTFd_submissions_\".concat(type, \"_\").concat(name, \"_\").concat(id, \"_\").concat(new Date().toISOString().slice(0, 19));\n },\n format: function format(type, id, name, account_id, responses) {\n var solves_count = responses[0].data.length;\n var fails_count = responses[1].meta.count;\n return [{\n values: [solves_count, fails_count],\n labels: [\"Solves\", \"Fails\"],\n marker: {\n colors: [\"rgb(0, 209, 64)\", \"rgb(207, 38, 0)\"]\n },\n hole: 0.4,\n type: \"pie\"\n }];\n }\n }\n};\nvar config = {\n displaylogo: false,\n responsive: true\n};\n\nfunction createGraph(graph_type, target, data, type, id, name, account_id) {\n var cfg = graph_configs[graph_type];\n var $elem = (0, _jquery.default)(target);\n $elem.empty();\n\n if ($elem[0] === undefined) {\n return;\n }\n\n $elem[0].fn = cfg.fn(type, id, name, account_id);\n var graph_data = cfg.format(type, id, name, account_id, data);\n\n _plotly.default.newPlot($elem[0], graph_data, cfg.layout, config);\n}\n\nfunction updateGraph(graph_type, target, data, type, id, name, account_id) {\n var cfg = graph_configs[graph_type];\n var $elem = (0, _jquery.default)(target);\n var graph_data = cfg.format(type, id, name, account_id, data);\n\n _plotly.default.update($elem[0], graph_data, cfg.layout, config);\n}\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/graphs.js?"); /***/ }) diff --git a/CTFd/themes/admin/static/js/pages/challenge.dev.js b/CTFd/themes/admin/static/js/pages/challenge.dev.js index 15881554..be5a2aaf 100644 --- a/CTFd/themes/admin/static/js/pages/challenge.dev.js +++ b/CTFd/themes/admin/static/js/pages/challenge.dev.js @@ -162,7 +162,7 @@ /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addFile = addFile;\nexports.deleteFile = deleteFile;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _helpers = _interopRequireDefault(__webpack_require__(/*! core/helpers */ \"./CTFd/themes/core/assets/js/helpers.js\"));\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction addFile(event) {\n event.preventDefault();\n var form = event.target;\n var data = {\n challenge: CHALLENGE_ID,\n type: \"challenge\"\n };\n\n _helpers.default.files.upload(form, data, function (response) {\n setTimeout(function () {\n window.location.reload();\n }, 700);\n });\n}\n\nfunction deleteFile(event) {\n var file_id = (0, _jquery.default)(this).attr(\"file-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Files\",\n body: \"Are you sure you want to delete this file?\",\n success: function success() {\n _CTFd.default.fetch(\"/api/v1/files/\" + file_id, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/files.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addFile = addFile;\nexports.deleteFile = deleteFile;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _helpers = _interopRequireDefault(__webpack_require__(/*! core/helpers */ \"./CTFd/themes/core/assets/js/helpers.js\"));\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction addFile(event) {\n event.preventDefault();\n var form = event.target;\n var data = {\n challenge: window.CHALLENGE_ID,\n type: \"challenge\"\n };\n\n _helpers.default.files.upload(form, data, function (_response) {\n setTimeout(function () {\n window.location.reload();\n }, 700);\n });\n}\n\nfunction deleteFile(_event) {\n var file_id = (0, _jquery.default)(this).attr(\"file-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Files\",\n body: \"Are you sure you want to delete this file?\",\n success: function success() {\n _CTFd.default.fetch(\"/api/v1/files/\" + file_id, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/files.js?"); /***/ }), @@ -174,7 +174,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.deleteFlag = deleteFlag;\nexports.addFlagModal = addFlagModal;\nexports.editFlagModal = editFlagModal;\nexports.flagTypeSelect = flagTypeSelect;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _nunjucks = _interopRequireDefault(__webpack_require__(/*! nunjucks */ \"./node_modules/nunjucks/browser/nunjucks.js\"));\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction deleteFlag(event) {\n event.preventDefault();\n var flag_id = (0, _jquery.default)(this).attr(\"flag-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Flag\",\n body: \"Are you sure you want to delete this flag?\",\n success: function success() {\n _CTFd.default.fetch(\"/api/v1/flags/\" + flag_id, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n}\n\nfunction addFlagModal(event) {\n _jquery.default.get(_CTFd.default.config.urlRoot + \"/api/v1/flags/types\", function (response) {\n var data = response.data;\n var flag_type_select = (0, _jquery.default)(\"#flags-create-select\");\n flag_type_select.empty();\n var option = (0, _jquery.default)(\"\");\n flag_type_select.append(option);\n\n for (var key in data) {\n if (data.hasOwnProperty(key)) {\n option = (0, _jquery.default)(\"\".format(key, data[key].name));\n flag_type_select.append(option);\n }\n }\n\n (0, _jquery.default)(\"#flag-edit-modal\").modal();\n });\n\n (0, _jquery.default)(\"#flag-edit-modal form\").submit(function (event) {\n event.preventDefault();\n var params = (0, _jquery.default)(this).serializeJSON(true);\n params[\"challenge\"] = CHALLENGE_ID;\n\n _CTFd.default.fetch(\"/api/v1/flags\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n window.location.reload();\n });\n });\n (0, _jquery.default)(\"#flag-edit-modal\").modal();\n}\n\nfunction editFlagModal(event) {\n event.preventDefault();\n var flag_id = (0, _jquery.default)(this).attr(\"flag-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n\n _jquery.default.get(_CTFd.default.config.urlRoot + \"/api/v1/flags/\" + flag_id, function (response) {\n var data = response.data;\n\n _jquery.default.get(_CTFd.default.config.urlRoot + data.templates.update, function (template_data) {\n (0, _jquery.default)(\"#edit-flags form\").empty();\n (0, _jquery.default)(\"#edit-flags form\").off();\n\n var template = _nunjucks.default.compile(template_data);\n\n (0, _jquery.default)(\"#edit-flags form\").append(template.render(data));\n (0, _jquery.default)(\"#edit-flags form\").submit(function (event) {\n event.preventDefault();\n var params = (0, _jquery.default)(\"#edit-flags form\").serializeJSON();\n\n _CTFd.default.fetch(\"/api/v1/flags/\" + flag_id, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery.default)(row).find(\".flag-content\").text(response.data.content);\n (0, _jquery.default)(\"#edit-flags\").modal(\"toggle\");\n }\n });\n });\n (0, _jquery.default)(\"#edit-flags\").modal();\n });\n });\n}\n\nfunction flagTypeSelect(event) {\n event.preventDefault();\n var flag_type_name = (0, _jquery.default)(this).find(\"option:selected\").text();\n\n _jquery.default.get(_CTFd.default.config.urlRoot + \"/api/v1/flags/types/\" + flag_type_name, function (response) {\n var data = response.data;\n\n _jquery.default.get(_CTFd.default.config.urlRoot + data.templates.create, function (template_data) {\n var template = _nunjucks.default.compile(template_data);\n\n (0, _jquery.default)(\"#create-keys-entry-div\").html(template.render());\n (0, _jquery.default)(\"#create-keys-button-div\").show();\n });\n });\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/flags.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.deleteFlag = deleteFlag;\nexports.addFlagModal = addFlagModal;\nexports.editFlagModal = editFlagModal;\nexports.flagTypeSelect = flagTypeSelect;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _nunjucks = _interopRequireDefault(__webpack_require__(/*! nunjucks */ \"./node_modules/nunjucks/browser/nunjucks.js\"));\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction deleteFlag(event) {\n event.preventDefault();\n var flag_id = (0, _jquery.default)(this).attr(\"flag-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Flag\",\n body: \"Are you sure you want to delete this flag?\",\n success: function success() {\n _CTFd.default.fetch(\"/api/v1/flags/\" + flag_id, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n}\n\nfunction addFlagModal(_event) {\n _jquery.default.get(_CTFd.default.config.urlRoot + \"/api/v1/flags/types\", function (response) {\n var data = response.data;\n var flag_type_select = (0, _jquery.default)(\"#flags-create-select\");\n flag_type_select.empty();\n var option = (0, _jquery.default)(\"\");\n flag_type_select.append(option);\n\n for (var key in data) {\n if (data.hasOwnProperty(key)) {\n option = (0, _jquery.default)(\"\".format(key, data[key].name));\n flag_type_select.append(option);\n }\n }\n\n (0, _jquery.default)(\"#flag-edit-modal\").modal();\n });\n\n (0, _jquery.default)(\"#flag-edit-modal form\").submit(function (event) {\n event.preventDefault();\n var params = (0, _jquery.default)(this).serializeJSON(true);\n params[\"challenge\"] = window.CHALLENGE_ID;\n\n _CTFd.default.fetch(\"/api/v1/flags\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (_response) {\n window.location.reload();\n });\n });\n (0, _jquery.default)(\"#flag-edit-modal\").modal();\n}\n\nfunction editFlagModal(event) {\n event.preventDefault();\n var flag_id = (0, _jquery.default)(this).attr(\"flag-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n\n _jquery.default.get(_CTFd.default.config.urlRoot + \"/api/v1/flags/\" + flag_id, function (response) {\n var data = response.data;\n\n _jquery.default.get(_CTFd.default.config.urlRoot + data.templates.update, function (template_data) {\n (0, _jquery.default)(\"#edit-flags form\").empty();\n (0, _jquery.default)(\"#edit-flags form\").off();\n\n var template = _nunjucks.default.compile(template_data);\n\n (0, _jquery.default)(\"#edit-flags form\").append(template.render(data));\n (0, _jquery.default)(\"#edit-flags form\").submit(function (event) {\n event.preventDefault();\n var params = (0, _jquery.default)(\"#edit-flags form\").serializeJSON();\n\n _CTFd.default.fetch(\"/api/v1/flags/\" + flag_id, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery.default)(row).find(\".flag-content\").text(response.data.content);\n (0, _jquery.default)(\"#edit-flags\").modal(\"toggle\");\n }\n });\n });\n (0, _jquery.default)(\"#edit-flags\").modal();\n });\n });\n}\n\nfunction flagTypeSelect(event) {\n event.preventDefault();\n var flag_type_name = (0, _jquery.default)(this).find(\"option:selected\").text();\n\n _jquery.default.get(_CTFd.default.config.urlRoot + \"/api/v1/flags/types/\" + flag_type_name, function (response) {\n var data = response.data;\n\n _jquery.default.get(_CTFd.default.config.urlRoot + data.templates.create, function (template_data) {\n var template = _nunjucks.default.compile(template_data);\n\n (0, _jquery.default)(\"#create-keys-entry-div\").html(template.render());\n (0, _jquery.default)(\"#create-keys-button-div\").show();\n });\n });\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/flags.js?"); /***/ }), @@ -186,7 +186,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.showHintModal = showHintModal;\nexports.showEditHintModal = showEditHintModal;\nexports.deleteHint = deleteHint;\nexports.editHint = editHint;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction hint(id) {\n return _CTFd.default.fetch(\"/api/v1/hints/\" + id + \"?preview=true\", {\n method: \"GET\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n });\n}\n\nfunction loadhint(hintid) {\n var md = _CTFd.default.lib.markdown();\n\n hint(hintid).then(function (response) {\n if (response.data.content) {\n (0, _ezq.ezAlert)({\n title: \"Hint\",\n body: md.render(response.data.content),\n button: \"Got it!\"\n });\n } else {\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: \"Error loading hint!\",\n button: \"OK\"\n });\n }\n });\n}\n\nfunction showHintModal(event) {\n event.preventDefault();\n (0, _jquery.default)(\"#hint-edit-modal form\").find(\"input, textarea\").val(\"\"); // Markdown Preview\n\n (0, _jquery.default)(\"#new-hint-edit\").on(\"shown.bs.tab\", function (event) {\n if (event.target.hash == \"#hint-preview\") {\n var renderer = _CTFd.default.lib.markdown();\n\n var editor_value = (0, _jquery.default)(\"#hint-write textarea\").val();\n (0, _jquery.default)(event.target.hash).html(renderer.render(editor_value));\n }\n });\n (0, _jquery.default)(\"#hint-edit-modal\").modal();\n}\n\nfunction showEditHintModal(event) {\n event.preventDefault();\n var hint_id = (0, _jquery.default)(this).attr(\"hint-id\");\n\n _CTFd.default.fetch(\"/api/v1/hints/\" + hint_id + \"?preview=true\", {\n method: \"GET\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery.default)(\"#hint-edit-form input[name=content],textarea[name=content]\").val(response.data.content);\n (0, _jquery.default)(\"#hint-edit-form input[name=cost]\").val(response.data.cost);\n (0, _jquery.default)(\"#hint-edit-form input[name=id]\").val(response.data.id); // Markdown Preview\n\n (0, _jquery.default)(\"#new-hint-edit\").on(\"shown.bs.tab\", function (event) {\n if (event.target.hash == \"#hint-preview\") {\n var renderer = _CTFd.default.lib.markdown();\n\n var editor_value = (0, _jquery.default)(\"#hint-write textarea\").val();\n (0, _jquery.default)(event.target.hash).html(renderer.render(editor_value));\n }\n });\n (0, _jquery.default)(\"#hint-edit-modal\").modal();\n }\n });\n}\n\nfunction deleteHint(event) {\n event.preventDefault();\n var hint_id = (0, _jquery.default)(this).attr(\"hint-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Hint\",\n body: \"Are you sure you want to delete this hint?\",\n success: function success() {\n _CTFd.default.fetch(\"/api/v1/hints/\" + hint_id, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n row.remove();\n }\n });\n }\n });\n}\n\nfunction editHint(event) {\n event.preventDefault();\n var params = (0, _jquery.default)(this).serializeJSON(true);\n params[\"challenge\"] = CHALLENGE_ID;\n var method = \"POST\";\n var url = \"/api/v1/hints\";\n\n if (params.id) {\n method = \"PATCH\";\n url = \"/api/v1/hints/\" + params.id;\n }\n\n _CTFd.default.fetch(url, {\n method: method,\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n // TODO: Refresh hints on submit.\n window.location.reload();\n }\n });\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/hints.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.showHintModal = showHintModal;\nexports.showEditHintModal = showEditHintModal;\nexports.deleteHint = deleteHint;\nexports.editHint = editHint;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction showHintModal(event) {\n event.preventDefault();\n (0, _jquery.default)(\"#hint-edit-modal form\").find(\"input, textarea\").val(\"\"); // Markdown Preview\n\n (0, _jquery.default)(\"#new-hint-edit\").on(\"shown.bs.tab\", function (event) {\n if (event.target.hash == \"#hint-preview\") {\n var renderer = _CTFd.default.lib.markdown();\n\n var editor_value = (0, _jquery.default)(\"#hint-write textarea\").val();\n (0, _jquery.default)(event.target.hash).html(renderer.render(editor_value));\n }\n });\n (0, _jquery.default)(\"#hint-edit-modal\").modal();\n}\n\nfunction showEditHintModal(event) {\n event.preventDefault();\n var hint_id = (0, _jquery.default)(this).attr(\"hint-id\");\n\n _CTFd.default.fetch(\"/api/v1/hints/\" + hint_id + \"?preview=true\", {\n method: \"GET\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery.default)(\"#hint-edit-form input[name=content],textarea[name=content]\").val(response.data.content);\n (0, _jquery.default)(\"#hint-edit-form input[name=cost]\").val(response.data.cost);\n (0, _jquery.default)(\"#hint-edit-form input[name=id]\").val(response.data.id); // Markdown Preview\n\n (0, _jquery.default)(\"#new-hint-edit\").on(\"shown.bs.tab\", function (event) {\n if (event.target.hash == \"#hint-preview\") {\n var renderer = _CTFd.default.lib.markdown();\n\n var editor_value = (0, _jquery.default)(\"#hint-write textarea\").val();\n (0, _jquery.default)(event.target.hash).html(renderer.render(editor_value));\n }\n });\n (0, _jquery.default)(\"#hint-edit-modal\").modal();\n }\n });\n}\n\nfunction deleteHint(event) {\n event.preventDefault();\n var hint_id = (0, _jquery.default)(this).attr(\"hint-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Hint\",\n body: \"Are you sure you want to delete this hint?\",\n success: function success() {\n _CTFd.default.fetch(\"/api/v1/hints/\" + hint_id, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n row.remove();\n }\n });\n }\n });\n}\n\nfunction editHint(event) {\n event.preventDefault();\n var params = (0, _jquery.default)(this).serializeJSON(true);\n params[\"challenge\"] = window.CHALLENGE_ID;\n var method = \"POST\";\n var url = \"/api/v1/hints\";\n\n if (params.id) {\n method = \"PATCH\";\n url = \"/api/v1/hints/\" + params.id;\n }\n\n _CTFd.default.fetch(url, {\n method: method,\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n // TODO: Refresh hints on submit.\n window.location.reload();\n }\n });\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/hints.js?"); /***/ }), @@ -198,7 +198,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addRequirement = addRequirement;\nexports.deleteRequirement = deleteRequirement;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction addRequirement(event) {\n event.preventDefault();\n var requirements = (0, _jquery.default)(\"#prerequisite-add-form\").serializeJSON(); // Shortcut if there's no prerequisite\n\n if (!requirements[\"prerequisite\"]) {\n return;\n }\n\n CHALLENGE_REQUIREMENTS.prerequisites.push(parseInt(requirements[\"prerequisite\"]));\n var params = {\n requirements: CHALLENGE_REQUIREMENTS\n };\n\n _CTFd.default.fetch(\"/api/v1/challenges/\" + CHALLENGE_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n // TODO: Make this refresh requirements\n window.location.reload();\n }\n });\n}\n\nfunction deleteRequirement(event) {\n var challenge_id = (0, _jquery.default)(this).attr(\"challenge-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n CHALLENGE_REQUIREMENTS.prerequisites.pop(challenge_id);\n var params = {\n requirements: CHALLENGE_REQUIREMENTS\n };\n\n _CTFd.default.fetch(\"/api/v1/challenges/\" + CHALLENGE_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n row.remove();\n }\n });\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/requirements.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addRequirement = addRequirement;\nexports.deleteRequirement = deleteRequirement;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction addRequirement(event) {\n event.preventDefault();\n var requirements = (0, _jquery.default)(\"#prerequisite-add-form\").serializeJSON(); // Shortcut if there's no prerequisite\n\n if (!requirements[\"prerequisite\"]) {\n return;\n }\n\n window.CHALLENGE_REQUIREMENTS.prerequisites.push(parseInt(requirements[\"prerequisite\"]));\n var params = {\n requirements: window.CHALLENGE_REQUIREMENTS\n };\n\n _CTFd.default.fetch(\"/api/v1/challenges/\" + window.CHALLENGE_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n // TODO: Make this refresh requirements\n window.location.reload();\n }\n });\n}\n\nfunction deleteRequirement(_event) {\n var challenge_id = (0, _jquery.default)(this).attr(\"challenge-id\");\n var row = (0, _jquery.default)(this).parent().parent();\n window.CHALLENGE_REQUIREMENTS.prerequisites.pop(challenge_id);\n var params = {\n requirements: window.CHALLENGE_REQUIREMENTS\n };\n\n _CTFd.default.fetch(\"/api/v1/challenges/\" + window.CHALLENGE_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n row.remove();\n }\n });\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/requirements.js?"); /***/ }), @@ -210,7 +210,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.deleteTag = deleteTag;\nexports.addTag = addTag;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction deleteTag(event) {\n var $elem = (0, _jquery.default)(this);\n var tag_id = $elem.attr(\"tag-id\");\n\n _CTFd.default.api.delete_tag({\n tagId: tag_id\n }).then(function (response) {\n if (response.success) {\n $elem.parent().remove();\n }\n });\n}\n\nfunction addTag(event) {\n if (event.keyCode != 13) {\n return;\n }\n\n var $elem = (0, _jquery.default)(this);\n var tag = $elem.val();\n var params = {\n value: tag,\n challenge: CHALLENGE_ID\n };\n\n _CTFd.default.api.post_tag_list({}, params).then(function (response) {\n if (response.success) {\n var tpl = \"\" + \"{0}\" + \"×\";\n\n var _tag = (0, _jquery.default)(tpl.format(response.data.value, response.data.id));\n\n (0, _jquery.default)(\"#challenge-tags\").append(_tag); // TODO: tag deletion not working on freshly created tags\n\n _tag.click(deleteTag);\n }\n });\n\n $elem.val(\"\");\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/tags.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.deleteTag = deleteTag;\nexports.addTag = addTag;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction deleteTag(_event) {\n var $elem = (0, _jquery.default)(this);\n var tag_id = $elem.attr(\"tag-id\");\n\n _CTFd.default.api.delete_tag({\n tagId: tag_id\n }).then(function (response) {\n if (response.success) {\n $elem.parent().remove();\n }\n });\n}\n\nfunction addTag(event) {\n if (event.keyCode != 13) {\n return;\n }\n\n var $elem = (0, _jquery.default)(this);\n var tag = $elem.val();\n var params = {\n value: tag,\n challenge: window.CHALLENGE_ID\n };\n\n _CTFd.default.api.post_tag_list({}, params).then(function (response) {\n if (response.success) {\n var tpl = \"\" + \"{0}\" + \"×\";\n\n var _tag = (0, _jquery.default)(tpl.format(response.data.value, response.data.id));\n\n (0, _jquery.default)(\"#challenge-tags\").append(_tag); // TODO: tag deletion not working on freshly created tags\n\n _tag.click(deleteTag);\n }\n });\n\n $elem.val(\"\");\n}\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/challenges/tags.js?"); /***/ }), @@ -222,7 +222,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/admin/assets/js/pages/main.js\");\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\n__webpack_require__(/*! bootstrap/js/dist/tab */ \"./node_modules/bootstrap/js/dist/tab.js\");\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _nunjucks = _interopRequireDefault(__webpack_require__(/*! nunjucks */ \"./node_modules/nunjucks/browser/nunjucks.js\"));\n\nvar _helpers = _interopRequireDefault(__webpack_require__(/*! core/helpers */ \"./CTFd/themes/core/assets/js/helpers.js\"));\n\nvar _files = __webpack_require__(/*! ../challenges/files */ \"./CTFd/themes/admin/assets/js/challenges/files.js\");\n\nvar _tags = __webpack_require__(/*! ../challenges/tags */ \"./CTFd/themes/admin/assets/js/challenges/tags.js\");\n\nvar _requirements = __webpack_require__(/*! ../challenges/requirements */ \"./CTFd/themes/admin/assets/js/challenges/requirements.js\");\n\nvar _hints = __webpack_require__(/*! ../challenges/hints */ \"./CTFd/themes/admin/assets/js/challenges/hints.js\");\n\nvar _flags = __webpack_require__(/*! ../challenges/flags */ \"./CTFd/themes/admin/assets/js/challenges/flags.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar md = _CTFd.default.lib.markdown();\n\nvar displayHint = function displayHint(data) {\n (0, _ezq.ezAlert)({\n title: \"Hint\",\n body: md.render(data.content),\n button: \"Got it!\"\n });\n};\n\nvar loadHint = function loadHint(id) {\n _CTFd.default.api.get_hint({\n hintId: id,\n preview: true\n }).then(function (response) {\n if (response.data.content) {\n displayHint(response.data);\n return;\n }\n\n displayUnlock(id);\n });\n};\n\nfunction renderSubmissionResponse(response, cb) {\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)(\"#submission-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 (0, _jquery.default)(\".challenge-solves\").text(parseInt((0, _jquery.default)(\".challenge-solves\").text().split(\" \")[0]) + 1 + \" Solves\");\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)(\"#submit-key\").removeClass(\"disabled-button\");\n (0, _jquery.default)(\"#submit-key\").prop(\"disabled\", false);\n }, 3000);\n\n if (cb) {\n cb(result);\n }\n}\n\nfunction loadChalTemplate(challenge) {\n _CTFd.default._internal.challenge = {};\n\n _jquery.default.getScript(_CTFd.default.config.urlRoot + challenge.scripts.view, function () {\n var template_data = challenge.create;\n (0, _jquery.default)(\"#create-chal-entry-div\").html(template_data);\n\n _jquery.default.getScript(_CTFd.default.config.urlRoot + challenge.scripts.create, function () {\n (0, _jquery.default)(\"#create-chal-entry-div form\").submit(function (event) {\n event.preventDefault();\n var params = (0, _jquery.default)(\"#create-chal-entry-div form\").serializeJSON();\n\n _CTFd.default.fetch(\"/api/v1/challenges\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery.default)(\"#challenge-create-options #challenge_id\").val(response.data.id);\n (0, _jquery.default)(\"#challenge-create-options\").modal();\n }\n });\n });\n });\n });\n}\n\nfunction handleChallengeOptions(event) {\n event.preventDefault();\n var params = (0, _jquery.default)(event.target).serializeJSON(true);\n var flag_params = {\n challenge_id: params.challenge_id,\n content: params.flag || \"\",\n type: params.flag_type,\n data: params.flag_data ? params.flag_data : \"\"\n }; // Define a save_challenge function\n\n var save_challenge = function save_challenge() {\n _CTFd.default.fetch(\"/api/v1/challenges/\" + params.challenge_id, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n state: params.state\n })\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n if (data.success) {\n setTimeout(function () {\n window.location = _CTFd.default.config.urlRoot + \"/admin/challenges/\" + params.challenge_id;\n }, 700);\n }\n });\n };\n\n Promise.all([// Save flag\n new Promise(function (resolve, reject) {\n if (flag_params.content.length == 0) {\n resolve();\n return;\n }\n\n _CTFd.default.fetch(\"/api/v1/flags\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(flag_params)\n }).then(function (response) {\n resolve(response.json());\n });\n }), // Upload files\n new Promise(function (resolve, reject) {\n var form = event.target;\n var data = {\n challenge: params.challenge_id,\n type: \"challenge\"\n };\n var filepath = (0, _jquery.default)(form.elements[\"file\"]).val();\n\n if (filepath) {\n _helpers.default.files.upload(form, data);\n }\n\n resolve();\n })]).then(function (responses) {\n save_challenge();\n });\n}\n\nfunction createChallenge(event) {\n var challenge = (0, _jquery.default)(this).find(\"option:selected\").data(\"meta\");\n\n if (challenge === undefined) {\n (0, _jquery.default)(\"#create-chal-entry-div\").empty();\n return;\n }\n\n loadChalTemplate(challenge);\n}\n\n(0, _jquery.default)(function () {\n (0, _jquery.default)(\".preview-challenge\").click(function (e) {\n window.challenge = new Object();\n _CTFd.default._internal.challenge = {};\n\n _jquery.default.get(_CTFd.default.config.urlRoot + \"/api/v1/challenges/\" + CHALLENGE_ID, function (response) {\n var challenge = _CTFd.default._internal.challenge;\n var challenge_data = response.data;\n challenge_data[\"solves\"] = null;\n\n _jquery.default.getScript(_CTFd.default.config.urlRoot + challenge_data.type_data.scripts.view, function () {\n (0, _jquery.default)(\"#challenge-window\").empty();\n (0, _jquery.default)(\"#challenge-window\").append(challenge_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 (0, _jquery.default)(\".challenge-solves\").hide();\n (0, _jquery.default)(\".nav-tabs a\").click(function (e) {\n e.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 (e) {\n e.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(true).then(renderSubmissionResponse); // Preview passed as true\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 challenge.postRender();\n window.location.replace(window.location.href.split(\"#\")[0] + \"#preview\");\n (0, _jquery.default)(\"#challenge-window\").modal();\n });\n });\n });\n (0, _jquery.default)(\".delete-challenge\").click(function (e) {\n (0, _ezq.ezQuery)({\n title: \"Delete Challenge\",\n body: \"Are you sure you want to delete {0}\".format(\"\" + (0, _utils.htmlEntities)(CHALLENGE_NAME) + \"\"),\n success: function success() {\n _CTFd.default.fetch(\"/api/v1/challenges/\" + CHALLENGE_ID, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location = _CTFd.default.config.urlRoot + \"/admin/challenges\";\n }\n });\n }\n });\n });\n (0, _jquery.default)(\"#challenge-update-container > form\").submit(function (e) {\n e.preventDefault();\n var params = (0, _jquery.default)(e.target).serializeJSON(true);\n\n _CTFd.default.fetch(\"/api/v1/challenges/\" + CHALLENGE_ID + \"/flags\", {\n method: \"GET\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n var update_challenge = function update_challenge() {\n _CTFd.default.fetch(\"/api/v1/challenges/\" + CHALLENGE_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery.default)(\".challenge-state\").text(response.data.state);\n\n switch (response.data.state) {\n case \"visible\":\n (0, _jquery.default)(\".challenge-state\").removeClass(\"badge-danger\").addClass(\"badge-success\");\n break;\n\n case \"hidden\":\n (0, _jquery.default)(\".challenge-state\").removeClass(\"badge-success\").addClass(\"badge-danger\");\n break;\n\n default:\n break;\n }\n\n (0, _ezq.ezToast)({\n title: \"Success\",\n body: \"Your challenge has been updated!\"\n });\n }\n });\n }; // Check if the challenge doesn't have any flags before marking visible\n\n\n if (response.data.length === 0 && params.state === \"visible\") {\n (0, _ezq.ezQuery)({\n title: \"Missing Flags\",\n body: \"This challenge does not have any flags meaning it is unsolveable. Are you sure you'd like to update this challenge?\",\n success: update_challenge\n });\n } else {\n update_challenge();\n }\n });\n });\n (0, _jquery.default)(\"#challenge-create-options form\").submit(handleChallengeOptions);\n (0, _jquery.default)(\"#tags-add-input\").keyup(_tags.addTag);\n (0, _jquery.default)(\".delete-tag\").click(_tags.deleteTag);\n (0, _jquery.default)(\"#prerequisite-add-form\").submit(_requirements.addRequirement);\n (0, _jquery.default)(\".delete-requirement\").click(_requirements.deleteRequirement);\n (0, _jquery.default)(\"#file-add-form\").submit(_files.addFile);\n (0, _jquery.default)(\".delete-file\").click(_files.deleteFile);\n (0, _jquery.default)(\"#hint-add-button\").click(_hints.showHintModal);\n (0, _jquery.default)(\".delete-hint\").click(_hints.deleteHint);\n (0, _jquery.default)(\".edit-hint\").click(_hints.showEditHintModal);\n (0, _jquery.default)(\"#hint-edit-form\").submit(_hints.editHint);\n (0, _jquery.default)(\"#flag-add-button\").click(_flags.addFlagModal);\n (0, _jquery.default)(\".delete-flag\").click(_flags.deleteFlag);\n (0, _jquery.default)(\"#flags-create-select\").change(_flags.flagTypeSelect);\n (0, _jquery.default)(\".edit-flag\").click(_flags.editFlagModal);\n\n _jquery.default.get(_CTFd.default.config.urlRoot + \"/api/v1/challenges/types\", function (response) {\n (0, _jquery.default)(\"#create-chals-select\").empty();\n var data = response.data;\n var chal_type_amt = Object.keys(data).length;\n\n if (chal_type_amt > 1) {\n var option = \"\";\n (0, _jquery.default)(\"#create-chals-select\").append(option);\n\n for (var key in data) {\n var challenge = data[key];\n\n var _option = (0, _jquery.default)(\"\";\n (0, _jquery.default)(\"#create-chals-select\").append(option);\n\n for (var key in data) {\n var challenge = data[key];\n\n var _option = (0, _jquery.default)(\"");for(var a in o.append(n),t)t.hasOwnProperty(a)&&(n=(0,s.default)("".format(a,t[a].name)),o.append(n));(0,s.default)("#flag-edit-modal").modal()}),(0,s.default)("#flag-edit-modal form").submit(function(e){e.preventDefault();var t=(0,s.default)(this).serializeJSON(!0);t.challenge=CHALLENGE_ID,i.default.fetch("/api/v1/flags",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){window.location.reload()})}),(0,s.default)("#flag-edit-modal").modal()},t.editFlagModal=function(e){e.preventDefault();var n=(0,s.default)(this).attr("flag-id"),a=(0,s.default)(this).parent().parent();s.default.get(i.default.config.urlRoot+"/api/v1/flags/"+n,function(e){var o=e.data;s.default.get(i.default.config.urlRoot+o.templates.update,function(e){(0,s.default)("#edit-flags form").empty(),(0,s.default)("#edit-flags form").off();var t=l.default.compile(e);(0,s.default)("#edit-flags form").append(t.render(o)),(0,s.default)("#edit-flags form").submit(function(e){e.preventDefault();var t=(0,s.default)("#edit-flags form").serializeJSON();i.default.fetch("/api/v1/flags/"+n,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){e.success&&((0,s.default)(a).find(".flag-content").text(e.data.content),(0,s.default)("#edit-flags").modal("toggle"))})}),(0,s.default)("#edit-flags").modal()})})},t.flagTypeSelect=function(e){e.preventDefault();var t=(0,s.default)(this).find("option:selected").text();s.default.get(i.default.config.urlRoot+"/api/v1/flags/types/"+t,function(e){var t=e.data;s.default.get(i.default.config.urlRoot+t.templates.create,function(e){var t=l.default.compile(e);(0,s.default)("#create-keys-entry-div").html(t.render()),(0,s.default)("#create-keys-button-div").show()})})};var s=a(o("./node_modules/jquery/dist/jquery.js")),i=a(o("./CTFd/themes/core/assets/js/CTFd.js")),l=a(o("./node_modules/nunjucks/browser/nunjucks.js")),n=o("./CTFd/themes/core/assets/js/ezq.js");function a(e){return e&&e.__esModule?e:{default:e}}},"./CTFd/themes/admin/assets/js/challenges/hints.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showHintModal=function(e){e.preventDefault(),(0,a.default)("#hint-edit-modal form").find("input, textarea").val(""),(0,a.default)("#new-hint-edit").on("shown.bs.tab",function(e){if("#hint-preview"==e.target.hash){var t=s.default.lib.markdown(),o=(0,a.default)("#hint-write textarea").val();(0,a.default)(e.target.hash).html(t.render(o))}}),(0,a.default)("#hint-edit-modal").modal()},t.showEditHintModal=function(e){e.preventDefault();var t=(0,a.default)(this).attr("hint-id");s.default.fetch("/api/v1/hints/"+t+"?preview=true",{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){e.success&&((0,a.default)("#hint-edit-form input[name=content],textarea[name=content]").val(e.data.content),(0,a.default)("#hint-edit-form input[name=cost]").val(e.data.cost),(0,a.default)("#hint-edit-form input[name=id]").val(e.data.id),(0,a.default)("#new-hint-edit").on("shown.bs.tab",function(e){if("#hint-preview"==e.target.hash){var t=s.default.lib.markdown(),o=(0,a.default)("#hint-write textarea").val();(0,a.default)(e.target.hash).html(t.render(o))}}),(0,a.default)("#hint-edit-modal").modal())})},t.deleteHint=function(e){e.preventDefault();var t=(0,a.default)(this).attr("hint-id"),o=(0,a.default)(this).parent().parent();(0,n.ezQuery)({title:"Delete Hint",body:"Are you sure you want to delete this hint?",success:function(){s.default.fetch("/api/v1/hints/"+t,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&o.remove()})}})},t.editHint=function(e){e.preventDefault();var t=(0,a.default)(this).serializeJSON(!0);t.challenge=CHALLENGE_ID;var o="POST",n="/api/v1/hints";t.id&&(o="PATCH",n="/api/v1/hints/"+t.id);s.default.fetch(n,{method:o,credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){e.success&&window.location.reload()})};var a=i(o("./node_modules/jquery/dist/jquery.js")),s=i(o("./CTFd/themes/core/assets/js/CTFd.js")),n=o("./CTFd/themes/core/assets/js/ezq.js");function i(e){return e&&e.__esModule?e:{default:e}}},"./CTFd/themes/admin/assets/js/challenges/requirements.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.addRequirement=function(e){e.preventDefault();var t=(0,a.default)("#prerequisite-add-form").serializeJSON();if(!t.prerequisite)return;CHALLENGE_REQUIREMENTS.prerequisites.push(parseInt(t.prerequisite));var o={requirements:CHALLENGE_REQUIREMENTS};s.default.fetch("/api/v1/challenges/"+CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(o)}).then(function(e){return e.json()}).then(function(e){e.success&&window.location.reload()})},t.deleteRequirement=function(e){var t=(0,a.default)(this).attr("challenge-id"),o=(0,a.default)(this).parent().parent();CHALLENGE_REQUIREMENTS.prerequisites.pop(t);var n={requirements:CHALLENGE_REQUIREMENTS};s.default.fetch("/api/v1/challenges/"+CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(n)}).then(function(e){return e.json()}).then(function(e){e.success&&o.remove()})};var a=n(o("./node_modules/jquery/dist/jquery.js")),s=n(o("./CTFd/themes/core/assets/js/CTFd.js"));function n(e){return e&&e.__esModule?e:{default:e}}},"./CTFd/themes/admin/assets/js/challenges/tags.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.deleteTag=i,t.addTag=function(e){if(13!=e.keyCode)return;var t=(0,n.default)(this),o={value:t.val(),challenge:CHALLENGE_ID};a.default.api.post_tag_list({},o).then(function(e){if(e.success){var t=(0,n.default)("{0}×".format(e.data.value,e.data.id));(0,n.default)("#challenge-tags").append(t),t.click(i)}}),t.val("")};var n=s(o("./node_modules/jquery/dist/jquery.js")),a=s(o("./CTFd/themes/core/assets/js/CTFd.js"));function s(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=(0,n.default)(this),o=t.attr("tag-id");a.default.api.delete_tag({tagId:o}).then(function(e){e.success&&t.parent().remove()})}},"./CTFd/themes/admin/assets/js/pages/challenge.js":function(e,t,o){o("./CTFd/themes/admin/assets/js/pages/main.js");var n=o("./CTFd/themes/core/assets/js/utils.js"),l=p(o("./node_modules/jquery/dist/jquery.js"));o("./node_modules/bootstrap/js/dist/tab.js");var i=p(o("./CTFd/themes/core/assets/js/CTFd.js")),a=o("./CTFd/themes/core/assets/js/ezq.js"),d=(p(o("./node_modules/nunjucks/browser/nunjucks.js")),p(o("./CTFd/themes/core/assets/js/helpers.js"))),s=o("./CTFd/themes/admin/assets/js/challenges/files.js"),r=o("./CTFd/themes/admin/assets/js/challenges/tags.js"),c=o("./CTFd/themes/admin/assets/js/challenges/requirements.js"),u=o("./CTFd/themes/admin/assets/js/challenges/hints.js"),m=o("./CTFd/themes/admin/assets/js/challenges/flags.js");function p(e){return e&&e.__esModule?e:{default:e}}function f(t){i.default.api.get_hint({hintId:t,preview:!0}).then(function(e){e.data.content?function(e){(0,a.ezAlert)({title:"Hint",body:h.render(e.content),button:"Got it!"})}(e.data):displayUnlock(t)})}var h=i.default.lib.markdown();function j(e,t){var o=e.data,n=(0,l.default)("#result-message"),a=(0,l.default)("#result-notification"),s=(0,l.default)("#submission-input");a.removeClass(),n.text(o.message),"authentication_required"!==o.status?("incorrect"===o.status?(a.addClass("alert alert-danger alert-dismissable text-center"),a.slideDown(),s.removeClass("correct"),s.addClass("wrong"),setTimeout(function(){s.removeClass("wrong")},3e3)):"correct"===o.status?(a.addClass("alert alert-success alert-dismissable text-center"),a.slideDown(),(0,l.default)(".challenge-solves").text(parseInt((0,l.default)(".challenge-solves").text().split(" ")[0])+1+" Solves"),s.val(""),s.removeClass("wrong"),s.addClass("correct")):"already_solved"===o.status?(a.addClass("alert alert-info alert-dismissable text-center"),a.slideDown(),s.addClass("correct")):"paused"===o.status?(a.addClass("alert alert-warning alert-dismissable text-center"),a.slideDown()):"ratelimited"===o.status&&(a.addClass("alert alert-warning alert-dismissable text-center"),a.slideDown(),s.addClass("too-fast"),setTimeout(function(){s.removeClass("too-fast")},3e3)),setTimeout(function(){(0,l.default)(".alert").slideUp(),(0,l.default)("#submit-key").removeClass("disabled-button"),(0,l.default)("#submit-key").prop("disabled",!1)},3e3),t&&t(o)):window.location=i.default.config.urlRoot+"/login?next="+i.default.config.urlRoot+window.location.pathname+window.location.hash}function g(t){i.default._internal.challenge={},l.default.getScript(i.default.config.urlRoot+t.scripts.view,function(){var e=t.create;(0,l.default)("#create-chal-entry-div").html(e),l.default.getScript(i.default.config.urlRoot+t.scripts.create,function(){(0,l.default)("#create-chal-entry-div form").submit(function(e){e.preventDefault();var t=(0,l.default)("#create-chal-entry-div form").serializeJSON();i.default.fetch("/api/v1/challenges",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){e.success&&((0,l.default)("#challenge-create-options #challenge_id").val(e.data.id),(0,l.default)("#challenge-create-options").modal())})})})})}function _(a){a.preventDefault();var s=(0,l.default)(a.target).serializeJSON(!0),o={challenge_id:s.challenge_id,content:s.flag||"",type:s.flag_type,data:s.flag_data?s.flag_data:""};Promise.all([new Promise(function(t,e){0!=o.content.length?i.default.fetch("/api/v1/flags",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(o)}).then(function(e){t(e.json())}):t()}),new Promise(function(e,t){var o=a.target,n={challenge:s.challenge_id,type:"challenge"};(0,l.default)(o.elements.file).val()&&d.default.files.upload(o,n),e()})]).then(function(e){i.default.fetch("/api/v1/challenges/"+s.challenge_id,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({state:s.state})}).then(function(e){return e.json()}).then(function(e){e.success&&setTimeout(function(){window.location=i.default.config.urlRoot+"/admin/challenges/"+s.challenge_id},700)})})}function v(e){var t=(0,l.default)(this).find("option:selected").data("meta");void 0!==t?g(t):(0,l.default)("#create-chal-entry-div").empty()}(0,l.default)(function(){(0,l.default)(".preview-challenge").click(function(e){window.challenge=new Object,i.default._internal.challenge={},l.default.get(i.default.config.urlRoot+"/api/v1/challenges/"+CHALLENGE_ID,function(e){var t=i.default._internal.challenge,o=e.data;o.solves=null,l.default.getScript(i.default.config.urlRoot+o.type_data.scripts.view,function(){(0,l.default)("#challenge-window").empty(),(0,l.default)("#challenge-window").append(o.view),(0,l.default)("#challenge-window #challenge-input").addClass("form-control"),(0,l.default)("#challenge-window #challenge-submit").addClass("btn btn-md btn-outline-secondary float-right"),(0,l.default)(".challenge-solves").hide(),(0,l.default)(".nav-tabs a").click(function(e){e.preventDefault(),(0,l.default)(this).tab("show")}),(0,l.default)("#challenge-window").on("hide.bs.modal",function(e){(0,l.default)("#challenge-input").removeClass("wrong"),(0,l.default)("#challenge-input").removeClass("correct"),(0,l.default)("#incorrect-key").slideUp(),(0,l.default)("#correct-key").slideUp(),(0,l.default)("#already-solved").slideUp(),(0,l.default)("#too-fast").slideUp()}),(0,l.default)(".load-hint").on("click",function(e){f((0,l.default)(this).data("hint-id"))}),(0,l.default)("#challenge-submit").click(function(e){e.preventDefault(),(0,l.default)("#challenge-submit").addClass("disabled-button"),(0,l.default)("#challenge-submit").prop("disabled",!0),i.default._internal.challenge.submit(!0).then(j)}),(0,l.default)("#challenge-input").keyup(function(e){13==e.keyCode&&(0,l.default)("#challenge-submit").click()}),t.postRender(),window.location.replace(window.location.href.split("#")[0]+"#preview"),(0,l.default)("#challenge-window").modal()})})}),(0,l.default)(".delete-challenge").click(function(e){(0,a.ezQuery)({title:"Delete Challenge",body:"Are you sure you want to delete {0}".format(""+(0,n.htmlEntities)(CHALLENGE_NAME)+""),success:function(){i.default.fetch("/api/v1/challenges/"+CHALLENGE_ID,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&(window.location=i.default.config.urlRoot+"/admin/challenges")})}})}),(0,l.default)("#challenge-update-container > form").submit(function(e){e.preventDefault();var o=(0,l.default)(e.target).serializeJSON(!0);i.default.fetch("/api/v1/challenges/"+CHALLENGE_ID+"/flags",{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){function t(){i.default.fetch("/api/v1/challenges/"+CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(o)}).then(function(e){return e.json()}).then(function(e){if(e.success){switch((0,l.default)(".challenge-state").text(e.data.state),e.data.state){case"visible":(0,l.default)(".challenge-state").removeClass("badge-danger").addClass("badge-success");break;case"hidden":(0,l.default)(".challenge-state").removeClass("badge-success").addClass("badge-danger")}(0,a.ezToast)({title:"Success",body:"Your challenge has been updated!"})}})}0===e.data.length&&"visible"===o.state?(0,a.ezQuery)({title:"Missing Flags",body:"This challenge does not have any flags meaning it is unsolveable. Are you sure you'd like to update this challenge?",success:t}):t()})}),(0,l.default)("#challenge-create-options form").submit(_),(0,l.default)("#tags-add-input").keyup(r.addTag),(0,l.default)(".delete-tag").click(r.deleteTag),(0,l.default)("#prerequisite-add-form").submit(c.addRequirement),(0,l.default)(".delete-requirement").click(c.deleteRequirement),(0,l.default)("#file-add-form").submit(s.addFile),(0,l.default)(".delete-file").click(s.deleteFile),(0,l.default)("#hint-add-button").click(u.showHintModal),(0,l.default)(".delete-hint").click(u.deleteHint),(0,l.default)(".edit-hint").click(u.showEditHintModal),(0,l.default)("#hint-edit-form").submit(u.editHint),(0,l.default)("#flag-add-button").click(m.addFlagModal),(0,l.default)(".delete-flag").click(m.deleteFlag),(0,l.default)("#flags-create-select").change(m.flagTypeSelect),(0,l.default)(".edit-flag").click(m.editFlagModal),l.default.get(i.default.config.urlRoot+"/api/v1/challenges/types",function(e){(0,l.default)("#create-chals-select").empty();var t=e.data,o=Object.keys(t).length;if(1 -- "),t){var a=t[n],s=(0,l.default)("