Files

378 lines
147 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*!
* mybb-april-fools 1.1.2 (01.04.2024)
* https://forumd.ru/viewtopic.php?id=7372
* Система первоапрельских розыгрышей для форумов MyBB
* @author kozhilya
* @license https://forumd.ru/viewtopic.php?id=5751#rule
*/
/*
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./src/html/button.html":
/*!******************************!*\
!*** ./src/html/button.html ***!
\******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"<button class=\\\"april-fools__button\\\">🎉</button>\\n\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/button.html?");
/***/ }),
/***/ "./src/html/joke-fresh_glass.html":
/*!****************************************!*\
!*** ./src/html/joke-fresh_glass.html ***!
\****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"<div class=\\\"april-fools__joke__fresh-grass\\\">\\n <div class=\\\"april-fools__joke__fresh-grass__window\\\">\\n <h4>А ты трогал сегодня траву?</h4>\\n\\n <img class=\\\"april-fools__joke__fresh-grass__image\\\"\\n src=\\\"https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Green_Grass.JPG/1280px-Green_Grass.JPG\\\"\\n alt=\\\"Здесь должная быть трава, но что-то сломалось... Притворись, что она здесь есть, хорошо?\\\">\\n\\n <small>\\n Изображение травы взято с\\n <a href=\\\"https://commons.wikimedia.org/wiki/File:Green_Grass.JPG\\\">WikiMedia</a>\\n под лицензией\\n <a href=\\\"https://creativecommons.org/licenses/by-sa/4.0/\\\">CC BY-SA 4.0 DEED</a>.\\n </small>\\n </div>\\n</div>\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/joke-fresh_glass.html?");
/***/ }),
/***/ "./src/html/styles.html":
/*!******************************!*\
!*** ./src/html/styles.html ***!
\******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"<style class=\\\"april-fools__styles\\\">\\r\\n .april-fools__button {\\r\\n position: fixed;\\r\\n bottom: 0.2rem;\\r\\n right: 0.2rem;\\r\\n padding: 0;\\r\\n font-size: 3rem;\\r\\n border: 0 solid;\\r\\n background: transparent none;\\r\\n opacity: 0.3;\\r\\n transition: 0.4s all;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n .april-fools__button:hover {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n .april-fools__joke-row {\\r\\n border-bottom: 1px solid black;\\r\\n }\\r\\n\\r\\n .april-fools__joke-row:first-of-type {\\r\\n border-top: 1px solid black;\\r\\n }\\r\\n\\r\\n .april-fools__joke {\\r\\n display: flex;\\r\\n flex-flow: row wrap;\\r\\n padding: 10px;\\r\\n opacity: 0.5;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n gap: 1ch;\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n .april-fools__joke:hover {\\r\\n text-shadow: 0 0 black;\\r\\n }\\r\\n\\r\\n .april-fools__joke:before {\\r\\n display: block;\\r\\n flex: 0 0 2ch;\\r\\n text-align: center;\\r\\n content: \\\"✔\\\";\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n input.april-fools__joke-input:checked + .april-fools__joke {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n input.april-fools__joke-input:checked + .april-fools__joke:before {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n .april-fools__joke .april-fools__joke-title {\\r\\n flex: 1 auto;\\r\\n font-weight: bold;\\r\\n }\\r\\n\\r\\n .april-fools__joke .april-fools__joke-description {\\r\\n flex: 1 auto;\\r\\n text-align: right;\\r\\n }\\r\\n\\r\\n .april-fools__joke .april-fools__joke-chance {\\r\\n flex: 0 0 4ch;\\r\\n text-align: right;\\r\\n }\\r\\n\\r\\n .april-fools__content .april-fools__reset-button {\\r\\n display: block;\\r\\n margin: 10px auto;\\r\\n }\\r\\n\\r\\n /* Шутка \\\"Свежая трава\\\" */\\r\\n html:has(.april-fools__joke__fresh-grass),\\r\\n body:has(.april-fools__joke__fresh-grass) {\\r\\n position: fixed;\\r\\n width: 100%;\\r\\n left: 0;\\r\\n top: var(--fresh-grass-body-top);\\r\\n }\\r\\n\\r\\n .april-fools__joke__fresh-grass {\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n background-color: #008000C0;\\r\\n z-index: 1000;\\r\\n }\\r\\n\\r\\n .april-fools__joke__fresh-grass__window {\\r\\n height: 100%;\\r\\n width: 100%;\\r\\n display: flex;\\r\\n flex-flow: column nowrap;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n user-select: none;\\r\\n }\\r\\n\\r\\n .april-fools__joke__fresh-grass__window h4 {\\r\\n position: absolute;\\r\\n top: 0;\\r\\n color: #FFFFFF;\\r\\n margin: 1vh 0;\\r\\n font-size: 2vh;\\r\\n line-height: 2vh;\\r\\n text-align: center;\\r\\n }\\r\\n .april-fools__joke__fresh-grass__window small {\\r\\n position: absolute;\\r\\n bottom: 0;\\r\\n }\\r\\n\\r\\n .april-fools__joke__fresh-grass__window img {\\r\\n display: block;\\r\\n max-width: 10vw;\\r\\n max-height: 10vh;\\r\\n }\\r\\n</style>\\r\\n\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/styles.html?");
/***/ }),
/***/ "./src/html/window.html":
/*!******************************!*\
!*** ./src/html/window.html ***!
\******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"<div class=\\\"april-fools__content\\\">\\r\\n <div class=\\\"april-fools__jokes\\\"></div>\\r\\n\\r\\n <button class=\\\"april-fools__reset-button\\\">\\r\\n Вернуться к настройкам форума (страница будет перезагружена!)\\r\\n </button>\\r\\n</div>\\r\\n<template class=\\\"april-fools__template\\\" id=\\\"april-fools__window-row\\\">\\r\\n <div class=\\\"april-fools__joke-row\\\">\\r\\n <input\\r\\n type=\\\"checkbox\\\"\\r\\n class=\\\"april-fools__joke-input\\\"\\r\\n name=\\\"april-fools__joke-${joke.id}\\\"\\r\\n id=\\\"april-fools__joke-${joke.id}\\\"\\r\\n style=\\\"display: none\\\"\\r\\n />\\r\\n <label class=\\\"april-fools__joke\\\" for=\\\"april-fools__joke-${joke.id}\\\">\\r\\n <span class=\\\"april-fools__joke-title\\\">${joke.title}</span>\\r\\n <span class=\\\"april-fools__joke-description\\\">${joke.description}</span>\\r\\n <span class=\\\"april-fools__joke-chance\\\">${joke.settings.chance}%</span>\\r\\n </label>\\r\\n </div>\\r\\n</template>\\r\\n\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/window.html?");
/***/ }),
/***/ "./src/types/html.d.ts":
/*!*****************************!*\
!*** ./src/types/html.d.ts ***!
\*****************************/
/***/ (() => {
eval("\n\n//# sourceURL=webpack://mybb-april-fools/./src/types/html.d.ts?");
/***/ }),
/***/ "./src/types/mybb.d.ts":
/*!*****************************!*\
!*** ./src/types/mybb.d.ts ***!
\*****************************/
/***/ (() => {
eval("\n\n//# sourceURL=webpack://mybb-april-fools/./src/types/mybb.d.ts?");
/***/ }),
/***/ "./src/common.ts":
/*!***********************!*\
!*** ./src/common.ts ***!
\***********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ d2: () => (/* binding */ d2),\n/* harmony export */ debug: () => (/* binding */ debug),\n/* harmony export */ debugEnabled: () => (/* binding */ debugEnabled),\n/* harmony export */ enableDebug: () => (/* binding */ enableDebug),\n/* harmony export */ getTextNodes: () => (/* binding */ getTextNodes),\n/* harmony export */ isFloat: () => (/* binding */ isFloat),\n/* harmony export */ isInt: () => (/* binding */ isInt),\n/* harmony export */ isNumber: () => (/* binding */ isNumber),\n/* harmony export */ isTouchEnabled: () => (/* binding */ isTouchEnabled)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * Получение всех элементов, являющимися TextNode.\n * Используется некоторыми шутками для уменьшения\n * влияния на существующее DOM-дерево.\n *\n * @param {HTMLElement | JQuery<HTMLElement> | JQuery.Selector} root\n * Элемет, у которого необходимо найти текстовые ноды\n *\n * @return {JQuery<HTMLElement | Text | Comment | Document>}\n */\nfunction getTextNodes(root) {\n // Это очень странный код, но надо успокоить ESLint\n const $root = (typeof root === 'string') ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(root) : jquery__WEBPACK_IMPORTED_MODULE_0___default()(root);\n return $root.\n find('*').\n contents().\n filter((_, node) => node.nodeType === Node.TEXT_NODE);\n}\nlet debugEnabled = ((scriptElement) => {\n if (!(scriptElement instanceof HTMLScriptElement)) {\n return false;\n }\n return !/\\.min\\.js$/.test(scriptElement.src);\n})(document.currentScript);\n/**\n * Отоброзить отладочное сообщение\n */\nfunction debug(...data) {\n if (!debugEnabled)\n return;\n console.log(...data);\n}\n/**\n * Включить отладку\n */\nfunction enableDebug() {\n debugEnabled = true;\n}\n/**\n * Проверка сенсорного экрана\n * @return {boolean}\n */\nfunction isTouchEnabled() {\n var _a;\n return 'ontouchstart' in window ||\n navigator.maxTouchPoints > 0 ||\n // eslint-disable-next-line\n ((_a = navigator.msMaxTouchPoints) !== null && _a !== void 0 ? _a : 0) > 0;\n}\n/**\n * Проверка, является ли переменная числом\n * @param {any} n Проверяемая переменная\n * @return {boolean} Результат проверки\n */\n// eslint-disable-next-line\nfunction isNumber(n) {\n return Number(n) === n;\n}\n/**\n * Проверка, является ли переменная целым числом\n * @param {any} n Проверяемая переменная\n * @return {boolean} Результат проверки\n */\n// eslint-disable-next-line\nfunction isInt(n) {\n return Number(n) === n && n % 1 === 0;\n}\n/**\n * Проверка, является ли переменная вещественным числом\n * @param {any} n Проверяемая переменная\n * @return {boolean} Результат проверки\n */\n// eslint-disable-next-line\nfunction isFloat(n) {\n return Number(n) === n && n % 1 !== 0;\n}\n/**\n * Тег литеральной функции, в которой вещественные числа будут\n * печататься с 2 точками после запятой\n * @param {TemplateStringsArray} strings\n * @param {any[]} values\n * @return {string}\n */\n// eslint-disable-next-line\nfunction d2(strings, ...values) {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n result += isFloat(values[i]) ? values[i].toFixed(2) : values[i];\n }\n }\n return result;\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/common.ts?");
/***/ }),
/***/ "./src/data/stupid_title_variants.ts":
/*!*******************************************!*\
!*** ./src/data/stupid_title_variants.ts ***!
\*******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StupidTitleDefaultVariants: () => (/* binding */ StupidTitleDefaultVariants)\n/* harmony export */ });\n/* harmony import */ var _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../jokes/stupid_title */ \"./src/jokes/stupid_title.ts\");\n\n/**\n * Метод, генерирующий стандартный список слов\n * @param {StupidTitleVariants} vars\n */\nfunction StupidTitleDefaultVariants(vars) {\n vars.adj = Object.assign(Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(true, \n // eslint-disable-next-line max-len\n 'адекватный,$адский,активный,алчный,%ангельский,банальный,безнадёжный,$бесполезный,былой,верный,виртуальный,вкусный,воспитанный,выгодный,выходной,гигантский,$глупый,гордый,грамотный,громадный,грубый,далекий,двуличный,деятельный,доброжелательный,$жалкий,жёсткий,жестокий,$жирный,заинтересованный,запасной,застенчивый,знакомый,иностранный,истинный,конструктивный,креативный,ласковый,любимый,мелочный,^мирный,мстительный,небесный,невозможный,независимый,низкий,нужный,объективный,обыкновенный,опрятный,^оригинальный,особенный,острый,откровенный,открытый,пестрый,повседневный,подземный,пожилой,показательный,последний,посторонний,провинциальный,пышный,робкий,родной,самовлюблённый,северный,седой,семейный,серьёзный,сногсшибательный,^солнечный,спокойный,суровый,терпеливый,уверенный в себе,ударный,^удачливый,формальный,хладнокровный,целый,чистый,чрезвычайный,чужой,южный')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(false, \n // eslint-disable-next-line max-len\n 'адекватная,$адская,активная,алчная,%ангельская,банальная,безнадёжная,$бесполезная,былая,верная,виртуальная,вкусная,воспитанная,выгодная,выходная,гигантская,$глупая,гордая,грамотная,громадная,грубая,далекая,двуличная,деятельная,доброжелательная,$жалкая,жёсткая,жестокая,$жирная,заинтересованная,запасная,застенчивая,знакомая,иностранная,истинная,конструктивная,креативная,ласковая,любимая,мелочная,^мирная,мстительная,небесная,невозможная,независимая,низкая,нужная,объективная,обыкновенная,опрятная,^оригинальная,особенная,острая,откровенная,открытая,пестрая,повседневная,подземная,пожилая,показательная,последняя,посторонняя,провинциальная,пышная,робкая,родная,самовлюблённая,северная,седая,семейная,серьезная,сногсшибательная,^солнечная,спокаяная,суровая,терпеливая,уверенная в себе,ударная,^удачливая,формальная,хладнокровная,целая,чистая,чрезвычайная,чужая,южная')), vars.adj);\n vars.noun = Object.assign(Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(true, \n // eslint-disable-next-line max-len\n 'актёр,$балбес,бард,басурманин,борец,бродяга,бруталище,волк,дворф,%дед,%дедушка,джентльмен,диван,динозавр,дракон,ёж,%ёжик,жук,зайц,$злоумышленник,зомби,карасик,кентавр,кит,кот,кролик,кулак,лев,ледник,лесоруб,%мальчег,мальчик,манекен,массажист,мачо,монах,монстр,наследник,ниндзя,носорог,одиночка,организм,орёл,отец,принц,проказник,пузырь,$раб,рыцарь,спортсмен,сурикат,сын,%сынок,тигр,товарищ,хоббит,эльф')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(false, \n // eslint-disable-next-line max-len\n 'актриса,акула,$бабка,бабочка,%бабушка,бактерия,белочка,бусинка,валькирия,$ведьма,волторна,волчица,горгулья,дворфиха,девочка,деревяшка,детка,%деффачка,%дочка,дочь,заноза,$злоумышленница,знаменитость,каруселька,килька,конфетка,косточка,кошка,красотка,крышка,леди,$личинка,львица,мать,машина,милашка,монашка,мышь,наследница,орлица,панда,пиранья,принцесса,простуда,$рабыня,русалочка,рыбка,рыбка,скамеечка,спортсменка,тигрица,травка,черепашка,чертовка,эльфийка')), vars.noun);\n vars.verb = Object.assign(Object.assign(Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(null, \n // eslint-disable-next-line max-len\n 'бежит,берёт и делает,болеет,встаёт,говорит,думает,забывает,замирает,заходит,идёт,%имеет план и придерживается его,ловит,меняется,молчит,нарушает,оглядывается,орёт,освобождает,отвечает,отказаться куда-то идти,отказывается,отказывается вставать,отказывается что-то делать,оформляет,плывёт,поглядывает,поздравляет,поздравляет,получает,прибывает,приказывает,просыпается,прощает,работает,радуется,скрывается,снимает,снимает,снимается в сериале,снимается в фильме,собирается,соединяет,спрашивает,тянет,указывает,учит,читает,что-то скрывает,чувствует опасность,шепчет')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(true, \n // eslint-disable-next-line max-len\n 'взял и сделал,додумался,женился,женится,заработался,не спал,не успел,обиделся,познал дзен,присел,проснулся,скрылся,смог,успел')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(false, \n // eslint-disable-next-line max-len\n 'взяла и сделала,выходит замуж,вышла замуж,додумалась,заработалась,не спала,не успела,обиделась,познала дзен,присела,проснулась,скрылась,смогла,успела')), vars.verb);\n vars.place = Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(null, \n // eslint-disable-next-line max-len\n 'в джунглях,в квартире,в космосе,в лесу,в очереди,в пустыне,в театре,%в тёплой и уютной квартире,в филармонии,где-то,на заснеженной вершине,на конференции,на пляже,на форуме,под водой,под дождём,%под проливным дождём')), vars.place);\n vars.adv = Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(null, \n // eslint-disable-next-line max-len\n 'безрассудно,быстро,внезапно,вновь,$грубо,грустно,медленно,%молниеносно,немедленно,опять,осмысленно,позже,предсказуемо,расчётливо,регулярно,счастливо,уже,уныло')), vars.adv);\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/data/stupid_title_variants.ts?");
/***/ }),
/***/ "./src/joke.ts":
/*!*********************!*\
!*** ./src/joke.ts ***!
\*********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Joke: () => (/* binding */ Joke),\n/* harmony export */ JokeSettings: () => (/* binding */ JokeSettings),\n/* harmony export */ StoppableJoke: () => (/* binding */ StoppableJoke)\n/* harmony export */ });\n/**\n * Объект настроек шутки\n */\nclass JokeSettings {\n constructor() {\n /**\n * Флаг блокировки срабатывания\n */\n this.enabled = true;\n /**\n * Вероятность срабатывания в процентах\n */\n this.chance = 20;\n }\n}\n/**\n * Объект, описывающий шутку\n */\nclass Joke {\n /**\n * Получение полного списка настроек\n */\n get settings() {\n return this._settings;\n }\n /**\n * Запись новых настроек\n *\n * @param {JokeSettings} settings\n */\n set settings(settings) {\n for (const entry of Object.entries(settings)) {\n const id = entry[0];\n const value = entry[1];\n switch (id) {\n case 'name':\n case 'title':\n this.title = value;\n break;\n case 'description':\n this.description = value;\n break;\n default:\n // eslint-disable-next-line\n this._settings[id] = value;\n }\n }\n }\n /**\n * Проверка вероятности\n *\n * @param {number} chance Вероятность срабатывания\n * @return {boolean} Флаг срабатывания (true - сработало)\n */\n check(chance) {\n return Math.random() < 0.01 * chance;\n }\n /**\n * Разблокировать шутку\n */\n enable() {\n this.settings.enabled = true;\n }\n /**\n * Заблокировать шутку\n */\n disable() {\n this.settings.enabled = false;\n }\n /**\n * Переключить блокировку шутки\n * @param {boolean | null} [value] Новое значение\n */\n toggle(value = null) {\n this.settings.enabled = value === null ? !this.settings.enabled : value;\n }\n}\n/**\n * Объект, описывающий шутку, которая может быть остановлена\n */\nclass StoppableJoke extends Joke {\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/joke.ts?");
/***/ }),
/***/ "./src/joker.ts":
/*!**********************!*\
!*** ./src/joker.ts ***!
\**********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ JokerClass: () => (/* binding */ JokerClass)\n/* harmony export */ });\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types/mybb.d */ \"./src/types/mybb.d.ts\");\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_mybb_d__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./joke */ \"./src/joke.ts\");\n/* harmony import */ var _ui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ui */ \"./src/ui.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./common */ \"./src/common.ts\");\n\n\n\n\n/**\n * Блок обработки перво-апрельских шуток\n *\n * @author Kozhilya\n */\nclass JokerClass {\n constructor() {\n this.ui = new _ui__WEBPACK_IMPORTED_MODULE_2__.JokerUI(this);\n /**\n * Общие настройки системы\n */\n this.core_settings = new CoreSettings();\n /**\n * Перечисление всех шуток\n */\n this.jokes = {};\n }\n /**\n * Получение полного списка настроек\n */\n get settings() {\n const result = {};\n result['core'] = this.core_settings;\n for (const entries of Object.entries(this.jokes)) {\n const id = entries[0];\n const joke = entries[1];\n result[id] = joke.settings;\n }\n return result;\n }\n /**\n * Запись новых настроек\n *\n * @param {SettingsMap} settings\n */\n set settings(settings) {\n for (const entry of Object.entries(settings)) {\n const id = entry[0];\n const jokeSettings = entry[1];\n const targetSettings = id === 'core' ? this.core_settings : this.jokes[id].settings;\n Object.assign(targetSettings, jokeSettings);\n }\n }\n /**\n * Проверка вероятности\n *\n * @param {number} chance Вероятность срабатывания\n * @return {boolean} Флаг срабатывания (true - сработало)\n */\n check(chance) {\n return Math.random() < 0.01 * chance;\n }\n /**\n * Добавление шутки\n *\n * @param {Joke} joke Объект шутки\n */\n add(joke) {\n this.jokes[joke.id] = joke;\n }\n /**\n * Регистрация новой шутки\n *\n * @param {string} id Идентификатор шутки\n * @param {JokeHandler} handler Метод, выполняющий шутку\n * @param {JokeSettings | null} [settings] Объект настроек шутки\n * @return {Joke<JokeSettings>} Объект шутки\n */\n addCustom(id, handler, settings = null) {\n const joke = new (class extends _joke__WEBPACK_IMPORTED_MODULE_1__.Joke {\n constructor() {\n super(...arguments);\n this.id = id;\n this.title = 'Пользовательская шутка';\n this.description = 'Для шутки не определено описание';\n this._settings = new _joke__WEBPACK_IMPORTED_MODULE_1__.JokeSettings();\n }\n /**\n * Метод запуска шутки\n */\n start() {\n handler.call(this, this.settings);\n }\n })();\n joke.settings = settings;\n this.add(joke);\n return joke;\n }\n /**\n * Разблокировать систему\n */\n enable() {\n this.core_settings.enabled = true;\n }\n /**\n * Заблокировать систему\n */\n disable() {\n this.core_settings.enabled = false;\n }\n /**\n * Разблокировать все шутки\n */\n enableAll() {\n for (const key of Object.keys(this.jokes)) {\n this.jokes[key].enable();\n }\n }\n /**\n * Заблокировать все шутки\n */\n disableAll() {\n for (const key of Object.keys(this.jokes)) {\n this.jokes[key].disable();\n }\n }\n /**\n * Переключение шутки\n *\n * @param {string} jokeId ID шутки для переключения\n * @param {boolean} state Новое состояние\n */\n toggleJoke(jokeId, state) {\n const joke = this.jokes[jokeId];\n joke.settings.enabled = state;\n if (joke instanceof _joke__WEBPACK_IMPORTED_MODULE_1__.StoppableJoke && !state) {\n joke.stop();\n }\n this.saveUserStates();\n }\n /**\n * Сохранение пользовательских настроек\n */\n saveUserStates() {\n const states = {};\n for (const key of Object.keys(this.jokes)) {\n states[key] = this.jokes[key].settings.enabled;\n }\n fetch('/api.php?' +\n $.param({\n method: 'storage.set',\n user_id: window.UserID,\n key: 'april-fools',\n token: window.ForumAPITicket,\n value: JSON.stringify(states),\n timer: 24 * 60,\n })).then((_) => { });\n }\n /**\n * Загрузка пользовательских настроек\n */\n async loadUserStates() {\n const response = await fetch('/api.php?' +\n $.param({\n method: 'storage.get',\n user_id: window.UserID,\n key: 'april-fools',\n }));\n const json = await response.json();\n if (json.error) {\n return;\n }\n const data = JSON.parse(json.response.storage.data['april-fools']);\n for (const key of Object.keys(this.jokes)) {\n this.jokes[key].settings.enabled = data[key];\n }\n }\n /**\n * Отчистка настроек пользователя\n */\n async clearUserStates() {\n await fetch('/api.php?' +\n $.param({\n method: 'storage.delete',\n user_id: window.UserID,\n key: 'april-fools',\n token: window.ForumAPITicket,\n }));\n return;\n }\n /**\n * Запуск шутки\n *\n * @param {string} jokeId ID шутки для запуска\n * @param {boolean} [forced] Принудительный запуск\n */\n start(jokeId, forced = false) {\n if (!(jokeId in this.jokes))\n return;\n const joke = this.jokes[jokeId];\n if (!forced && (!joke.settings.enabled || !this.check(joke.settings.chance))) {\n (0,_common__WEBPACK_IMPORTED_MODULE_3__.debug)(joke.title, '- шутка не включена');\n return;\n }\n (0,_common__WEBPACK_IMPORTED_MODULE_3__.debug)(joke.title, '- шутка включена');\n joke.start();\n }\n /**\n * Запуск всех шуток\n *\n * @param {boolean} [forced] Принудительный запуск\n */\n startAll(forced = false) {\n for (const key of Object.keys(this.jokes)) {\n this.start(key, forced);\n }\n }\n /**\n * Стандартная проверка 1 апреля\n *\n * @return {boolean} Флаг, должна ли запускаться система\n */\n regularCheck() {\n if (!this.core_settings.enabled) {\n return false;\n }\n if (this.core_settings.testers.indexOf(window.UserID) >= 0) {\n return true;\n }\n const today = new Date();\n const month = today.getMonth() + 1;\n const day = today.getDate();\n if (month !== 4 || day !== 1) {\n return false;\n }\n return this.check(this.core_settings.chance);\n }\n /**\n * Стандартный запуск 1 апреля\n */\n async regularStart() {\n if (!this.regularCheck()) {\n return;\n }\n await this.loadUserStates();\n this.ui.show();\n this.startAll();\n }\n}\n/**\n * Общие правила системы\n */\nclass CoreSettings {\n constructor() {\n this.chance = 100;\n this.enabled = true;\n /**\n * Список пользователей-тестировщиков\n */\n this.testers = [];\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/joker.ts?");
/***/ }),
/***/ "./src/jokes/carnival.ts":
/*!*******************************!*\
!*** ./src/jokes/carnival.ts ***!
\*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CarnivalJoke: () => (/* binding */ CarnivalJoke),\n/* harmony export */ CarnivalJokeSettings: () => (/* binding */ CarnivalJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Карнавал**\n *\n * Аватарки приобретают интересные цвета\n *\n * @author Kozhilya\n */\nclass CarnivalJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'carnival';\n this.title = 'Карнавал';\n this.description = 'Аватарки приобретают интересные цвета';\n this._settings = new CarnivalJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(this.settings.selector).each((_, elem) => {\n const filters = [];\n for (const entry of Object.entries(this.settings.variants)) {\n if (!this.check(this.settings.variant_chance)) {\n continue;\n }\n filters.push(entry[0].replace('{0}', Math.round(Math.random() * entry[1]).toString()));\n }\n if (filters.length > 0) {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css({ filter: filters.join(' ') });\n }\n });\n }\n}\n/**\n * Класс настроек для шутки \"Карнавал\"\n */\nclass CarnivalJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 30;\n /**\n * Селектор всех элементов, которые будут перекрашены\n */\n this.selector = 'img[src*=\"/avatars/\"]';\n /**\n * Вероятность применения некоторого фильтра\n */\n this.variant_chance = 20;\n /**\n * Список фильтров и диапозона случайных параметров\n */\n this.variants = {\n 'sepia({0}%)': 100,\n 'saturate({0}%)': 100,\n 'hue-rotate({0}deg)': 360,\n 'invert({0}%)': 100,\n };\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/carnival.ts?");
/***/ }),
/***/ "./src/jokes/crazy_letters.ts":
/*!************************************!*\
!*** ./src/jokes/crazy_letters.ts ***!
\************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrazyLettersJoke: () => (/* binding */ CrazyLettersJoke),\n/* harmony export */ CrazyLettersJokeSettings: () => (/* binding */ CrazyLettersJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Мама, Я сОшЛа С уМа!**\n *\n * иМеНа ЗаБоРчИкОм\n *\n * @author Kozhilya\n */\nclass CrazyLettersJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'crazy_letters';\n this.title = 'Мама, Я сОшЛа С уМа!';\n this.description = 'иМеНа ЗаБоРчИкОм';\n this._settings = new CrazyLettersJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(this.settings.selector).each((_, elem) => {\n const text = jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).text();\n let result = '';\n for (let i = 0; i < text.length; i++) {\n result += text[i][i % 2 ? 'toLowerCase' : 'toUpperCase']();\n }\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(this).text(result);\n });\n }\n}\n/**\n * Класс настроек для шутки \"Мама, Я сОшЛа С уМа!\"\n */\nclass CrazyLettersJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 20;\n /**\n * Селектор всех элементов, которые будут затронуты\n */\n this.selector = '.pa-author a';\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/crazy_letters.ts?");
/***/ }),
/***/ "./src/jokes/cursor.ts":
/*!*****************************!*\
!*** ./src/jokes/cursor.ts ***!
\*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CursorEffectsJoke: () => (/* binding */ CursorEffectsJoke),\n/* harmony export */ CursorEffectsJokeSettings: () => (/* binding */ CursorEffectsJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var cursor_effects__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! cursor-effects */ \"./node_modules/cursor-effects/dist/esm.js\");\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\n\n/**\n * **Красивый курсор**\n *\n * Эффекты, следующие за курсором\n *\n * @author Tim Holman\n * @link https://tholman.com/cursor-effects/\n */\nclass CursorEffectsJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.StoppableJoke {\n constructor() {\n super(...arguments);\n this.id = 'cursor_effects';\n this.title = 'Красивый курсор';\n this.description = 'Эффекты, следующие за курсором';\n this._settings = new CursorEffectsJokeSettings();\n }\n /**\n * Разблокировать все варианты курсоров\n */\n enableAll() {\n for (const key of Object.keys(this.settings.effects)) {\n this.settings.effects[key].enabled = true;\n }\n }\n /**\n * Заблокировать все варианты курсоров\n */\n disableAll() {\n for (const key of Object.keys(this.settings.effects)) {\n this.settings.effects[key].enabled = false;\n }\n }\n /**\n * Получение веса отдельного эффекта\n * @param {CursorEffectsEnum} effect Тип эффекта\n * @return {number} Значение веса\n * @private\n */\n weight(effect) {\n const s = this.settings.effects[effect];\n return s.enabled ? s.weight : 0;\n }\n /**\n * Получение случайного эффекта\n * @return {CursorEffectsEnum}\n */\n getRandomEffect() {\n const elements = Object.values(CursorEffectsEnum).map((e) => e);\n const totalWeight = elements.reduce((sum, element) => sum + this.weight(element), 0);\n const randomWeight = Math.random() * totalWeight;\n let currentWeight = 0;\n for (const element of elements) {\n currentWeight += this.weight(element);\n if (randomWeight <= currentWeight) {\n return element;\n }\n }\n throw new Error('Тебя быть тут не должно...');\n }\n /**\n * Запуск шутки\n */\n start() {\n const effect = this.getRandomEffect();\n const settings = this.settings.effects[effect];\n this.active_cursor_effect = resolveCursorEffectsEnum(effect, settings);\n }\n /**\n * Остановка шутки\n */\n stop() {\n this.active_cursor_effect.destroy();\n }\n}\nvar CursorEffectsEnum;\n(function (CursorEffectsEnum) {\n CursorEffectsEnum[\"Rainbow\"] = \"rainbow\";\n CursorEffectsEnum[\"FairyDust\"] = \"fairy_dust\";\n CursorEffectsEnum[\"SpringyEmoji\"] = \"springy_emoji\";\n CursorEffectsEnum[\"Emoji\"] = \"emoji\";\n CursorEffectsEnum[\"Ghost\"] = \"ghost\";\n CursorEffectsEnum[\"Trailing\"] = \"trailing\";\n CursorEffectsEnum[\"TextFlag\"] = \"text_flag\";\n CursorEffectsEnum[\"FollowingDot\"] = \"following_dot\";\n CursorEffectsEnum[\"Bubbles\"] = \"bubbles\";\n CursorEffectsEnum[\"Snowflake\"] = \"snowflake\";\n CursorEffectsEnum[\"Clock\"] = \"clock\";\n})(CursorEffectsEnum || (CursorEffectsEnum = {}));\n/**\n * Получение эффекта\n * @param {CursorEffectsEnum | string} effect Тип эффекта\n * @param {CursorEffectsSetting} options Настройки эффекта\n * @return {CursorEffectsLib.CursorEffectResult}\n */\nfunction resolveCursorEffectsEnum(effect, options) {\n switch (effect) {\n case CursorEffectsEnum.Rainbow:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.rainbowCursor(options);\n case CursorEffectsEnum.FairyDust:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.fairyDustCursor(options);\n case CursorEffectsEnum.SpringyEmoji:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.springyEmojiCursor(options);\n case CursorEffectsEnum.Emoji:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.emojiCursor(options);\n case CursorEffectsEnum.Ghost:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.ghostCursor(options);\n case CursorEffectsEnum.Trailing:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.trailingCursor(options);\n case CursorEffectsEnum.TextFlag:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.textFlag(options);\n case CursorEffectsEnum.FollowingDot:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.followingDotCursor(options);\n case CursorEffectsEnum.Bubbles:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.bubbleCursor(options);\n case CursorEffectsEnum.Snowflake:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.snowflakeCursor(options);\n case CursorEffectsEnum.Clock:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.clockCursor(options);\n }\n}\n/**\n * Класс настроек для шутки \"Красивый курсор\"\n */\nclass CursorEffectsJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 100;\n this.effects = {\n /**\n * Радужный след за курсором\n */\n [CursorEffectsEnum.Rainbow]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Длина полосы\n */\n this.length = 20;\n /**\n * Ширина полосы\n */\n this.size = 3;\n /**\n * Цвета полос (сверху вниз)\n */\n this.colors = [\n '#9400D3',\n '#4B0082',\n '#0000FF',\n '#00FF00',\n '#FFFF00',\n '#FF7F00',\n '#FF0000',\n ];\n }\n })(),\n /**\n * Цепочка из эмодзи \"на резинке\" под курсором\n */\n [CursorEffectsEnum.SpringyEmoji]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Висящий эмодзи\n */\n this.emoji = '🤪';\n }\n })(),\n /**\n * Падающие от курсора эмодзи\n */\n [CursorEffectsEnum.Emoji]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Падающие эмодзи\n */\n this.emoji = ['🔥', '🐬', '🦆'];\n }\n })(),\n /**\n * Падающие от курсора пылинки\n */\n [CursorEffectsEnum.FairyDust]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Цвет пылинок\n */\n this.colors = ['#ff0000', '#00ff00', '#0000ff'];\n }\n })(),\n /**\n * След \"зависших\" курсоров\n */\n [CursorEffectsEnum.Ghost]: new CursorEffectsSetting(),\n /**\n * След курсоров \"на резинке\"\n */\n [CursorEffectsEnum.Trailing]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Количество элементов\n */\n this.particles = 15;\n /**\n * Скорость частиц\n */\n this.rate = 0.4;\n /**\n * Ссылка на картинку с курсором\n * Используйте `null`, что бы использовать картинку курсора по умолчанию\n */\n this.baseImageSrc = null;\n }\n })(),\n /**\n * Текст, развивающийся флагом от курсора\n */\n [CursorEffectsEnum.TextFlag]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Отображаемый текст\n */\n this.text = 'С днём смеха!';\n /**\n * Цвет текста\n */\n this.color = '#000000';\n /**\n * Шрифт текста\n */\n this.font = 'monospace';\n /**\n * Размер текста\n */\n this.textSize = 12;\n /**\n * Растояние между бквами\n */\n this.gap = 14;\n /**\n * Размер... чего-то.\n */\n this.size = 3;\n }\n })(),\n /**\n * Точка, преследующая курсор\n */\n [CursorEffectsEnum.FollowingDot]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Цвет догоняющей точки\n */\n this.color = '#323232a6';\n }\n })(),\n /**\n * Пузырьки от курсора\n */\n [CursorEffectsEnum.Bubbles]: new CursorEffectsSetting(),\n /**\n * Снежинки, летящие от курсора\n *\n * Отключено, потому что сейчас не зима :D\n */\n [CursorEffectsEnum.Snowflake]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n this.weight = 0;\n }\n })(),\n /**\n * Циферблат вокруг курсора\n */\n [CursorEffectsEnum.Clock]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Цвет даты\n */\n this.dateColor = 'blue';\n /**\n * Цвет циферблата\n */\n this.faceColor = 'black';\n /**\n * Цвет секундной стрелки\n */\n this.secondsColor = 'red';\n /**\n * Цвет минутной стрелки\n */\n this.minutesColor = 'black';\n /**\n * Цвет часовой стрелки\n */\n this.hoursColor = 'black';\n }\n })(),\n };\n }\n}\n/**\n * Восстановление класса CursorEffectsLib.DefaultOptions\n */\nclass DefaultOptions {\n}\n/**\n * Класс настроек для курсора\n */\nclass CursorEffectsSetting extends DefaultOptions {\n constructor() {\n super(...arguments);\n /**\n * Флаг возможности срабатывания\n */\n this.enabled = true;\n /**\n * Весовой коэффициент вероятности курсора\n */\n this.weight = 50;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/cursor.ts?");
/***/ }),
/***/ "./src/jokes/fresh_grass.ts":
/*!**********************************!*\
!*** ./src/jokes/fresh_grass.ts ***!
\**********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FreshGrassJoke: () => (/* binding */ FreshGrassJoke),\n/* harmony export */ FreshGrassJokeSettings: () => (/* binding */ FreshGrassJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types/html.d */ \"./src/types/html.d.ts\");\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_html_d__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _html_joke_fresh_glass_html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../html/joke-fresh_glass.html */ \"./src/html/joke-fresh_glass.html\");\n/* harmony import */ var _lib_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/vector */ \"./src/lib/vector.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n\n\n\n\n/**\n * **Свежая трава**\n *\n * Предложение потрогать траву\n * @author Идея: Magia\n * @author Kozhilya\n */\nclass FreshGrassJoke extends _joke__WEBPACK_IMPORTED_MODULE_1__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'fresh_grass';\n this.title = 'Свежая трава';\n this.description = 'Предложение потрогать траву';\n this._settings = new FreshGrassJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_2___default()(() => this.init());\n }\n /**\n * Основная загрузка шутки\n */\n init() {\n const $body = jquery__WEBPACK_IMPORTED_MODULE_2___default()(document.body);\n document.body.style.setProperty('--fresh-grass-body-top', `-${window.scrollY}px`);\n this.container = jquery__WEBPACK_IMPORTED_MODULE_2___default()(_html_joke_fresh_glass_html__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n this.container.hide(0);\n $body.append(this.container);\n this.container.fadeIn(500);\n this.fleeingGrass();\n }\n /**\n * Отладка\n * @param {string} str\n */\n debug(str) {\n if (!_common__WEBPACK_IMPORTED_MODULE_5__.debugEnabled)\n return;\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('small', this.container).html(`<pre>${str}</pre>`);\n }\n /**\n * Анимация убегания травы от пользователя\n */\n fleeingGrass() {\n this.movement = new Movement(this.settings);\n const $img = jquery__WEBPACK_IMPORTED_MODULE_2___default()('img.april-fools__joke__fresh-grass__image', this.container);\n $img.on('mousedown', () => {\n this.close();\n });\n jquery__WEBPACK_IMPORTED_MODULE_2___default()(window).on('mousemove', (e) => {\n this.movement.mouse = new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(e.clientX - window.innerWidth / 2, e.clientY - window.innerHeight / 2);\n });\n this.intervalIndex = setInterval(() => {\n const img = $img[0].getBoundingClientRect();\n this.movement.step(img);\n // this.debug(this.movement.debugLines.join('\\n'));\n $img.css('transform', this.movement.state.position.toTransform());\n }, Math.floor(1000 * this.movement.dt));\n }\n /**\n * Закрыть окно\n */\n close() {\n clearInterval(this.intervalIndex);\n this.container.fadeOut({\n duration: 500,\n // eslint-disable-next-line\n // @ts-ignore\n complete: () => {\n this.container.remove();\n scrollTo(0, -parseInt(document.body.style.getPropertyValue('--fresh-grass-body-top')));\n },\n });\n }\n}\n/**\n * Класс обработки движения\n */\nclass Movement {\n /**\n * Конструктор\n * @param {FreshGrassJokeSettings} settings\n */\n constructor(settings) {\n this.settings = settings;\n this.state = {\n position: new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(),\n velocity: _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(Math.random() * 2 * Math.PI, Math.random() *\n (this.settings.maxVelocity - this.settings.minVelocity) +\n this.settings.minVelocity),\n acceleration: new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(),\n };\n this.mouse = new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector();\n this.dt = 1.0 / this.settings.tickPerSecond;\n }\n /**\n * Координата движения\n */\n get position() {\n return this.state.position;\n }\n /**\n * Скорость движения\n */\n get velocity() {\n return this.state.velocity;\n }\n /**\n * Ускорение движения\n */\n get acceleration() {\n return this.state.acceleration;\n }\n /**\n * Произвести вычисление\n * @param {DOMRect} img Изображение\n */\n step(img) {\n this.last = this.state;\n this.debugLines = [];\n this.forces = {};\n // Обработка сил\n this.processForces();\n this.processMovement();\n this.processCollisions(img);\n }\n /**\n * Обработка сил\n */\n processForces() {\n // Притяжение к центру\n this.forces.gravity = _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(this.last.position.angle + Math.PI, this.settings.gravity);\n // Коррекция скорости\n if (this.last.velocity.length < this.settings.minVelocity) {\n this.forces.correction = _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(this.last.velocity.angle, this.settings.correctionForce *\n Math.pow(this.last.velocity.length - this.settings.minVelocity, 2));\n }\n else if (this.last.velocity.length > this.settings.maxVelocity) {\n this.forces.correction = _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(this.last.velocity.angle + Math.PI, this.settings.correctionForce *\n Math.pow(this.last.velocity.length - this.settings.maxVelocity, 2));\n }\n // Отталкивание от мыши\n const toMouseVector = this.mouse.add(this.last.position.reverse());\n if (toMouseVector.length < this.settings.keepDistance &&\n toMouseVector.length > 0) {\n this.forces.running = _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(toMouseVector.angle + Math.PI, this.settings.mouseForceMax -\n Math.pow(Math.abs(toMouseVector.length / this.settings.keepDistance - 1), this.settings.mouseForcePow));\n }\n }\n /**\n * Обработка движения\n */\n processMovement() {\n // Ускорение\n this.debugLines.push('Forces:');\n let acceleration = new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector();\n for (const [name, force] of Object.entries(this.forces)) {\n acceleration = acceleration.add(force);\n this.debugLines.push(` [${name}] ${force}`);\n }\n acceleration = acceleration.multiply(1 / this.settings.mass);\n this.state = {\n position: this.last.position,\n velocity: this.last.velocity,\n acceleration: acceleration,\n };\n this.state.velocity = this.velocity.add(this.acceleration.multiply(this.dt));\n this.state.position = this.position.add(this.velocity.multiply(this.dt));\n this.debugLines.push(`acceleration: ${this.acceleration}`);\n this.debugLines.push(`velocity: ${this.velocity}`);\n this.debugLines.push(`position: ${this.position}`);\n }\n /**\n * Обработка столкновения с границами окна\n * @param {DOMRect} img Изображение\n */\n processCollisions(img) {\n const limitX = (window.innerWidth - img.width) / 2;\n const limitY = (window.innerHeight - img.height) / 2;\n if (this.position.x < -limitX) {\n // Left\n this.position.x = -2 * limitX - this.position.x;\n this.velocity.x = -this.velocity.x * this.settings.collisionElasticity;\n }\n if (this.position.x > limitX) {\n // Right\n this.position.x = 2 * limitX - this.position.x;\n this.velocity.x = -this.velocity.x * this.settings.collisionElasticity;\n }\n if (this.position.y < -limitY) {\n // Top\n this.position.y = -2 * limitY - this.position.y;\n this.velocity.y = -this.velocity.y * this.settings.collisionElasticity;\n }\n if (this.position.y > limitY) {\n // Bottom\n this.position.y = 2 * limitY - this.position.y;\n this.velocity.y = -this.velocity.y * this.settings.collisionElasticity;\n }\n }\n /**\n * Нормально распределённая случайная величина\n * @param {number} mean\n * @param {number} stdev\n * @return {number}\n * @private\n */\n randomGaussian(mean = 0, stdev = 1) {\n const u = 1 - Math.random(); // Converting [0,1) to (0,1]\n const v = Math.random();\n const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n // Transform to the desired mean and standard deviation:\n return z * stdev + mean;\n }\n}\n/**\n * Класс настроек для шутки \"Свежая трава\"\n */\nclass FreshGrassJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 100;\n /**\n * Расстояние, на котором трава начнёт убегать\n */\n this.keepDistance = 200;\n /**\n * Максимальная скорость картинки (в пикселях в секунду)\n */\n this.maxVelocity = 500;\n /**\n * Минимальная скорость картинки (в пикселях в секунду)\n */\n this.minVelocity = 20;\n /**\n * Количество отметок времени за секунду\n */\n this.tickPerSecond = 50;\n /**\n * Сила притяжения в центр\n */\n this.gravity = 20;\n /**\n * Сила исправления скорости\n */\n this.correctionForce = 0.8;\n /**\n * Максимальная сила отталкивания от курсора\n */\n this.mouseForceMax = 5000;\n /**\n * Степень увеличения силы отталкивания от курсора\n */\n this.mouseForcePow = 5;\n /**\n * Общая масса картинки\n */\n this.mass = 1;\n /**\n * Доля скорости, сохраняемой при столкновении со стеной\n */\n this.collisionElasticity = 0.9;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/fresh_grass.ts?");
/***/ }),
/***/ "./src/jokes/humanitarian_hell.ts":
/*!****************************************!*\
!*** ./src/jokes/humanitarian_hell.ts ***!
\****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HumanitarianHellJoke: () => (/* binding */ HumanitarianHellJoke),\n/* harmony export */ HumanitarianHellJokeSettings: () => (/* binding */ HumanitarianHellJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n/**\n * **Ад гуманитария**\n *\n * Все \"тся\" заменяются на \"ться\", а все \"ться\" на \"тся\"\n *\n * @author Kozhilya\n */\nclass HumanitarianHellJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'humanitarian_hell';\n this.title = 'Ад гуманитария';\n this.description = 'Все \"тся\" заменяются на \"ться\", а все \"ться\" на \"тся\"';\n this._settings = new HumanitarianHellJokeSettings();\n }\n /**\n * Обработка текста\n *\n * @param {string} text Входная строка\n * @return {string} Итоговая строка\n */\n processText(text) {\n return text.replace(/(ть?ся)/g, function (fnd) {\n return fnd.indexOf('ь') > 0 ? 'тся' : 'ться';\n });\n }\n /**\n * Запуск шутки\n */\n start() {\n const textNodes = (0,_common__WEBPACK_IMPORTED_MODULE_1__.getTextNodes)(this.settings.selector);\n textNodes.each((_, elem) => {\n elem.textContent = this.processText(elem.textContent);\n });\n }\n}\n/**\n * Класс настроек для шутки \"Ад гуманитария\"\n */\nclass HumanitarianHellJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 20;\n /**\n * Селектор всех элементов, которые будут затронуты\n */\n this.selector = '.post-content';\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/humanitarian_hell.ts?");
/***/ }),
/***/ "./src/jokes/inverted_scroll.ts":
/*!**************************************!*\
!*** ./src/jokes/inverted_scroll.ts ***!
\**************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InvertedScrollJoke: () => (/* binding */ InvertedScrollJoke),\n/* harmony export */ InvertedScrollJokeSettings: () => (/* binding */ InvertedScrollJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n\n/**\n * **Обратная гравитация**\n *\n * Скролл в обратную сторону (крутишь вверх, а крутится вниз)\n *\n * @author Идея: Alex_63\n * @author Реализация: Kozhilya\n */\nclass InvertedScrollJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'inverted_scroll';\n this.title = 'Обратная гравитация';\n this.description = 'Скролл в обратную сторону';\n this._settings = new InvertedScrollJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n // let lastScroll = window.scrollY;\n document.addEventListener('wheel', (e) => {\n e.preventDefault();\n scrollBy(0, -e.deltaY);\n }, { passive: false });\n }\n}\n/**\n * Класс настроек для шутки \"Обратная гравитация\"\n */\nclass InvertedScrollJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 10;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/inverted_scroll.ts?");
/***/ }),
/***/ "./src/jokes/latinization.ts":
/*!***********************************!*\
!*** ./src/jokes/latinization.ts ***!
\***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LatinizationJoke: () => (/* binding */ LatinizationJoke),\n/* harmony export */ LatinizationJokeSettings: () => (/* binding */ LatinizationJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n/**\n * **Латинизация**\n *\n * Все символы на странице или только в постах или еще где-то местами -\n * латиницей вместо кириллицы и наоборот\n *\n * @author Идея: Alex_63\n * @author Kozhilya\n */\nclass LatinizationJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'latinization';\n this.title = 'Латинизация';\n this.description = 'Все символы на странице или только в постах ' +\n 'или еще где-то местами - латиницей вместо кириллицы и наоборот';\n this._settings = new LatinizationJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n const textNodes = (0,_common__WEBPACK_IMPORTED_MODULE_1__.getTextNodes)(this.settings.selector);\n textNodes.each((_, node) => this.processNode(node));\n }\n /**\n * Латинизация или кириллизация слова\n * @param {string} word\n * @return {string}\n * @private\n */\n latinize(word) {\n if (/[а-яА-ЯёЁ0-9_-]+/.test(word)) {\n // Кириллица в латиницу\n for (const [ru, en] of Object.entries(this.settings.ruToEn)) {\n word = word.replace(new RegExp(ru, 'g'), en).\n replace(new RegExp(ru.toUpperCase(), 'gi'), en.toUpperCase());\n }\n }\n else if (/[a-zA-Z0-9_-]+/.test(word)) {\n // Латиница в кириллицу\n for (const [en, ru] of Object.entries(this.settings.enToRu)) {\n word = word.replace(new RegExp(en, 'g'), ru).\n replace(new RegExp(en.toUpperCase(), 'gi'), ru.toUpperCase());\n }\n }\n return word;\n }\n /**\n * Обработка текстовой ноды\n * @param {Text} node\n * @private\n */\n processNode(node) {\n var _a;\n node.textContent = (_a = node.textContent) === null || _a === void 0 ? void 0 : _a.replace(/([А-Яа-яA-Za-z]+)/gm, (_, word) => this.latinize(word));\n }\n}\n/**\n * Класс настроек для шутки \"Латинизация\"\n */\nclass LatinizationJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 10;\n /**\n * Селектор, в котором может изменяться текст\n */\n this.selector = '.post-content';\n /**\n * Правила преобразования из кириллицы в латиницу\n */\n this.ruToEn = {\n 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',\n 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i',\n 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n',\n 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't',\n 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch',\n 'ш': 'sh', 'щ': 'shch', 'ъ': 'ie', 'ы': 'y', 'ь': '',\n 'э': 'e', 'ю': 'u', 'я': 'ya',\n };\n /**\n * Правила преобразования из латиницы в кириллицу\n */\n this.enToRu = {\n 'a': 'а', 'b': 'б', 'c': 'с', 'd': 'д', 'e': 'е',\n 'f': 'ф', 'gh': 'ж', 'g': 'г', 'h': 'х', 'i': 'и',\n 'j': 'й', 'k': 'к', 'l': 'л', 'm': 'м', 'n': 'н',\n 'o': 'о', 'p': 'п', 'q': 'кью', 'r': 'р', 's': 'с',\n 't': 'т', 'u': 'ю', 'v': 'в', 'w': 'в', 'x': 'кс',\n 'y': 'ы', 'z': 'з',\n };\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/latinization.ts?");
/***/ }),
/***/ "./src/jokes/letter_chaos.ts":
/*!***********************************!*\
!*** ./src/jokes/letter_chaos.ts ***!
\***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LetterChaosJoke: () => (/* binding */ LetterChaosJoke),\n/* harmony export */ LetterChaosJokeSettings: () => (/* binding */ LetterChaosJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n/**\n * **Буквенный хаос**\n *\n * Все буквы в словах, кроме первой и последней, перемешены\n *\n * @author Kozhilya\n */\nclass LetterChaosJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'letter_chaos';\n this.title = 'Буквенный хаос';\n this.description = 'Все буквы в словах, кроме первой и последней, перемешены';\n this._settings = new LetterChaosJokeSettings();\n this.punctuationSymbols = null;\n }\n /**\n * Перемешивание букв в словах\n * @param {string} word\n * @return {string}\n * @private\n */\n shuffleLetters(word) {\n if (word.length < 3 || !this.check(this.settings.shuffle_chance)) {\n return word;\n }\n const characters = word.split('');\n const middleCharacters = characters.slice(1, -1);\n for (let i = middleCharacters.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [middleCharacters[i], middleCharacters[j]] = [\n middleCharacters[j],\n middleCharacters[i],\n ];\n }\n return [\n characters[0],\n ...middleCharacters,\n characters[characters.length - 1],\n ].join('');\n }\n /**\n * Обработка текстовой ноды\n * @param {Text} node\n * @private\n */\n processNode(node) {\n var _a;\n node.textContent = (_a = node.textContent) === null || _a === void 0 ? void 0 : _a.replace(/([А-Яа-яA-Za-z]+)/gm, (_, word) => this.shuffleLetters(word));\n }\n /**\n * Запуск шутки\n */\n start() {\n const textNodes = (0,_common__WEBPACK_IMPORTED_MODULE_1__.getTextNodes)(this.settings.selector);\n textNodes.each((_, node) => this.processNode(node));\n }\n}\n/**\n * Класс настроек для шутки \"Буквенный хаос\"\n */\nclass LetterChaosJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 20;\n /**\n * Селектор всех элементов, которые будут затронуты\n */\n this.selector = '.post-content';\n /**\n * Вероятность того, что буквы будут перемешаны\n */\n this.shuffle_chance = 50;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/letter_chaos.ts?");
/***/ }),
/***/ "./src/jokes/mirror.ts":
/*!*****************************!*\
!*** ./src/jokes/mirror.ts ***!
\*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MirrorJoke: () => (/* binding */ MirrorJoke),\n/* harmony export */ MirrorJokeSettings: () => (/* binding */ MirrorJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Зеркало**\n *\n * Элементы форума отражаются (по крайней мере, пытаются)\n *\n * @author Kozhilya\n */\nclass MirrorJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'mirror';\n this.title = 'Зеркало';\n this.description = 'Элементы форума отражаются (по крайней мере, пытаются)';\n this._settings = new MirrorJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post, .post h3, .post-links, .post-author, .post-content')\n .css('transform', 'scaleX(-1)')\n .css('-moz-transform', 'scaleX(-1)')\n .css('-moz-transform', 'scaleX(-1)')\n .css('filter', 'FlipH')\n .css('-ms-filter', '\"FlipH\"');\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post-links, .post-links ul, .post h3 span').css('margin-left', '0');\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post h3 span').css('margin-right', '25em');\n }\n}\n/**\n * Класс настроек для шутки \"Зеркало\"\n */\nclass MirrorJokeSettings {\n constructor() {\n this.enabled = false;\n this.chance = 30;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/mirror.ts?");
/***/ }),
/***/ "./src/jokes/shake.ts":
/*!****************************!*\
!*** ./src/jokes/shake.ts ***!
\****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ShakeJoke: () => (/* binding */ ShakeJoke),\n/* harmony export */ ShakeJokeSettings: () => (/* binding */ ShakeJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Форумо-трясение**\n *\n * Страница форума начинает трястись\n *\n * @author Kozhilya\n */\nclass ShakeJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.StoppableJoke {\n constructor() {\n super(...arguments);\n this.id = 'shake';\n this.title = 'Форумо-трясение';\n this.description = 'Страница форума начинает трястись';\n this._settings = new ShakeJokeSettings();\n this.dataName = 'april-fools-shake';\n }\n /**\n * Выбор случайной амплитуды\n * @param {number} a\n * @return {number}\n */\n rand(a) {\n return a + this.settings.force * (Math.random() * 2 - 1);\n }\n /**\n * Запуск шутки\n */\n start() {\n this.items = jquery__WEBPACK_IMPORTED_MODULE_1___default()(this.settings.selector);\n this.items.each((_, elem) => {\n const data = {};\n this.settings.directions.forEach((d) => {\n data[d] = parseInt(jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css('margin-' + d));\n });\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).data(this.dataName, data);\n });\n this.intervalId = setInterval(() => {\n this.items.each((_, elem) => {\n const data = jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).data(this.dataName);\n for (const entry of Object.entries(data)) {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css('margin-' + entry[0], this.rand(entry[1]));\n }\n });\n }, this.settings.interval);\n }\n /**\n * Остновка шутки\n */\n stop() {\n clearInterval(this.intervalId);\n this.items.each((_, elem) => {\n const data = {};\n this.settings.directions.forEach((d) => {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css('margin-' + d, data[d]);\n });\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).data(this.dataName, data);\n });\n }\n}\n/**\n * Класс настроек для шутки \"Форумо-трясение\"\n */\nclass ShakeJokeSettings {\n constructor() {\n this.enabled = false;\n this.chance = 1;\n /**\n * Направление тряски (тряска происходит путём изменения перечисленных\n * направлений margin на значение ±force от стандартного значения)\n */\n this.directions = ['top', 'left', 'bottom', 'left'];\n /**\n * Сила тряски - насколько отклоняется элемент от стандартного значения\n */\n this.force = 0.5;\n /**\n * Селектор всех элементов, которые будут трястись\n */\n this.selector = '[id^=pun]';\n /**\n * Частота тряски\n */\n this.interval = 100;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/shake.ts?");
/***/ }),
/***/ "./src/jokes/stupid_title.ts":
/*!***********************************!*\
!*** ./src/jokes/stupid_title.ts ***!
\***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BuildStupidTitleVariant: () => (/* binding */ BuildStupidTitleVariant),\n/* harmony export */ StupidTitleJoke: () => (/* binding */ StupidTitleJoke),\n/* harmony export */ StupidTitleJokeSettings: () => (/* binding */ StupidTitleJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _data_stupid_title_variants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data/stupid_title_variants */ \"./src/data/stupid_title_variants.ts\");\n\n\n\n/**\n * **Глупые статусы**\n *\n * Каждому пользователю даётся новый глупый статус\n *\n * @author Kozhilya\n */\nclass StupidTitleJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'stupid_title';\n this.title = 'Глупые статусы';\n this.description = 'Каждому пользователю даётся новый глупый статус';\n this._settings = new StupidTitleJokeSettings();\n this.loadedGenders = null;\n this.variantsGenerated = false;\n this.seed = 0;\n }\n /**\n * Загрузка полов, если они не определены\n */\n async loadGenders() {\n var _a;\n const names = jquery__WEBPACK_IMPORTED_MODULE_1___default()('.pa-author a').\n map((_, elem) => elem.innerText).\n toArray().\n reduce((arr, name) => {\n if (arr.indexOf(name) < 0) {\n arr.push(name);\n }\n return arr;\n }, []);\n const url = '/api.php?' +\n jquery__WEBPACK_IMPORTED_MODULE_1___default().param({ method: 'users.get', fields: 'username,sex', username: names });\n const response = await fetch(url);\n const json = await response.json();\n this.loadedGenders = {};\n if (json.error) {\n return;\n }\n (_a = json.response) === null || _a === void 0 ? void 0 : _a.users.forEach((element) => {\n if (element.sex === '0') {\n return;\n }\n this.loadedGenders[element.username] = element.sex === '1';\n });\n }\n /**\n * Разрешение пола по имени\n * @param {string} name\n * @return {boolean}\n */\n resolveGender(name) {\n if (this.settings.gender_resolver !== null) {\n return !!this.settings.gender_resolver.call(this, name);\n }\n if (name in this.loadedGenders) {\n return !!this.loadedGenders[name];\n }\n this.resetSeed();\n return this.selectRandom(name, { m: 1, f: 1 }) === 'm';\n }\n /**\n * Запуск шутки\n */\n async start() {\n if (!this.variantsGenerated) {\n (0,_data_stupid_title_variants__WEBPACK_IMPORTED_MODULE_2__.StupidTitleDefaultVariants)(this.settings.variants);\n this.variantsGenerated = true;\n }\n await this.loadGenders();\n const cache = {};\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post-author').each((_, root) => {\n const name = jquery__WEBPACK_IMPORTED_MODULE_1___default()('.pa-author a', root).text();\n if (!name) {\n return;\n }\n if (!(name in cache)) {\n this.resetSeed();\n cache[name] = this.generatePhrase(name);\n }\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.pa-title', root).text(cache[name]);\n });\n }\n /**\n * Сгенерировать фразу\n * @param {string} name Имя, кому необходимо сгенерировать фразу\n * @return {string} Итоговая фраза\n */\n generatePhrase(name) {\n const gender = this.resolveGender(name);\n const phrase = this.selectRandom(name, this.settings.schemas);\n return this.capitalizeFirst(phrase.replace(/\\{(.+?)}/g, (_, type) => {\n const variants = this.buildVariants(type, gender);\n return this.selectRandom(name, variants);\n }));\n }\n /**\n * Функция хеширования\n *\n * https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js\n *\n * cyrb53 (c) 2018 bryc (github.com/bryc)\n * A fast and simple hash function with decent collision resistance.\n * Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity.\n * Public domain. Attribution appreciated.\n *\n * @param {string} name Имя\n * @param {number} seed Зерно случайности\n * @param {limit} limit Максимальное значение\n * @return {number} Хеш-значение\n * @private\n */\n prng(name, seed, limit) {\n let h1 = 0xdeadbeef ^ seed;\n let h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < name.length; i++) {\n ch = name.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 =\n Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^\n Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 =\n Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^\n Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n const value = 4294967296 * (2097151 & h2) + (h1 >>> 0);\n return Math.floor(Math.pow(Math.sin(value), 2) * limit) % limit;\n }\n /**\n * Сброс зерна случайности\n * @private\n */\n resetSeed() {\n const date = new Date();\n const time = date.getUTCHours() * 60 + date.getUTCMinutes();\n if (this.settings.change_frequency === 0) {\n this.seed = time * 60 + date.getUTCSeconds();\n return;\n }\n this.seed = Math.floor(time / this.settings.change_frequency);\n }\n /**\n * Выбор случайного слова\n * @param {string} name\n * @param {StupidTitleWeightedVariants} variants\n * @return {string}\n * @private\n */\n selectRandom(name, variants) {\n const elements = Object.keys(variants);\n const totalWeight = elements.reduce((sum, element) => sum + variants[element], 0);\n const randomWeight = this.prng(name, this.seed++, totalWeight);\n let currentWeight = 0;\n for (const element of elements) {\n currentWeight += variants[element];\n if (randomWeight <= currentWeight) {\n return element;\n }\n }\n throw new Error('Тебя быть тут не должно...');\n }\n /**\n * Выбор случайной фразы\n * @param {string} type\n * @param {boolean} gender\n * @return {StupidTitleWeightedVariants}\n * @private\n */\n buildVariants(type, gender) {\n const result = {};\n const variants = this.settings.variants[type];\n for (const iterator of Object.entries(variants)) {\n const word = iterator[0];\n const wordSettings = iterator[1];\n if (!wordSettings.enabled || wordSettings.gender === !gender) {\n continue;\n }\n if (!this.settings.rude && wordSettings.rude) {\n continue;\n }\n result[word] = wordSettings.weight;\n }\n return result;\n }\n /**\n * Сделать первую буква слова заглавной\n * @param {string} str Слово\n * @return {string} Исправленное слово\n * @private\n */\n capitalizeFirst(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n}\n/**\n * Класс настроек для шутки \"Глупые статусы\"\n */\nclass StupidTitleJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 100;\n /**\n * Определение пола по имени.\n * По умолчанию род устанавливается случайным образом\n *\n * Если установлено значение `null`, система попытается загрузить пол,\n * установленный в настройках аккаунта. Если этот пол определить невозможно,\n * то он будет выбран случайно. Эта настройка позволяет изменить это\n * поведение, если ваш форум обладает ролевой системой, в которой пол\n * определяется иным образом.\n */\n this.gender_resolver = null;\n /**\n * Разрешить возможно оскорбительные варианты\n */\n this.rude = false;\n /**\n * Частота смены статусов (в минутах)\n * Установите значение 0, что бы обновление происходило при\n * каждом обновлении страницы\n */\n this.change_frequency = 5;\n /**\n * Разрешённые схемы формирования статусов\n *\n * {adj} - прилагательное\n * {noun} - имя существительно\n * {verb} - глагол\n * {adv} - наречие\n * {place} - дополнение места\n * {p} - знак препинания\n */\n this.schemas = {\n '{adj} {noun}{p}': 10,\n '{noun} {adj}{p}': 3,\n '{adj}, {adj} {noun}{p}': 10,\n '{adj} и очень {adj} {noun}{p}': 10,\n '{adj} {noun} {verb}{p}': 10,\n '{adj} {noun} {adv} {verb}{p}': 5,\n '{adj} {noun} {verb} {place}{p}': 5,\n '{adj} {noun} {adv} {verb} {place}{p}': 5,\n };\n /**\n * Вариант слов\n * Смотрите раздел описания скрипта, что бы настроить это поле\n */\n this.variants = {\n adj: {},\n noun: {},\n verb: {},\n place: {},\n adv: {},\n p: {\n '': new StupidTitleSetting({ weight: 15 }),\n '.': new StupidTitleSetting({ weight: 10 }),\n '...': new StupidTitleSetting({ weight: 5 }),\n '!': new StupidTitleSetting({ weight: 5 }),\n '!!!': new StupidTitleSetting({ weight: 2 }),\n '?': new StupidTitleSetting({ weight: 2 }),\n '?!': new StupidTitleSetting({ weight: 1 }),\n },\n };\n }\n}\n/**\n * Класс настройки\n */\nclass StupidTitleSetting {\n /**\n * Создание класса\n * @param {StupidTitleSettingInitializer} options\n */\n constructor(options) {\n var _a, _b, _c, _d;\n this.weight = 10;\n this.enabled = true;\n this.rude = false;\n this.gender = null;\n (_a = this.weight) !== null && _a !== void 0 ? _a : (this.weight = options.weight);\n (_b = this.enabled) !== null && _b !== void 0 ? _b : (this.enabled = options.enabled);\n (_c = this.rude) !== null && _c !== void 0 ? _c : (this.rude = options.rude);\n (_d = this.gender) !== null && _d !== void 0 ? _d : (this.gender = options.gender);\n }\n}\n/**\n * Метод создания списка слов\n * @param {boolean | null} gender\n * @param {string} input\n * @return {StupidTitleVariant}\n * @constructor\n */\nfunction BuildStupidTitleVariant(gender, input) {\n const result = {};\n const words = input.split(',').map((word) => word.trim());\n words.forEach((word) => {\n const cleanWord = word.replace(/[^А-ЯЁа-яёA-Za-z\\- ]/g, '');\n if (cleanWord === '') {\n return;\n }\n result[cleanWord] = new StupidTitleSetting({\n gender,\n rude: word.indexOf('$') >= 0,\n enabled: word.indexOf('!') < 0,\n weight: 10 *\n (word.indexOf('$') >= 0 ? 0.5 : 1) *\n (word.indexOf('%') >= 0 ? 0.5 : 1) *\n (word.indexOf('^') >= 0 ? 2 : 1),\n });\n });\n return result;\n}\nwindow.BuildStupidTitleVariant = BuildStupidTitleVariant;\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/stupid_title.ts?");
/***/ }),
/***/ "./src/lib/vector.ts":
/*!***************************!*\
!*** ./src/lib/vector.ts ***!
\***************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Vector: () => (/* binding */ Vector)\n/* harmony export */ });\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n/**\n * Класс вектора\n */\nclass Vector {\n /**\n * Конструктор вектора\n * @param {number} x Координата X\n * @param {number} y Координата Y\n */\n constructor(x = 0, y = 0) {\n this.x = x;\n this.y = y;\n }\n /**\n * Угол наклона вектора\n */\n get angle() {\n return Math.atan2(this.y, this.x);\n }\n /**\n * Угол наклона вектора\n * @param {number} angle\n */\n set angle(angle) {\n const length = this.length;\n this.x = Math.cos(angle) * length;\n this.y = Math.sin(angle) * length;\n }\n /**\n * Длина вектора\n */\n get length() {\n return Math.distance(this.x, this.y);\n }\n /**\n * Длина вектора\n * @param {number} length\n */\n set length(length) {\n const angle = this.angle;\n this.x = Math.cos(angle) * length;\n this.y = Math.sin(angle) * length;\n }\n /**\n * Сумма векторов\n * @param {Vector} a Первый вектор\n * @param {Vector} b Второй вектор\n * @return {Vector} Вектор суммы\n */\n static addVectors(a, b) {\n return new Vector(a.x + b.x, a.y + b.y);\n }\n /**\n * Скалярное умножение векторов\n * @param {Vector} a Первый вектор\n * @param {Vector} b Второй вектор\n * @return {number} Скалярное произведение векторов\n */\n static dotProduct(a, b) {\n return a.x * b.x + a.y * b.y;\n }\n /**\n * Создать вектор по углу наклона и длине\n * @param {number} angle Угол наклона\n * @param {number} length Длина\n * @return {Vector} Вектор суммы\n */\n static fromLengthAngle(angle, length) {\n const v = new Vector();\n v.length = length;\n v.angle = angle;\n return v;\n }\n /**\n * Нахождение противоположного вектора\n * @return {Vector} Противоположный вектор\n */\n reverse() {\n return new Vector(-this.x, -this.y);\n }\n /**\n * Прибавить вектор\n * @param {Vector} a Второе слагаемое\n * @return {Vector} Вектор суммы\n */\n add(a) {\n return Vector.addVectors(this, a);\n }\n /**\n * Умножение вектора на число\n * @param {number} a Скаляр\n * @return {Vector} Вектор-результат\n */\n multiply(a) {\n return new Vector(a * this.x, a * this.y);\n }\n /**\n * Преобразование в CSS-преобразование\n * @return {string} CSS-преобразование\n */\n toTransform() {\n return `translate(${this.x}px, ${this.y}px)`;\n }\n /**\n * Строковое представление\n * @return {string}\n */\n toString() {\n return (0,_common__WEBPACK_IMPORTED_MODULE_0__.d2) `Vector(x=${this.x}, y=${this.y}, ` +\n (0,_common__WEBPACK_IMPORTED_MODULE_0__.d2) `length=${this.length}, angle=${this.angle})`;\n }\n}\nMath.distance = (x, y) => Math.sqrt(x * x + y * y);\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/lib/vector.ts?");
/***/ }),
/***/ "./src/main.ts":
/*!*********************!*\
!*** ./src/main.ts ***!
\*********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _joker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./joker */ \"./src/joker.ts\");\n/* harmony import */ var _jokes_shake__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jokes/shake */ \"./src/jokes/shake.ts\");\n/* harmony import */ var _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jokes/humanitarian_hell */ \"./src/jokes/humanitarian_hell.ts\");\n/* harmony import */ var _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jokes/mirror */ \"./src/jokes/mirror.ts\");\n/* harmony import */ var _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jokes/carnival */ \"./src/jokes/carnival.ts\");\n/* harmony import */ var _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./jokes/crazy_letters */ \"./src/jokes/crazy_letters.ts\");\n/* harmony import */ var _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./jokes/letter_chaos */ \"./src/jokes/letter_chaos.ts\");\n/* harmony import */ var _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./jokes/cursor */ \"./src/jokes/cursor.ts\");\n/* harmony import */ var _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./jokes/stupid_title */ \"./src/jokes/stupid_title.ts\");\n/* harmony import */ var _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./jokes/inverted_scroll */ \"./src/jokes/inverted_scroll.ts\");\n/* harmony import */ var _jokes_latinization__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./jokes/latinization */ \"./src/jokes/latinization.ts\");\n/* harmony import */ var _jokes_fresh_grass__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./jokes/fresh_grass */ \"./src/jokes/fresh_grass.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nwindow.AprilJokes = ((jokes) => {\n const cl = new _joker__WEBPACK_IMPORTED_MODULE_0__.JokerClass();\n jokes.forEach((CustomJoke) => {\n cl.add(new CustomJoke());\n });\n $(() => cl.regularStart());\n return cl;\n})([\n _jokes_shake__WEBPACK_IMPORTED_MODULE_1__.ShakeJoke,\n _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__.HumanitarianHellJoke,\n _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__.MirrorJoke,\n _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__.CarnivalJoke,\n _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__.CrazyLettersJoke,\n _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__.LetterChaosJoke,\n _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__.CursorEffectsJoke,\n _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__.StupidTitleJoke,\n _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__.InvertedScrollJoke,\n _jokes_latinization__WEBPACK_IMPORTED_MODULE_10__.LatinizationJoke,\n _jokes_fresh_grass__WEBPACK_IMPORTED_MODULE_11__.FreshGrassJoke,\n]);\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/main.ts?");
/***/ }),
/***/ "./src/ui.ts":
/*!*******************!*\
!*** ./src/ui.ts ***!
\*******************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ JokerUI: () => (/* binding */ JokerUI)\n/* harmony export */ });\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types/html.d */ \"./src/types/html.d.ts\");\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_html_d__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types/mybb.d */ \"./src/types/mybb.d.ts\");\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_types_mybb_d__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _html_button_html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./html/button.html */ \"./src/html/button.html\");\n/* harmony import */ var _html_styles_html__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./html/styles.html */ \"./src/html/styles.html\");\n/* harmony import */ var _html_window_html__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./html/window.html */ \"./src/html/window.html\");\n\n\n\n\n\n\n/**\n * Класс интерфейса настроек\n */\nclass JokerUI {\n /**\n * Создание класса интерфейса настроек\n *\n * @param {JokerClass} joker\n */\n constructor(joker) {\n this.joker = joker;\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('link[rel=\"stylesheet\"]').eq(0).before(_html_styles_html__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\n const button = this.button;\n button.hide();\n button.mybbModal({\n title: 'Настройки первоапрельских шуток',\n content: () => this.render(),\n closer: true,\n noscroll: true,\n escClose: true,\n });\n }\n /**\n * Основная кнопка, открывающая настройки\n * @return {JQuery<HTMLButtonElement>}\n */\n get button() {\n let button = jquery__WEBPACK_IMPORTED_MODULE_2___default()('.april-fools__button');\n if (button.length === 0) {\n button = jquery__WEBPACK_IMPORTED_MODULE_2___default()(_html_button_html__WEBPACK_IMPORTED_MODULE_3__[\"default\"]).appendTo('body');\n }\n return button;\n }\n /**\n * Показать кнопку настроек\n */\n show() {\n this.button.show();\n }\n /**\n * Создать окно настроек\n * @return {JQuery<HTMLDivElement>}\n */\n render() {\n const result = jquery__WEBPACK_IMPORTED_MODULE_2___default()('<div></div>').html(_html_window_html__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n const rowTemplate = jquery__WEBPACK_IMPORTED_MODULE_2___default()('#april-fools__window-row', result).html();\n const jokeContainer = jquery__WEBPACK_IMPORTED_MODULE_2___default()('.april-fools__jokes', result);\n for (const joke of Object.values(this.joker.jokes)) {\n const row = jquery__WEBPACK_IMPORTED_MODULE_2___default()(eval('`' + rowTemplate + '`'));\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('input[type=\"checkbox\"]', row)\n .prop('checked', joke.settings.enabled)\n .on('click', (e) => {\n const target = e.currentTarget;\n this.joker.toggleJoke(joke.id, target.checked);\n });\n jokeContainer.append(row);\n }\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('button', result).on('click', async () => {\n await this.joker.clearUserStates();\n window.location.reload();\n });\n return jquery__WEBPACK_IMPORTED_MODULE_2___default()('.april-fools__content', result);\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/ui.ts?");
/***/ }),
/***/ "jquery":
/*!*************************!*\
!*** external "jQuery" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = jQuery;
/***/ }),
/***/ "./node_modules/cursor-effects/dist/esm.js":
/*!*************************************************!*\
!*** ./node_modules/cursor-effects/dist/esm.js ***!
\*************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ bubbleCursor: () => (/* binding */ h),\n/* harmony export */ characterCursor: () => (/* binding */ i),\n/* harmony export */ clockCursor: () => (/* binding */ r),\n/* harmony export */ emojiCursor: () => (/* binding */ c),\n/* harmony export */ fairyDustCursor: () => (/* binding */ e),\n/* harmony export */ followingDotCursor: () => (/* binding */ s),\n/* harmony export */ ghostCursor: () => (/* binding */ l),\n/* harmony export */ rainbowCursor: () => (/* binding */ a),\n/* harmony export */ snowflakeCursor: () => (/* binding */ n),\n/* harmony export */ springyEmojiCursor: () => (/* binding */ t),\n/* harmony export */ textFlag: () => (/* binding */ d),\n/* harmony export */ trailingCursor: () => (/* binding */ o)\n/* harmony export */ });\nfunction t(t){let e,n,i,o,s=t&&t.emoji||\"🤪\",h=t&&t.element,c=h||document.body,l=window.innerWidth,a=window.innerHeight,r={x:l/2,y:l/2},d=[];const u=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function A(){if(u.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",h?(e.style.position=\"absolute\",c.appendChild(e),e.width=c.clientWidth,e.height=c.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=l,e.height=a),n.font=\"16px serif\",n.textBaseline=\"middle\",n.textAlign=\"center\";let t=n.measureText(s),i=document.createElement(\"canvas\"),r=i.getContext(\"2d\");i.width=t.width,i.height=2*t.actualBoundingBoxAscent,r.textAlign=\"center\",r.font=\"16px serif\",r.textBaseline=\"middle\",r.fillText(s,i.width/2,t.actualBoundingBoxAscent),o=i;let A=0;for(A=0;A<7;A++)d[A]=new x(o);c.addEventListener(\"mousemove\",f),c.addEventListener(\"touchmove\",g,{passive:!0}),c.addEventListener(\"touchstart\",g,{passive:!0}),window.addEventListener(\"resize\",m),p()}function m(t){l=window.innerWidth,a=window.innerHeight,h?(e.width=c.clientWidth,e.height=c.clientHeight):(e.width=l,e.height=a)}function g(t){if(t.touches.length>0)if(h){const e=c.getBoundingClientRect();r.x=t.touches[0].clientX-e.left,r.y=t.touches[0].clientY-e.top}else r.x=t.touches[0].clientX,r.y=t.touches[0].clientY}function f(t){if(h){const e=c.getBoundingClientRect();r.x=t.clientX-e.left,r.y=t.clientY-e.top}else r.x=t.clientX,r.y=t.clientY}function p(){!function(){e.width=e.width,d[0].position.x=r.x,d[0].position.y=r.y;for(let t=1;t<7;t++){let i=new v(0,0);t>0&&w(t-1,t,i),t<6&&w(t+1,t,i);let o,s,h=new v(10*-d[t].velocity.x,10*-d[t].velocity.y),c=new v((i.X+h.X)/1,(i.Y+h.Y)/1+50);d[t].velocity.x+=.01*c.X,d[t].velocity.y+=.01*c.Y,Math.abs(d[t].velocity.x)<.1&&Math.abs(d[t].velocity.y)<.1&&Math.abs(c.X)<.1&&Math.abs(c.Y)<.1&&(d[t].velocity.x=0,d[t].velocity.y=0),d[t].position.x+=d[t].velocity.x,d[t].position.y+=d[t].velocity.y,o=e.clientHeight,s=e.clientWidth,d[t].position.y>=o-11-1&&(d[t].velocity.y>0&&(d[t].velocity.y=.7*-d[t].velocity.y),d[t].position.y=o-11-1),d[t].position.x>=s-11&&(d[t].velocity.x>0&&(d[t].velocity.x=.7*-d[t].velocity.x),d[t].position.x=s-11-1),d[t].position.x<0&&(d[t].velocity.x<0&&(d[t].velocity.x=.7*-d[t].velocity.x),d[t].position.x=0),d[t].draw(n)}}(),i=requestAnimationFrame(p)}function y(){e.remove(),cancelAnimationFrame(i),c.removeEventListener(\"mousemove\",f),c.removeEventListener(\"touchmove\",g),c.removeEventListener(\"touchstart\",g),window.addEventListener(\"resize\",m)}function v(t,e){this.X=t,this.Y=e}function w(t,e,n){let i=d[t].position.x-d[e].position.x,o=d[t].position.y-d[e].position.y,s=Math.sqrt(i*i+o*o);if(s>10){let t=10*(s-10);n.X+=i/s*t,n.Y+=o/s*t}}function x(t){this.position={x:r.x,y:r.y},this.velocity={x:0,y:0},this.canv=t,this.draw=function(t){t.drawImage(this.canv,this.position.x-this.canv.width/2,this.position.y-this.canv.height/2,this.canv.width,this.canv.height)}}return u.onchange=()=>{u.matches?y():A()},A(),{destroy:y}}function e(t){let e=t&&t.colors||[\"#D61C59\",\"#E7D84B\",\"#1B8798\"],n=t&&t.element,i=n||document.body,o=window.innerWidth,s=window.innerHeight;const h={x:o/2,y:o/2},c={x:o/2,y:o/2},l=[],a=[];let r,d,u;const A=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function m(){if(A.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;r=document.createElement(\"canvas\"),d=r.getContext(\"2d\"),r.style.top=\"0px\",r.style.left=\"0px\",r.style.pointerEvents=\"none\",n?(r.style.position=\"absolute\",i.appendChild(r),r.width=i.clientWidth,r.height=i.clientHeight):(r.style.position=\"fixed\",i.appendChild(r),r.width=o,r.height=s),d.font=\"21px serif\",d.textBaseline=\"middle\",d.textAlign=\"center\",e.forEach((t=>{let e=d.measureText(\"*\"),n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=e.width,n.height=e.actualBoundingBoxAscent+e.actualBoundingBoxDescent,i.fillStyle=t,i.textAlign=\"center\",i.font=\"21px serif\",i.textBaseline=\"middle\",i.fillText(\"*\",n.width/2,e.actualBoundingBoxAscent),a.push(n)})),i.addEventListener(\"mousemove\",p),i.addEventListener(\"touchmove\",f,{passive:!0}),i.addEventListener(\"touchstart\",f,{passive:!0}),window.addEventListener(\"resize\",g),v()}function g(t){o=window.innerWidth,s=window.innerHeight,n?(r.width=i.clientWidth,r.height=i.clientHeight):(r.width=o,r.height=s)}function f(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)y(t.touches[e].clientX,t.touches[e].clientY,a[Math.floor(Math.random()*a.length)])}function p(t){window.requestAnimationFrame((()=>{if(n){const e=i.getBoundingClientRect();h.x=t.clientX-e.left,h.y=t.clientY-e.top}else h.x=t.clientX,h.y=t.clientY;Math.hypot(h.x-c.x,h.y-c.y)>1.5&&(y(h.x,h.y,a[Math.floor(Math.random()*e.length)]),c.x=h.x,c.y=h.y)}))}function y(t,e,n){l.push(new x(t,e,n))}function v(){!function(){if(0!=l.length){d.clearRect(0,0,o,s);for(let t=0;t<l.length;t++)l[t].update(d);for(let t=l.length-1;t>=0;t--)l[t].lifeSpan<0&&l.splice(t,1);0==l.length&&d.clearRect(0,0,o,s)}}(),u=requestAnimationFrame(v)}function w(){r.remove(),cancelAnimationFrame(u),i.removeEventListener(\"mousemove\",p),i.removeEventListener(\"touchmove\",f),i.removeEventListener(\"touchstart\",f),window.addEventListener(\"resize\",g)}function x(t,e,n){const i=Math.floor(30*Math.random()+60);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/2),y:.7*Math.random()+.9},this.position={x:t,y:e},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.velocity.y+=.02;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0);t.drawImage(this.canv,this.position.x-this.canv.width/2*e,this.position.y-this.canv.height/2,this.canv.width*e,this.canv.height*e)}}return A.onchange=()=>{A.matches?w():m()},m(),{destroy:w}}function n(t){let e,n,i,o=t&&t.element,s=o||document.body,h=[\"❄️\"],c=window.innerWidth,l=window.innerHeight,a={x:c/2,y:c/2},r=[],d=[];const u=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function A(){if(u.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=c,e.height=l),n.font=\"12px serif\",n.textBaseline=\"middle\",n.textAlign=\"center\",h.forEach((t=>{let e=n.measureText(t),i=document.createElement(\"canvas\"),o=i.getContext(\"2d\");i.width=e.width,i.height=2*e.actualBoundingBoxAscent,o.textAlign=\"center\",o.font=\"12px serif\",o.textBaseline=\"middle\",o.fillText(t,i.width/2,e.actualBoundingBoxAscent),d.push(i)})),s.addEventListener(\"mousemove\",f),s.addEventListener(\"touchmove\",g,{passive:!0}),s.addEventListener(\"touchstart\",g,{passive:!0}),window.addEventListener(\"resize\",m),y()}function m(t){c=window.innerWidth,l=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=c,e.height=l)}function g(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)p(t.touches[e].clientX,t.touches[e].clientY,d[Math.floor(Math.random()*d.length)])}function f(t){if(o){const e=s.getBoundingClientRect();a.x=t.clientX-e.left,a.y=t.clientY-e.top}else a.x=t.clientX,a.y=t.clientY;p(a.x,a.y,d[Math.floor(Math.random()*h.length)])}function p(t,e,n){r.push(new w(t,e,n))}function y(){!function(){if(0!=r.length){n.clearRect(0,0,c,l);for(let t=0;t<r.length;t++)r[t].update(n);for(let t=r.length-1;t>=0;t--)r[t].lifeSpan<0&&r.splice(t,1);0==r.length&&n.clearRect(0,0,c,l)}}(),i=requestAnimationFrame(y)}function v(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",f),s.removeEventListener(\"touchmove\",g),s.removeEventListener(\"touchstart\",g),window.addEventListener(\"resize\",m)}function w(t,e,n){const i=Math.floor(60*Math.random()+80);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/2),y:1+Math.random()},this.position={x:t,y:e},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.velocity.x+=2*(Math.random()<.5?-1:1)/75,this.velocity.y-=Math.random()/300;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0),n=.0174533*(2*this.lifeSpan);t.translate(this.position.x,this.position.y),t.rotate(n),t.drawImage(this.canv,-this.canv.width/2*e,-this.canv.height/2,this.canv.width*e,this.canv.height*e),t.rotate(-n),t.translate(-this.position.x,-this.position.y)}}return u.onchange=()=>{u.matches?v():A()},A(),{destroy:v}}function i(t){let e=t&&t.element,n=e||document.body,i=t?.characters||[\"h\",\"e\",\"l\",\"l\",\"o\"];const o=t?.colors||[\"#6622CC\",\"#A755C2\",\"#B07C9E\",\"#B59194\",\"#D2A1B8\"];let s,h,c,l=t?.cursorOffset||{x:0,y:0},a=window.innerWidth,r=window.innerHeight,d={x:a/2,y:a/2},u=[],A=t?.font||\"15px serif\",m=t?.characterLifeSpanFunction||function(){return Math.floor(60*Math.random()+80)},g=t?.initialCharacterVelocityFunction||function(){return{x:(Math.random()<.5?-1:1)*Math.random()*5,y:(Math.random()<.5?-1:1)*Math.random()*5}},f=t?.characterVelocityChangeFunctions||{x_func:function(t,e){return(Math.random()<.5?-1:1)/30},y_func:function(t,e){return(Math.random()<.5?-1:1)/15}},p=t?.characterScalingFunction||function(t,e){let n=e-t;return Math.max(n/e*2,0)},y=t?.characterNewRotationDegreesFunction||function(t,e){return(e-t)/5},v=[];const w=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function x(){if(w.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;s=document.createElement(\"canvas\"),h=s.getContext(\"2d\"),s.style.top=\"0px\",s.style.left=\"0px\",s.style.pointerEvents=\"none\",e?(s.style.position=\"absolute\",n.appendChild(s),s.width=n.clientWidth,s.height=n.clientHeight):(s.style.position=\"fixed\",document.body.appendChild(s),s.width=a,s.height=r),h.font=A,h.textBaseline=\"middle\",h.textAlign=\"center\",i.forEach((t=>{let e=h.measureText(t),n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=e.width,n.height=2.5*e.actualBoundingBoxAscent,i.textAlign=\"center\",i.font=A,i.textBaseline=\"middle\";var s=o[Math.floor(Math.random()*o.length)];i.fillStyle=s,i.fillText(t,n.width/2,e.actualBoundingBoxAscent),v.push(n)})),n.addEventListener(\"mousemove\",L),n.addEventListener(\"touchmove\",M,{passive:!0}),n.addEventListener(\"touchstart\",M,{passive:!0}),window.addEventListener(\"resize\",E),B()}function E(t){a=window.innerWidth,r=window.innerHeight,e?(s.width=n.clientWidth,s.height=n.clientHeight):(s.width=a,s.height=r)}function M(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)C(t.touches[e].clientX,t.touches[e].clientY,v[Math.floor(Math.random()*v.length)])}function L(t){if(e){const e=n.getBoundingClientRect();d.x=t.clientX-e.left,d.y=t.clientY-e.top}else d.x=t.clientX,d.y=t.clientY;C(d.x,d.y,v[Math.floor(Math.random()*i.length)])}function C(t,e,n){u.push(new S(t,e,n))}function B(){!function(){if(0!=u.length){h.clearRect(0,0,a,r);for(let t=0;t<u.length;t++)u[t].update(h);for(let t=u.length-1;t>=0;t--)u[t].lifeSpan<0&&u.splice(t,1);0==u.length&&h.clearRect(0,0,a,r)}}(),c=requestAnimationFrame(B)}function R(){s.remove(),cancelAnimationFrame(c),n.removeEventListener(\"mousemove\",L),n.removeEventListener(\"touchmove\",M),n.removeEventListener(\"touchstart\",M),window.addEventListener(\"resize\",E)}function S(t,e,n){const i=m();this.rotationSign=Math.random()<.5?-1:1,this.age=0,this.initialLifeSpan=i,this.lifeSpan=i,this.velocity=g(),this.position={x:t+l.x,y:e+l.y},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.age++,this.velocity.x+=f.x_func(this.age,this.initialLifeSpan),this.velocity.y+=f.y_func(this.age,this.initialLifeSpan);const e=p(this.age,this.initialLifeSpan),n=.0174533*(this.rotationSign*y(this.age,this.initialLifeSpan));t.translate(this.position.x,this.position.y),t.rotate(n),t.drawImage(this.canv,-this.canv.width/2*e,-this.canv.height/2,this.canv.width*e,this.canv.height*e),t.rotate(-n),t.translate(-this.position.x,-this.position.y)}}return w.onchange=()=>{w.matches?R():x()},x(),{destroy:R}}function o(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2},a=[];const r=t?.particles||15,d=t?.rate||.4,u=t?.baseImageSrc||\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAATCAYAAACk9eypAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAAEwAAAAAChpcNAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAABqElEQVQoFY3SPUvDQBgH8BREpRHExYiDgmLFl6WC+AYmWeyLg4i7buJX8DMpOujgyxGvUYeCgzhUQUSKKLUS0+ZyptXh8Z5Ti621ekPyJHl+uftfomhaf9Ei5JyxXKfynyEA6EYcLHpwyflT958GAQ7DTABNHd8EbtDbEH2BD5QEQmi2mM8P/Iq+A0SzszEg+3sPjDnDdVEtQKQbMUidHD3xVzf6A9UDEmEm+8h9KTqTVUjT+vB53aHrCbAPiceYq1dQI1Aqv4EhMll0jzv+Y0yiRgCnLRSYyDQHVoqUXe4uKL9l+L7GXC4vkMhE6eW/AOJs9k583ORDUyXMZ8F5SVHVVnllmPNKSFagAJ5DofaqGXw/gHBYg51dIldkmknY3tguv3jOtHR4+MqAzaraJXbEhqHhcQlwGSOi5pytVQHZLN5s0WNe8HPrLYlFsO20RPHkImxsbmHdLJFI76th7Z4SeuF53hTeFLvhRCJRCTKZKxgdnRDbW+iozFJbBMw14/ElwGYc0egMBMFzT21f5Rog33Z7dX02GBm7WV5ZfT5Nn5bE3zuCDe9UxdTpNvK+5AAAAABJRU5ErkJggg==\";let A=!1,m=new Image;m.src=u;const g=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function f(){if(g.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),s.addEventListener(\"mousemove\",y),window.addEventListener(\"resize\",p),v()}function p(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function y(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY;if(!1===A){A=!0;for(let t=0;t<r;t++)e=l.x,n=l.y,i=m,a.push(new x(e,n,i))}var e,n,i}function v(){!function(){n.clearRect(0,0,h,c);let t=l.x,e=l.y;a.forEach((function(i,o,s){let h=s[o+1]||s[0];i.position.x=t,i.position.y=e,i.move(n),t+=(h.position.x-i.position.x)*d,e+=(h.position.y-i.position.y)*d}))}(),i=requestAnimationFrame(v)}function w(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",y),window.addEventListener(\"resize\",p)}function x(t,e,n){this.position={x:t,y:e},this.image=n,this.move=function(t){t.drawImage(this.image,this.position.x,this.position.y)}}return g.onchange=()=>{g.matches?w():f()},f(),{destroy:w}}function s(t){let e,n,i=t&&t.element,o=i||document.body,s=window.innerWidth,h=window.innerHeight,c={x:s/2,y:s/2},l=new function(t,e,n,i){this.position={x:t,y:e},this.width=n,this.lag=i,this.moveTowards=function(t,e,n){this.position.x+=(t-this.position.x)/this.lag,this.position.y+=(e-this.position.y)/this.lag,n.fillStyle=a,n.beginPath(),n.arc(this.position.x,this.position.y,this.width,0,2*Math.PI),n.fill(),n.closePath()}}(s/2,h/2,10,10),a=t?.color||\"#323232a6\";const r=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function d(){if(r.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",i?(e.style.position=\"absolute\",o.appendChild(e),e.width=o.clientWidth,e.height=o.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=s,e.height=h),o.addEventListener(\"mousemove\",A),window.addEventListener(\"resize\",u),m()}function u(t){s=window.innerWidth,h=window.innerHeight,i?(e.width=o.clientWidth,e.height=o.clientHeight):(e.width=s,e.height=h)}function A(t){if(i){const e=o.getBoundingClientRect();c.x=t.clientX-e.left,c.y=t.clientY-e.top}else c.x=t.clientX,c.y=t.clientY}function m(){n.clearRect(0,0,s,h),l.moveTowards(c.x,c.y,n),requestAnimationFrame(m)}function g(){e.remove(),cancelAnimationFrame(m),o.removeEventListener(\"mousemove\",A),window.addEventListener(\"resize\",u)}return r.onchange=()=>{r.matches?g():d()},d(),{destroy:g}}function h(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2},a=[],r=[];const d=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function u(){if(d.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),s.addEventListener(\"mousemove\",g),s.addEventListener(\"touchmove\",m,{passive:!0}),s.addEventListener(\"touchstart\",m,{passive:!0}),window.addEventListener(\"resize\",A),p()}function A(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function m(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)f(t.touches[e].clientX,t.touches[e].clientY,r[Math.floor(Math.random()*r.length)])}function g(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY;f(l.x,l.y)}function f(t,e,n){a.push(new v(t,e,n))}function p(){!function(){if(0!=a.length){n.clearRect(0,0,h,c);for(let t=0;t<a.length;t++)a[t].update(n);for(let t=a.length-1;t>=0;t--)a[t].lifeSpan<0&&a.splice(t,1);0==a.length&&n.clearRect(0,0,h,c)}}(),i=requestAnimationFrame(p)}function y(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",g),s.removeEventListener(\"touchmove\",m),s.removeEventListener(\"touchstart\",m),window.addEventListener(\"resize\",A)}function v(t,e,n){const i=Math.floor(60*Math.random()+60);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/10),y:-1*Math.random()-.4},this.position={x:t,y:e},this.canv=n,this.baseDimension=4,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.velocity.x+=2*(Math.random()<.5?-1:1)/75,this.velocity.y-=Math.random()/600,this.lifeSpan--;const e=.2+(this.initialLifeSpan-this.lifeSpan)/this.initialLifeSpan;t.fillStyle=\"#e6f1f7\",t.strokeStyle=\"#3a92c5\",t.beginPath(),t.arc(this.position.x-this.baseDimension/2*e,this.position.y-this.baseDimension/2,this.baseDimension*e,0,2*Math.PI),t.stroke(),t.fill(),t.closePath()}}return d.onchange=()=>{d.matches?y():u()},u(),{destroy:y}}function c(t){const e=t&&t.emoji||[\"😀\",\"😂\",\"😆\",\"😊\"];let n=t&&t.element,i=n||document.body,o=window.innerWidth,s=window.innerHeight;const h={x:o/2,y:o/2},c={x:o/2,y:o/2};let l=0;const a=[],r=[];let d,u,A;const m=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function g(){if(m.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;d=document.createElement(\"canvas\"),u=d.getContext(\"2d\"),d.style.top=\"0px\",d.style.left=\"0px\",d.style.pointerEvents=\"none\",n?(d.style.position=\"absolute\",i.appendChild(d),d.width=i.clientWidth,d.height=i.clientHeight):(d.style.position=\"fixed\",document.body.appendChild(d),d.width=o,d.height=s),u.font=\"21px serif\",u.textBaseline=\"middle\",u.textAlign=\"center\",e.forEach((t=>{let e=u.measureText(t),n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=e.width,n.height=2*e.actualBoundingBoxAscent,i.textAlign=\"center\",i.font=\"21px serif\",i.textBaseline=\"middle\",i.fillText(t,n.width/2,e.actualBoundingBoxAscent),r.push(n)})),i.addEventListener(\"mousemove\",y,{passive:!0}),i.addEventListener(\"touchmove\",p,{passive:!0}),i.addEventListener(\"touchstart\",p,{passive:!0}),window.addEventListener(\"resize\",f),w()}function f(t){o=window.innerWidth,s=window.innerHeight,n?(d.width=i.clientWidth,d.height=i.clientHeight):(d.width=o,d.height=s)}function p(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)v(t.touches[e].clientX,t.touches[e].clientY,r[Math.floor(Math.random()*r.length)])}function y(t){t.timeStamp-l<16||window.requestAnimationFrame((()=>{if(n){const e=i.getBoundingClientRect();h.x=t.clientX-e.left,h.y=t.clientY-e.top}else h.x=t.clientX,h.y=t.clientY;Math.hypot(h.x-c.x,h.y-c.y)>1&&(v(h.x,h.y,r[Math.floor(Math.random()*e.length)]),c.x=h.x,c.y=h.y,l=t.timeStamp)}))}function v(t,e,n){a.push(new E(t,e,n))}function w(){!function(){if(0!=a.length){u.clearRect(0,0,o,s);for(let t=0;t<a.length;t++)a[t].update(u);for(let t=a.length-1;t>=0;t--)a[t].lifeSpan<0&&a.splice(t,1);0==a.length&&u.clearRect(0,0,o,s)}}(),A=requestAnimationFrame(w)}function x(){d.remove(),cancelAnimationFrame(A),i.removeEventListener(\"mousemove\",y),i.removeEventListener(\"touchmove\",p),i.removeEventListener(\"touchstart\",p),window.addEventListener(\"resize\",f)}function E(t,e,n){const i=Math.floor(60*Math.random()+80);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/2),y:.4*Math.random()+.8},this.position={x:t,y:e},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.velocity.y+=.05;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0);t.drawImage(this.canv,this.position.x-this.canv.width/2*e,this.position.y-this.canv.height/2,this.canv.width*e,this.canv.height*e)}}return m.onchange=()=>{m.matches?x():g()},g(),{destroy:x}}function l(t){let e,n,i,o=t&&t.element,s=o||document.body,h=t&&t.randomDelay,c=t&&t.minDelay||5,l=t&&t.maxDelay||50,a=window.innerWidth,r=window.innerHeight,d={x:a/2,y:a/2},u=[],A=new Image;t&&t.image?A.src=t.image:A.src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAATCAYAAACk9eypAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAAEwAAAAAChpcNAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAABqElEQVQoFY3SPUvDQBgH8BREpRHExYiDgmLFl6WC+AYmWeyLg4i7buJX8DMpOujgyxGvUYeCgzhUQUSKKLUS0+ZyptXh8Z5Ti621ekPyJHl+uftfomhaf9Ei5JyxXKfynyEA6EYcLHpwyflT958GAQ7DTABNHd8EbtDbEH2BD5QEQmi2mM8P/Iq+A0SzszEg+3sPjDnDdVEtQKQbMUidHD3xVzf6A9UDEmEm+8h9KTqTVUjT+vB53aHrCbAPiceYq1dQI1Aqv4EhMll0jzv+Y0yiRgCnLRSYyDQHVoqUXe4uKL9l+L7GXC4vkMhE6eW/AOJs9k583ORDUyXMZ8F5SVHVVnllmPNKSFagAJ5DofaqGXw/gHBYg51dIldkmknY3tguv3jOtHR4+MqAzaraJXbEhqHhcQlwGSOi5pytVQHZLN5s0WNe8HPrLYlFsO20RPHkImxsbmHdLJFI76th7Z4SeuF53hTeFLvhRCJRCTKZKxgdnRDbW+iozFJbBMw14/ElwGYc0egMBMFzT21f5Rog33Z7dX02GBm7WV5ZfT5Nn5bE3zuCDe9UxdTpNvK+5AAAAABJRU5ErkJggg==\";const m=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function g(){if(m.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=a,e.height=r),s.addEventListener(\"mousemove\",x),s.addEventListener(\"touchmove\",p,{passive:!0}),s.addEventListener(\"touchstart\",p,{passive:!0}),window.addEventListener(\"resize\",f),M()}function f(t){a=window.innerWidth,r=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=a,e.height=r)}function p(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)E(t.touches[e].clientX,t.touches[e].clientY,A)}m.onchange=()=>{m.matches?L():g()};let y=()=>Math.floor(Math.random()*(l-c+1))+c,v=Date.now(),w=y();function x(t){if(h){if(v+w>Date.now())return;v=Date.now(),w=y()}if(o){const e=s.getBoundingClientRect();d.x=t.clientX-e.left,d.y=t.clientY-e.top}else d.x=t.clientX,d.y=t.clientY;E(d.x,d.y,A)}function E(t,e,n){u.push(new C(t,e,n))}function M(){!function(){if(0!=u.length){n.clearRect(0,0,a,r);for(let t=0;t<u.length;t++)u[t].update(n);for(let t=u.length-1;t>=0;t--)u[t].lifeSpan<0&&u.splice(t,1);0==u.length&&n.clearRect(0,0,a,r)}}(),i=requestAnimationFrame(M)}function L(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",x),s.removeEventListener(\"touchmove\",p),s.removeEventListener(\"touchstart\",p),window.addEventListener(\"resize\",f)}function C(t,e,n){this.initialLifeSpan=40,this.lifeSpan=40,this.position={x:t,y:e},this.image=n,this.update=function(t){this.lifeSpan--;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0);t.globalAlpha=e,t.drawImage(this.image,this.position.x,this.position.y)}}return g(),{destroy:L}}function a(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2},a=[];const r=t?.length||20,d=t?.colors||[\"#FE0000\",\"#FD8C00\",\"#FFE500\",\"#119F0B\",\"#0644B3\",\"#C22EDC\"],u=t?.size||3;let A=!1;const m=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function g(){if(m.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),s.addEventListener(\"mousemove\",p),window.addEventListener(\"resize\",f),y()}function f(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function p(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY;if(!1===A){A=!0;for(let t=0;t<r;t++)e=l.x,n=l.y,void 0,a.push(new w(e,n))}var e,n}function y(){!function(){n.clearRect(0,0,h,c),n.lineJoin=\"round\";let t=[],e=l.x,i=l.y;a.forEach((function(n,o,s){let h=s[o+1]||s[0];n.position.x=e,n.position.y=i,t.push({x:e,y:i}),e+=.4*(h.position.x-n.position.x),i+=.4*(h.position.y-n.position.y)})),d.forEach(((e,i)=>{n.beginPath(),n.strokeStyle=e,t.length&&n.moveTo(t[0].x,t[0].y+i*(u-1)),t.forEach(((t,e)=>{0!==e&&n.lineTo(t.x,t.y+i*u)})),n.lineWidth=u,n.lineCap=\"round\",n.stroke()}))}(),i=requestAnimationFrame(y)}function v(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",p),window.addEventListener(\"resize\",f)}function w(t,e){this.position={x:t,y:e}}return m.onchange=()=>{m.matches?v():g()},g(),{destroy:v}}function r(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2};const a=t&&t.dateColor||\"blue\",r=t&&t.faceColor||\"black\",d=t&&t.secondsColor||\"red\",u=t&&t.minutesColor||\"black\",A=t&&t.hoursColor||\"black\",m=.4,g=t&&t.theDays||[\"SUNDAY\",\"MONDAY\",\"TUESDAY\",\"WEDNESDAY\",\"THURSDAY\",\"FRIDAY\",\"SATURDAY\"],f=t&&t.theMonths||[\"JANUARY\",\"FEBRUARY\",\"MARCH\",\"APRIL\",\"MAY\",\"JUNE\",\"JULY\",\"AUGUST\",\"SEPTEMBER\",\"OCTOBER\",\"NOVEMBER\",\"DECEMBER\"];let p=new Date,y=p.getDate(),v=p.getYear()+1900;const w=(\" \"+g[p.getDay()]+\" \"+y+\" \"+f[p.getMonth()]+\" \"+v).split(\"\"),x=[\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"1\",\"2\"],E=x.length,M=[\"•\",\"•\",\"•\"],L=[\"•\",\"•\",\"•\",\"•\"],C=[\"•\",\"•\",\"•\",\"•\",\"•\"],B=360/E,R=360/w.length,S=45/6.5,b=[],Y=[],W=[],H=[],I=[],X=[],D=[],T=[],F=[];var z=parseInt(w.length+E+M.length+L.length+C.length)+1;const P=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function J(){if(P.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),n.font=\"10px sans-serif\",n.textAlign=\"center\",n.textBaseline=\"middle\";for(let t=0;t<z;t++)b[t]=0,Y[t]=0,W[t]=0,H[t]=0;for(let t=0;t<w.length;t++)F[t]={color:a,value:w[t]};for(let t=0;t<x.length;t++)T[t]={color:r,value:x[t]};for(let t=0;t<M.length;t++)D[t]={color:A,value:M[t]};for(let t=0;t<L.length;t++)X[t]={color:u,value:L[t]};for(let t=0;t<C.length;t++)I[t]={color:d,value:C[t]};s.addEventListener(\"mousemove\",Z),s.addEventListener(\"touchmove\",Q,{passive:!0}),s.addEventListener(\"touchstart\",Q,{passive:!0}),window.addEventListener(\"resize\",U),k()}function U(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function Q(t){if(t.touches.length>0)if(o){const e=s.getBoundingClientRect();l.x=t.touches[0].clientX-e.left,l.y=t.touches[0].clientY-e.top}else l.x=t.touches[0].clientX,l.y=t.touches[0].clientY}function Z(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY}function k(){!function(){W[0]=Math.round(b[0]+=(l.y-b[0])*m),H[0]=Math.round(Y[0]+=(l.x-Y[0])*m);for(let t=1;t<z;t++)W[t]=Math.round(b[t]+=(W[t-1]-b[t])*m),H[t]=Math.round(Y[t]+=(H[t-1]-Y[t])*m),b[t-1]>=c-80&&(b[t-1]=c-80),Y[t-1]>=h-80&&(Y[t-1]=h-80)}(),function(){n.clearRect(0,0,h,c);const t=new Date,e=t.getSeconds(),i=Math.PI*(e-15)/30,o=t.getMinutes(),s=Math.PI*(o-15)/30,l=t.getHours(),a=Math.PI*(l-3)/6+Math.PI*parseInt(t.getMinutes())/360;for(let t=0;t<F.length;t++)F[t].y=b[t]+67.5*Math.sin(-i+t*R*Math.PI/180),F[t].x=Y[t]+67.5*Math.cos(-i+t*R*Math.PI/180),n.fillStyle=F[t].color,n.fillText(F[t].value,F[t].x,F[t].y);for(let t=0;t<T.length;t++)T[t].y=b[F.length+t]+45*Math.sin(t*B*Math.PI/180),T[t].x=Y[F.length+t]+45*Math.cos(t*B*Math.PI/180),n.fillStyle=T[t].color,n.fillText(T[t].value,T[t].x,T[t].y);for(let t=0;t<D.length;t++)D[t].y=b[F.length+E+t]+0+t*S*Math.sin(a),D[t].x=Y[F.length+E+t]+0+t*S*Math.cos(a),n.fillStyle=D[t].color,n.fillText(D[t].value,D[t].x,D[t].y);for(let t=0;t<X.length;t++)X[t].y=b[F.length+E+D.length+t]+0+t*S*Math.sin(s),X[t].x=Y[F.length+E+D.length+t]+0+t*S*Math.cos(s),n.fillStyle=X[t].color,n.fillText(X[t].value,X[t].x,X[t].y);for(let t=0;t<I.length;t++)I[t].y=b[F.length+E+D.length+X.length+t]+0+t*S*Math.sin(i),I[t].x=Y[F.length+E+D.length+X.length+t]+0+t*S*Math.cos(i),n.fillStyle=I[t].color,n.fillText(I[t].value,I[t].x,I[t].y)}(),i=requestAnimationFrame(k)}function N(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",Z),s.removeEventListener(\"touchmove\",Q),s.removeEventListener(\"touchstart\",Q),window.addEventListener(\"resize\",U)}return P.onchange=()=>{P.matches?N():J()},J(),{destroy:N}}function d(t){let e,n,i,o=t||{},s=t&&t.element,h=s||document.body,c=o.text?\" \"+t.text:\" Your Text Here\",l=t?.color||\"#000000\",a=o.font||\"monospace\",r=o.textSize||12,d=r+\"px \"+a,u=o.gap||r+2,A=0,m=[],g=window.innerWidth,f=window.innerHeight,p={x:g/2,y:g/2};for(let t=0;t<c.length;t++)m[t]={letter:c.charAt(t),x:g/2,y:g/2};t?.size;const y=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function v(){if(y.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",s?(e.style.position=\"absolute\",h.appendChild(e),e.width=h.clientWidth,e.height=h.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=g,e.height=f),h.addEventListener(\"mousemove\",x),window.addEventListener(\"resize\",w),E()}function w(t){g=window.innerWidth,f=window.innerHeight,s?(e.width=h.clientWidth,e.height=h.clientHeight):(e.width=g,e.height=f)}function x(t){if(s){const e=h.getBoundingClientRect();p.x=t.clientX-e.left,p.y=t.clientY-e.top}else p.x=t.clientX,p.y=t.clientY}function E(){!function(){n.clearRect(0,0,g,f),A+=.15;let t=2*Math.cos(A),e=5*Math.sin(A);for(let t=m.length-1;t>0;t--)m[t].x=m[t-1].x+u,m[t].y=m[t-1].y,n.fillStyle=l,n.font=d,n.fillText(m[t].letter,m[t].x,m[t].y);let i=m[0].x,o=m[0].y;i+=(p.x-i)/5+t+2,o+=(p.y-o)/5+e,m[0].x=i,m[0].y=o}(),i=requestAnimationFrame(E)}function M(){e.remove(),cancelAnimationFrame(i),h.removeEventListener(\"mousemove\",x),window.addEventListener(\"resize\",w)}return y.onchange=()=>{y.matches?M():v()},v(),{destroy:M}}\n\n\n//# sourceURL=webpack://mybb-april-fools/./node_modules/cursor-effects/dist/esm.js?");
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval devtool is used.
/******/ var __webpack_exports__ = __webpack_require__("./src/main.ts");
/******/
/******/ })()
;