async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)) } const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor function clone(x) { return JSON.parse(JSON.stringify(x)) } function acyclicStringify(obj) { let cache = [] let str = JSON.stringify(obj, function(key, value) { if (typeof value === "object" && value !== null) { if (cache.indexOf(value) !== -1) { return } cache.push(value) } return value }) cache = null return str } function setClipboard(object, isCut) { data.clipboard = clone(object) data.clipboardCut = isCut navigator.clipboard.writeText(JSON.stringify(data.clipboard, null, 2)) } function isBuffer (obj) { return obj != null && obj.constructor != null && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) } function isFunction(functionToCheck) { return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]'; } function parseJWT(token) { let base64Url = token.split('.')[1] let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/') let jsonPayload = decodeURIComponent( atob(base64) .split('') .map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2) }).join('')) return JSON.parse(jsonPayload) } function urlparam(name, url = window.location.href) { name = name.replace(/[\[\]]/g, '\\$&') var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'), results = regex.exec(url) if (!results) return null if (!results[2]) return '' return decodeURIComponent(results[2].replace(/\+/g, ' ')) }