Greasy Fork is available in English.

MAL-Sync

Integrates MyAnimeList into various sites, with auto episode tracking.

Version vom 26.11.2018. Aktuellste Version

// ==UserScript==
// @name MAL-Sync
// @namespace https://greasyfork.org/users/92233
// @description Integrates MyAnimeList into various sites, with auto episode tracking.
// @version 0.3.0
// @author lolamtisch@gmail.com
// @license GPL-3.0
// @iconURL https://raw.githubusercontent.com/lolamtisch/MALSync/master/assets/icons/icon128.png
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_listValues
// @grant GM_addStyle
// @grant GM_getResourceText
// @grant GM.xmlHttpRequest
// @grant GM.getValue
// @grant GM.setValue
// @noframes
// @match *://myanimelist.net/anime/*
// @match *://myanimelist.net/manga/*
// @match *://myanimelist.net/animelist/*
// @match *://myanimelist.net/mangalist/*
// @match *://myanimelist.net/anime.php?id=*
// @match *://myanimelist.net/manga.php?id=*
// @match *://myanimelist.net/character/*
// @match *://myanimelist.net/people/*
// @match *://myanimelist.net/search/*
// @match *://kissanime.ru/Anime/*
// @match *://kissanime.to/Anime/*
// @match *://kissmanga.com/Manga/*
// @match *://*.9anime.to/watch/*
// @match *://*.9anime.is/watch/*
// @match *://*.9anime.ru/watch/*
// @match *://*.9anime.ch/watch/*
// @match *://*.crunchyroll.com/*
// @match *://www.masterani.me/anime/info/*
// @match *://www.masterani.me/anime/watch/*
// @match *://*.mangadex.org/manga/*
// @match *://*.mangadex.org/title/*
// @match *://*.mangadex.org/chapter/*
// @match *://mangarock.com/manga/*
// @match *://*.gogoanime.tv/*
// @match *://*.gogoanime.io/*
// @match *://*.gogoanime.in/*
// @match *://*.gogoanime.se/*
// @match *://*.gogoanime.sh/*
// @match *://*.gogoanimes.co/*
// @match *://animeheaven.eu/i.php*
// @match *://animeheaven.eu/watch.php*
// @exclude *crunchyroll.com/
// @exclude *crunchyroll.com
// @exclude *crunchyroll.com/acct*
// @exclude *crunchyroll.com/anime*
// @exclude *crunchyroll.com/comics*
// @exclude *crunchyroll.com/edit*
// @exclude *crunchyroll.com/email*
// @exclude *crunchyroll.com/forum*
// @exclude *crunchyroll.com/home*
// @exclude *crunchyroll.com/inbox*
// @exclude *crunchyroll.com/library*
// @exclude *crunchyroll.com/login*
// @exclude *crunchyroll.com/manga*
// @exclude *crunchyroll.com/newprivate*
// @exclude *crunchyroll.com/news*
// @exclude *crunchyroll.com/notifications*
// @exclude *crunchyroll.com/order*
// @exclude *crunchyroll.com/outbox*
// @exclude *crunchyroll.com/pm*
// @exclude *crunchyroll.com/search*
// @exclude *crunchyroll.com/store*
// @exclude *crunchyroll.com/user*
// @exclude *crunchyroll.com/videos*
// @exclude *crunchyroll.com/affiliate_iframeplayer*
// @exclude *gogoanime*.*/
// @exclude *gogoanime*.*/*.html
// @exclude *gogoanime*.*/anime-List*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @resource material.css https://code.getmdl.io/1.3.0/material.indigo-pink.min.css
// @resource materialFont.css https://fonts.googleapis.com/icon?family=Material+Icons
// @resource material.js https://code.getmdl.io/1.3.0/material.min.js
// @resource simpleBar.css https://unpkg.com/simplebar@3.0.0-beta.4/dist/simplebar.css
// @resource simpleBar.js https://unpkg.com/simplebar@3.0.0-beta.4/dist/simplebar.js
// @run-at document_start
// @connect myanimelist.net
// @connect kissanimelist.firebaseio.com
// @connect *
// ==/UserScript==

/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 25);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);

// EXTERNAL MODULE: ./src/api/storage/userscriptLegacy.ts
var userscriptLegacy = __webpack_require__(7);

// CONCATENATED MODULE: ./src/api/request/requestUserscriptLegacy.ts
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
const requestUserscriptLegacy = {
    xhr(method, url) {
        return __awaiter(this, void 0, void 0, function* () {
            return new Promise((resolve, reject) => {
                var request = {
                    method: method,
                    url: url,
                    synchronous: false,
                    headers: [],
                    data: null,
                    onload: function (response) {
                        console.log(response);
                        var responseObj = {
                            finalUrl: response.finalUrl,
                            responseText: response.responseText,
                            status: response.status
                        };
                        resolve(responseObj);
                    }
                };
                if (typeof url === 'object') {
                    request.url = url.url;
                    request.headers = url.headers;
                    request.data = url.data;
                }
                GM_xmlhttpRequest(request);
            });
        });
    },
};

// EXTERNAL MODULE: ./src/api/settings.ts
var settings = __webpack_require__(8);

// CONCATENATED MODULE: ./src/api/userscript.ts
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "storage", function() { return storage; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "request", function() { return request; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return userscript_settings; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "type", function() { return type; });



var storage = userscriptLegacy["a" /* userscriptLegacy */];
var request = requestUserscriptLegacy;
var userscript_settings = settings["a" /* settingsObj */];
var type = 'userscript';


/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$", function() { return $; });
var $ = jQuery;


/***/ }),
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "error", function() { return error; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "info", function() { return info; });
var log = function () {
    return Function.prototype.bind.call(console.log, console, "%cMAL-Sync", "background-color: #2e51a2; color: white; padding: 2px 10px; border-radius: 3px;");
}();
var error = function () {
    return Function.prototype.bind.call(console.error, console, "%cMAL-Sync", "background-color: #8f0000; color: white; padding: 2px 10px; border-radius: 3px;");
}();
var info = function () {
    return Function.prototype.bind.call(console.info, console, "%cMAL-Sync", "background-color: wheat; color: black; padding: 2px 10px; border-radius: 3px;");
}();


/***/ }),
/* 3 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(api, j, con, utils) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "urlPart", function() { return urlPart; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "urlParam", function() { return urlParam; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "favicon", function() { return favicon; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "watching", function() { return watching; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "planTo", function() { return planTo; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "episode", function() { return episode; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "syncRegex", function() { return syncRegex; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "status", function() { return status; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getselect", function() { return getselect; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "absoluteLink", function() { return absoluteLink; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "urlChangeDetect", function() { return urlChangeDetect; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilTrue", function() { return waitUntilTrue; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlFromTags", function() { return getUrlFromTags; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUrlInTags", function() { return setUrlInTags; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setResumeWaching", function() { return setResumeWaching; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getResumeWaching", function() { return getResumeWaching; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setContinueWaching", function() { return setContinueWaching; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getContinueWaching", function() { return getContinueWaching; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "handleMalImages", function() { return handleMalImages; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMalToKissArray", function() { return getMalToKissArray; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTooltip", function() { return getTooltip; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epPredictionUI", function() { return epPredictionUI; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canHideTabs", function() { return canHideTabs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epPrediction", function() { return epPrediction; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "statusTag", function() { return statusTag; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUserList", function() { return getUserList; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMalUserName", function() { return getMalUserName; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flashm", function() { return flashm; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flashConfirm", function() { return flashConfirm; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lazyload", function() { return lazyload; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementInViewport", function() { return elementInViewport; });
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
function urlPart(url, part) {
    try {
        return url.split("/")[part].split("?")[0];
    }
    catch (e) {
        return undefined;
    }
}
function urlParam(url, name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(url);
    if (results == null) {
        return null;
    }
    else {
        return decodeURI(results[1]) || 0;
    }
}
function favicon(domain) {
    if (domain.indexOf('animeheaven') !== -1)
        return 'http://animeheaven.eu/favicon.ico';
    return 'https://www.google.com/s2/favicons?domain=' + domain;
}
function watching(type) {
    if (type == "manga")
        return 'Reading';
    return 'Watching';
}
function planTo(type) {
    if (type == "manga")
        return 'Plan to Read';
    return 'Plan to Watch';
}
function episode(type) {
    if (type == "manga")
        return 'Chapter';
    return 'Episode';
}
var syncRegex = /(^settings\/.*|^resume\/.*|^continue\/.*|^.*\/Offset$|^updateCheckTime$|^tempVersion$)/;
var status;
(function (status) {
    status[status["watching"] = 1] = "watching";
    status[status["completed"] = 2] = "completed";
    status[status["onhold"] = 3] = "onhold";
    status[status["dropped"] = 4] = "dropped";
    status[status["planToWatch"] = 6] = "planToWatch";
})(status || (status = {}));
function getselect(data, name) {
    var temp = data.split('name="' + name + '"')[1].split('</select>')[0];
    if (temp.indexOf('selected="selected"') > -1) {
        temp = temp.split('<option');
        for (var i = 0; i < temp.length; ++i) {
            if (temp[i].indexOf('selected="selected"') > -1) {
                return temp[i].split('value="')[1].split('"')[0];
            }
        }
    }
    else {
        return '';
    }
}
function absoluteLink(url, domain) {
    if (typeof url === "undefined") {
        return url;
    }
    if (!url.startsWith("http")) {
        if (url.charAt(0) !== '/')
            url = '/' + url;
        url = domain + url;
    }
    return url;
}
;
function urlChangeDetect(callback) {
    var currentPage = window.location.href;
    return setInterval(function () {
        if (currentPage != window.location.href) {
            currentPage = window.location.href;
            callback();
        }
    }, 1000);
}
function waitUntilTrue(condition, callback) {
    var Interval = null;
    Interval = setInterval(function () {
        if (condition()) {
            clearInterval(Interval);
            callback();
        }
    }, 1000);
    return Interval;
}
function getUrlFromTags(tags) {
    if (!api.settings.get('malTags'))
        return undefined;
    if (/malSync::[\d\D]+::/.test(tags)) {
        return atobURL(tags.split("malSync::")[1].split("::")[0]);
    }
    if (/last::[\d\D]+::/.test(tags)) {
        return atobURL(tags.split("last::")[1].split("::")[0]);
    }
    return undefined;
    function atobURL(encoded) {
        try {
            return atob(encoded);
        }
        catch (e) {
            return encoded;
        }
    }
}
function setUrlInTags(url, tags) {
    if (!api.settings.get('malTags'))
        return tags;
    var addition = "malSync::" + btoa(url) + "::";
    if (/(last|malSync)::[\d\D]+::/.test(tags)) {
        tags = tags.replace(/(last|malSync)::[^\^]*?::/, addition);
    }
    else {
        tags = tags + ',' + addition;
    }
    return tags;
}
function setResumeWaching(url, ep, type, id) {
    return __awaiter(this, void 0, void 0, function* () {
        return api.storage.set('resume/' + type + '/' + id, { url: url, ep: ep });
    });
}
function getResumeWaching(type, id) {
    return __awaiter(this, void 0, void 0, function* () {
        //@ts-ignore
        if (!api.settings.get('malResume'))
            return undefined;
        return api.storage.get('resume/' + type + '/' + id);
    });
}
function setContinueWaching(url, ep, type, id) {
    return __awaiter(this, void 0, void 0, function* () {
        return api.storage.set('continue/' + type + '/' + id, { url: url, ep: ep });
    });
}
function getContinueWaching(type, id) {
    return __awaiter(this, void 0, void 0, function* () {
        return api.storage.get('continue/' + type + '/' + id);
    });
}
function handleMalImages(url) {
    if (url.indexOf('questionmark') !== -1)
        return api.storage.assetUrl('questionmark.gif');
    return url;
}
function getMalToKissArray(type, id) {
    return __awaiter(this, void 0, void 0, function* () {
        return new Promise((resolve, reject) => {
            var url = 'https://kissanimelist.firebaseio.com/Data2/Mal' + type + '/' + id + '/Sites.json';
            api.request.xhr('GET', url).then((response) => __awaiter(this, void 0, void 0, function* () {
                var json = j.$.parseJSON(response.responseText);
                for (var pageKey in json) {
                    var page = json[pageKey];
                    if (!api.settings.get(pageKey)) {
                        con.log(pageKey + ' is deactivated');
                        delete json[pageKey];
                        continue;
                    }
                    for (var streamKey in page) {
                        var stream = page[streamKey];
                        var streamUrl = 'https://kissanimelist.firebaseio.com/Data2/' + stream + '/' + encodeURIComponent(streamKey) + '.json';
                        var cache = yield api.storage.get('MalToKiss/' + stream + '/' + encodeURIComponent(streamKey), null);
                        if (typeof (cache) != "undefined") {
                            var streamJson = cache;
                        }
                        else {
                            var streamRespose = yield api.request.xhr('GET', streamUrl);
                            var streamJson = j.$.parseJSON(streamRespose.responseText);
                            api.storage.set('MalToKiss/' + stream + '/' + encodeURIComponent(streamKey), streamJson);
                        }
                        if (pageKey == 'Crunchyroll') {
                            streamJson['url'] = streamJson['url'] + '?season=' + streamKey;
                        }
                        json[pageKey][streamKey] = streamJson;
                    }
                }
                con.log('Mal2Kiss', json);
                resolve(json);
            }));
        });
    });
}
function getTooltip(text, style = '', direction = 'top') {
    var rNumber = Math.floor((Math.random() * 1000) + 1);
    return '<div id="tt' + rNumber + '" class="icon material-icons" style="font-size:16px; line-height: 0; color: #7f7f7f; padding-bottom: 20px; padding-left: 3px; ' + style + '">contact_support</div>\
  <div class="mdl-tooltip mdl-tooltip--' + direction + ' mdl-tooltip--large" for="tt' + rNumber + '">' + text + '</div>';
}
function epPredictionUI(malid, callback) {
    return __awaiter(this, void 0, void 0, function* () {
        utils.epPrediction(malid, function (pre) {
            return __awaiter(this, void 0, void 0, function* () {
                var type = 'anime';
                var updateCheckTime = yield api.storage.get("updateCheckTime");
                var elCache = undefined;
                if (typeof updateCheckTime != 'undefined' && updateCheckTime && updateCheckTime != '0') {
                    elCache = yield api.storage.get('updateCheck/' + type + '/' + malid);
                }
                if (pre === false && typeof elCache == 'undefined')
                    return;
                var UI = {
                    tag: '',
                    text: '',
                    color: '',
                    colorStyle: '',
                    tagEpisode: false,
                    prediction: pre,
                    elCache: elCache
                };
                //
                var airing = pre.airing;
                var episode = pre.episode;
                if (typeof elCache != 'undefined' && typeof elCache.error == 'undefined') {
                    if (!elCache.finished) {
                        airing = true;
                    }
                    if (elCache.newestEp && elCache.newestEp != '' && typeof elCache.newestEp != 'undefined') {
                        episode = elCache.newestEp;
                        UI.color = 'red';
                    }
                }
                if (UI.color != '') {
                    //UI.colorStyle = 'text-decoration: underline overline !important; text-decoration-color: '+UI.color+' !important;'
                    UI.colorStyle = 'background-color: #00ff0057 !important;';
                }
                //
                if (airing) {
                    if (pre.airing) {
                        UI.text = 'Next episode estimated in ' + pre.diffDays + 'd ' + pre.diffHours + 'h ' + pre.diffMinutes + 'm';
                    }
                    if (episode) {
                        UI.tag = '<span class="mal-sync-ep-pre" title="' + UI.text + '">[<span style="' + UI.colorStyle + ';">' + episode + '</span>]</span>';
                        UI.tagEpisode = episode;
                    }
                }
                else {
                    if (pre) {
                        UI.text = '<span class="mal-sync-ep-pre">Airing in ' + ((pre.diffWeeks * 7) + pre.diffDays) + 'd ' + pre.diffHours + 'h ' + pre.diffMinutes + 'm </span>';
                    }
                }
                callback(UI);
            });
        });
    });
}
function canHideTabs() {
    if (typeof browser != 'undefined' && typeof browser.tabs.hide != 'undefined') {
        return true;
    }
    return false;
}
function epPrediction(malId, callback) {
    return __awaiter(this, void 0, void 0, function* () {
        if (!api.settings.get('epPredictions'))
            return;
        var timestamp = yield api.storage.get('mal/' + malId + '/release');
        if (typeof (timestamp) != "undefined") {
            var airing = 1;
            var episode = 0;
            if (Date.now() < timestamp)
                airing = 0;
            if (airing) {
                var delta = Math.abs(Date.now() - timestamp) / 1000;
            }
            else {
                var delta = Math.abs(timestamp - Date.now()) / 1000;
            }
            var diffWeeks = Math.floor(delta / (86400 * 7));
            delta -= diffWeeks * (86400 * 7);
            if (airing) {
                //We need the time until the week is complete
                delta = (86400 * 7) - delta;
            }
            var diffDays = Math.floor(delta / 86400);
            delta -= diffDays * 86400;
            var diffHours = Math.floor(delta / 3600) % 24;
            delta -= diffHours * 3600;
            var diffMinutes = Math.floor(delta / 60) % 60;
            delta -= diffMinutes * 60;
            if (airing) {
                episode = diffWeeks - (new Date().getFullYear() - new Date(timestamp).getFullYear()); //Remove 1 week between years
                episode++;
                if (episode > 50) {
                    episode = 0;
                }
            }
            var maxEp = yield api.storage.get('mal/' + malId + '/release');
            if (typeof (maxEp) === "undefined" || episode < maxEp) {
                callback({
                    timestamp: timestamp,
                    airing: airing,
                    diffWeeks: diffWeeks,
                    diffDays: diffDays,
                    diffHours: diffHours,
                    diffMinutes: diffMinutes,
                    episode: episode
                });
                return;
            }
        }
        callback(false);
    });
}
function statusTag(status, type, id) {
    var info = {
        anime: {
            1: {
                class: 'watching',
                text: 'CW',
                title: 'Watching'
            },
            2: {
                class: 'completed',
                text: 'CMPL',
                title: 'Completed'
            },
            3: {
                class: 'on-hold',
                text: ' HOLD',
                title: 'On-Hold'
            },
            4: {
                class: 'dropped',
                text: 'DROP',
                title: 'Dropped'
            },
            6: {
                class: 'plantowatch',
                text: 'PTW',
                title: 'Plan to Watch'
            }
        },
        manga: {
            1: {
                class: 'reading',
                text: 'CR',
                title: 'Reading'
            },
            2: {
                class: 'completed',
                text: 'CMPL',
                title: 'Completed'
            },
            3: {
                class: 'on-hold',
                text: ' HOLD',
                title: 'On-Hold'
            },
            4: {
                class: 'dropped',
                text: 'DROP',
                title: 'Dropped'
            },
            6: {
                class: 'plantoread',
                text: 'PTR',
                title: 'Plan to Read'
            }
        }
    };
    $.each([1, 2, 3, 4, 6], function (i, el) {
        info.anime[info.anime[el].title] = info.anime[el];
        info.manga[info.manga[el].title] = info.manga[el];
    });
    if (status) {
        var tempInfo = info[type][status];
        return ` <a href="https://myanimelist.net/ownlist/${type}/${id}/edit?hideLayout=1" title="${tempInfo.title}" class="Lightbox_AddEdit button_edit ${tempInfo.class}">${tempInfo.text}</a>`;
    }
    return false;
}
//Status: 1 = watching | 2 = completed | 3 = onhold | 4 = dropped | 6 = plan to watch | 7 = all
function getUserList(status = 1, localListType = 'anime', singleCallback = null, finishCallback = null, fullListCallback = null, continueCall = null, username = null, offset = 0, templist = []) {
    con.log('[UserList]', 'username: ' + username, 'status: ' + status, 'offset: ' + offset);
    if (username == null) {
        getMalUserName(function (usernameTemp) {
            if (usernameTemp == false) {
                flashm("Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>");
            }
            else {
                getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, usernameTemp, offset, templist);
            }
        });
        return;
    }
    var url = 'https://myanimelist.net/' + localListType + 'list/' + username + '/load.json?offset=' + offset + '&status=' + status;
    api.request.xhr('GET', url).then((response) => {
        var data = JSON.parse(response.responseText);
        if (singleCallback) {
            // @ts-ignore
            if (!data.length)
                singleCallback(false, 0, 0);
            for (var i = 0; i < data.length; i++) {
                // @ts-ignore
                singleCallback(data[i], i + offset + 1, data.length + offset);
            }
        }
        if (fullListCallback) {
            templist = templist.concat(data);
        }
        if (data.length > 299) {
            if (continueCall) {
                // @ts-ignore
                continueCall(function () {
                    getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, username, offset + 300, templist);
                });
            }
            else {
                getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, username, offset + 300, templist);
            }
        }
        else {
            // @ts-ignore
            if (fullListCallback)
                fullListCallback(templist);
            // @ts-ignore
            if (finishCallback)
                finishCallback();
        }
    });
}
function getMalUserName(callback) {
    var url = 'https://myanimelist.net/editlist.php?hideLayout';
    api.request.xhr('GET', url).then((response) => {
        var username = false;
        try {
            username = response.responseText.split('USER_NAME = "')[1].split('"')[0];
        }
        catch (e) { }
        con.log('[Username]', username);
        callback(username);
    });
}
//flashm
function flashm(text, options) {
    if (!j.$('#flash-div-top').length) {
        initflashm();
    }
    con.log("[Flash] Message:", text);
    var colorF = "#323232";
    if (typeof options !== 'undefined' && typeof options.error !== 'undefined' && options.error) {
        var colorF = "#3e0808";
    }
    var flashdiv = '#flash-div-bottom';
    if (typeof options !== 'undefined' && typeof options.position !== 'undefined' && options.position) {
        flashdiv = '#flash-div-' + options.position;
    }
    var messClass = "flash";
    if (typeof options !== 'undefined' && typeof options.type !== 'undefined' && options.type) {
        var tempClass = "type-" + options.type;
        j.$(flashdiv + ' .' + tempClass + ', #flashinfo-div .' + tempClass)
            .removeClass(tempClass)
            .fadeOut({
            duration: 1000,
            queue: false,
            complete: function () { j.$(this).remove(); }
        });
        messClass += " " + tempClass;
    }
    var mess = '<div class="' + messClass + '" style="display:none;">\
        <div style="display:table; pointer-events: all; padding: 14px 24px 14px 24px; margin: 0 auto; margin-top: 5px; max-width: 60%; -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 2px;color: white;background:' + colorF + '; ">\
          ' + text + '\
        </div>\
      </div>';
    if (typeof options !== 'undefined' && typeof options.hoverInfo !== 'undefined' && options.hoverInfo) {
        messClass += " flashinfo";
        mess = '<div class="' + messClass + '" style="display:none; max-height: 5000px; overflow: hidden;"><div style="display:table; pointer-events: all; margin: 0 auto; margin-top: -2px; max-width: 60%; -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 2px;color: white;background:' + colorF + '; "><div style="max-height: 60vh; overflow-y: auto; padding: 14px 24px 14px 24px;">' + text + '</div></div></div>';
        j.$('#flashinfo-div').addClass('hover');
        var flashm = j.$(mess).appendTo('#flashinfo-div');
    }
    else {
        var flashm = j.$(mess).appendTo(flashdiv);
    }
    if (typeof options !== 'undefined' && typeof options.permanent !== 'undefined' && options.permanent) {
        flashm.slideDown(800);
    }
    else if (typeof options !== 'undefined' && typeof options.hoverInfo !== 'undefined' && options.hoverInfo) {
        flashm.slideDown(800).delay(4000).queue(function () { j.$('#flashinfo-div').removeClass('hover'); flashm.css('max-height', '8px'); });
    }
    else {
        flashm.slideDown(800).delay(4000).slideUp(800, () => {
            // @ts-ignore
            j.$(this).remove();
        });
    }
    return flashm;
}
function flashConfirm(message, type, yesCall = () => { }, cancelCall = () => { }) {
    return __awaiter(this, void 0, void 0, function* () {
        return new Promise(function (resolve, reject) {
            message = '<div style="text-align: left;">' + message + '</div><div style="display: flex; justify-content: space-around;"><button class="Yes" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px; cursor:pointer;">OK</button><button class="Cancel" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px; cursor:pointer;">CANCEL</button></div>';
            var flasmessage = flashm(message, { permanent: true, position: "top", type: type });
            flasmessage.find('.Yes').click(function (evt) {
                j.$(evt.target).parentsUntil('.flash').remove();
                resolve(true);
                yesCall();
            });
            flasmessage.find('.Cancel').click(function (evt) {
                j.$(evt.target).parentsUntil('.flash').remove();
                resolve(false);
                cancelCall();
            });
        });
    });
}
function initflashm() {
    api.storage.addStyle('.flashinfo{\
                    transition: max-height 2s;\
                 }\
                 .flashinfo:hover{\
                    max-height:5000px !important;\
                    z-index: 2147483647;\
                 }\
                 .flashinfo .synopsis{\
                    transition: max-height 2s, max-width 2s ease 2s;\
                 }\
                 .flashinfo:hover .synopsis{\
                    max-height:9999px !important;\
                    max-width: 500px !important;\
                    transition: max-height 2s;\
                 }\
                 #flashinfo-div{\
                  z-index: 2;\
                  transition: 2s;\
                 }\
                 #flashinfo-div:hover, #flashinfo-div.hover{\
                  z-index: 2147483647;\
                 }\
                 \
                 #flash-div-top, #flash-div-bottom, #flashinfo-div{\
                    font-family: "Helvetica","Arial",sans-serif;\
                    color: white;\
                    font-size: 14px;\
                    font-weight: 400;\
                    line-height: 17px;\
                 }\
                 #flash-div-top h2, #flash-div-bottom h2, #flashinfo-div h2{\
                    font-family: "Helvetica","Arial",sans-serif;\
                    color: white;\
                    font-size: 14px;\
                    font-weight: 700;\
                    line-height: 17px;\
                    padding: 0;\
                    margin: 0;\
                 }\
                 #flash-div-top a, #flash-div-bottom a, #flashinfo-div a{\
                    color: #DF6300;\
                 }');
    j.$('body').after('<div id="flash-div-top" style="text-align: center;pointer-events: none;position: fixed;top:-5px;width:100%;z-index: 2147483647;left: 0;"></div>\
        <div id="flash-div-bottom" style="text-align: center;pointer-events: none;position: fixed;bottom:0px;width:100%;z-index: 2147483647;left: 0;"><div id="flash" style="display:none;  background-color: red;padding: 20px; margin: 0 auto;max-width: 60%;          -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 20px;background:rgba(227,0,0,0.6);"></div></div>\
        <div id="flashinfo-div" style="text-align: center;pointer-events: none;position: fixed;bottom:0px;width:100%;left: 0;">');
}
var lazyloaded = false;
var lazyimages = new Array();
function lazyload(doc, scrollElement = '.simplebar-scroll-content') {
    /* lazyload.js (c) Lorenzo Giuliani
     * MIT License (http://www.opensource.org/licenses/mit-license.html)
     *
     * expects a list of:
     * `<img src="blank.gif" data-src="my_image.png" width="600" height="400" class="lazy">`
     */
    processScroll = function () {
        for (var i = 0; i < lazyimages.length; i++) {
            if (elementInViewport(lazyimages[i])) {
                loadImage(lazyimages[i], function () {
                    lazyimages.splice(i, i);
                });
            }
            if (!$(lazyimages[i]).length) {
                lazyimages.splice(i, i);
            }
        }
        ;
    };
    function loadImage(el, fn) {
        if (j.$(el).hasClass('lazyBack')) {
            j.$(el).css('background-image', 'url(' + el.getAttribute('data-src') + ')').removeClass('lazyBack');
        }
        else {
            var img = new Image(), src = el.getAttribute('data-src');
            img.onload = function () {
                if (!!el.parent)
                    el.parent.replaceChild(img, el);
                else
                    el.src = src;
                fn ? fn() : null;
            };
            img.src = src;
        }
    }
    lazyimages = new Array();
    var query = doc.find('img.lazy.init, .lazyBack.init'), processScroll = function () {
        for (var i = 0; i < lazyimages.length; i++) {
            if (utils.elementInViewport(lazyimages[i], 600)) {
                loadImage(lazyimages[i], function () {
                    lazyimages.splice(i, i);
                });
            }
        }
        ;
    };
    // Array.prototype.slice.call is not callable under our lovely IE8
    for (var i = 0; i < query.length; i++) {
        lazyimages.push(query[i]);
        $(query[i]).removeClass('init');
    }
    ;
    processScroll();
    if (!lazyloaded) {
        lazyloaded = true;
        doc.find(scrollElement).scroll(function () {
            processScroll();
        });
    }
}
function elementInViewport(el, horizontalOffset = 0) {
    var rect = el.getBoundingClientRect();
    return (rect.top >= 0
        && rect.left >= 0
        // @ts-ignore
        && (rect.top - horizontalOffset) <= (window.innerHeight || document.documentElement.clientHeight));
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(1), __webpack_require__(2), __webpack_require__(3)))

/***/ }),
/* 4 */
/***/ (function(module, exports) {

/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
// css base code, injected by the css-loader
module.exports = function(useSourceMap) {
	var list = [];

	// return the list of modules as css string
	list.toString = function toString() {
		return this.map(function (item) {
			var content = cssWithMappingToString(item, useSourceMap);
			if(item[2]) {
				return "@media " + item[2] + "{" + content + "}";
			} else {
				return content;
			}
		}).join("");
	};

	// import a list of modules into the list
	list.i = function(modules, mediaQuery) {
		if(typeof modules === "string")
			modules = [[null, modules, ""]];
		var alreadyImportedModules = {};
		for(var i = 0; i < this.length; i++) {
			var id = this[i][0];
			if(typeof id === "number")
				alreadyImportedModules[id] = true;
		}
		for(i = 0; i < modules.length; i++) {
			var item = modules[i];
			// skip already imported module
			// this implementation is not 100% perfect for weird media query combinations
			//  when a module is imported multiple times with different media queries.
			//  I hope this will never occur (Hey this way we have smaller bundles)
			if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
				if(mediaQuery && !item[2]) {
					item[2] = mediaQuery;
				} else if(mediaQuery) {
					item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
				}
				list.push(item);
			}
		}
	};
	return list;
};

function cssWithMappingToString(item, useSourceMap) {
	var content = item[1] || '';
	var cssMapping = item[3];
	if (!cssMapping) {
		return content;
	}

	if (useSourceMap && typeof btoa === 'function') {
		var sourceMapping = toComment(cssMapping);
		var sourceURLs = cssMapping.sources.map(function (source) {
			return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'
		});

		return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
	}

	return [content].join('\n');
}

// Adapted from convert-source-map (MIT)
function toComment(sourceMap) {
	// eslint-disable-next-line no-undef
	var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
	var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;

	return '/*# ' + data + ' */';
}


/***/ }),
/* 5 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(utils, con, api, j) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return mal; });
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
class mal {
    constructor(url) {
        this.url = url;
        this.name = "";
        this.totalEp = NaN;
        this.addAnime = false;
        this.login = false;
        this.id = utils.urlPart(url, 4);
        this.type = utils.urlPart(url, 3);
    }
    init() {
        return this.update();
    }
    ;
    update() {
        var editUrl = 'https://myanimelist.net/ownlist/' + this.type + '/' + this.id + '/edit?hideLayout';
        con.log('Update MAL info', editUrl);
        return api.request.xhr('GET', editUrl).then((response) => {
            if (response.finalUrl.indexOf("myanimelist.net/login.php") > -1 || response.responseText.indexOf("Unauthorized") > -1) {
                this.login = false;
                con.error("User not logged in");
                return;
            }
            this.login = true;
            this.animeInfo = this.getObject(response.responseText);
        });
    }
    getEpisode() {
        if (this.type == "manga") {
            return this.animeInfo[".add_manga[num_read_chapters]"];
        }
        return this.animeInfo[".add_anime[num_watched_episodes]"];
    }
    setEpisode(ep) {
        if (ep + '' === '')
            ep = 0;
        if (this.type == "manga") {
            this.animeInfo[".add_manga[num_read_chapters]"] = parseInt(ep + '');
        }
        this.animeInfo[".add_anime[num_watched_episodes]"] = parseInt(ep + '');
    }
    getVolume() {
        if (this.type == "manga") {
            return this.animeInfo[".add_manga[num_read_volumes]"];
        }
        return false;
    }
    setVolume(ep) {
        if (this.type == "manga") {
            this.animeInfo[".add_manga[num_read_volumes]"] = ep;
            return;
        }
        con.error('You cant set Volumes for animes');
    }
    getStatus() {
        if (this.type == "manga") {
            return this.animeInfo[".add_manga[status]"];
        }
        return this.animeInfo[".add_anime[status]"];
    }
    setStatus(status) {
        if (this.type == "manga") {
            this.animeInfo[".add_manga[status]"] = status;
        }
        this.animeInfo[".add_anime[status]"] = status;
    }
    getScore() {
        if (this.type == "manga") {
            return this.animeInfo[".add_manga[score]"];
        }
        return this.animeInfo[".add_anime[score]"];
    }
    setScore(score) {
        if (this.type == "manga") {
            this.animeInfo[".add_manga[score]"] = score;
        }
        this.animeInfo[".add_anime[score]"] = score;
    }
    setCompletionDateToNow() {
        var Datec = new Date();
        if (this.animeInfo['.add_anime[finish_date][day]'] === '' || this.animeInfo['.add_manga[finish_date][day]'] === '') {
            if (this.type == "manga") {
                this.animeInfo['.add_manga[finish_date][year]'] = Datec.getFullYear();
                this.animeInfo['.add_manga[finish_date][month]'] = Datec.getMonth() + 1;
                this.animeInfo['.add_manga[finish_date][day]'] = Datec.getDate();
            }
            this.animeInfo['.add_anime[finish_date][year]'] = Datec.getFullYear();
            this.animeInfo['.add_anime[finish_date][month]'] = Datec.getMonth() + 1;
            this.animeInfo['.add_anime[finish_date][day]'] = Datec.getDate();
        }
        else {
            con.error('Completion date already set');
        }
    }
    setStartingDateToNow() {
        var Datec = new Date();
        if (this.animeInfo['.add_anime[start_date][day]'] === '' || this.animeInfo['.add_manga[start_date][day]'] === '') {
            if (this.type == "manga") {
                this.animeInfo['.add_manga[start_date][year]'] = Datec.getFullYear();
                this.animeInfo['.add_manga[start_date][month]'] = Datec.getMonth() + 1;
                this.animeInfo['.add_manga[start_date][day]'] = Datec.getDate();
            }
            this.animeInfo['.add_anime[start_date][year]'] = Datec.getFullYear();
            this.animeInfo['.add_anime[start_date][month]'] = Datec.getMonth() + 1;
            this.animeInfo['.add_anime[start_date][day]'] = Datec.getDate();
        }
        else {
            con.info('Start date already set');
        }
    }
    getStreamingUrl() {
        var tags = this.animeInfo[".add_anime[tags]"];
        if (this.type == "manga") {
            tags = this.animeInfo[".add_manga[tags]"];
        }
        return utils.getUrlFromTags(tags);
    }
    setStreamingUrl(url) {
        var tags = this.animeInfo[".add_anime[tags]"];
        if (this.type == "manga") {
            tags = this.animeInfo[".add_manga[tags]"];
        }
        tags = utils.setUrlInTags(url, tags);
        if (this.type == "manga") {
            this.animeInfo[".add_manga[tags]"] = tags;
            return;
        }
        this.animeInfo[".add_anime[tags]"] = tags;
    }
    getRating() {
        return __awaiter(this, void 0, void 0, function* () {
            return new Promise((resolve, reject) => {
                var url = '';
                if (this.type == 'anime') {
                    url = 'https://myanimelist.net/includes/ajax.inc.php?t=64&id=' + this.id;
                }
                else {
                    url = 'https://myanimelist.net/includes/ajax.inc.php?t=65&id=' + this.id;
                }
                api.request.xhr('GET', url).then((response) => {
                    try {
                        resolve(response.responseText.split('Score:</span>')[1].split('<')[0]);
                    }
                    catch (e) {
                        con.error('Could not get rating', e);
                        reject();
                    }
                });
            });
        });
    }
    setResumeWaching(url, ep) {
        return __awaiter(this, void 0, void 0, function* () {
            return utils.setResumeWaching(url, ep, this.type, this.id);
        });
    }
    getResumeWaching() {
        return __awaiter(this, void 0, void 0, function* () {
            return utils.getResumeWaching(this.type, this.id);
        });
    }
    setContinueWaching(url, ep) {
        return __awaiter(this, void 0, void 0, function* () {
            return utils.setContinueWaching(url, ep, this.type, this.id);
        });
    }
    getContinueWaching() {
        return __awaiter(this, void 0, void 0, function* () {
            return utils.getContinueWaching(this.type, this.id);
        });
    }
    clone() {
        const copy = new this.constructor();
        Object.assign(copy, this);
        copy.animeInfo = Object.assign({}, this.animeInfo);
        return copy;
    }
    sync() {
        return new Promise((resolve, reject) => {
            var This = this;
            var url = "https://myanimelist.net/ownlist/" + this.type + "/" + this.id + "/edit";
            if (this.addAnime) {
                if (this.type == 'anime') {
                    url = "https://myanimelist.net/ownlist/anime/add?selected_series_id=" + this.id;
                    utils.flashConfirm('Add "' + this.name + '" to MAL?', 'add', function () {
                        This.setStatus(1);
                        continueCall();
                    }, function () {
                        /*if(change['checkIncrease'] == 1){TODO
                            episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl']);
                        }*/
                    });
                    return;
                }
                else {
                    url = "https://myanimelist.net/ownlist/manga/add?selected_manga_id=" + this.id;
                    utils.flashConfirm('Add "' + this.name + '" to MAL?', 'add', function () {
                        This.setStatus(1);
                        continueCall();
                    }, function () { });
                    return;
                }
            }
            continueCall();
            function continueCall() {
                var parameter = "";
                j.$.each(This.animeInfo, function (index, value) {
                    if (index.toString().charAt(0) == ".") {
                        if (!((index === '.add_anime[is_rewatching]' || index === '.add_manga[is_rereading]') && parseInt(value) === 0)) {
                            parameter += encodeURIComponent(index.toString().substring(1)) + "=" + encodeURIComponent(value) + "&";
                        }
                    }
                });
                con.log('[SET] URL:', url);
                con.log('[SET] Object:', This.animeInfo);
                api.request.xhr('POST', { url: url, data: parameter, headers: { "Content-Type": "application/x-www-form-urlencoded" } }).then((response) => {
                    if (response.responseText.indexOf('Successfully') >= 0) {
                        con.log('Update Succeeded');
                        resolve();
                    }
                    else {
                        con.error('Update failed');
                        reject();
                    }
                    //This.animeInfo = This.getObject(response.responseText);
                });
            }
        });
    }
    getObject(data) {
        var getselect = utils.getselect;
        if (typeof data.split('<form name="')[1] === "undefined" && (this.url.indexOf('/manga/') !== -1 || this.url.indexOf('/anime/') !== -1)) {
            throw new Error("MAL is down or otherwise giving bad data");
        }
        this.addAnime = false;
        if (this.type == 'anime') {
            var anime = {};
            anime['.csrf_token'] = data.split('\'csrf_token\'')[1].split('\'')[1].split('\'')[0];
            if (data.indexOf('Add Anime') > -1) {
                this.addAnime = true;
            }
            data = data.split('<form name="')[1].split('</form>')[0];
            this.totalEp = parseInt(data.split('id="totalEpisodes">')[1].split('<')[0]);
            this.name = data.split('<a href="')[1].split('">')[1].split('<')[0];
            anime['.anime_id'] = parseInt(data.split('name="anime_id"')[1].split('value="')[1].split('"')[0]); //input
            anime['.aeps'] = parseInt(data.split('name="aeps"')[1].split('value="')[1].split('"')[0]);
            anime['.astatus'] = parseInt(data.split('name="astatus"')[1].split('value="')[1].split('"')[0]);
            anime['.add_anime[status]'] = parseInt(getselect(data, 'add_anime[status]'));
            //Rewatching
            if (data.split('name="add_anime[is_rewatching]"')[1].split('>')[0].indexOf('checked="checked"') >= 0) {
                anime['.add_anime[is_rewatching]'] = 1;
            }
            //
            anime['.add_anime[num_watched_episodes]'] = parseInt(data.split('name="add_anime[num_watched_episodes]"')[1].split('value="')[1].split('"')[0]);
            if (isNaN(anime['.add_anime[num_watched_episodes]'])) {
                anime['.add_anime[num_watched_episodes]'] = '';
            }
            anime['.add_anime[score]'] = getselect(data, 'add_anime[score]');
            anime['.add_anime[start_date][month]'] = getselect(data, 'add_anime[start_date][month]');
            anime['.add_anime[start_date][day]'] = getselect(data, 'add_anime[start_date][day]');
            anime['.add_anime[start_date][year]'] = getselect(data, 'add_anime[start_date][year]');
            anime['.add_anime[finish_date][month]'] = getselect(data, 'add_anime[finish_date][month]');
            anime['.add_anime[finish_date][day]'] = getselect(data, 'add_anime[finish_date][day]');
            anime['.add_anime[finish_date][year]'] = getselect(data, 'add_anime[finish_date][year]');
            anime['.add_anime[tags]'] = data.split('name="add_anime[tags]"')[1].split('>')[1].split('<')[0]; //textarea
            anime['.add_anime[priority]'] = getselect(data, 'add_anime[priority]');
            anime['.add_anime[storage_type]'] = getselect(data, 'add_anime[storage_type]');
            anime['.add_anime[storage_value]'] = data.split('name="add_anime[storage_value]"')[1].split('value="')[1].split('"')[0];
            anime['.add_anime[num_watched_times]'] = data.split('name="add_anime[num_watched_times]"')[1].split('value="')[1].split('"')[0];
            anime['.add_anime[rewatch_value]'] = getselect(data, 'add_anime[rewatch_value]');
            anime['.add_anime[comments]'] = data.split('name="add_anime[comments]"')[1].split('>')[1].split('<')[0];
            anime['.add_anime[is_asked_to_discuss]'] = getselect(data, 'add_anime[is_asked_to_discuss]');
            if (anime['.add_anime[is_asked_to_discuss]'] == '')
                anime['.add_anime[is_asked_to_discuss]'] = 0; //#15
            anime['.add_anime[sns_post_type]'] = getselect(data, 'add_anime[sns_post_type]');
            anime['.submitIt'] = data.split('name="submitIt"')[1].split('value="')[1].split('"')[0];
            con.log('[GET] Object:', anime);
            return anime;
        }
        else {
            var anime = {};
            anime['.csrf_token'] = data.split('\'csrf_token\'')[1].split('\'')[1].split('\'')[0];
            if (data.indexOf('Add Manga') > -1) {
                this.addAnime = true;
            }
            data = data.split('<form name="')[1].split('</form>')[0];
            this.totalEp = parseInt(data.split('id="totalChap">')[1].split('<')[0]);
            this.totalVol = parseInt(data.split('id="totalVol">')[1].split('<')[0]);
            this.name = data.split('<a href="')[1].split('">')[1].split('<')[0];
            anime['.entry_id'] = parseInt(data.split('name="entry_id"')[1].split('value="')[1].split('"')[0]);
            anime['.manga_id'] = parseInt(data.split('name="manga_id"')[1].split('value="')[1].split('"')[0]); //input
            anime['volumes'] = parseInt(data.split('id="volumes"')[1].split('value="')[1].split('"')[0]);
            anime['mstatus'] = parseInt(data.split('id="mstatus"')[1].split('value="')[1].split('"')[0]);
            anime['.add_manga[status]'] = parseInt(getselect(data, 'add_manga[status]'));
            //Rewatching
            if (data.split('name="add_manga[is_rereading]"')[1].split('>')[0].indexOf('checked="checked"') >= 0) {
                anime['.add_manga[is_rereading]'] = 1;
            }
            //
            anime['.add_manga[num_read_volumes]'] = parseInt(data.split('name="add_manga[num_read_volumes]"')[1].split('value="')[1].split('"')[0]);
            if (isNaN(anime['.add_manga[num_read_volumes]'])) {
                anime['.add_manga[num_read_volumes]'] = '';
            }
            anime['.add_manga[num_read_chapters]'] = parseInt(data.split('name="add_manga[num_read_chapters]"')[1].split('value="')[1].split('"')[0]);
            if (isNaN(anime['.add_manga[num_read_chapters]'])) {
                anime['.add_manga[num_read_chapters]'] = '';
            }
            anime['.add_manga[score]'] = getselect(data, 'add_manga[score]');
            anime['.add_manga[start_date][month]'] = getselect(data, 'add_manga[start_date][month]');
            anime['.add_manga[start_date][day]'] = getselect(data, 'add_manga[start_date][day]');
            anime['.add_manga[start_date][year]'] = getselect(data, 'add_manga[start_date][year]');
            anime['.add_manga[finish_date][month]'] = getselect(data, 'add_manga[finish_date][month]');
            anime['.add_manga[finish_date][day]'] = getselect(data, 'add_manga[finish_date][day]');
            anime['.add_manga[finish_date][year]'] = getselect(data, 'add_manga[finish_date][year]');
            anime['.add_manga[tags]'] = data.split('name="add_manga[tags]"')[1].split('>')[1].split('<')[0]; //textarea
            anime['.add_manga[priority]'] = getselect(data, 'add_manga[priority]');
            anime['.add_manga[storage_type]'] = getselect(data, 'add_manga[storage_type]');
            anime['.add_manga[num_retail_volumes]'] = data.split('name="add_manga[num_retail_volumes]"')[1].split('value="')[1].split('"')[0];
            anime['.add_manga[num_read_times]'] = data.split('name="add_manga[num_read_times]"')[1].split('value="')[1].split('"')[0];
            anime['.add_manga[reread_value]'] = getselect(data, 'add_manga[reread_value]');
            anime['.add_manga[comments]'] = data.split('name="add_manga[comments]"')[1].split('>')[1].split('<')[0];
            anime['.add_manga[is_asked_to_discuss]'] = getselect(data, 'add_manga[is_asked_to_discuss]');
            if (anime['.add_manga[is_asked_to_discuss]'] == '')
                anime['.add_manga[is_asked_to_discuss]'] = 0; //#15
            anime['.add_manga[sns_post_type]'] = getselect(data, 'add_manga[sns_post_type]');
            anime['.submitIt'] = data.split('name="submitIt"')[1].split('value="')[1].split('"')[0];
            con.log('[GET] Object:', anime);
            return anime;
        }
    }
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(0), __webpack_require__(1)))

/***/ }),
/* 6 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return pages; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return pageSearch; });
/* harmony import */ var _Kissanime_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10);
/* harmony import */ var _Kissmanga_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11);
/* harmony import */ var _nineAnime_main__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12);
/* harmony import */ var _Crunchyroll_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(13);
/* harmony import */ var _Masterani_main__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(14);
/* harmony import */ var _Mangadex_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(15);
/* harmony import */ var _Mangarock_main__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(16);
/* harmony import */ var _Gogoanime_main__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(17);
/* harmony import */ var _Animeheaven_main__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(18);









const pages = {
    Kissanime: _Kissanime_main__WEBPACK_IMPORTED_MODULE_0__[/* Kissanime */ "a"],
    Kissmanga: _Kissmanga_main__WEBPACK_IMPORTED_MODULE_1__[/* Kissmanga */ "a"],
    nineAnime: _nineAnime_main__WEBPACK_IMPORTED_MODULE_2__[/* nineAnime */ "a"],
    Crunchyroll: _Crunchyroll_main__WEBPACK_IMPORTED_MODULE_3__[/* Crunchyroll */ "a"],
    Masterani: _Masterani_main__WEBPACK_IMPORTED_MODULE_4__[/* Masterani */ "a"],
    Mangadex: _Mangadex_main__WEBPACK_IMPORTED_MODULE_5__[/* Mangadex */ "a"],
    Mangarock: _Mangarock_main__WEBPACK_IMPORTED_MODULE_6__[/* Mangarock */ "a"],
    Gogoanime: _Gogoanime_main__WEBPACK_IMPORTED_MODULE_7__[/* Gogoanime */ "a"],
    Animeheaven: _Animeheaven_main__WEBPACK_IMPORTED_MODULE_8__[/* Animeheaven */ "a"],
};
const pageSearch = {
    Kissanime: {
        name: 'Kissanime',
        type: 'anime',
        domain: 'kissanime.ru',
        searchUrl: (titleEncoded) => { return ''; },
        completeSearchTag: (title, linkContent) => { return '<form class="mal_links" target="_blank" action="http://kissanime.ru/Search/Anime" style="display: inline;" id="kissanimeSearch" method="post" _lpchecked="1"><a href="#" class="submitKissanimeSearch" onclick="document.getElementById(\'kissanimeSearch\').submit(); return false;">' + linkContent + '</a><input type="hidden" id="keyword" name="keyword" value="' + title + '"/></form>'; }
    },
    Kissmanga: {
        name: 'Kissmanga',
        type: 'manga',
        domain: 'kissmanga.com',
        searchUrl: (titleEncoded) => { return ''; },
        completeSearchTag: (title, linkContent) => { return '<form class="mal_links" target="_blank" action="http://kissmanga.com/Search/Manga" style="display: inline;" id="kissanimeSearch" method="post" _lpchecked="1"><a href="#" class="submitKissanimeSearch" onclick="document.getElementById(\'kissanimeSearch\').submit(); return false;">' + linkContent + '</a><input type="hidden" id="keyword" name="keyword" value="' + title + '"/></form>'; }
    },
    Crunchyroll: {
        name: 'Crunchyroll',
        type: 'anime',
        domain: 'www.crunchyroll.com',
        searchUrl: (titleEncoded) => { return 'http://www.crunchyroll.com/search?q=' + titleEncoded; }
    },
    nineAnime: {
        name: '9Anime',
        type: 'anime',
        domain: '9anime.to',
        googleSearchDomain: '9anime.to/watch',
        searchUrl: (titleEncoded) => { return 'https://www1.9anime.to/search?keyword=' + titleEncoded; }
    },
    MasterAnime: {
        name: 'MasterAnime',
        type: 'anime',
        domain: 'www.masterani.me',
        googleSearchDomain: 'www.masterani.me/anime/info/',
        searchUrl: (titleEncoded) => { return 'https://www.masterani.me/anime?search=' + titleEncoded; }
    },
    Gogoanime: {
        name: 'Gogoanime',
        type: 'anime',
        domain: 'www.gogoanime.in',
        searchUrl: (titleEncoded) => { return 'http://gogoanimes.co/search.html?keyword=' + titleEncoded; }
    },
    Animeheaven: {
        name: 'Animeheaven',
        type: 'anime',
        domain: 'animeheaven.eu',
        searchUrl: (titleEncoded) => { return 'http://animeheaven.eu/search.php?q=' + titleEncoded; }
    },
    Mangadex: {
        name: 'Mangadex',
        type: 'manga',
        domain: 'mangadex.org',
        searchUrl: (titleEncoded) => { return 'https://mangadex.org/quick_search/' + titleEncoded; }
    },
    Mangarock: {
        name: 'Mangarock',
        type: 'manga',
        domain: 'mangarock.com',
        searchUrl: (titleEncoded) => { return 'https://mangarock.com/search?q=' + titleEncoded; }
    },
    AniList: {
        name: 'AniList',
        type: 'anime',
        domain: 'anilist.co',
        searchUrl: (titleEncoded) => { return 'https://anilist.co/search/anime?sort=SEARCH_MATCH&search=' + titleEncoded; }
    },
    AniListManga: {
        name: 'AniList',
        type: 'manga',
        domain: 'anilist.co',
        searchUrl: (titleEncoded) => { return 'https://anilist.co/search/manga?sort=SEARCH_MATCH&search=' + titleEncoded; }
    },
};


/***/ }),
/* 7 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(j) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return userscriptLegacy; });
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
const userscriptLegacy = {
    set(key, value) {
        return __awaiter(this, void 0, void 0, function* () {
            GM_setValue(key, value);
        });
    },
    get(key) {
        return __awaiter(this, void 0, void 0, function* () {
            const value = GM_getValue(key);
            return value;
        });
    },
    remove(key) {
        return __awaiter(this, void 0, void 0, function* () {
            GM_deleteValue(key);
        });
    },
    list() {
        return __awaiter(this, void 0, void 0, function* () {
            var reverseArray = {};
            j.$.each(GM_listValues(), function (index, cache) {
                reverseArray[cache] = index;
            });
            return reverseArray;
        });
    },
    addStyle(css) {
        return __awaiter(this, void 0, void 0, function* () {
            GM_addStyle(css);
        });
    },
    version() {
        return GM_info.script.version;
    },
    assetUrl(filename) {
        return 'https://raw.githubusercontent.com/lolamtisch/MALSync/master/assets/assets/' + filename;
    },
    injectCssResource(res, head) {
        head.append(j.$('<style>')
            .attr("rel", "stylesheet")
            .attr("type", "text/css")
            .html(GM_getResourceText(res)));
    },
    injectjsResource(res, head) {
        var s = document.createElement('script');
        s.text = GM_getResourceText(res);
        s.onload = function () {
            // @ts-ignore
            this.remove();
        };
        head.get(0).appendChild(s);
    },
    updateDom(head) {
        var s = document.createElement('script');
        s.text = `
        document.getElementsByTagName('head')[0].onclick = function(e){
          try{
            componentHandler.upgradeDom();
          }catch(e){
            console.log(e);
            setTimeout(function(){
              componentHandler.upgradeDom();
            },500);
          }
        }`;
        s.onload = function () {
            // @ts-ignore
            this.remove();
        };
        head.get(0).appendChild(s);
    }
};

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))

/***/ }),
/* 8 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return settingsObj; });
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var settingsObj = {
    options: {
        autoTracking: true,
        userscriptMode: false,
        delay: 0,
        malTags: true,
        malResume: true,
        epPredictions: true,
        posLeft: 'left',
        miniMALonMal: false,
        displayFloatButton: true,
        outWay: true,
        miniMalWidth: '30%',
        miniMalHeight: '90%',
        malThumbnail: 100,
        '9anime': true,
        Crunchyroll: true,
        Gogoanime: true,
        Kissanime: true,
        Masterani: true,
        Kissmanga: true,
        Mangadex: true,
        updateCheckNotifications: true,
    },
    init: function () {
        return __awaiter(this, void 0, void 0, function* () {
            return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
                for (var key in this.options) {
                    var store = yield api.storage.get('settings/' + key);
                    if (typeof store != 'undefined') {
                        this.options[key] = store;
                    }
                }
                con.log('Settings', this.options);
                resolve(this);
            }));
        });
    },
    get: function (name) {
        return this.options[name];
    },
    set: function (name, value) {
        if (this.options.hasOwnProperty(name)) {
            this.options[name] = value;
            api.storage.set('settings/' + name, value);
        }
        else {
            con.error(name + ' is not a defined option');
        }
    }
};

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(2)))

/***/ }),
/* 9 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(j, utils, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return syncPage; });
/* harmony import */ var _pages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);
/* harmony import */ var _utils_mal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
/* harmony import */ var _minimal_iframe__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(19);
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};



class syncPage {
    constructor(url) {
        this.url = url;
        this.UILoaded = false;
        this.page = this.getPage(url);
        if (this.page == null) {
            throw new Error('Page could not be recognized');
        }
    }
    init() {
        var This = this;
        j.$(document).ready(function () {
            Object(_minimal_iframe__WEBPACK_IMPORTED_MODULE_2__[/* initIframeModal */ "a"])(This);
        });
        this.page.init(this);
    }
    getPage(url) {
        for (var key in _pages__WEBPACK_IMPORTED_MODULE_0__[/* pages */ "b"]) {
            var page = _pages__WEBPACK_IMPORTED_MODULE_0__[/* pages */ "b"][key];
            if (j.$.isArray(page.domain)) {
                for (var k in page.domain) {
                    var singleDomain = page.domain[k];
                    if (checkDomain(singleDomain)) {
                        page.domain = singleDomain;
                        return page;
                    }
                }
            }
            else {
                if (checkDomain(page.domain)) {
                    return page;
                }
            }
            function checkDomain(domain) {
                if (url.indexOf(utils.urlPart(domain, 2).split('.').slice(-2, -1)[0] + '.') > -1) {
                    return true;
                }
                return false;
            }
        }
        return null;
    }
    handlePage() {
        return __awaiter(this, void 0, void 0, function* () {
            var state;
            var This = this;
            this.url = window.location.href;
            this.loadUI();
            if (this.page.isSyncPage(this.url)) {
                state = {
                    title: this.page.sync.getTitle(this.url),
                    identifier: this.page.sync.getIdentifier(this.url)
                };
                this.offset = yield api.storage.get(this.page.name + '/' + state.identifier + '/Offset');
                state.episode = +parseInt(this.page.sync.getEpisode(this.url) + '') + parseInt(this.getOffset());
                if (typeof (this.page.sync.getVolume) != "undefined") {
                    state.volume = this.page.sync.getVolume(this.url);
                }
                con.log('Sync', state);
            }
            else {
                if (typeof (this.page.overview) == "undefined") {
                    con.log('No overview definition');
                    return;
                }
                state = {
                    title: this.page.overview.getTitle(this.url),
                    identifier: this.page.overview.getIdentifier(this.url)
                };
                this.offset = yield api.storage.get(this.page.name + '/' + state.identifier + '/Offset');
                con.log('Overview', state);
            }
            var malUrl = yield this.getMalUrl(state.identifier, state.title, this.page);
            if (malUrl === null) {
                j.$("#MalInfo").text("Not Found!");
                con.log('Not on mal');
            }
            else if (!malUrl) {
                j.$("#MalInfo").text("Nothing Found!");
                con.log('Nothing found');
            }
            else {
                con.log('MyAnimeList', malUrl);
                this.malObj = new _utils_mal__WEBPACK_IMPORTED_MODULE_1__[/* mal */ "a"](malUrl);
                yield this.malObj.init();
                this.oldMalObj = this.malObj.clone();
                //fillUI
                this.fillUI();
                if (!this.malObj.login) {
                    utils.flashm("Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>", { error: true });
                    return;
                }
                //sync
                if (this.page.isSyncPage(this.url)) {
                    if (yield this.handleAnimeUpdate(state)) {
                        con.log('Start Sync (' + api.settings.get('delay') + ' Seconds)');
                        if (api.settings.get('autoTracking')) {
                            setTimeout(() => {
                                sync();
                            }, api.settings.get('delay') * 1000);
                        }
                        else {
                            if (This.page.type == 'anime') {
                                var epis = 'episode: ' + state.episode;
                            }
                            else {
                                var epis = 'chapter: <b>' + state.episode + '</b>';
                            }
                            var message = '<button class="sync" style="margin-bottom: 8px; background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Update MAL to ' + epis + '</button>';
                            utils.flashm(message, { hoverInfo: true, error: true, type: 'update' }).find('.sync').on('click', function () {
                                j.$('.flashinfo').remove();
                                sync();
                            });
                            //Debugging
                            con.log('overviewUrl', This.page.sync.getOverviewUrl(This.url));
                            if (typeof This.page.sync.nextEpUrl !== 'undefined') {
                                con.log('nextEp', This.page.sync.nextEpUrl(This.url));
                            }
                        }
                        function sync() {
                            This.malObj.setResumeWaching(This.url, state.episode);
                            if (typeof This.page.sync.nextEpUrl !== 'undefined') {
                                var continueWatching = This.page.sync.nextEpUrl(This.url);
                                if (continueWatching && !(continueWatching.indexOf('undefined') != -1)) {
                                    This.malObj.setContinueWaching(continueWatching, state.episode + 1);
                                }
                            }
                            This.syncHandling(true);
                        }
                    }
                    else {
                        con.log('Nothing to Sync');
                    }
                }
            }
        });
    }
    syncHandling(hoverInfo = false) {
        var This = this;
        return this.malObj.sync()
            .then(function () {
            var message = This.malObj.name;
            var split = '<br>';
            var totalVol = This.malObj.totalVol;
            if (totalVol == 0)
                totalVol = '?';
            var totalEp = This.malObj.totalEp;
            if (totalEp == 0)
                totalEp = '?';
            if (typeof This.oldMalObj == "undefined" || This.malObj.getStatus() != This.oldMalObj.getStatus()) {
                var statusString = "";
                switch (parseInt(This.malObj.getStatus())) {
                    case 1:
                        statusString = utils.watching(This.page.type);
                        break;
                    case 2:
                        statusString = 'Completed';
                        break;
                    case 3:
                        statusString = 'On-Hold';
                        break;
                    case 4:
                        statusString = 'Dropped';
                        break;
                    case 6:
                        statusString = utils.planTo(This.page.type);
                        break;
                }
                message += split + statusString;
                split = ' | ';
            }
            if (This.page.type == 'manga' && (typeof This.oldMalObj == "undefined" || This.malObj.getVolume() != This.oldMalObj.getVolume())) {
                message += split + 'Volume: ' + This.malObj.getVolume() + "/" + totalVol;
                split = ' | ';
            }
            if (typeof This.oldMalObj == "undefined" || This.malObj.getEpisode() != This.oldMalObj.getEpisode()) {
                message += split + 'Episode: ' + This.malObj.getEpisode() + "/" + totalEp;
                split = ' | ';
            }
            if (typeof This.oldMalObj == "undefined" || This.malObj.getScore() != This.oldMalObj.getScore() && This.malObj.getScore() != '') {
                message += split + 'Rating: ' + This.malObj.getScore();
                split = ' | ';
            }
            if (hoverInfo) {
                /*if(episodeInfoBox){//TODO
                    episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl'], message, function(){
                        undoAnime['checkIncrease'] = 0;
                        setanime(thisUrl, undoAnime, null, localListType);
                        j.$('.info-Mal-undo').remove();
                        if(j.$('.flashinfo>div').text() == ''){
                            j.$('.flashinfo').remove();
                        }
                    });
                }*/
                if (typeof This.oldMalObj != "undefined") {
                    message += '<br><button class="undoButton" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Undo</button>';
                }
                utils.flashm(message, { hoverInfo: true, type: 'update' }).find('.undoButton').on('click', function () {
                    this.closest('.flash').remove();
                    This.malObj = This.oldMalObj;
                    This.oldMalObj = undefined;
                    This.syncHandling();
                });
            }
            else {
                utils.flashm(message);
            }
            This.fillUI();
            return;
        }).catch(function (e) {
            con.error(e);
            utils.flashm("Update failed", { error: true });
            return;
        });
    }
    handleAnimeUpdate(state) {
        return __awaiter(this, void 0, void 0, function* () {
            var status = utils.status;
            if (this.malObj.getEpisode() >= state.episode) {
                return false;
            }
            this.malObj.setEpisode(state.episode);
            this.malObj.setStreamingUrl(this.page.sync.getOverviewUrl(this.url));
            //TODO: Add the Rewatching Handling
            this.malObj.setStartingDateToNow();
            if (this.malObj.getStatus() !== status.completed && parseInt(state.episode) === this.malObj.totalEp && parseInt(state.episode) != 0) {
                if (yield utils.flashConfirm('Set as completed?', 'complete')) {
                    this.malObj.setStatus(status.completed);
                    this.malObj.setCompletionDateToNow();
                    return true;
                }
            }
            if (this.malObj.getStatus() !== status.watching && this.malObj.getStatus() !== status.completed && state.status !== status.completed) {
                if (yield utils.flashConfirm('Start ' + utils.watching(this.page.type).toLowerCase() + '?', 'start')) {
                    this.malObj.setStatus(status.watching);
                }
                else {
                    return false;
                }
            }
            return true;
        });
    }
    fillUI() {
        j.$('.MalLogin').css("display", "initial");
        j.$('#AddMalDiv').remove();
        j.$("#malRating").attr("href", this.malObj.url);
        this.malObj.getRating().then((rating) => { j.$("#malRating").text(rating); });
        if (!this.malObj.login) {
            j.$('.MalLogin').css("display", "none");
            j.$("#MalData").css("display", "flex");
            j.$("#MalInfo").text("");
            j.$("#malRating").after("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span id='LoginMalDiv'>Please log in on <a target='_blank' id='login' href='https://myanimelist.net/login.php'>MyAnimeList!<a></span>");
            return;
        }
        if (this.malObj.addAnime) {
            j.$('.MalLogin').css("display", "none");
            j.$("#malRating").after("<span id='AddMalDiv'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='#' id='AddMal' onclick='return false;'>Add to MAL</a></span>");
            var This = this;
            j.$('#AddMal').click(function () {
                This.malObj.setStatus(6);
                This.syncHandling()
                    .then(() => {
                    return This.malObj.update();
                }).then(() => {
                    This.fillUI();
                });
            });
        }
        else {
            j.$("#malTotal, #malTotalCha").text(this.malObj.totalEp);
            if (this.malObj.totalEp == 0) {
                j.$("#malTotal, #malTotalCha").text('?');
            }
            j.$("#malTotalVol").text(this.malObj.totalVol);
            if (this.malObj.totalVol == 0) {
                j.$("#malTotalVol").text('?');
            }
            j.$("#malEpisodes").val(this.malObj.getEpisode());
            j.$("#malVolumes").val(this.malObj.getVolume());
            j.$("#malStatus").val(this.malObj.getStatus());
            j.$("#malUserRating").val(this.malObj.getScore());
        }
        j.$("#MalData").css("display", "flex");
        j.$("#MalInfo").text("");
        try {
            this.handleList(true);
        }
        catch (e) {
            con.error(e);
        }
    }
    handleList(searchCurrent = false, reTry = 0) {
        j.$('.mal-sync-active').removeClass('mal-sync-active');
        if (typeof (this.page.overview) != "undefined" && typeof (this.page.overview.list) != "undefined") {
            var epList = this.getEpList();
            if (typeof (epList) != "undefined" && epList.length > 0) {
                var elementUrl = this.page.overview.list.elementUrl;
                con.log("Episode List", j.$.map(epList, function (val, i) { if (typeof (val) != "undefined") {
                    return elementUrl(val);
                } return '-'; }));
                var curEp = epList[this.malObj.getEpisode()];
                if (typeof (curEp) != "undefined" && curEp) {
                    curEp.addClass('mal-sync-active');
                }
                else if (this.malObj.getEpisode() && searchCurrent && reTry < 10 && typeof this.page.overview.list.paginationNext !== 'undefined') {
                    con.log('Pagination next');
                    var This = this;
                    if (this.page.overview.list.paginationNext()) {
                        setTimeout(function () {
                            reTry++;
                            This.handleList(true, reTry);
                        }, 500);
                    }
                }
                var nextEp = epList[this.malObj.getEpisode() + 1];
                if (typeof (nextEp) != "undefined" && nextEp && !this.page.isSyncPage(this.url)) {
                    var message = '<a href="' + elementUrl(nextEp) + '">' + utils.episode(this.page.type) + ' ' + (this.malObj.getEpisode() + 1) + '</a>';
                    utils.flashm(message, { hoverInfo: true, type: 'nextEp' });
                }
            }
        }
    }
    getEpList() {
        var This = this;
        if (typeof (this.page.overview) != "undefined" && typeof (this.page.overview.list) != "undefined") {
            var elementEp = this.page.overview.list.elementEp;
            var elementArray = [];
            this.page.overview.list.elementsSelector().each(function (index, el) {
                try {
                    var elEp = parseInt(elementEp(j.$(el)) + "") + parseInt(This.getOffset());
                    elementArray[elEp] = j.$(el);
                }
                catch (e) {
                    con.info(e);
                }
            });
            return elementArray;
        }
    }
    cdn() {
    }
    getMalUrl(identifier, title, page) {
        return __awaiter(this, void 0, void 0, function* () {
            var This = this;
            var cache = yield api.storage.get(this.page.name + '/' + identifier + '/Mal', null);
            if (typeof (cache) != "undefined") {
                con.log('Cache', this.page.name + '/' + identifier, cache);
                return cache;
            }
            if (typeof page.database != "undefined") {
                var firebaseVal = yield firebase();
                if (firebaseVal !== false) {
                    return firebaseVal;
                }
            }
            var malSearchVal = yield malSearch();
            if (malSearchVal !== false) {
                return malSearchVal;
            }
            return false;
            function firebase() {
                var url = 'https://kissanimelist.firebaseio.com/Data2/' + page.database + '/' + encodeURIComponent(titleToDbKey(identifier)).toLowerCase() + '/Mal.json';
                con.log("Firebase", url);
                return api.request.xhr('GET', url).then((response) => {
                    con.log("Firebase response", response.responseText);
                    if (response.responseText !== 'null' && !(response.responseText.indexOf("error") > -1)) {
                        var returnUrl = '';
                        if (response.responseText.split('"')[1] == 'Not-Found') {
                            returnUrl = null;
                        }
                        else {
                            returnUrl = 'https://myanimelist.net/' + page.type + '/' + response.responseText.split('"')[1] + '/' + response.responseText.split('"')[3];
                        }
                        This.setCache(returnUrl, false, identifier);
                        return returnUrl;
                    }
                    else {
                        return false;
                    }
                });
            }
            function malSearch() {
                var url = "https://myanimelist.net/" + page.type + ".php?q=" + encodeURI(title);
                con.log("malSearch", url);
                return api.request.xhr('GET', url).then((response) => {
                    if (response.responseText !== 'null' && !(response.responseText.indexOf("  error ") > -1)) {
                        try {
                            var link = response.responseText.split('<a class="hoverinfo_trigger" href="')[1].split('"')[0];
                            This.setCache(link, true, identifier);
                            return link;
                        }
                        catch (e) {
                            con.error(e);
                            return false;
                        }
                    }
                    else {
                        return false;
                    }
                });
            }
            //Helper
            function titleToDbKey(title) {
                if (window.location.href.indexOf("crunchyroll.com") > -1) {
                    return encodeURIComponent(title.toLowerCase().split('#')[0]).replace(/\./g, '%2E');
                }
                return title.toLowerCase().split('#')[0].replace(/\./g, '%2E');
            }
            ;
        });
    }
    setCache(url, toDatabase, identifier = null) {
        if (identifier == null) {
            if (this.page.isSyncPage(this.url)) {
                identifier = this.page.sync.getIdentifier(this.url);
            }
            else {
                identifier = this.page.overview.getIdentifier(this.url);
            }
        }
        api.storage.set(this.page.name + '/' + identifier + '/Mal', url);
        this.databaseRequest(url, toDatabase, identifier);
    }
    databaseRequest(malurl, toDatabase, identifier, kissurl = null) {
        if (typeof this.page.database != 'undefined' && toDatabase) {
            if (kissurl == null) {
                if (this.page.isSyncPage(this.url)) {
                    kissurl = this.page.sync.getOverviewUrl(this.url);
                }
                else {
                    kissurl = this.url;
                }
            }
            var param = { Kiss: kissurl, Mal: malurl };
            if (toDatabase == 'correction') {
                param['newCorrection'] = true;
            }
            var url = 'https://kissanimelist.firebaseio.com/Data2/Request/' + this.page.database + 'Request.json';
            api.request.xhr('POST', { url: url, data: JSON.stringify(param) }).then((response) => {
                if (response.responseText !== 'null' && !(response.responseText.indexOf("error") > -1)) {
                    con.log("[DB] Send to database:", param);
                }
                else {
                    con.error("[DB] Send to database:", response.responseText);
                }
            });
        }
    }
    deleteCache() {
        var getIdentifier;
        if (this.page.isSyncPage(this.url)) {
            getIdentifier = this.page.sync.getIdentifier;
        }
        else {
            getIdentifier = this.page.overview.getIdentifier;
        }
        api.storage.remove(this.page.name + '/' + getIdentifier(this.url) + '/Mal');
    }
    getOffset() {
        if (typeof this.offset == 'undefined')
            return 0;
        return this.offset;
    }
    setOffset(value) {
        return __awaiter(this, void 0, void 0, function* () {
            this.offset = value;
            var getIdentifier;
            if (this.page.isSyncPage(this.url)) {
                getIdentifier = this.page.sync.getIdentifier;
            }
            else {
                getIdentifier = this.page.overview.getIdentifier;
                this.handleList();
            }
            var returnValue = api.storage.set(this.page.name + '/' + getIdentifier(this.url) + '/Offset', value);
            if (typeof this.malObj != 'undefined') {
                api.storage.remove('updateCheck/' + this.malObj.type + '/' + this.malObj.id);
            }
            return returnValue;
        });
    }
    loadUI() {
        if (this.UILoaded)
            return;
        this.UILoaded = true;
        var wrapStart = '<span style="display: inline-block;">';
        var wrapEnd = '</span>';
        var ui = '<p id="malp">';
        ui += '<span id="MalInfo">Loading</span>';
        ui += '<span id="MalData" style="display: none; justify-content: space-between; flex-wrap: wrap;">';
        ui += wrapStart;
        ui += '<span class="info">MAL Score: </span>';
        ui += '<a id="malRating" style="min-width: 30px;display: inline-block;" target="_blank" href="">____</a>';
        ui += wrapEnd;
        //ui += '<span id="MalLogin">';
        wrapStart = '<span style="display: inline-block; display: none;" class="MalLogin">';
        ui += wrapStart;
        ui += '<span class="info">Status: </span>';
        ui += '<select id="malStatus" style="font-size: 12px;background: transparent; border-width: 1px; border-color: grey;  text-decoration: none; outline: medium none;">';
        //ui += '<option value="0" style="background: #111111;"></option>';
        ui += '<option value="1" style="background: #111111;">' + utils.watching(this.page.type) + '</option>';
        ui += '<option value="2" style="background: #111111;">Completed</option>';
        ui += '<option value="3" style="background: #111111;">On-Hold</option>';
        ui += '<option value="4" style="background: #111111;">Dropped</option>';
        ui += '<option value="6" style="background: #111111;">' + utils.planTo(this.page.type) + '</option>';
        ui += '</select>';
        ui += wrapEnd;
        if (this.page.type == 'anime') {
            var middle = '';
            middle += wrapStart;
            middle += '<span class="info">Episodes: </span>';
            middle += '<span style=" text-decoration: none; outline: medium none;">';
            middle += '<input id="malEpisodes" value="0" style="background: transparent; border-width: 1px; border-color: grey; text-align: right;  text-decoration: none; outline: medium none;" type="text" size="1" maxlength="4">';
            middle += '/<span id="malTotal">0</span>';
            middle += '</span>';
            middle += wrapEnd;
        }
        else {
            var middle = '';
            middle += wrapStart;
            middle += '<span class="info">Volumes: </span>';
            middle += '<span style=" text-decoration: none; outline: medium none;">';
            middle += '<input id="malVolumes" value="0" style="background: transparent; border-width: 1px; border-color: grey; text-align: right;  text-decoration: none; outline: medium none;" type="text" size="1" maxlength="4">';
            middle += '/<span id="malTotalVol">0</span>';
            middle += '</span>';
            middle += wrapEnd;
            middle += wrapStart;
            middle += '<span class="info">Chapters: </span>';
            middle += '<span style=" text-decoration: none; outline: medium none;">';
            middle += '<input id="malEpisodes" value="0" style="background: transparent; border-width: 1px; border-color: grey; text-align: right;  text-decoration: none; outline: medium none;" type="text" size="1" maxlength="4">';
            middle += '/<span id="malTotalCha">0</span>';
            middle += '</span>';
            middle += wrapEnd;
        }
        ui += middle;
        ui += wrapStart;
        ui += '<span class="info">Your Score: </span>';
        ui += '<select id="malUserRating" style="font-size: 12px;background: transparent; border-width: 1px; border-color: grey;  text-decoration: none; outline: medium none;"><option value="" style="background: #111111;">Select</option>';
        ui += '<option value="10" style="background: #111111;">(10) Masterpiece</option>';
        ui += '<option value="9" style="background: #111111;">(9) Great</option>';
        ui += '<option value="8" style="background: #111111;">(8) Very Good</option>';
        ui += '<option value="7" style="background: #111111;">(7) Good</option>';
        ui += '<option value="6" style="background: #111111;">(6) Fine</option>';
        ui += '<option value="5" style="background: #111111;">(5) Average</option>';
        ui += '<option value="4" style="background: #111111;">(4) Bad</option>';
        ui += '<option value="3" style="background: #111111;">(3) Very Bad</option>';
        ui += '<option value="2" style="background: #111111;">(2) Horrible</option>';
        ui += '<option value="1" style="background: #111111;">(1) Appalling</option>';
        ui += '</select>';
        ui += wrapEnd;
        //ui += '</span>';
        ui += '</span>';
        ui += '</p>';
        var uihead = '';
        uihead += '<p class="headui" style="float: right; margin: 0; margin-right: 10px">';
        uihead += '';
        uihead += '</p>';
        var uiwrong = '';
        uiwrong += '<button class="open-info-popup mdl-button" style="display:none; margin-left: 6px;">MAL</button>';
        if (this.page.isSyncPage(this.url)) {
            if (typeof (this.page.sync.uiSelector) != "undefined") {
                this.page.sync.uiSelector(j.$(ui));
            }
        }
        else {
            if (typeof (this.page.overview) != "undefined") {
                this.page.overview.uiSelector(j.$(ui));
            }
        }
        var This = this;
        j.$("#malEpisodes, #malVolumes, #malUserRating, #malStatus").change(function () {
            This.buttonclick();
        });
    }
    buttonclick() {
        this.malObj.setEpisode(j.$("#malEpisodes").val());
        if (j.$("#malVolumes").length)
            this.malObj.setVolume(j.$("#malVolumes").val());
        this.malObj.setScore(j.$("#malUserRating").val());
        this.malObj.setStatus(j.$("#malStatus").val());
        this.syncHandling()
            .then(() => {
            return this.malObj.update();
        }).then(() => {
            this.fillUI();
        });
    }
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(3), __webpack_require__(0), __webpack_require__(2)))

/***/ }),
/* 10 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(utils, j, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Kissanime; });
const Kissanime = {
    name: 'kissanime',
    domain: 'http://kissanime.ru',
    database: 'Kissanime',
    type: 'anime',
    isSyncPage: function (url) {
        if (typeof utils.urlPart(url, 5) != 'undefined') {
            if (j.$('#centerDivVideo').length) {
                return true;
            }
        }
        return false;
    },
    sync: {
        getTitle: function (url) { return Kissanime.sync.getIdentifier(url); },
        getIdentifier: function (url) { return utils.urlPart(url, 4); },
        getOverviewUrl: function (url) { return url.split('/').slice(0, 5).join('/'); },
        getEpisode: function (url) {
            var episodePart = utils.urlPart(url, 5);
            var temp = [];
            temp = episodePart.match(/[e,E][p,P][i,I]?[s,S]?[o,O]?[d,D]?[e,E]?\D?\d{3}/);
            if (temp !== null) {
                episodePart = temp[0];
            }
            temp = episodePart.match(/\d{3}/);
            if (temp === null) {
                temp = episodePart.match(/\d{2,}\-/);
                if (temp === null) {
                    episodePart = 0;
                }
                else {
                    episodePart = temp[0];
                }
            }
            else {
                episodePart = temp[0];
            }
            return episodePart;
        },
        nextEpUrl: function (url) { return url.replace(/\/[^\/]*$/, '') + '/' + j.$('#selectEpisode option:selected').next().val(); }
    },
    overview: {
        getTitle: function () { return j.$('.bigChar').first().text(); },
        getIdentifier: function (url) { return Kissanime.sync.getIdentifier(url); },
        uiSelector: function (selector) { selector.insertAfter(j.$(".bigChar").first()); },
        list: {
            elementsSelector: function () { return j.$(".listing tr"); },
            elementUrl: function (selector) { return utils.absoluteLink(selector.find('a').first().attr('href'), Kissanime.domain); },
            elementEp: function (selector) {
                var url = Kissanime.overview.list.elementUrl(selector);
                if (/_ED/.test(url))
                    return NaN;
                return Kissanime.sync.getEpisode(url);
            },
        }
    },
    init(page) {
        if (document.title == "Please wait 5 seconds...") {
            con.log("loading");
            page.cdn();
            return;
        }
        api.storage.addStyle(__webpack_require__(26).toString());
        j.$(document).ready(function () { page.handlePage(); });
    }
};

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(1), __webpack_require__(2), __webpack_require__(0)))

/***/ }),
/* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(utils, j, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Kissmanga; });
const Kissmanga = {
    name: 'kissmanga',
    domain: 'http://kissmanga.com',
    database: 'Kissmanga',
    type: 'manga',
    isSyncPage: function (url) {
        if (typeof utils.urlPart(url, 5) != 'undefined') {
            return true;
        }
        return false;
    },
    sync: {
        getTitle: function (url) { return utils.urlPart(url, 4); },
        getIdentifier: function (url) { return utils.urlPart(url, 4); },
        getOverviewUrl: function (url) { return url.split('/').slice(0, 5).join('/'); },
        getEpisode: function (url) {
            var episodePart = utils.urlPart(url, 5);
            //var temp = [];
            /*try{
              episodePart = episodePart.replace(j.$('.bigChar').attr('href').split('/')[2],'');
            }catch(e){
              episodePart = episodePart.replace(kalUrl.split("/")[4],'');
            }*/
            var temp = episodePart.match(/[c,C][h,H][a,A]?[p,P]?[t,T]?[e,E]?[r,R]?\D?\d+/);
            if (temp === null) {
                episodePart = episodePart.replace(/[V,v][o,O][l,L]\D?\d+/, '');
                temp = episodePart.match(/\d{3}/);
                if (temp === null) {
                    temp = episodePart.match(/\d+/);
                    if (temp === null) {
                        episodePart = 0;
                    }
                    else {
                        episodePart = temp[0];
                    }
                }
                else {
                    episodePart = temp[0];
                }
            }
            else {
                episodePart = temp[0].match(/\d+/)[0];
            }
            return episodePart;
        },
        getVolume: function (url) {
            try {
                url = url.match(/[V,v][o,O][l,L]\D?\d{3}/)[0];
                url = url.match(/\d+/)[0].slice(-3);
            }
            catch (e) {
                return;
            }
            return url;
        },
    },
    overview: {
        getTitle: function () { return j.$('.bigChar').first().text(); },
        getIdentifier: function (url) { return Kissmanga.sync.getIdentifier(url); },
        uiSelector: function (selector) { selector.insertAfter(j.$(".bigChar").first()); },
        list: {
            elementsSelector: function () { return j.$(".listing tr"); },
            elementUrl: function (selector) { return utils.absoluteLink(selector.find('a').first().attr('href'), Kissmanga.domain); },
            elementEp: function (selector) {
                var url = Kissmanga.overview.list.elementUrl(selector);
                if (/_ED/.test(url))
                    return NaN;
                return Kissmanga.sync.getEpisode(url);
            },
        }
    },
    init(page) {
        if (document.title == "Please wait 5 seconds...") {
            con.log("loading");
            page.cdn();
            return;
        }
        api.storage.addStyle(__webpack_require__(28).toString());
        j.$(document).ready(function () { page.handlePage(); });
    }
};

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(1), __webpack_require__(2), __webpack_require__(0)))

/***/ }),
/* 12 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(j, utils, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return nineAnime; });
const nineAnime = {
    name: '9anime',
    domain: 'https://9anime.to',
    database: '9anime',
    type: 'anime',
    isSyncPage: function (url) { return true; },
    sync: {
        getTitle: function (url) { return url.split("/")[4].split("?")[0].split(".")[0]; },
        getIdentifier: function (url) {
            url = url.split("/")[4].split("?")[0];
            if (url.indexOf(".") > -1) {
                url = url.split(".")[1];
            }
            return url;
        },
        getOverviewUrl: function (url) { return url.split('/').slice(0, 5).join('/'); },
        getEpisode: function (url) { return parseInt(j.$(".servers .episodes a.active").attr('data-base')); },
        nextEpUrl: function (url) { return nineAnime.domain + j.$(".servers .episodes a.active").parent('li').next().find('a').attr('href'); },
        uiSelector: function (selector) { j.$('<div class="widget info"><div class="widget-body"> ' + selector.html() + '</div></div>').insertBefore(j.$(".widget.info").first()); },
    },
    overview: {
        getTitle: function (url) { return ''; },
        getIdentifier: function (url) { return ''; },
        uiSelector: function (selector) { },
        list: {
            elementsSelector: function () { return j.$(".episodes.range a"); },
            elementUrl: function (selector) { return utils.absoluteLink(selector.attr('href'), nineAnime.domain); },
            elementEp: function (selector) { return selector.attr('data-base'); },
        }
    },
    init(page) {
        api.storage.addStyle(__webpack_require__(30).toString());
        utils.waitUntilTrue(function () { return j.$('.servers').length; }, function () {
            con.info('Start check');
            page.handlePage();
            utils.urlChangeDetect(function () {
                con.info('Check');
                page.handlePage();
            });
        });
    }
};

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(3), __webpack_require__(0), __webpack_require__(2)))

/***/ }),
/* 13 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(j, utils, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Crunchyroll; });
//TODO: Add mal2kiss season argument
const Crunchyroll = {
    name: 'Crunchyroll',
    domain: 'http://www.crunchyroll.com',
    database: 'Crunchyroll',
    type: 'anime',
    isSyncPage: function (url) {
        if (typeof url.split('/')[4] != 'undefined') {
            if (j.$('#showmedia_video').length) {
                return true;
            }
        }
        return false;
    },
    sync: {
        getTitle: function (url) { return Crunchyroll.sync.getIdentifier(url); },
        getIdentifier: function (url) {
            var script = (j.$("#template_body script")[1]).innerHTML;
            script = script.split('mediaMetadata =')[1].split('"name":"')[1].split(' -')[0];
            script = JSON.parse('"' + script.replace('"', '\\"') + '"');
            return script;
        },
        getOverviewUrl: function (url) { return url.split('/').slice(0, 4).join('/') + '?season=' + Crunchyroll.sync.getIdentifier(url); },
        getEpisode: function (url) {
            var episodePart = utils.urlPart(url, 4);
            var temp = [];
            temp = episodePart.match(/[e,E][p,P][i,I]?[s,S]?[o,O]?[d,D]?[e,E]?\D?\d+/);
            if (temp !== null) {
                episodePart = temp[0];
            }
            else {
                episodePart = '';
            }
            temp = episodePart.match(/\d+/);
            if (temp === null) {
                episodePart = 1;
            }
            else {
                episodePart = temp[0];
            }
            return episodePart;
        },
        nextEpUrl: function (url) { return Crunchyroll.domain + j.$('.collection-carousel-media-link-current').parent().next().find('.link').attr('href'); }
    },
    overview: {
        getTitle: function (url) { return Crunchyroll.overview.getIdentifier(url); },
        getIdentifier: function (url) {
            if (j.$('.season-dropdown').length > 1) {
                throw new Error('MAL-Sync does not support multiple seasons');
            }
            else {
                if (j.$('.season-dropdown').length) {
                    return j.$('.season-dropdown').first().text();
                }
                else {
                    return j.$('#source_showview h1 span').text();
                }
            }
        },
        uiSelector: function (selector) { selector.insertBefore(j.$("#tabs").first()); },
        list: {
            elementsSelector: function () { return j.$("#showview_content_videos .list-of-seasons .group-item a"); },
            elementUrl: function (selector) { return utils.absoluteLink(selector.attr('href'), Crunchyroll.domain); },
            elementEp: function (selector) {
                var url = Crunchyroll.overview.list.elementUrl(selector);
                return Crunchyroll.sync.getEpisode(url);
            },
        }
    },
    init(page) {
        api.storage.addStyle(__webpack_require__(32).toString());
        page.setCacheTemp = page.setCache;
        page.setCache = function (url, toDatabase, identifier = null) {
            if (this.page.isSyncPage(this.url)) {
                this.setCacheTemp(url, toDatabase, identifier);
            }
        };
        page.databaseRequestTemp = page.databaseRequest;
        page.databaseRequest = function (malurl, toDatabase, identifier, kissurl = null) {
            this.databaseRequestTemp(malurl, toDatabase, identifier, this.url + '?..' + encodeURIComponent(identifier.toLowerCase().split('#')[0]).replace(/\./g, '%2E'));
        };
        j.$(document).ready(function () {
            if (j.$('.season-dropdown').length > 1) {
                j.$('.season-dropdown').append('<span class="exclusivMal" style="float: right; margin-right: 20px; color: #0A6DA4;" onclick="return false;">MAL</span>');
                j.$('.exclusivMal').click(function (evt) {
                    j.$('#showview_content').before('<div><a href="' + page.url.split('?')[0] + '">Show hidden seasons</a></div>');
                    var thisparent = j.$(evt.target).parent();
                    j.$('.season-dropdown').not(thisparent).siblings().remove();
                    j.$('.season-dropdown').not(thisparent).remove();
                    j.$('.portrait-grid').css('display', 'block').find("li.group-item img.landscape").each(function () {
                        // @ts-ignore
                        void 0 === j.$(this).attr("src") && j.$(this).attr("src", j.$(this).attr("data-thumbnailUrl"));
                    }),
                        j.$('.exclusivMal').remove();
                    page.handlePage();
                });
                var season = new RegExp('[\?&]' + 'season' + '=([^&#]*)').exec(page.url);
                if (season != null) {
                    // @ts-ignore
                    season = season[1] || null;
                    if (season != null) {
                        // @ts-ignore
                        season = decodeURIComponent(decodeURI(season));
                        j.$('.season-dropdown[title="' + season + '" i] .exclusivMal').first().click();
                    }
                }
                return;
            }
            else {
                page.handlePage();
            }
        });
    }
};

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(3), __webpack_require__(0)))

/***/ }),
/* 14 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(utils, j, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Masterani; });
const Masterani = {
    name: 'Masterani',
    domain: 'https://www.masterani.me',
    database: 'Masterani',
    type: 'anime',
    isSyncPage: function (url) {
        if (url.split('/')[4] !== 'watch') {
            return false;
        }
        else {
            return true;
        }
    },
    sync: {
        getTitle: function (url) { return Masterani.sync.getIdentifier(url).replace(/^\d*-/, ''); },
        getIdentifier: function (url) { return utils.urlPart(url, 5); },
        getOverviewUrl: function (url) { return utils.absoluteLink(j.$('.info a').first().attr('href'), Masterani.domain); },
        getEpisode: function (url) {
            return parseInt(utils.urlPart(url, 6));
        },
        nextEpUrl: function (url) { return Masterani.domain + j.$('#watch .anime-info .actions a').last().attr('href'); }
    },
    overview: {
        getTitle: function (url) { return Masterani.sync.getTitle(url); },
        getIdentifier: function (url) { return Masterani.sync.getIdentifier(url); },
        uiSelector: function (selector) { selector.prependTo(j.$("#stats").first()); },
        list: {
            elementsSelector: function () { return j.$(".episodes .thumbnail"); },
            elementUrl: function (selector) { return utils.absoluteLink(selector.find('a').first().attr('href'), Masterani.domain); },
            elementEp: function (selector) {
                return Masterani.sync.getEpisode(Masterani.overview.list.elementUrl(selector));
            },
            paginationNext: function () {
                var el = j.$('.pagination .item').last();
                if (el.hasClass('disabled')) {
                    return false;
                }
                else {
                    el[0].click();
                    return true;
                }
            }
        }
    },
    init(page) {
        api.storage.addStyle(__webpack_require__(34).toString());
        utils.waitUntilTrue(function () { return j.$('#stats,#watch').length; }, function () {
            page.handlePage();
            j.$('.ui.toggle.checkbox, .pagination.menu').click(function () {
                setTimeout(function () {
                    page.handleList();
                }, 500);
            });
        });
    }
};

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(1), __webpack_require__(0)))

/***/ }),
/* 15 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(j, utils, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Mangadex; });
const Mangadex = {
    name: 'Mangadex',
    domain: 'https://www.mangadex.org',
    database: 'Mangadex',
    type: 'manga',
    isSyncPage: function (url) {
        if (url.split('/')[3] !== 'chapter') {
            return false;
        }
        else {
            return true;
        }
    },
    sync: {
        getTitle: function (url) { return j.$('.manga-link').text().trim(); },
        getIdentifier: function (url) { return utils.urlPart(Mangadex.sync.getOverviewUrl(url), 4); },
        getOverviewUrl: function (url) { return utils.absoluteLink(j.$('a.manga-link').first().attr('href'), Mangadex.domain); },
        getEpisode: function (url) {
            var chapterId = url.split('/')[4];
            var curOption = j.$('#jump-chapter option[value="' + chapterId + '"]');
            if (curOption.length) {
                var temp = curOption.text().trim().match(/ch\.\D?\d+/i);
                if (temp !== null) {
                    return EpisodePartToEpisode(temp[0]);
                }
            }
            return NaN;
        },
        getVolume: function (url) {
            var chapterId = url.split('/')[4];
            var curOption = j.$('#jump-chapter option[value="' + chapterId + '"]');
            if (curOption.length) {
                var temp = curOption.text().trim().match(/vol\.\D?\d+/i);
                if (temp !== null) {
                    temp = temp[0].match(/\d+/);
                    if (temp !== null) {
                        return parseInt(temp[0]);
                    }
                }
            }
            return 0;
        },
    },
    overview: {
        getTitle: function () { return j.$('.card-header').first().text().trim(); },
        getIdentifier: function (url) { return utils.urlPart(url, 4); },
        uiSelector: function (selector) {
            j.$(".container .card .edit.row > * > .row").first().after('<div class="row m-0 py-1 px-0 border-top"><div class="col-lg-3 col-xl-2 strong">MyAnimeList:</div><div class="col-lg-9 col-xl-10 kal-ui"></div></div>');
            selector.appendTo(j.$(".container .card .kal-ui").first());
        },
        list: {
            elementsSelector: function () { return j.$(".chapter-container > .row:not(:first-of-type) .chapter-row"); },
            elementUrl: function (selector) { return utils.absoluteLink(selector.find("a").first().attr('href'), Mangadex.domain); },
            elementEp: function (selector) { return selector.attr('data-chapter'); },
        }
    },
    init(page) {
        api.storage.addStyle(__webpack_require__(36).toString());
        if (j.$('.card-header').length) {
            j.$(document).ready(function () { page.handlePage(); });
        }
        else {
            con.info('Waiting');
            utils.waitUntilTrue(function () { return Mangadex.sync.getOverviewUrl(''); }, function () {
                con.info('Start');
                page.handlePage();
                var tempChapterId = utils.urlPart(window.location.href, 4);
                utils.urlChangeDetect(function () {
                    var newTempChapterId = utils.urlPart(window.location.href, 4);
                    if (tempChapterId !== newTempChapterId) {
                        tempChapterId = newTempChapterId;
                        con.info('Check');
                        page.handlePage();
                    }
                    else {
                        con.info('Nothing to do');
                    }
                });
            });
        }
    }
};
function EpisodePartToEpisode(string) {
    if (!string)
        return '';
    if (!(isNaN(parseInt(string)))) {
        return string;
    }
    var temp = [];
    temp = string.match(/ch\.\D?\d+/i);
    console.log(temp);
    if (temp !== null) {
        string = temp[0];
        temp = string.match(/\d+/);
        if (temp !== null) {
            return temp[0];
        }
    }
    return '';
}
;

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(3), __webpack_require__(0), __webpack_require__(2)))

/***/ }),
/* 16 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(utils, j, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Mangarock; });
const Mangarock = {
    name: 'Mangarock',
    domain: 'https://mangarock.com',
    type: 'manga',
    isSyncPage: function (url) {
        if (typeof utils.urlPart(url, 5) != 'undefined') {
            return true;
        }
        return false;
    },
    sync: {
        getTitle: function (url) {
            return j.$('a[href*="' + Mangarock.overview.getIdentifier(url) + '"]').text().trim();
        },
        getIdentifier: function (url) { return Mangarock.overview.getIdentifier(url); },
        getOverviewUrl: function (url) { return url.split('/').slice(0, 5).join('/'); },
        getEpisode: function (url) {
            con.log(j.$("option:contains('Chapter')").first().parent().find(':selected').text());
            return EpisodePartToEpisode(j.$("option:contains('Chapter')").first().parent().find(':selected').text());
        },
        getVolume: function (url) {
            return 0;
        },
    },
    overview: {
        getTitle: function () { return j.$('h1').first().text().trim(); },
        getIdentifier: function (url) { return utils.urlPart(url, 4).replace(/mrs-serie-/i, ''); },
        uiSelector: function (selector) {
            selector.insertBefore($("h2:contains('Chapters')").first().parent().parent().parent());
        },
        list: {
            elementsSelector: function () { return j.$('[data-test="chapter-table"] tr'); },
            elementUrl: function (selector) { return utils.absoluteLink(selector.find("a").first().attr('href'), Mangarock.domain); },
            elementEp: function (selector) { return EpisodePartToEpisode(selector.find('a').text()); },
        }
    },
    init(page) {
        api.storage.addStyle(__webpack_require__(38).toString());
        start();
        utils.urlChangeDetect(function () {
            page.url = window.location.href;
            page.UILoaded = false;
            $('#flashinfo-div, #flash-div-bottom, #flash-div-top').remove();
            start();
        });
        function start() {
            if (!/manga/i.test(utils.urlPart(page.url, 3))) {
                con.log('Not a manga page!');
                return;
            }
            if (Mangarock.isSyncPage(page.url)) {
                utils.waitUntilTrue(function () { return Mangarock.sync.getTitle(page.url); }, function () {
                    page.handlePage();
                });
            }
            else {
                j.$(document).ready(function () {
                    var waitTimeout = false;
                    utils.waitUntilTrue(function () {
                        con.log('visibility', j.$('#page-content .col-lg-8 .lazyload-placeholder:visible').length);
                        return !j.$('#page-content .col-lg-8 .lazyload-placeholder:visible').length || waitTimeout;
                    }, function () {
                        page.handlePage();
                    });
                    setTimeout(function () {
                        waitTimeout = true;
                    }, 2000);
                });
            }
        }
    }
};
function EpisodePartToEpisode(string) {
    if (!string)
        return '';
    if (!(isNaN(parseInt(string)))) {
        return string;
    }
    var temp = [];
    temp = string.match(/Chapter\ \d+/i);
    con.log(temp);
    if (temp !== null) {
        string = temp[0];
        temp = string.match(/\d+/);
        if (temp !== null) {
            return temp[0];
        }
    }
    return '';
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(1), __webpack_require__(2), __webpack_require__(0)))

/***/ }),
/* 17 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(utils, j, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Gogoanime; });
const Gogoanime = {
    name: 'Gogoanime',
    domain: ['https://gogoanimes.co', 'https://gogoanime.tv'],
    database: 'Gogoanime',
    type: 'anime',
    isSyncPage: function (url) {
        if (utils.urlPart(url, 3) === 'category') {
            return false;
        }
        else {
            return true;
        }
    },
    sync: {
        getTitle: function (url) { return Gogoanime.sync.getIdentifier(url); },
        getIdentifier: function (url) { return utils.urlPart(url, 3).split('-episode')[0]; },
        getOverviewUrl: function (url) { return url.split('/').slice(0, 3).join('/') + '/category/' + Gogoanime.sync.getIdentifier(url); },
        getEpisode: function (url) { return utils.urlPart(url, 3).split('episode-')[1]; },
        nextEpUrl: function (url) { return Gogoanime.domain + j.$('.anime_video_body_episodes_r a').last().attr('href'); }
    },
    overview: {
        getTitle: function (url) { return Gogoanime.overview.getIdentifier(url); },
        getIdentifier: function (url) { return utils.urlPart(url, 4); },
        uiSelector: function (selector) { selector.prependTo(j.$(".anime_info_body").first()); },
        list: {
            elementsSelector: function () { return j.$("#episode_related a"); },
            elementUrl: function (selector) { return utils.absoluteLink(selector.attr('href').replace(/^ /, ''), Gogoanime.domain); },
            elementEp: function (selector) {
                var url = Gogoanime.overview.list.elementUrl(selector);
                return Gogoanime.sync.getEpisode(url);
            },
            paginationNext: function () {
                var next = false;
                var nextReturn = false;
                j.$(j.$('#episode_page a').get().reverse()).each(function (index, el) {
                    if (next && !nextReturn) {
                        el.click();
                        nextReturn = true;
                        return;
                    }
                    if (j.$(el).hasClass('active')) {
                        next = true;
                    }
                });
                return nextReturn;
            }
        }
    },
    init(page) {
        api.storage.addStyle(__webpack_require__(40).toString());
        if (Gogoanime.isSyncPage(page.url)) {
            j.$(document).ready(function () {
                start();
            });
        }
        else {
            con.log('noSync');
            utils.waitUntilTrue(function () { return j.$('#episode_related').length; }, function () {
                start();
            });
        }
        function start() {
            Gogoanime.domain = window.location.protocol + "//" + window.location.hostname;
            page.handlePage();
            j.$('#episode_page').click(function () {
                setTimeout(function () {
                    page.handleList();
                }, 500);
            });
        }
    }
};

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(1), __webpack_require__(0), __webpack_require__(2)))

/***/ }),
/* 18 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(utils, j, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Animeheaven; });
const Animeheaven = {
    name: 'Animeheaven',
    domain: 'http://animeheaven.eu',
    type: 'anime',
    isSyncPage: function (url) {
        if (utils.urlPart(url, 3) === 'watch.php') {
            return true;
        }
        return false;
    },
    sync: {
        getTitle: function (url) { return Animeheaven.sync.getIdentifier(url); },
        getIdentifier: function (url) { return utils.urlParam(url, 'a'); },
        getOverviewUrl: function (url) { return utils.absoluteLink(j.$('a.infoan2').first().attr('href'), Animeheaven.domain); },
        getEpisode: function (url) { return utils.urlParam(url, 'e'); },
        nextEpUrl: function (url) { return utils.absoluteLink(j.$('.next2').first().parent().attr('href'), Animeheaven.domain); }
    },
    overview: {
        getTitle: function (url) { return Animeheaven.sync.getIdentifier(url); },
        getIdentifier: function (url) { return Animeheaven.sync.getIdentifier(url); },
        uiSelector: function (selector) { selector.insertBefore(j.$(".infoepboxmain").first()); },
        list: {
            elementsSelector: function () { return j.$(".infoepbox > a"); },
            elementUrl: function (selector) { return utils.absoluteLink(selector.attr('href'), Animeheaven.domain); },
            elementEp: function (selector) {
                var url = Animeheaven.overview.list.elementUrl(selector);
                return Animeheaven.sync.getEpisode(url);
            }
        }
    },
    init(page) {
        api.storage.addStyle(__webpack_require__(42).toString());
        j.$(document).ready(function () {
            page.handlePage();
            setDesign();
            $('#bbox').click(function () {
                setDesign();
            });
        });
        function setDesign() {
            if ($('#bwsel').hasClass('bwselect2')) {
                $('body').addClass('white');
            }
            else {
                $('body').removeClass('white');
            }
        }
    }
};

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(1), __webpack_require__(0)))

/***/ }),
/* 19 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(j, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return initIframeModal; });
/* harmony import */ var _minimalClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20);

var minimalObj;
function createIframe(page) {
    var iframe = document.createElement('iframe');
    iframe.setAttribute("id", "info-iframe");
    iframe.setAttribute("style", "height:100%;width:100%;border:0;display:block;");
    iframe.onload = function () {
        var head = j.$("#info-iframe").contents().find("head");
        api.storage.injectjsResource('simpleBar.js', head);
        api.storage.injectjsResource('material.js', head);
        api.storage.updateDom(head);
        api.storage.injectCssResource('material.css', head);
        api.storage.injectCssResource('materialFont.css', head);
        api.storage.injectCssResource('simpleBar.css', head);
        setTimeout(function () {
            minimalObj = new _minimalClass__WEBPACK_IMPORTED_MODULE_0__[/* minimal */ "a"](j.$("#info-iframe").contents().find('html'));
            if (typeof (page) != 'undefined') {
                minimalObj.setPageSync(page);
                if (typeof (page.malObj) != 'undefined') {
                    minimalObj.fill(page.malObj.url);
                }
                else {
                    minimalObj.fill(null);
                }
            }
        }, 200);
    };
    document.getElementById("modal-content").appendChild(iframe);
    j.$("#modal-content").append('<div class="kal-tempHeader" style="position:  absolute; width: 100%; height:  103px; background-color: rgb(63,81,181); "></div>');
    if ((!j.$("#info-iframe").length) || (j.$('#info-iframe').css('display') != 'block')) {
        j.$('#info-popup').remove();
        alert('The miniMAL iframe could not be loaded.\nThis could be caused by an AdBlocker.');
    }
}
function initIframeModal(page) {
    var posLeft = api.settings.get('posLeft');
    var miniMalWidth = api.settings.get('miniMalWidth');
    var miniMalHeight = api.settings.get('miniMalHeight');
    if (!(j.$('#info-popup').length)) {
        api.storage.addStyle('.modal-content-kal.fullscreen{width: 100% !important;height: 100% !important; bottom: 0 !important;' + posLeft + ': 0 !important;}\
      .modal-content-kal{-webkit-transition: all 0.5s ease; -moz-transition: all 0.5s ease; -o-transition: all 0.5s ease; transition: all 0.5s ease;}\
      .floatbutton:hover {background-color:rgb(63,81,181);}\
      .floatbutton:hover div {background-color:white;}\
      .floatbutton div {background-color:black;-webkit-transition: all 0.5s ease;-moz-transition: all 0.5s ease;-o-transition: all 0.5s ease;transition: all 0.5s ease;}\
      .floatbutton {\
       z-index: 9999;display: none; position:fixed; bottom:40px; right:40px; border-radius: 50%; font-size: 24px; height: 56px; margin: auto; min-width: 56px; width: 56px; padding: 0; overflow: hidden; background: rgba(158,158,158,.2); box-shadow: 0 1px 1.5px 0 rgba(0,0,0,.12), 0 1px 1px 0 rgba(0,0,0,.24); line-height: normal; border: none;\
       font-weight: 500; text-transform: uppercase; letter-spacing: 0; will-change: box-shadow; transition: box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1); outline: none; cursor: pointer; text-decoration: none; text-align: center; vertical-align: middle; padding: 16px;\
      }\
      .mdl-button{\
       background: #3f51b5; color: #fff;box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);\
       border: none; border-radius: 2px;\
      }');
        //var position = 'width: 80%; height: 70%; position: absolute; top: 15%; left: 10%';
        var position = 'max-width: 100%; max-height: 100%; min-width: 500px; min-height: 300px; width: ' + miniMalWidth + '; height: ' + miniMalHeight + '; position: absolute; bottom: 0%; ' + posLeft + ': 0%'; //phone
        // @ts-ignore
        if (j.$(window).width() < 500) {
            position = 'width: 100vw; height: 100%; position: absolute; top: 0%; ' + posLeft + ': 0%';
        }
        var material = '<dialog class="modal-kal" id="info-popup" style="pointer-events: none;display: none; position: fixed;z-index: 9999;left: 0;top: 0;bottom: 0;width: 100%; height: 100%; background-color: transparent; padding: 0; margin: 0; border: 0;">';
        material += '<div id="modal-content" class="modal-content-kal" Style="pointer-events: all; background-color: #f9f9f9; margin: 0; ' + position + '">';
        material += '</div>';
        material += '</dialog>';
        j.$('body').after(material);
        var floatbutton = '<button class="open-info-popup floatbutton" style="">';
        floatbutton += '<i class="my-float open-info-popup" style="margin-top:22px;"><div class="open-info-popup" style="width: 100%; height: 4px; margin-bottom: 15%;"></div><div class="open-info-popup" style="width: 100%; height: 4px; margin-bottom: 15%;"></div><div class="open-info-popup" style="width: 100%; height: 4px"></div></i></button>';
        j.$('#info-popup').after(floatbutton);
        j.$(".open-info-popup").show();
        document.addEventListener("click", function (e) {
            if (j.$(e.target).hasClass('open-info-popup')) {
                con.log("Open miniMAL");
                if (j.$('#info-popup').css('display') == 'none') {
                    document.getElementById('info-popup').style.display = "block";
                    //fillIframe(url, currentMalData);
                    j.$('.floatbutton').fadeOut();
                    if (!(j.$('#info-iframe').length)) {
                        createIframe(page);
                    }
                    else if (typeof minimalObj !== 'undefined' && typeof (page.malObj) != 'undefined') {
                        minimalObj.fillBase(page.malObj.url);
                        minimalObj.setPageSync(page);
                    }
                }
                else {
                    document.getElementById('info-popup').style.display = "none";
                    j.$('.floatbutton').fadeIn();
                }
            }
        });
    }
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(0), __webpack_require__(2)))

/***/ }),
/* 20 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(j, utils, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return minimal; });
/* harmony import */ var _types_anime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(21);
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};

class minimal {
    constructor(minimal) {
        this.minimal = minimal;
        this.history = [];
        var material = `
      <div id="material" style="height: 100%;">
        <div class="mdl-layout mdl-js-layout mdl-layout--fixed-header mdl-layout--fixed-tabs">
          <header class="mdl-layout__header" style="min-height: 0;">
            <button class="mdl-layout__drawer-button" id="backbutton" style="display: none;"><i class="material-icons">arrow_back</i></button>
            <div class="mdl-layout__header-row">
              <button class="mdl-button mdl-js-button mdl-button--icon mdl-layout__drawer-button" id="book" style="">
                <i class="material-icons md-48 bookIcon">book</i>
                <i class="material-icons md-48 settingsIcon" style="display:none;">settings</i>
              </button>
              <div class="mdl-textfield mdl-js-textfield mdl-textfield--expandable" id="SearchButton" style="margin-left: -57px; margin-top: 3px; padding-left: 40px;">
                <label class="mdl-button mdl-js-button mdl-button--icon" for="headMalSearch">
                  <i class="material-icons">search</i>
                </label>
                <div class="mdl-textfield__expandable-holder">
                  <input class="mdl-textfield__input" type="text" id="headMalSearch">
                  <label class="mdl-textfield__label" for="headMalSearch"></label>
                </div>
              </div>
              <button class="mdl-button mdl-js-button mdl-button--icon mdl-layout__drawer-button" id="material-fullscreen" style="left: initial; right: 40px;">
                <i class="material-icons" class="material-icons md-48">fullscreen</i>
              </button>
              <button class="mdl-button mdl-js-button mdl-button--icon mdl-layout__drawer-button" id="close-info-popup" style="left: initial; right: 0;">
                <i class="material-icons close">close</i>
              </button>
            </div>
            <!-- Tabs -->
            <div class="mdl-layout__tab-bar mdl-js-ripple-effect">

              <a href="#fixed-tab-1" class="mdl-layout__tab is-active">Overview</a>
              <a href="#fixed-tab-2" class="mdl-layout__tab reviewsTab">Reviews</a>
              <a href="#fixed-tab-3" class="mdl-layout__tab recommendationTab">Recommendations</a>
              <a href="#fixed-tab-5" class="mdl-layout__tab settingsTab">Settings</a>
            </div>
          </header>
          <main class="mdl-layout__content" data-simplebar style="height:  100%;">
            <section class="mdl-layout__tab-panel is-active" id="fixed-tab-1">
              <div id="loadOverview" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div>
              <div class="page-content"></div>
            </section>
            <section class="mdl-layout__tab-panel" id="fixed-tab-2">
              <div id="loadReviews" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div>
              <div class="page-content malClear" id="malReviews"></div>
            </section>
            <section class="mdl-layout__tab-panel" id="fixed-tab-3">
              <div id="loadRecommendations" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div>
              <div class="page-content malClear" id="malRecommendations"></div>
            </section>
            <section class="mdl-layout__tab-panel" id="fixed-tab-4">
              <div id="loadMalSearchPop" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div>
              <div class="page-content malClear" id="malSearchPopInner"></div>
            </section>
            <section class="mdl-layout__tab-panel" id="fixed-tab-5">
              <div class="page-content malClear" id="malConfig"></div>
            </section></main>
          </div>
        </div>
      </div>
    `;
        this.minimal.find("body").append(material);
        this.minimal.find("head").append('<base href="https://myanimelist.net/">');
        this.uiListener();
        this.injectCss();
        this.loadSettings();
        this.updateDom();
    }
    uiListener() {
        var modal = document.getElementById('info-popup');
        var This = this;
        this.minimal.on('click', '.mdl-layout__content a', function (e) {
            // @ts-ignore
            if (j.$(this).attr('target') === '_blank' || j.$(this).hasClass('nojs')) {
                return;
            }
            e.preventDefault();
            // @ts-ignore
            var url = utils.absoluteLink(j.$(this).attr('href'), 'https://myanimelist.net');
            if (!This.fill(url)) {
                var win = window.open(url, '_blank');
                if (win) {
                    win.focus();
                }
                else {
                    alert('Please allow popups for this website');
                }
            }
        });
        this.minimal.find("#backbutton").click(function () {
            con.log('History', This.history);
            if (This.history.length > 1) {
                This.history.pop(); //Remove current page
                var url = This.history.pop();
                if (typeof url != 'undefined') {
                    This.fill(url);
                    if (This.history.length > 1) {
                        return;
                    }
                }
            }
            This.backbuttonHide();
        });
        this.minimal.find("#close-info-popup").click(function () {
            if (This.isPopup()) {
                window.close();
            }
            else {
                modal.style.display = "none";
                j.$('.floatbutton').fadeIn();
            }
        });
        this.minimal.find("#material-fullscreen").click(function () {
            if (j.$('.modal-content-kal.fullscreen').length) {
                j.$(".modal-content-kal").removeClass('fullscreen');
                // @ts-ignore
                j.$(this).find('i').text('fullscreen');
            }
            else {
                j.$(".modal-content-kal").addClass('fullscreen');
                // @ts-ignore
                j.$(this).find('i').text('fullscreen_exit');
            }
        });
        var timer;
        this.minimal.find("#headMalSearch").on("input", function () {
            var listType = 'anime';
            if (typeof This.pageSync != 'undefined') {
                listType = This.pageSync.page.type;
            }
            This.minimal.find('#fixed-tab-4 #malSearchPopInner').html('');
            This.minimal.find('#loadMalSearchPop').show();
            clearTimeout(timer);
            timer = setTimeout(function () {
                if (This.minimal.find("#headMalSearch").val() == '') {
                    This.minimal.find('#material').removeClass('pop-over');
                }
                else {
                    This.minimal.find('#material').addClass('pop-over');
                    This.searchMal(This.minimal.find("#headMalSearch").val(), listType, '#malSearchPopInner', function () {
                        This.minimal.find('#loadMalSearchPop').hide();
                    });
                }
            }, 300);
        });
        this.minimal.on('click', '.searchItem', function (e) {
            This.minimal.find("#headMalSearch").val('').trigger("input").parent().parent().removeClass('is-dirty');
        });
        this.minimal.find("#book").click(function () {
            if (This.minimal.find('#material.pop-over #malList').length) {
                This.minimal.find("#book").toggleClass('open');
                This.minimal.find('#material').removeClass('pop-over');
            }
            else {
                This.minimal.find("#book").toggleClass('open');
                This.minimal.find('#material').addClass('pop-over');
                This.bookmarks();
            }
        });
    }
    isPopup() {
        if (j.$('#Mal-Sync-Popup').length)
            return true;
        return false;
    }
    updateDom() {
        this.minimal.find("head").click();
    }
    injectCss() {
        this.minimal.find("head").append(j.$('<style>')
            .html(__webpack_require__(44).toString()));
    }
    fill(url) {
        if (url == null) {
            this.minimal.find('#material').addClass('settings-only');
            if (this.isPopup()) {
                this.minimal.find('#book').first().click();
            }
            return false;
        }
        if (/^https:\/\/myanimelist.net\/(anime|manga)\//i.test(url)) {
            this.loadOverview(new _types_anime__WEBPACK_IMPORTED_MODULE_0__[/* animeType */ "a"](url));
            return true;
        }
        this.minimal.find('#material').addClass('settings-only');
        if (this.isPopup()) {
            this.minimal.find('#book').first().click();
        }
        return false;
    }
    fillBase(url) {
        con.log('Fill Base', url, this.history);
        if (!this.history.length) {
            this.fill(url);
        }
        else if (this.history[0] !== url) {
            while (this.history.length > 0) {
                this.history.pop();
            }
            this.fill(url);
        }
    }
    setPageSync(page) {
        this.pageSync = page;
        var This = this;
        var malUrl = '';
        var title = 'Not Found';
        if (typeof page.malObj != 'undefined') {
            malUrl = page.malObj.url;
            title = page.malObj.name;
        }
        var html = ` <div class="mdl-card__title mdl-card--border">
        <h2 class="mdl-card__title-text">
          ${title}
        </h2>
      </div>
      <div class="mdl-list__item">
        <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">
          <input class="mdl-textfield__input" style="padding-right: 18px;" type="number" step="1" id="malOffset" value="${page.getOffset()}">
          <label class="mdl-textfield__label" for="malOffset">Episode Offset</label>
          ${utils.getTooltip('Input the episode offset, if an anime has 12 episodes, but uses the numbers 0-11 rather than 1-12, you simply type " +1 " in the episode offset.', 'float: right; margin-top: -17px;', 'left')}
        </div>
      </div>
      <div class="mdl-list__item" style="padding-bottom: 0;padding-top: 0;">
        <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">
          <input class="mdl-textfield__input" style="padding-right: 18px;" type="text" id="malUrlInput" value="${malUrl}">
          <label class="mdl-textfield__label" for="malUrlInput">MyAnimeList Url</label>
          ${utils.getTooltip('Only change this URL if it points to the wrong anime page on MAL.', 'float: right; margin-top: -17px;', 'left')}
        </div>
      </div>

      <div class="mdl-list__item" style="padding-bottom: 0;padding-top: 0;">
        <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">
          <label class="mdl-textfield__label" for="malSearch">
            Search
          </label>
          <input class="mdl-textfield__input" style="padding-right: 18px;" type="text" id="malSearch">
          ${utils.getTooltip('This field is for finding an anime, when you need to replace the "MyAnimeList Url" shown above.<br>To make a search, simply begin typing the name of an anime, and a list with results will automatically appear as you type.', 'float: right; margin-top: -17px;', 'left')}
        </div>
      </div>
      <div class="mdl-list__item" style="min-height: 0; padding-bottom: 0; padding-top: 0;">
        <div class="malResults" id="malSearchResults"></div>
      </div>

      <div class="mdl-list__item">
        <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored" id="malSubmit">Update</button>
        <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--accent" id="malReset" style="margin-left: 5px;">Reset</button>
      </div>`;
        this.minimal.find('#page-config').html(html).show();
        this.minimal.find("#malOffset").on("input", function () {
            var Offset = This.minimal.find("#malOffset").val();
            if (Offset !== null) {
                if (Offset !== '') {
                    page.setOffset(Offset);
                    utils.flashm("New Offset (" + Offset + ") set.");
                }
                else {
                    page.setOffset(0);
                    utils.flashm("Offset reset");
                }
            }
        });
        this.minimal.find("#malReset").click(function () {
            page.deleteCache();
            utils.flashm("MyAnimeList url reset", false);
            page.handlePage();
            This.minimal.find("#close-info-popup").trigger("click");
        });
        this.minimal.find("#malSubmit").click(function () {
            var murl = This.minimal.find("#malUrlInput").val();
            var toDatabase = false;
            if (typeof page.page.database != 'undefined' && confirm('Submit database correction request? \nIf it does not exist on MAL, please leave empty.')) {
                toDatabase = 'correction';
            }
            page.setCache(murl, toDatabase);
            utils.flashm("new url '" + murl + "' set.", false);
            page.handlePage();
            This.fillBase(murl);
        });
        var listType = 'anime';
        if (typeof This.pageSync != 'undefined') {
            listType = This.pageSync.page.type;
        }
        var timer;
        this.minimal.find("#malSearch").on("input", function () {
            clearTimeout(timer);
            timer = setTimeout(function () {
                This.searchMal(This.minimal.find("#malSearch").val(), listType, '.malResults', function () {
                    This.minimal.find("#malSearchResults .searchItem").unbind('click').click(function (e) {
                        e.preventDefault();
                        // @ts-ignore
                        This.minimal.find('#malUrlInput').val(j.$(this).attr('href'));
                        This.minimal.find('#malSearch').val('');
                        This.minimal.find('#malSearchResults').html('');
                        This.minimal.find('#malSubmit').click();
                    });
                });
            }, 300);
        });
        this.updateDom();
    }
    loadOverview(overviewObj) {
        var This = this;
        this.minimal.find("#book.open").toggleClass('open');
        this.minimal.find('#material').removeClass('settings-only').removeClass('pop-over');
        this.minimal.find('.mdl-layout__tab:eq(0) span').trigger("click");
        this.history.push(overviewObj.url);
        if (this.history.length > 1)
            this.backbuttonShow();
        this.minimal.find('#loadOverview, #loadReviews, #loadRecommendations').show();
        this.minimal.find('#fixed-tab-1 .page-content, #fixed-tab-2 .page-content, #fixed-tab-3 .page-content').html('');
        overviewObj.init()
            .then(() => {
            this.minimal.find('.reviewsTab').off("click").one('click', function () {
                overviewObj.reviews(This.minimal)
                    .then((html) => {
                    This.minimal.find('#fixed-tab-2 .page-content').html(html);
                    This.minimal.find('#loadReviews').hide();
                    overviewObj.lazyLoadReviews(This.minimal);
                });
            });
            this.minimal.find('.recommendationTab').off("click").one('click', function () {
                overviewObj.recommendations(This.minimal)
                    .then((html) => {
                    This.minimal.find('#fixed-tab-3 .page-content').html(html);
                    This.minimal.find('#loadRecommendations').hide();
                    overviewObj.lazyLoadRecommendations(This.minimal);
                });
            });
            return overviewObj.overview(this.minimal);
        }).then((html) => {
            this.minimal.find('#fixed-tab-1 .page-content').html(html);
            this.minimal.find('#loadOverview').hide();
            overviewObj.lazyLoadOverview(this.minimal);
        });
    }
    backbuttonShow() {
        this.minimal.find("#backbutton").show();
        this.minimal.find('#SearchButton').css('margin-left', '-17px');
        this.minimal.find('#book').css('left', '40px');
    }
    backbuttonHide() {
        this.minimal.find("#backbutton").hide();
        this.minimal.find('#SearchButton').css('margin-left', '-57px');
        this.minimal.find('#book').css('left', '0px');
    }
    loadSettings() {
        var This = this;
        var listener = [];
        var settingsUI = `
    <ul class="demo-list-control mdl-list" style="margin: 0px; padding: 0px;">
      <div class="mdl-grid">
        <div id="page-config" class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp" style="display: none;"></div>

        <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">
          <div class="mdl-card__title mdl-card--border">
            <h2 class="mdl-card__title-text">General</h2>
          </div>
          ${materialCheckbox('autoTracking', 'Autotracking' + utils.getTooltip('Autotracking is the function where this script automatically updates the anime`s you watch with your MAL account.', '', 'bottom'))}
          <li class="mdl-list__item">
              <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">
                  <input class="mdl-textfield__input" type="number" step="1" id="malDelay" value="${api.settings.get('delay')}">
              <label class="mdl-textfield__label" for="malDelay">Autotracking delay (Seconds)</label>
              </div>
          </li>
        </div>

        <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">
          <div class="mdl-card__title mdl-card--border">
            <h2 class="mdl-card__title-text">Streaming Site Links</h2>
            ${utils.getTooltip('If disabled, the streaming site will no longer appear in an animes sidebar on MAL.')}
          </div>
          ${materialCheckbox('Kissanime', 'KissAnime')}
          ${materialCheckbox('Masterani', 'MasterAnime')}
          ${materialCheckbox('9anime', '9anime')}
          ${materialCheckbox('Crunchyroll', 'Crunchyroll')}
          ${materialCheckbox('Gogoanime', 'Gogoanime')}
          ${materialCheckbox('Kissmanga', 'KissManga')}
          ${materialCheckbox('Mangadex', 'MangaDex')}
        </div>

        <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">
          <div class="mdl-card__title mdl-card--border">
            <h2 class="mdl-card__title-text">MyAnimeList</h2>
          </div>
          <li class="mdl-list__item">
            <span class="mdl-list__item-primary-content">
              Thumbnails
              ${utils.getTooltip('The option is for resizing the thumbnails on MAL.<br>Like thumbnails for characters, people, recommendations, etc.')}
            </span>
            <span class="mdl-list__item-secondary-action">
              <select name="myinfo_score" id="malThumbnail" class="inputtext mdl-textfield__input" style="outline: none;">
                <option value="144">Large</option>
                <option value="100">Medium</option>
                <option value="60">Small</option>
                <option value="0">MAL Default</option>
              </select>
            </span>
          </li>
          ${materialCheckbox('epPredictions', 'Estimate episode number')}
          ${materialCheckbox('malTags', 'Continue watching links' + utils.getTooltip('If enabled: On your MAL Anime List and the bookmark list in miniMAL, an icon-link will be added to the last used streaming site you were using to watch an anime.<br>Simply click the icon to continue watching the anime.', '', 'bottom'))}
          ${materialCheckbox('malResume', 'Resume watching links')}
        </div>

        <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">
          <div class="mdl-card__title mdl-card--border">
            <h2 class="mdl-card__title-text">miniMAL</h2>
            <!--<span style="margin-left: auto; color: #7f7f7f;">Shortcut: Ctrl + m</span>-->
          </div>
          <li class="mdl-list__item">
            <span class="mdl-list__item-primary-content">
              Display to the
            </span>
            <span class="mdl-list__item-secondary-action">
              <select name="myinfo_score" id="posLeft" class="inputtext mdl-textfield__input" style="outline: none;">
                <option value="left">Left</option>
                <option value="right">Right</option>
              </select>
            </span>
          </li>
          <!--${materialCheckbox('miniMALonMal', 'Display on MyAnimeList') /*TODO*/}
          ${materialCheckbox('displayFloatButton', 'Floating menu button')}
          ${materialCheckbox('outWay', 'Move video out of the way')}-->
          <li class="mdl-list__item" style="display: inline-block; width: 49%;">
            <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">
              <input class="mdl-textfield__input" type="text" step="1" id="miniMalHeight" value="${api.settings.get('miniMalHeight')}">
              <label class="mdl-textfield__label" for="miniMalHeight">Height (px / %)
              </label>
            </div>
          </li>
          <li class="mdl-list__item" style="display: inline-block; width: 50%;">
            <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">
              <input class="mdl-textfield__input" type="text" step="1" id="miniMalWidth" value="${api.settings.get('miniMalWidth')}">
              <label class="mdl-textfield__label" for="miniMalWidth">Width (px / %)</label>
            </div>
          </li>
        </div>

        <div id="updateCheck" class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp" style="display: none;">
          <div class="mdl-card__title mdl-card--border">
            <h2 class="mdl-card__title-text">Update Check</h2>
            ${utils.getTooltip('Checks for new episodes in the background.')}
            <div id="updateCheckAgo" style="margin-left: auto;"></div>
          </div>

          <li class="mdl-list__item">
            <span class="mdl-list__item-primary-content">
              Interval
            </span>
            <span class="mdl-list__item-secondary-action">
              <select name="updateCheckTime" id="updateCheckTime" class="inputtext mdl-textfield__input" style="outline: none;">
                <option value="0">Off</option>
                <option value="60">1h</option>
                <option value="240">4h</option>
                <option value="720">12h</option>
                <option value="1440">24h</option>
                <option value="2880">48h</option>
              </select>
            </span>
          </li>
          <span class="updateCheckEnable" style="display: none;">${materialCheckbox('updateCheckNotifications', 'Notifications')}<span>
          <li class="mdl-list__item updateCheckEnable" style="display: none;"><button type="button" id="updateCheckUi" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">Debugging</button></li>
        </div>

        <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">
          <div class="mdl-card__title mdl-card--border">
            <h2 class="mdl-card__title-text">ETC</h2>
          </div>
          <span class="option-extension" style="display: none;">${materialCheckbox('userscriptMode', 'Userscript mode' + utils.getTooltip('Disables the content script. This makes it possible to have the extension and userscript enabled at the same time.', '', 'bottom'))}</span>
          <li class="mdl-list__item"><button type="button" id="clearCache" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">Clear Cache</button></li>
        </div>

        <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">

          <li class="mdl-list__item">

            <div style="line-height: 30px;">

              <a href="https://malsync.lolamtisch.de/changelog#${api.storage.version()}">
                <img src="https://img.shields.io/badge/Changelog-${api.storage.version()}-green.svg?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAtxQTFRFAAAARj1Hw158LyQzRDRBVF54Ew0ZXqvnIx4labLsQEFTdsD7ZpPC////VE1SNCg3Nik7PS1CSzBKWjRXczBXjjBUsTZd0WuILSUyMiU2MiI2Nyc9dypNoClRbC5INTQ+YXKMMCQ7PyQ/WitFKx4vFxchT16CRStIPSY6TSQ6jjhScb33TViCpCROni9VYKzqTlN+qDBZXK3sYi5JXbHyQzNGXLLzTTZOW6/wQC5EX67sNSw7Y67qWa3vLCUzMCo1uc3fXq3rWa/yLCgxSEdKZa7nV6rrWrDyKCEsMzA1aLDpYbLyYbj6SUJgPj5VLy87e8D6csP+c8r/d9L/fNT+esnydLbgcKfOa5vDdJ/MQi5GSjFLTTFOYi9PWS1NUS9OTTFPRzFLSDJMTTBMXjBPaS5NZzBVgTdjczVfbjVhXjVaTjRTQzJMSzRNTzVOTzNLai1ShzJcjjNdiDNeejRhbDVhWzZbSzRRQzFKQjJKUDNMiyxPYy9UlzBfyDBlpjJgcjJbajNfXDVaTDNRPzBHPTBHVDJNrDBZxSpaV1aBajBZkDNipzNjnTNjdDJdYzJcXDRZTzRQPzFHRzJHZTJNcS9MZ2WUcS9VcDNdezRgcjJeezNgZTNaTjNRRDFLQzJJQjNHQjJGWDJLUjJKYoK4cS5NWTFTWzRaWDJVbjRbWDNVSzNQRjJMUTRLSTVHSzRJjjZbfDdZYqXlhEZwVS5MSzRUVTNUczVbTjJRSTNOUDRMSTNLQTJISTNGczZUXjVRWrH0W3+1Ri9OSDJSSzNSTDNTRzJRRzNRSTNNQzJLPzFKPjJGPjFCOSw/W67vTWOORi5NSjJRSzNVTDRURTJRQTBNQTFKQzJKPjFINSw9XKrpSVyIQCxLRS9QRjJSQjJPRzRQUTROQjBFLyc1W6rrS22ePTRVQSxLSjNVSzZYTzZWUTJPOSw+Z778YqPWWnGcV1F/UkZxT0Nm////ch6M6QAAAFp0Uk5TAAAAAAAAAAAAAAAAAAABKH2/3+bIjTgFCm7a/f7nhRILifn9nRJx+v6JBC3b6UV//aPB3OTz5/bL3Y6oNuLuTAGA/ZsIEp79shwRhervmxwFQqDd+frjqksImWc25wAAAAFiS0dEDfa0YfUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEbSURBVBjTARAB7/4AAAABDg8QERITFBUWFwIAAAAAAxgZGhtaW1xdHB0eHwQAAAUgISJeX2BhYmNkZSMkJQYAACYnZmdoaWprbG1ubygpKgArLHBxcnN0dXZ3eHl6ey0uAC8wfH1+f4CBgoOEhYaHiDEAMomKi4yNjo+QkZKSk5SVMwA0lpeYmZqbnJ2en6ChoqM1ADakpaanqKmqq6ytrq+wsTcAOLKztLW2t7i5uru8vb6/OQA6wMHCw8TFxsfIycrLzM07ADw9zs/Q0dLT1NXW19jZPj8AQEFC2tvc3d7U3+Dh4uNDRAAHRUZH5OXm5+jp6uvsSEkIAAAJSktM7e7v8PHyTU5PCgAAAAALUFFSU1RVVldYWQwNAEGXdELuOiRkAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTA1LTE2VDEzOjM2OjI0KzAwOjAwK9TuQgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOC0wNS0xNlQxMzozNjoyNCswMDowMFqJVv4AAABGdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDYuNy44LTkgMjAxNC0wNS0xMiBRMTYgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmfchu0AAAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAGHRFWHRUaHVtYjo6SW1hZ2U6OmhlaWdodAAxOTIPAHKFAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADE5MtOsIQgAAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTUyNjQ3Nzc4NGTqj8oAAAAPdEVYdFRodW1iOjpTaXplADBCQpSiPuwAAABWdEVYdFRodW1iOjpVUkkAZmlsZTovLy9tbnRsb2cvZmF2aWNvbnMvMjAxOC0wNS0xNi82ODRlZmQxYzBmMTdmMzAxMjIzMWFmNzQ4YzhmYjJjYy5pY28ucG5nP6GaiQAAAABJRU5ErkJggg=="/>
              </a><br/>

              <a href="https://discordapp.com/invite/cTH4yaw">
                <img src="https://img.shields.io/discord/358599430502481920.svg?style=flat-square&logo=discord&label=Chat%20%2F%20Support&colorB=7289DA"/>
              </a><br/>

              <a href="https://github.com/lolamtisch/MALSync">
                <img src="https://img.shields.io/github/last-commit/lolamtisch/malsync.svg?style=flat-square&logo=github&logoColor=white&label=Github"/>
              </a><br/>

              <a href="https://github.com/lolamtisch/MALSync/issues">
                <img src="https://img.shields.io/github/issues/lolamtisch/MALSync.svg?style=flat-square&logo=github&logoColor=white"/>
              </a><br/>

              <a href="https://chrome.google.com/webstore/detail/mal-sync/kekjfbackdeiabghhcdklcdoekaanoel?hl=en">
                <img src="https://img.shields.io/badge/Chrome-Download-brightgreen.svg?style=flat-square&label=Chrome&logo=google%20chrome&logoColor=white"/>
              </a><br/>

              <a href="https://addons.mozilla.org/en-US/firefox/addon/mal-sync">
                <img src="https://img.shields.io/badge/Firefox-Download-brightgreen.svg?style=flat-square&label=Firefox&logo=mozilla%20firefox&logoColor=white"/>
              </a><br/>

              <a href="https://greasyfork.org/de/scripts/372847-mal-sync">
                <img src="https://img.shields.io/badge/Userscript-Download-brightgreen.svg?style=flat-square&label=Userscript&logo=javascript&logoColor=white"/>
              </a>

            </div>
          </li>
        </div>

      </div>
    </ul>
    `;
        this.minimal.find('#malConfig').html(settingsUI);
        // Listener
        this.minimal.find("#posLeft").val(api.settings.get('posLeft'));
        this.minimal.find("#posLeft").change(function () {
            // @ts-ignore
            api.settings.set('posLeft', j.$(this).val());
            // @ts-ignore
            j.$('#modal-content').css('right', 'auto').css('left', 'auto').css(j.$(this).val(), '0');
        });
        this.minimal.find("#miniMalWidth").on("input", function () {
            var miniMalWidth = This.minimal.find("#miniMalWidth").val();
            if (miniMalWidth !== null) {
                if (miniMalWidth === '') {
                    miniMalWidth = '30%';
                    utils.flashm("Width reset");
                }
                api.settings.set('miniMalWidth', miniMalWidth);
            }
            j.$("#modal-content").css('width', miniMalWidth);
        });
        this.minimal.find("#miniMalHeight").on("input", function () {
            var miniMalHeight = This.minimal.find("#miniMalHeight").val();
            if (miniMalHeight !== null) {
                if (miniMalHeight === '') {
                    miniMalHeight = '90%';
                    utils.flashm("Height reset");
                }
                api.settings.set('miniMalHeight', miniMalHeight);
            }
            j.$("#modal-content").css('height', miniMalHeight);
        });
        this.minimal.find("#malThumbnail").val(api.settings.get('malThumbnail'));
        this.minimal.find("#malThumbnail").change(function () {
            api.settings.set('malThumbnail', This.minimal.find("#malThumbnail").val());
        });
        this.minimal.find('#clearCache').click(function () {
            return __awaiter(this, void 0, void 0, function* () {
                var cacheArray = yield api.storage.list();
                var deleted = 0;
                j.$.each(cacheArray, function (index, cache) {
                    if (!utils.syncRegex.test(index)) {
                        api.storage.remove(index);
                        deleted++;
                    }
                });
                utils.flashm("Cache Cleared [" + deleted + "]");
            });
        });
        this.minimal.find("#malDelay").on("input", function () {
            var tempDelay = This.minimal.find("#malDelay").val();
            if (tempDelay !== null) {
                if (tempDelay !== '') {
                    api.settings.set('delay', tempDelay);
                    utils.flashm("New delay (" + tempDelay + ") set.");
                }
                else {
                    api.settings.set('delay', 0);
                    utils.flashm("Delay reset");
                }
            }
        });
        listener.forEach(function (fn) {
            fn();
        });
        if (api.type == 'webextension') {
            this.minimal.find('.option-extension').show();
        }
        if (api.type == 'webextension' && this.isPopup()) {
            chrome.alarms.get("updateCheck", (a) => {
                con.log(a);
                interval = 0;
                if (typeof a !== 'undefined') {
                    var interval = a.periodInMinutes;
                    this.minimal.find('.updateCheckEnable').show();
                }
                this.minimal.find('#updateCheckTime').val(interval);
                if (interval) {
                    setUpdateCheckLast();
                    setInterval(function () {
                        setUpdateCheckLast();
                    }, 60 * 1000);
                    function setUpdateCheckLast() {
                        api.storage.get("updateCheckLast").then((updateCheckTime) => {
                            if (isNaN(updateCheckTime))
                                return;
                            var delta = Math.abs(updateCheckTime - Date.now()) / 1000;
                            var text = '';
                            var diffDays = Math.floor(delta / 86400);
                            delta -= diffDays * 86400;
                            if (diffDays) {
                                text += diffDays + 'd ';
                            }
                            var diffHours = Math.floor(delta / 3600) % 24;
                            delta -= diffHours * 3600;
                            if (diffHours) {
                                text += diffHours + 'h ';
                            }
                            var diffMinutes = Math.floor(delta / 60) % 60;
                            delta -= diffMinutes * 60;
                            if (!diffDays) {
                                text += diffMinutes + 'min ';
                            }
                            if (text != '') {
                                text += 'ago';
                                $('#updateCheckAgo').text(text);
                            }
                        });
                    }
                }
            });
            this.minimal.find("#updateCheckTime").change(() => {
                var updateCheckTime = this.minimal.find('#updateCheckTime').val();
                api.storage.set('updateCheckTime', updateCheckTime);
                if (updateCheckTime != 0 && updateCheckTime != '0') {
                    this.minimal.find('.updateCheckEnable').show();
                    chrome.alarms.create("updateCheck", {
                        periodInMinutes: parseInt(updateCheckTime)
                    });
                    if (!utils.canHideTabs()) {
                        chrome.permissions.request({
                            permissions: ["webRequest", "webRequestBlocking"],
                            origins: chrome.runtime.getManifest().optional_permissions.filter((permission) => { return (permission != 'webRequest' && permission != 'webRequestBlocking'); })
                        }, function (granted) {
                            con.log('optional_permissions', granted);
                        });
                    }
                    ;
                    chrome.alarms.create("updateCheckNow", {
                        when: Date.now() + 1000
                    });
                }
                else {
                    this.minimal.find('.updateCheckEnable').hide();
                    chrome.alarms.clear("updateCheck");
                }
            });
            this.minimal.find('#updateCheck').show();
        }
        this.minimal.find('#updateCheckUi').click(() => {
            this.updateCheckUi();
        });
        api.storage.get('tempVersion')
            .then((version) => {
            if (typeof version == undefined || version != api.storage.version()) {
                this.flashm('Updated to version ' + api.storage.version() + ' [<a class="close" target="_blank" href="https://malsync.lolamtisch.de/changelog#' + api.storage.version() + '">CHANGELOG</a>]', function () {
                    api.storage.set('tempVersion', api.storage.version());
                });
            }
        });
        //helper
        function materialCheckbox(option, text, header = false) {
            var check = '';
            var sty = '';
            var value = api.settings.get(option);
            if (value)
                check = 'checked';
            if (header)
                sty = 'font-size: 24px; font-weight: 300; line-height: normal;';
            var item = `
      <li class="mdl-list__item">
        <span class="mdl-list__item-primary-content" style="${sty}">
          ${text}
        </span>
        <span class="mdl-list__item-secondary-action">
          <label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="${option}">
            <input type="checkbox" id="${option}" class="mdl-switch__input" ${check} />
          </label>
        </span>
      </li>`;
            listener.push(function () {
                This.minimal.find('#' + option).change(function () {
                    if (This.minimal.find('#' + option).is(":checked")) {
                        api.settings.set(option, true);
                    }
                    else {
                        api.settings.set(option, false);
                    }
                });
            });
            return item;
        }
    }
    searchMal(keyword, type = 'all', selector, callback) {
        var This = this;
        this.minimal.find(selector).html('');
        api.request.xhr('GET', 'https://myanimelist.net/search/prefix.json?type=' + type + '&keyword=' + keyword + '&v=1').then((response) => {
            var searchResults = j.$.parseJSON(response.responseText);
            this.minimal.find(selector).append('<div class="mdl-grid">\
          <select name="myinfo_score" id="searchListType" class="inputtext mdl-textfield__input mdl-cell mdl-cell--12-col" style="outline: none; background-color: white; border: none;">\
            <option value="anime">Anime</option>\
            <option value="manga">Manga</option>\
          </select>\
        </div>');
            this.minimal.find('#searchListType').val(type);
            this.minimal.find('#searchListType').change(function (event) {
                This.searchMal(keyword, This.minimal.find('#searchListType').val(), selector, callback);
            });
            j.$.each(searchResults, (i, value) => {
                j.$.each(value, (i, value) => {
                    j.$.each(value, (i, value) => {
                        if (typeof value !== 'object')
                            return;
                        j.$.each(value, (i, value) => {
                            if (typeof value['name'] != 'undefined') {
                                This.minimal.find(selector + ' > div').append('<a class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--2dp mdl-grid searchItem" href="' + value['url'] + '" style="cursor: pointer;">\
                  <img src="' + value['image_url'] + '" style="margin: -8px 0px -8px -8px; height: 100px; width: 64px; background-color: grey;"></img>\
                  <div style="flex-grow: 100; cursor: pointer; margin-top: 0; margin-bottom: 0;" class="mdl-cell">\
                    <span style="font-size: 20px; font-weight: 400; line-height: 1;">' + value['name'] + '</span>\
                    <p style="margin-bottom: 0; line-height: 20px; padding-top: 3px;">Type: ' + value['payload']['media_type'] + '</p>\
                    <p style="margin-bottom: 0; line-height: 20px;">Score: ' + value['payload']['score'] + '</p>\
                    <p style="margin-bottom: 0; line-height: 20px;">Year: ' + value['payload']['start_year'] + '</p>\
                  </div>\
                  </a>');
                            }
                        });
                    });
                });
            });
            callback();
        });
    }
    bookmarks(state = 1, localListType = 'anime') {
        this.minimal.find('#fixed-tab-4 #malSearchPopInner').html('');
        this.minimal.find('#loadMalSearchPop').show();
        var element = this.minimal.find('#malSearchPopInner');
        var This = this;
        var my_watched_episodes = 'num_watched_episodes';
        var series_episodes = 'anime_num_episodes';
        var localPlanTo = 'Plan to Watch';
        var localWatching = 'Watching';
        if (localListType != 'anime') {
            my_watched_episodes = 'num_read_chapters';
            series_episodes = 'manga_num_chapters';
            localPlanTo = 'Plan to Read';
            localWatching = 'Reading';
        }
        var firstEl = 1;
        utils.getUserList(state, localListType, function (el, index, total) {
            if (firstEl) {
                firstEl = 0;
                var bookmarkHtml = '<div class="mdl-grid" id="malList" style="justify-content: space-around;">';
                bookmarkHtml += '<select name="myinfo_score" id="userListType" class="inputtext mdl-textfield__input mdl-cell mdl-cell--12-col" style="outline: none; background-color: white; border: none;">\
                          <option value="anime">Anime</option>\
                          <option value="manga">Manga</option>\
                        </select>';
                bookmarkHtml += '<select name="myinfo_score" id="userListState" class="inputtext mdl-textfield__input mdl-cell mdl-cell--12-col" style="outline: none; background-color: white; border: none;">\
                          <option value="7">All</option>\
                          <option value="1" selected>' + localWatching + '</option>\
                          <option value="2">Completed</option>\
                          <option value="3">On-Hold</option>\
                          <option value="4">Dropped</option>\
                          <option value="6">' + localPlanTo + '</option>\
                        </select>';
                //flexbox placeholder
                for (var i = 0; i < 10; i++) {
                    bookmarkHtml += '<div class="listPlaceholder mdl-cell mdl-cell--2-col mdl-cell--4-col-tablet mdl-cell--6-col-phone mdl-shadow--2dp mdl-grid "  style="cursor: pointer; height: 250px; padding: 0; width: 210px; height: 0px; margin-top:0; margin-bottom:0; visibility: hidden;"></div>';
                }
                bookmarkHtml += '</div>';
                element.html(bookmarkHtml);
                This.minimal.find('#malSearchPopInner #userListType').val(localListType);
                This.minimal.find('#malSearchPopInner #userListType').change(function (event) {
                    This.bookmarks(state, This.minimal.find('#malSearchPopInner #userListType').val());
                });
                This.minimal.find('#malSearchPopInner #userListState').val(state);
                This.minimal.find('#malSearchPopInner #userListState').change(function (event) {
                    This.bookmarks(This.minimal.find('#malSearchPopInner #userListState').val(), localListType);
                });
            }
            if (!el) {
                element.find('#malList .listPlaceholder').first().before('<span class="mdl-chip" style="margin: auto; margin-top: 16px; display: table;"><span class="mdl-chip__text">No Entries</span></span>');
                element.find('#malList .listPlaceholder').remove();
                return;
            }
            var bookmarkElement = '';
            var uid = el[localListType + '_id'];
            var malUrl = 'https://myanimelist.net' + el[localListType + '_url'];
            var streamUrl = utils.getUrlFromTags(el['tags']);
            var imageHi = el[localListType + '_image_path'];
            var regexDimensions = /\/r\/\d*x\d*/g;
            if (regexDimensions.test(imageHi)) {
                imageHi = imageHi.replace(/v.jpg$/g, '.jpg').replace(regexDimensions, '');
            }
            var progressProcent = (el[my_watched_episodes] / el[series_episodes]) * 100;
            bookmarkElement += '<div class="mdl-cell mdl-cell--2-col mdl-cell--4-col-tablet mdl-cell--6-col-phone mdl-shadow--2dp mdl-grid bookEntry e' + uid + '" malhref="' + malUrl + '" maltitle="' + el[localListType + '_title'] + '" malimage="' + el[localListType + '_image_path'] + '" style="position: relative; cursor: pointer; height: 250px; padding: 0; width: 210px; height: 293px;">';
            bookmarkElement += '<div class="data title lazyBack init" data-src="' + imageHi + '" style="background-image: url(); background-color: grey; background-size: cover; background-position: center center; background-repeat: no-repeat; width: 100%; position: relative; padding-top: 5px;">';
            bookmarkElement += '<span class="mdl-shadow--2dp" style="position: absolute; bottom: 0; display: block; background-color: rgba(255, 255, 255, 0.9); padding-top: 5px; display: inline-flex; align-items: center; justify-content: space-between; left: 0; right: 0; padding-right: 8px; padding-left: 8px; padding-bottom: 8px;">' + el[localListType + '_title'];
            bookmarkElement += '<div id="p1" class="mdl-progress" series_episodes="' + el[series_episodes] + '" style="position: absolute; top: -4px; left: 0;"><div class="progressbar bar bar1" style="width: ' + progressProcent + '%;"></div><div class="bufferbar bar bar2" style="width: 100%;"></div><div class="auxbar bar bar3" style="width: 0%;"></div></div>';
            bookmarkElement += '<div class="data progress mdl-chip mdl-chip--contact mdl-color--indigo-100" style="float: right; line-height: 20px; height: 20px; padding-right: 4px; margin-left: 5px;">';
            bookmarkElement += '<div class="link mdl-chip__contact mdl-color--primary mdl-color-text--white" style="line-height: 20px; height: 20px; margin-right: 0;">' + el[my_watched_episodes] + '</div>';
            bookmarkElement += '</div>';
            bookmarkElement += '</span>';
            bookmarkElement += '<div class="tags" style="display: none;">' + el['tags'] + '</div>';
            bookmarkElement += '</div>';
            bookmarkElement += '</div>';
            element.find('#malList .listPlaceholder').first().before(bookmarkElement);
            var domE = element.find('#malList .e' + uid).first();
            domE.click(function (event) {
                // @ts-ignore
                if (!This.fill(j.$(this).attr('malhref'))) {
                    con.error('Something is wrong');
                }
            });
            utils.epPredictionUI(uid, function (prediction) {
                var pre = prediction.prediction;
                var color = 'orange';
                if (prediction.color != '') {
                    color = prediction.color;
                }
                if (prediction.tagEpisode) {
                    var progressBar = domE.find('.mdl-progress');
                    var predictionProgress = (prediction.tagEpisode / progressBar.attr('series_episodes')) * 100;
                    progressBar.prepend('<div class="predictionbar bar kal-ep-pre" ep="' + (prediction.tagEpisode) + '" style="width: ' + predictionProgress + '%; background-color: ' + color + '; z-index: 1; left: 0;"></div>');
                    domE.attr('title', prediction.text);
                }
                if (prediction.text != "" && prediction.text) {
                    domE.find('.data.title').prepend(`
            <div class="mdl-shadow--2dp" style="
              position: absolute;
              top: 0;
              right: 0;
              background-color: rgba(255, 255, 255, 0.9);
              padding: 0px 5px;
              margin: 5px 0;
              text-align: center;
            ">
              ${preTexter(pre)}
            </div>
          `);
                }
                function preTexter(pre) {
                    //Round hours
                    if (pre.diffDays > 1 && pre.diffHours > 12) {
                        pre.diffDays++;
                    }
                    var text = '';
                    if (pre.diffDays > 1) {
                        return text + pre.diffDays + ' Days';
                    }
                    if (pre.diffDays == 1) {
                        text += pre.diffDays + ' Day ';
                    }
                    if (pre.diffHours > 1) {
                        return text + pre.diffHours + ' Hours';
                    }
                    if (pre.diffHours == 1) {
                        text += pre.diffHours + ' Hour ';
                    }
                    return text + pre.diffMinutes + ' mins';
                }
            });
            streamUI();
            function streamUI() {
                return __awaiter(this, void 0, void 0, function* () {
                    if (typeof streamUrl !== 'undefined') {
                        con.log(streamUrl);
                        domE.find('.data.progress').append(`
            <a class="mal-sync-stream" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0 5px;" href="${streamUrl}">
              <img src="${utils.favicon(streamUrl.split('/')[2])}">
            </a>`);
                        var id = utils.urlPart(malUrl, 4);
                        var type = utils.urlPart(malUrl, 3);
                        var resumeUrlObj = yield utils.getResumeWaching(type, id);
                        var continueUrlObj = yield utils.getContinueWaching(type, id);
                        var curEp = parseInt(el[my_watched_episodes]);
                        con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj);
                        if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (curEp + 1)) {
                            domE.find('.data.progress').append(`<a class="nextStream" title="Continue watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${continueUrlObj.url}">
                <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16">
              </a>`);
                        }
                        else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === curEp) {
                            domE.find('.data.progress').append(`<a class="resumeStream" title="Resume watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${resumeUrlObj.url}">
                <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16">
              </a>`);
                        }
                    }
                });
            }
        }, function () {
            This.minimal.find('#loadMalSearchPop').hide();
            utils.lazyload(This.minimal);
        }, null, function (continueCall) {
            utils.lazyload(This.minimal);
            if (state == 1) {
                continueCall();
                return;
            }
            var scrollable = This.minimal.find('.simplebar-scroll-content');
            var scrollDone = 0;
            This.minimal.find('#loadMalSearchPop').hide();
            scrollable.scroll(function () {
                if (scrollDone)
                    return;
                // @ts-ignore
                if (scrollable.scrollTop() + scrollable.height() > scrollable.find('.simplebar-content').height() - 100) {
                    scrollDone = 1;
                    con.log('[Bookmarks]', 'Loading next part');
                    This.minimal.find('#loadMalSearchPop').show();
                    continueCall();
                }
            });
        });
    }
    updateCheckUi(type = 'anime') {
        this.minimal.find('#material').addClass('pop-over');
        if (!this.minimal.find('.refresh-updateCheck').length) {
            this.minimal.find('#fixed-tab-4 #malSearchPopInner').html('');
        }
        setTimeout(() => {
            if (this.minimal.find('.refresh-updateCheck').length && this.minimal.find('#fixed-tab-4').css('display') != 'none') {
                this.updateCheckUi(type);
            }
        }, 5000);
        utils.getUserList(1, 'anime', null, null, (list) => __awaiter(this, void 0, void 0, function* () {
            var html = `
      <button class="mdl-button mdl-js-button mdl-button--primary refresh-updateCheck">
        Refresh
      </button>
      <button class="mdl-button mdl-js-button mdl-button--accent startCheck-updateCheck">
        Start Check
      </button>
      <table class="mdl-data-table mdl-js-data-table mdl-data-table__cell--non-numeric mdl-shadow--2dp">
        <tr>
          <th class="mdl-data-table__cell--non-numeric"></th>
          <th>Episode</th>
          <th>Message</th>
        </tr>`;
            for (var i = 0; i < list.length; i++) {
                var el = list[i];
                var title = el['anime_title'];
                var elUrl = el['anime_url'];
                var episode = '';
                var error = '';
                var trColor = '';
                con.log('el', el);
                var elCache = yield api.storage.get('updateCheck/' + type + '/' + el['anime_id']);
                con.log('elCache', elCache);
                if (typeof elCache != 'undefined') {
                    episode = elCache['newestEp'] + '/' + el['anime_num_episodes'];
                    trColor = 'orange';
                    if (elCache['finished']) {
                        error = 'finished';
                        trColor = 'green';
                    }
                    if (typeof elCache['error'] != 'undefined') {
                        error = elCache['error'];
                        trColor = 'red';
                    }
                }
                html += `
        <tr style="background-color: ${trColor};">
          <th class="mdl-data-table__cell--non-numeric">
            <button class="mdl-button mdl-js-button mdl-button--icon delete-updateCheck" data-delete="${'updateCheck/' + type + '/' + el['anime_id']}"><i class="material-icons">delete</i></button>
            <a href="${elUrl}" style="color: black;">
              ${title}
            </a>
          </th>
          <th>${episode}</th>
          <th>${error}</th>
        </tr>
        `;
            }
            html += '</table>';
            this.minimal.find('#fixed-tab-4 #malSearchPopInner').html(html);
            this.minimal.find('.refresh-updateCheck').click(() => {
                this.updateCheckUi(type);
            });
            this.minimal.find('.startCheck-updateCheck').click(() => {
                chrome.alarms.create("updateCheckNow", {
                    when: Date.now() + 1000
                });
                utils.flashm("Check started");
            });
            this.minimal.find('.delete-updateCheck').click(function () {
                //@ts-ignore
                var thisEl = $(this);
                var delData = thisEl.data('delete');
                con.log('delete', delData);
                api.storage.remove(delData);
                thisEl.parent().parent().css('background-color', 'black');
            });
        }));
    }
    flashm(text, closefn = function () { }) {
        var mess = `
      <div style="
        background-color: #3f51b5;
        text-align: center;
        padding: 5px 24px;
        color: white;
        border-top: 1px solid #fefefe;
      ">
        ${text}
        <i class="material-icons close" style="
          float: right;
          font-size: 24px;
          margin-top: -2px;
          margin-right: -24px;
          margin-bottom: -5px;
        ">close</i>
      </div>
    `;
        var flashmDiv = j.$(mess).appendTo(this.minimal.find('.mdl-layout'));
        flashmDiv.find('.close').click(function () {
            flashmDiv.slideUp(100, function () {
                flashmDiv.remove();
                closefn();
            });
        });
        return flashmDiv;
    }
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(3), __webpack_require__(2), __webpack_require__(0)))

/***/ }),
/* 21 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(api, j, utils, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return animeType; });
/* harmony import */ var _utils_mal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5);
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};

class animeType {
    constructor(url) {
        this.url = url;
    }
    init() {
        var This = this;
        return new Promise((resolve, reject) => {
            return api.request.xhr('GET', This.url).then((response) => {
                This.vars = response.responseText;
                resolve();
            });
        });
    }
    overview(minimal) {
        return new Promise((resolve, reject) => {
            var data = this.vars;
            var html = '';
            var image = '';
            var title = '';
            var description = '';
            var altTitle = '';
            var stats = '';
            try {
                image = data.split('js-scrollfix-bottom')[1].split('<img src="')[1].split('"')[0];
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                title = data.split('itemprop="name">')[1].split('<')[0];
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                description = data.split('itemprop="description">')[1].split('</span')[0];
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                altTitle = data.split('<h2>Alternative Titles</h2>')[1].split('<h2>')[0];
                altTitle = altTitle.replace(/spaceit_pad/g, 'mdl-chip" style="margin-right: 5px;');
                altTitle = altTitle.replace(/<\/span>/g, '</span><span class="mdl-chip__text">');
                altTitle = altTitle.replace(/<\/div>/g, '</span></div>');
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                var statsBlock = data.split('<h2>Statistics</h2>')[1].split('<h2>')[0];
                // @ts-ignore
                var tempHtml = j.$.parseHTML(statsBlock);
                var statsHtml = '<ul class="mdl-list mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--12-col" style="display: flex; justify-content: space-around;">';
                j.$.each(j.$(tempHtml).filter('div').slice(0, 5), function (index, value) {
                    statsHtml += '<li class="mdl-list__item mdl-list__item--two-line" style="padding: 0; padding-left: 10px; padding-right: 3px; min-width: 18%;">';
                    statsHtml += '<span class="mdl-list__item-primary-content">';
                    statsHtml += '<span>';
                    statsHtml += j.$(value).find('.dark_text').text();
                    statsHtml += '</span>';
                    statsHtml += '<span class="mdl-list__item-sub-title">';
                    statsHtml += j.$(value).find('span[itemprop=ratingValue]').height() != null ? j.$(value).find('span[itemprop=ratingValue]').text() : j.$(value).clone().children().remove().end().text();
                    statsHtml += '</span>';
                    statsHtml += '</span>';
                    statsHtml += '</li>';
                });
                statsHtml += '</ul>';
                stats = statsHtml;
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            html += overviewElement(this.url, title, image, description, altTitle, stats);
            try {
                var localType = utils.urlPart(this.url, 3);
                html +=
                    `<div class="mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-shadow--4dp data-block mdl-grid mdl-grid--no-spacing malClear">
          <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tbody>
              <li class="mdl-list__item mdl-list__item--three-line" style="width: 100%;">
                <span class="mdl-list__item-primary-content">
                  <span>Status:</span>
                  <span class="mdl-list__item-text-body">
                    <select name="myinfo_status" id="myinfo_status" class="inputtext js-anime-status-dropdown mdl-textfield__input" style="outline: none; visibility: hidden;">
                      <option selected="selected" value="1">${utils.watching(localType)}</option>
                      <option value="2">Completed</option>
                      <option value="3">On-Hold</option>
                      <option value="4">Dropped</option>
                      <option value="6">${utils.planTo(localType)}</option>
                    </select>
                  </span>
                </span>
              </li>
              <li class="mdl-list__item mdl-list__item--three-line" style="width: 100%;">
                <span class="mdl-list__item-primary-content">
                  <span>${utils.episode(localType)}:</span>
                  <span class="mdl-list__item-text-body">
                    <input type="text" id="myinfo_watchedeps" name="myinfo_watchedeps" size="3" class="inputtext mdl-textfield__input" value="6" style="width: 35px; display: inline-block; visibility: hidden;"> / <span id="curEps" style="visibility: hidden;">?</span>
                    <a href="javascript:void(0)" class="js-anime-increment-episode-button" target="_blank">
                      <i class="fa fa-plus-circle ml4">
                      </i>
                    </a>
                  </span>
                </span>
              </li>
          `;
                if (localType == 'manga') {
                    html += `
              <li class="mdl-list__item mdl-list__item--three-line" style="width: 100%;">
                <span class="mdl-list__item-primary-content">
                  <span>Volume:</span>
                  <span class="mdl-list__item-text-body">
                    <input type="text" id="myinfo_volumes" name="myinfo_volumes" size="3" class="inputtext mdl-textfield__input" value="6" style="width: 35px; display: inline-block; visibility: hidden;"> / <span id="curVolumes" style="visibility: hidden;">?</span>
                    <a href="javascript:void(0)" class="js-anime-increment-episode-button" target="_blank">
                      <i class="fa fa-plus-circle ml4">
                      </i>
                    </a>
                  </span>
                </span>
              </li>
            `;
                }
                html += `
              <li class="mdl-list__item mdl-list__item--three-line" style="width: 100%;">
                <span class="mdl-list__item-primary-content">
                  <span>Your Score:</span>
                  <span class="mdl-list__item-text-body">
                    <select name="myinfo_score" id="myinfo_score" class="inputtext mdl-textfield__input" style="outline: none; visibility: hidden;">
                      <option value="" selected="selected">Select</option>
                      <option value="10">(10) Masterpiece</option>
                      <option value="9">(9) Great</option>
                      <option value="8">(8) Very Good</option>
                      <option value="7">(7) Good</option>
                      <option value="6">(6) Fine</option>
                      <option value="5">(5) Average</option>
                      <option value="4">(4) Bad</option>
                      <option value="3">(3) Very Bad</option>
                      <option value="2">(2) Horrible</option>
                      <option value="1">(1) Appalling</option>
                    </select>
                  </span>
                </span>
              </li>
              <li class="mdl-list__item" style="width: 100%;">
                <input type="button" name="myinfo_submit" value="Update" class="inputButton btn-middle flat js-anime-update-button mdl-button mdl-js-button mdl-button--raised mdl-button--colored" style="margin-right: 5px;" data-upgraded=",MaterialButton">
                <small>
                  <a href="https://myanimelist.net/ownlist/anime/${utils.urlPart(this.url, 4)}/edit" target="_blank">Edit Details</a>
                </small>
              </li>

            </tbody>
          </table>
        </div>`;
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                var relatedBlock = data.split('Related ')[1].split('</h2>')[1].split('<h2>')[0];
                var related = j.$.parseHTML(relatedBlock);
                var relatedHtml = '<ul class="mdl-list">';
                j.$.each(j.$(related).filter('table').find('tr'), function (index, value) {
                    relatedHtml += '<li class="mdl-list__item mdl-list__item--two-line">';
                    relatedHtml += '<span class="mdl-list__item-primary-content">';
                    relatedHtml += '<span>';
                    relatedHtml += j.$(value).find('.borderClass').first().text();
                    relatedHtml += '</span>';
                    relatedHtml += '<span class="mdl-list__item-sub-title">';
                    j.$(value).find('.borderClass').last().each(function (index, value) {
                        j.$(value).html(j.$(value).children());
                    });
                    relatedHtml += j.$(value).find('.borderClass').last().html();
                    relatedHtml += '</span>';
                    relatedHtml += '</span>';
                    relatedHtml += '</li>';
                });
                relatedHtml += '</ul>';
                html += `<div class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-shadow--4dp related-block alternative-list mdl-grid malClear">
                  ${relatedHtml}
                </div>`;
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                html += `<div style="display: none;" class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-shadow--4dp mdl-grid alternative-list stream-block malClear">
                  <ul class="mdl-list stream-block-inner">
                  </ul>
                </div>`;
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                var characterBlock = data.split('detail-characters-list')[1].split('</h2>')[0];
                var charHtml = j.$.parseHTML('<div class="detail-characters-list ' + characterBlock);
                var temphtml = '';
                var charFound = 0;
                var tempWrapHtml = '<div class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--12-col mdl-shadow--4dp characters-block mdl-grid malClear">\
        <div class="mdl-card__actions clicker" style="display: none;">\
          <h1 class="mdl-card__title-text" style="float: left;">Characters</h1>\
          <i class="material-icons mdl-accordion__icon mdl-animation--default remove" style="float: right; margin-top: 3px;">expand_more</i>\
        </div>\
        <div class="mdl-grid mdl-card__actions mdl-card--border" id="characterList" style="justify-content: space-between; display: none;">';
                j.$.each(j.$(charHtml).find(':not(td) > table'), (index, value) => {
                    if (!index)
                        charFound = 1;
                    var regexDimensions = /\/r\/\d*x\d*/g;
                    var charImg = j.$(value).find('img').first().attr("data-src");
                    if (regexDimensions.test(charImg)) {
                        charImg = charImg.replace(regexDimensions, '');
                    }
                    else {
                        charImg = 'https://myanimelist.cdn-dena.com/images/questionmark_23.gif';
                    }
                    charImg = utils.handleMalImages(charImg);
                    tempWrapHtml += '<div>';
                    tempWrapHtml += '<div class="mdl-grid" style="width: 126px;">';
                    tempWrapHtml += '<div style="width: 100%; height: auto;">';
                    tempWrapHtml += '<img style="height: auto; width: 100%;"src="' + charImg + '">';
                    tempWrapHtml += '</div>';
                    tempWrapHtml += '<div class="">';
                    tempWrapHtml += j.$(value).find('.borderClass .spaceit_pad').first().parent().html();
                    tempWrapHtml += '</div>';
                    tempWrapHtml += '</div>';
                    tempWrapHtml += '</div>';
                });
                for (var i = 0; i < 10; i++) {
                    tempWrapHtml += '<div class="listPlaceholder" style="height: 0;"><div class="mdl-grid" style="width: 126px;"></div></div>';
                }
                tempWrapHtml += '</div></div>';
                if (charFound)
                    html += tempWrapHtml;
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                var infoBlock = data.split('<h2>Information</h2>')[1].split('<h2>')[0];
                var infoData = j.$.parseHTML(infoBlock);
                var infoHtml = '<ul class="mdl-grid mdl-grid--no-spacing mdl-list mdl-cell mdl-cell--12-col">';
                j.$.each(j.$(infoData).filter('div'), (index, value) => {
                    if ((index + 4) % 4 == 0 && index != 0) {
                        //infoHtml +='</ul><ul class="mdl-list mdl-cell mdl-cell--3-col mdl-cell--4-col-tablet">';
                    }
                    infoHtml += '<li class="mdl-list__item mdl-list__item--three-line mdl-cell mdl-cell--3-col mdl-cell--4-col-tablet">';
                    infoHtml += '<span class="mdl-list__item-primary-content">';
                    infoHtml += '<span>';
                    infoHtml += j.$(value).find('.dark_text').text();
                    infoHtml += '</span>';
                    infoHtml += '<span class="mdl-list__item-text-body">';
                    j.$(value).find('.dark_text').remove();
                    infoHtml += j.$(value).html();
                    //j.$(value).find('*').each(function(){infoHtml += j.$(value)[0].outerHTML});
                    //infoHtml += j.$(value).find('span[itemprop=ratingValue]').height() != null ? j.$(value).find('span[itemprop=ratingValue]').text() : j.$(value).clone().children().remove().end().text();
                    infoHtml += '</span>';
                    infoHtml += '</span>';
                    infoHtml += '</li>';
                });
                infoHtml += '</ul>';
                html += '<div class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--12-col mdl-shadow--4dp info-block mdl-grid malClear">' + infoHtml + '</div>';
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            resolve('<div class="mdl-grid">' + html + '</div>');
        });
    }
    lazyLoadOverview(minimal) {
        return __awaiter(this, void 0, void 0, function* () {
            //minimal.find('.characters-block .clicker').one('click', function(){
            minimal.find('#characterList').show();
            minimal.find('.characters-block .remove').remove();
            //});
            try {
                utils.epPredictionUI(utils.urlPart(this.url, 4), function (prediction) {
                    con.log(prediction);
                    minimal.find('[id="curEps"]').before(prediction.tag + ' ');
                    if (!prediction.prediction.airing) {
                        minimal.find('.data-block').prepend('<li class="mdl-list__item" style="width: 100%;">' + prediction.text + '</li>');
                    }
                });
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                con.log('Streaming UI');
                var malObj = new _utils_mal__WEBPACK_IMPORTED_MODULE_0__[/* mal */ "a"](this.url);
                yield malObj.init();
                minimal.find('#myinfo_status').val(malObj.getStatus()).css('visibility', 'visible');
                minimal.find('#myinfo_watchedeps').val(malObj.getEpisode()).css('visibility', 'visible');
                minimal.find('#myinfo_volumes').val(malObj.getVolume()).css('visibility', 'visible');
                minimal.find('#curEps').html(malObj.totalEp).css('visibility', 'visible');
                minimal.find('#curVolumes').html(malObj.totalVol).css('visibility', 'visible');
                minimal.find('#myinfo_score').val(malObj.getScore()).css('visibility', 'visible');
                minimal.find('.inputButton').click(function () {
                    malObj.setStatus(minimal.find('#myinfo_status').val());
                    malObj.setEpisode(minimal.find('#myinfo_watchedeps').val());
                    if (minimal.find('#myinfo_volumes').length) {
                        malObj.setVolume(minimal.find('#myinfo_volumes').val());
                    }
                    malObj.setScore(minimal.find('#myinfo_score').val());
                    malObj.sync()
                        .then(function () {
                        utils.flashm('Updated');
                    }, function () {
                        utils.flashm("Update failed", { error: true });
                    });
                });
                var streamUrl = malObj.getStreamingUrl();
                if (typeof streamUrl !== 'undefined') {
                    var streamhtml = `<div class="mdl-card__actions mdl-card--border" style="padding-left: 0;">
          <div class="data title progress" style="display: inline-block; position: relative; top: 2px; margin-left: -2px;">
            <a class="stream mdl-button mdl-button--colored mdl-js-button mdl-button--raised" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0px 5px; color: white;" href="${streamUrl}">
              <img src="${utils.favicon(streamUrl.split('/')[2])}" style="padding-bottom: 3px; padding-right: 6px; margin-left: -3px;">Continue ${utils.watching(malObj.type)}
            </a>`;
                    var resumeUrlObj = yield malObj.getResumeWaching();
                    var continueUrlObj = yield malObj.getContinueWaching();
                    con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj);
                    if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (malObj.getEpisode() + 1)) {
                        streamhtml +=
                            `<a class="nextStream mdl-button mdl-button--colored mdl-js-button mdl-button--raised" title="Continue watching" target="_blank" style="margin: 0px 5px 0px 0px; color: white;" href="${continueUrlObj.url}">
              <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16" style="padding-bottom: 3px; padding-right: 6px; margin-left: -3px;">Next Episode
            </a>`;
                    }
                    else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === malObj.getEpisode()) {
                        streamhtml +=
                            `<a class="resumeStream mdl-button mdl-button--colored mdl-js-button mdl-button--raised" title="Resume watching" target="_blank" style="margin: 0px 5px 0px 0px; color: white;" href="${resumeUrlObj.url}">
              <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16" style="padding-bottom: 3px; padding-right: 6px; margin-left: -3px;">Resume Episode
            </a>`;
                    }
                    streamhtml +=
                        `</div>
        </div>`;
                    minimal.find('.malDescription').first().append(streamhtml);
                }
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                utils.getMalToKissArray(utils.urlPart(this.url, 3), utils.urlPart(this.url, 4)).then((links) => {
                    var Kisshtml = '';
                    for (var pageKey in links) {
                        var page = links[pageKey];
                        var tempHtml = '';
                        var tempUrl = '';
                        for (var streamKey in page) {
                            var stream = page[streamKey];
                            tempHtml += '<div class="mal_links"><a target="_blank" href="' + stream['url'] + '">' + stream['title'] + '</a></div>';
                            tempUrl = stream['url'];
                        }
                        Kisshtml += `<li class="mdl-list__item mdl-list__item--three-line">
                        <span class="mdl-list__item-primary-content">
                          <span>
                            <img style="padding-bottom: 3px;" src="${utils.favicon(tempUrl.split('/')[2])}">
                            ${pageKey}
                          </span>
                          <span id="KissAnimeLinks" class="mdl-list__item-text-body">
                            ${tempHtml}
                          </span>
                        </span>
                       </li>`;
                    }
                    minimal.find('.stream-block').show().find('.stream-block-inner').prepend(Kisshtml);
                });
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
            try {
                minimal.find('.related-block a').each(function () {
                    //@ts-ignore
                    var el = $(this);
                    var url = utils.absoluteLink(el.attr('href'), 'https://myanimelist.net');
                    if (typeof url != 'undefined') {
                        var malObj = new _utils_mal__WEBPACK_IMPORTED_MODULE_0__[/* mal */ "a"](url);
                        malObj.init().then(() => {
                            var tag = utils.statusTag(malObj.getStatus(), malObj.type, malObj.id);
                            if (tag) {
                                el.wrap("<div></div>").after('<span>' + tag + '</span>');
                            }
                        });
                    }
                });
            }
            catch (e) {
                console.log('[iframeOverview] Error:', e);
            }
        });
    }
    reviews(minimal) {
        return __awaiter(this, void 0, void 0, function* () {
            return new Promise((resolve, reject) => {
                con.info('Loading reviews');
                var data = this.vars;
                try {
                    var reviews = data.split('Reviews</h2>')[1].split('<h2>')[0];
                    var reviewsData = j.$.parseHTML(reviews);
                    var reviewsHtml = '<div class="mdl-grid">';
                    j.$.each(j.$(reviewsData).filter('.borderDark'), (index, value) => {
                        reviewsHtml += '<div class="mdl-cell mdl-cell--12-col mdl-shadow--4dp">';
                        reviewsHtml += '<div class="mdl-card__supporting-text mdl-card--border" style="color: black;">';
                        j.$(value).find('.spaceit > div').css('max-width', '60%');
                        reviewsHtml += j.$(value).find('.spaceit').first().html();
                        reviewsHtml += '</div>';
                        reviewsHtml += '<div class="mdl-card__supporting-text" style="color: black;">';
                        j.$(value).find('.textReadability, .textReadability > span').contents().filter(function () {
                            // @ts-ignore
                            return this.nodeType == 3 && j.$.trim(this.nodeValue).length;
                        }).wrap('<p style="margin:0;padding=0;"/>');
                        j.$(value).find('br').css('line-height', '10px');
                        reviewsHtml += j.$(value).find('.textReadability').html();
                        reviewsHtml += '</div>';
                        reviewsHtml += '</div>';
                    });
                    reviewsHtml += '</div>';
                    if (reviewsHtml == '<div class="mdl-grid"></div>') {
                        reviewsHtml = '<span class="mdl-chip" style="margin: auto; margin-top: 16px; display: table;"><span class="mdl-chip__text">Nothing Found</span></span>';
                    }
                    resolve(reviewsHtml);
                    /*j.$("#info-iframe").contents().find('#malReviews').html(reviewsHtml).show();
                    */
                }
                catch (e) {
                    console.log('[iframeReview] Error:', e);
                }
            });
        });
    }
    lazyLoadReviews(minimal) {
        return __awaiter(this, void 0, void 0, function* () {
            minimal.find('.js-toggle-review-button').addClass('nojs').click(function () {
                // @ts-ignore
                var revID = j.$(this).attr('data-id');
                minimal.find('#review' + revID).css('display', 'initial');
                minimal.find('#revhelp_output_' + revID).remove();
                // @ts-ignore
                j.$(this).remove();
            });
            minimal.find('.mb8 a').addClass('nojs').click(function () {
                // @ts-ignore
                var revID = j.$(this).attr('onclick').split("j.$('")[1].split("'")[0];
                minimal.find(revID).toggle();
            });
        });
    }
    recommendations(minimal) {
        return __awaiter(this, void 0, void 0, function* () {
            //return new Promise((resolve, reject) => {
            return api.request.xhr('GET', this.url + '/userrecs').then((response) => {
                var data = response.responseText;
                try {
                    var recommendationsBlock = data.split('Make a recommendation</a>')[1].split('</h2>')[1].split('<div class="mauto')[0];
                    var html = j.$.parseHTML(recommendationsBlock);
                    var recommendationsHtml = '<div class="mdl-grid">';
                    j.$.each(j.$(html).filter('.borderClass'), (index, value) => {
                        recommendationsHtml += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp mdl-grid">';
                        recommendationsHtml += '<div class="mdl-card__media" style="background-color: transparent; margin: 8px;">';
                        recommendationsHtml += j.$(value).find('.picSurround').html();
                        recommendationsHtml += '</div>';
                        recommendationsHtml += '<div class="mdl-cell" style="flex-grow: 100;">';
                        recommendationsHtml += '<div class="">';
                        j.$(value).find('.button_edit, .button_add, td:eq(1) > div:eq(1) span').remove();
                        recommendationsHtml += j.$(value).find('td:eq(1) > div:eq(1)').html();
                        recommendationsHtml += '</div>';
                        recommendationsHtml += '<div class="">';
                        j.$(value).find('a[href^="/dbchanges.php?go=report"]').remove();
                        recommendationsHtml += j.$(value).find('.borderClass').html();
                        recommendationsHtml += '</div>';
                        recommendationsHtml += '<div class="">';
                        recommendationsHtml += (typeof j.$(value).find('.spaceit').html() != 'undefined') ? j.$(value).find('.spaceit').html() : '';
                        recommendationsHtml += '<div class="more" style="display: none;">';
                        recommendationsHtml += j.$(value).find('td:eq(1) > div').last().html();
                        recommendationsHtml += '</div>';
                        recommendationsHtml += '</div>';
                        recommendationsHtml += '</div>';
                        /*recommendationsHtml += '<div class="mdl-card__supporting-text mdl-card--border" style="color: black;">';
                          j.$(value).find('.spaceit > div').css('max-width','60%');
                          recommendationsHtml += j.$(value).find('.spaceit').first().html();
                        recommendationsHtml += '</div>';
                        recommendationsHtml += '<div class="mdl-card__supporting-text" style="color: black;">';
                          j.$(value).find('.textReadability, .textReadability > span').contents().filter(function(){
                            return value.nodeType == 3 && j.$.trim(value.nodeValue).length;
                          }).wrap('<p style="margin:0;padding=0;"/>');
                          j.$(value).find('br').css('line-height','10px');
                          recommendationsHtml += j.$(value).find('.textReadability').html();
                        recommendationsHtml += '</div>';*/
                        //recommendationsHtml += j.$(value).html();
                        recommendationsHtml += '</div>';
                    });
                    recommendationsHtml += '</div>';
                    if (recommendationsHtml == '<div class="mdl-grid"></div>') {
                        recommendationsHtml = '<span class="mdl-chip" style="margin: auto; margin-top: 16px; display: table;"><span class="mdl-chip__text">Nothing Found</span></span>';
                    }
                    //resolve(recommendationsHtml);
                    return recommendationsHtml;
                }
                catch (e) {
                    console.log('[iframeRecommendations] Error:', e);
                }
            });
        });
    }
    lazyLoadRecommendations(minimal) {
        return __awaiter(this, void 0, void 0, function* () {
            // @ts-ignore
            minimal.find('.js-similar-recommendations-button').addClass('nojs').click(function () { j.$(this).parent().find('.more').toggle(); });
            minimal.find('.js-toggle-recommendation-button').addClass('nojs').click(function () {
                // @ts-ignore
                var revID = j.$(this).attr('data-id');
                minimal.find('#recommend' + revID).css('display', 'initial');
                // @ts-ignore
                j.$(this).remove();
            });
            minimal.find('#malRecommendations .more .borderClass').addClass('mdl-shadow--2dp').css('padding', '10px');
            // @ts-ignore
            minimal.find('.lazyload').each(function () { j.$(this).attr('src', j.$(this).attr('data-src')); }); //TODO: use lazyloading
        });
    }
}
function overviewElement(url, title, image, description, altTitle, stats) {
    return `
    <div class="mdl-cell mdl-cell--1-col mdl-cell--8-col-tablet mdl-cell--6-col-phone mdl-shadow--4dp stats-block malClear" style="min-width: 120px;">
      ${stats}
    </div>
    <div class="mdl-grid mdl-cell mdl-shadow--4dp coverinfo malClear" style="display:block; flex-grow: 100; min-width: 70%;">
      <div class="mdl-card__media mdl-cell mdl-cell--2-col" style="background-color: transparent; float:left; padding-right: 16px;">
        <img class="malImage malClear" style="width: 100%; height: auto;" src="${image}"></img>
      </div>
      <div class="mdl-cell mdl-cell--12-col">
        <a class="mdl-button mdl-button--icon mdl-js-button mdl-js-ripple-effect malClear malLink" href="${url}" style="float: right;" target="_blank"><i class="material-icons">open_in_new</i></a>
        <h1 class="malTitle mdl-card__title-text malClear" style="padding-left: 0px; overflow:visible;">${title}</h1>
        <div class="malAltTitle mdl-card__supporting-text malClear" style="padding: 10px 0 0 0px; overflow:visible;">${altTitle}</div>
      </div>
      <div class="malDescription malClear mdl-cell mdl-cell--10-col" style="overflow: hidden;">
        <p style="color: black;">
          ${description}
        </p>
      </div>
    </div>
  `;
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(1), __webpack_require__(3), __webpack_require__(2)))

/***/ }),
/* 22 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(utils, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return myanimelistClass; });
/* harmony import */ var _pages_pages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);
/* harmony import */ var _utils_mal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};


class myanimelistClass {
    constructor(url) {
        this.url = url;
        this.page = null;
        //detail
        this.id = null;
        this.type = null;
        //bookmarks
        this.username = null;
        if (url.indexOf("myanimelist.net/anime.php") > -1) {
            var urlTemp = '/anime/' + utils.urlParam(this.url, 'id');
            // @ts-ignore
            window.history.replaceState(null, null, urlTemp);
            this.url = utils.absoluteLink(urlTemp, 'https://myanimelist.net');
        }
        if (url.indexOf("myanimelist.net/manga.php") > -1) {
            var urlTemp = '/manga/' + utils.urlParam(this.url, 'id');
            // @ts-ignore
            window.history.replaceState(null, null, urlTemp);
            this.url = utils.absoluteLink(urlTemp, 'https://myanimelist.net');
        }
        var urlpart = utils.urlPart(this.url, 3);
        if (urlpart == 'anime' || urlpart == 'manga') {
            this.page = 'detail';
            this.id = utils.urlPart(this.url, 4);
            this.type = urlpart;
        }
        if (urlpart == 'animelist' || urlpart == 'mangalist') {
            this.page = 'bookmarks';
            this.type = urlpart.substring(0, 5);
            this.username = utils.urlPart(this.url, 4);
        }
        if (urlpart == 'character') {
            this.page = 'character';
        }
        if (urlpart == 'people') {
            this.page = 'people';
        }
        if (urlpart == 'search') {
            this.page = 'search';
        }
    }
    init() {
        con.log(this);
        switch (this.page) {
            case 'detail':
                this.thumbnails();
                this.setEpPrediction();
                this.streamingUI();
                this.malToKiss();
                this.siteSearch();
                this.related();
                setInterval(() => {
                    this.setEpPrediction();
                }, 1000 * 60);
                break;
            case 'bookmarks':
                var This = this;
                $(document).ready(function () {
                    if ($('#mal_cs_powered').length) {
                        This.page = 'classic';
                    }
                    else {
                        This.page = 'modern';
                    }
                    This.init();
                });
                break;
            case 'modern':
                this.bookmarks();
                break;
            case 'classic':
                this.bookmarks();
                break;
            case 'character':
            case 'people':
                this.relatedTag();
            case 'search':
                this.thumbnails();
                break;
            default:
                con.log('This page has no scipt');
        }
    }
    thumbnails() {
        con.log('Lazyloaded Images');
        if (this.url.indexOf("/pics") > -1) {
            return;
        }
        if (this.url.indexOf("/pictures") > -1) {
            return;
        }
        if (api.settings.get('malThumbnail') == "0") {
            return;
        }
        var height = parseInt(api.settings.get('malThumbnail'));
        var width = Math.floor(height / 144 * 100);
        var surHeight = height + 4;
        var surWidth = width + 4;
        api.storage.addStyle('.picSurround img:not(.noKal){height: ' + height + 'px !important; width: ' + width + 'px !important;}');
        api.storage.addStyle('.picSurround img.lazyloaded.kal{width: auto !important;}');
        api.storage.addStyle('.picSurround:not(.noKal) a{height: ' + surHeight + 'px; width: ' + surWidth + 'px; overflow: hidden; display: flex; justify-content: center;}');
        var loaded = 0;
        try {
            // @ts-ignore
            $(window).load(function () { overrideLazyload(); });
        }
        catch (e) {
            con.info(e);
        }
        try {
            window.onload = function () { overrideLazyload(); };
        }
        catch (e) {
            con.info(e);
        }
        try {
            document.onload = function () { overrideLazyload(); };
        }
        catch (e) {
            con.info(e);
        }
        try {
            $(document).ready(function () { overrideLazyload(); });
        }
        catch (e) {
            con.info(e);
        }
        function overrideLazyload() {
            if (loaded)
                return;
            loaded = 1;
            var tags = document.querySelectorAll(".picSurround img:not(.kal)");
            var url = '';
            for (var i = 0; i < tags.length; i++) {
                var regexDimensions = /\/r\/\d*x\d*/g;
                if (tags[i].hasAttribute("data-src")) {
                    url = tags[i].getAttribute("data-src");
                }
                else {
                    url = tags[i].getAttribute("src");
                }
                if (regexDimensions.test(url) || /voiceactors.*v.jpg$/g.test(url) || url.indexOf('questionmark') !== -1) {
                    url = utils.handleMalImages(url);
                    if (!(url.indexOf("100x140") > -1)) {
                        tags[i].setAttribute("data-src", url);
                        url = url.replace(/v.jpg$/g, '.jpg');
                        tags[i].setAttribute("data-srcset", url.replace(regexDimensions, ''));
                        tags[i].classList.add('lazyload');
                    }
                    tags[i].classList.add('kal');
                }
                else {
                    tags[i].closest(".picSurround").classList.add('noKal');
                    tags[i].classList.add('kal');
                    tags[i].classList.add('noKal');
                }
            }
        }
    }
    bookmarksHDimages() {
        var tags = document.querySelectorAll('img[src*="/96x136/"]');
        for (var i = 0; i < tags.length; i++) {
            var regexDimensions = /\/r\/\d*x\d*/g;
            var url = tags[i].getAttribute("src");
            tags[i].setAttribute("src", url.replace(regexDimensions, ''));
        }
    }
    setEpPrediction() {
        con.log('setEpPrediction');
        utils.epPredictionUI(this.id, function (prediction) {
            con.log(prediction);
            $('.mal-sync-pre-remove, .mal-sync-ep-pre').remove();
            $('#addtolist').prev().before('<div class="mal-sync-pre-remove">' + prediction.text + '</div>');
            $('[id="curEps"]').before(prediction.tag + ' ');
        });
    }
    malToKiss() {
        return __awaiter(this, void 0, void 0, function* () {
            con.log('malToKiss');
            utils.getMalToKissArray(this.type, this.id).then((links) => {
                var html = '';
                for (var pageKey in links) {
                    var page = links[pageKey];
                    var tempHtml = '';
                    var tempUrl = '';
                    for (var streamKey in page) {
                        var stream = page[streamKey];
                        tempHtml += '<div class="mal_links"><a target="_blank" href="' + stream['url'] + '">' + stream['title'] + '</a></div>';
                        tempUrl = stream['url'];
                    }
                    html += '<h2 id="' + pageKey + 'Links" class="mal_links"><img src="' + utils.favicon(tempUrl.split('/')[2]) + '"> ' + pageKey + '</h2>';
                    html += tempHtml;
                    html += '<br class="mal_links" />';
                }
                $(document).ready(function () {
                    $('h2:contains("Information")').before(html);
                });
            });
        });
    }
    siteSearch() {
        var This = this;
        $(document).ready(function () {
            con.log('Site Search');
            $('h2:contains("Information")').before('<h2 id="mal-sync-search-links" class="mal_links">Search</h2><div class="MALSync-search"><a>[Show]</a></div><br class="mal_links" />');
            api.storage.addStyle('#AniList.mal_links img{background-color: #898989;}');
            $('#mal-sync-search-links, .MALSync-search').one('click', () => {
                $('.MALSync-search').remove();
                var title = $('#contentWrapper > div:first-child span').text();
                var titleEncoded = encodeURI(title);
                var html = '';
                var imgStyle = 'position: relative; top: 4px;';
                for (var key in _pages_pages__WEBPACK_IMPORTED_MODULE_0__[/* pageSearch */ "a"]) {
                    var page = _pages_pages__WEBPACK_IMPORTED_MODULE_0__[/* pageSearch */ "a"][key];
                    if (page.type !== This.type)
                        continue;
                    var linkContent = `<img style="${imgStyle}" src="${utils.favicon(page.domain)}"> ${page.name}`;
                    if (typeof page.completeSearchTag === 'undefined') {
                        var link = `<a target="_blank" href="${page.searchUrl(titleEncoded)}">
              ${linkContent}
            </a>`;
                    }
                    else {
                        var link = page.completeSearchTag(title, linkContent);
                    }
                    var googleSeach = '';
                    if (typeof page.googleSearchDomain !== 'undefined') {
                        googleSeach = `<a target="_blank" href="https://www.google.com/search?q=${titleEncoded}+site:${page.googleSearchDomain}">
              <img style="${imgStyle}" src="${utils.favicon('google.com')}">
            </a>`;
                    }
                    html +=
                        `<div class="mal_links" id="${key}" style="padding: 1px 0;">
              ${link}
              ${googleSeach}
          </div>`;
                }
                $('#mal-sync-search-links').after(html);
            });
        });
    }
    streamingUI() {
        return __awaiter(this, void 0, void 0, function* () {
            con.log('Streaming UI');
            var malObj = new _utils_mal__WEBPACK_IMPORTED_MODULE_1__[/* mal */ "a"](this.url);
            yield malObj.init();
            var streamUrl = malObj.getStreamingUrl();
            if (typeof streamUrl !== 'undefined') {
                $(document).ready(function () {
                    return __awaiter(this, void 0, void 0, function* () {
                        $('.h1 span').first().after(`
        <div class="data title progress" id="mal-sync-stream-div" style="display: inline-block; position: relative; top: 2px;">
          <a class="mal-sync-stream" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0 0;" href="${streamUrl}">
            <img src="${utils.favicon(streamUrl.split('/')[2])}">
          </a>
        </div>`);
                        var resumeUrlObj = yield malObj.getResumeWaching();
                        var continueUrlObj = yield malObj.getContinueWaching();
                        con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj);
                        if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (malObj.getEpisode() + 1)) {
                            $('#mal-sync-stream-div').append(`<a class="nextStream" title="Continue watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${continueUrlObj.url}">
              <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16">
            </a>`);
                        }
                        else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === malObj.getEpisode()) {
                            $('#mal-sync-stream-div').append(`<a class="resumeStream" title="Resume watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${resumeUrlObj.url}">
              <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16">
            </a>`);
                        }
                    });
                });
            }
        });
    }
    bookmarks() {
        con.log('Bookmarks [' + this.username + '][' + this.page + ']');
        var This = this;
        if (this.page == 'modern') {
            var book = {
                bookReady: function (callback) {
                    utils.waitUntilTrue(function () { return $('#loading-spinner').css('display') == 'none'; }, function () {
                        callback($.parseJSON($('.list-table').attr('data-items')));
                    });
                },
                getElement: function (malUrl) {
                    return $('.list-item a[href^="' + malUrl + '"]').parent().parent('.list-table-data');
                },
                streamingSelector: '.data.title .link',
                cleanTags: function () {
                    $('.tags span a').each(function (index) {
                        if (typeof utils.getUrlFromTags($(this).text()) !== 'undefined') {
                            $(this).parent().remove();
                        }
                    });
                },
                predictionPos(element, tag) {
                    element.find('.data.progress span').first().after(tag);
                },
            };
        }
        else if (this.page == 'classic') {
            var book = {
                bookReady: function (callback) {
                    utils.getUserList(7, This.type, null, null, function (list) {
                        callback(list);
                    }, null, This.username);
                },
                getElement: function (malUrl) {
                    return $('a[href^="' + malUrl + '"]');
                },
                streamingSelector: 'span',
                cleanTags: function () {
                    $('span[id^="tagLinks"] a').each(function (index) {
                        if (typeof utils.getUrlFromTags($(this).text()) !== 'undefined') {
                            $(this).remove();
                        }
                    });
                },
                predictionPos(element, tag) {
                    element.parent().parent().find('span[id^="epText"] a span').first().after(tag);
                },
            };
        }
        else {
            con.error('Bookmark type unknown');
            return;
        }
        book.bookReady(function (data) {
            This.bookmarksHDimages();
            $.each(data, function (index, el) {
                return __awaiter(this, void 0, void 0, function* () {
                    var streamUrl = utils.getUrlFromTags(el['tags']);
                    var malUrl = el[This.type + '_url'];
                    con.log(malUrl);
                    var id = utils.urlPart(malUrl, 2);
                    var type = utils.urlPart(malUrl, 1);
                    if (typeof streamUrl !== 'undefined') {
                        var element = book.getElement(malUrl);
                        element.find(book.streamingSelector).after(`
            <a class="mal-sync-stream" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0 0;" href="${streamUrl}">
              <img src="${utils.favicon(streamUrl.split('/')[2])}">
            </a>`);
                        var resumeUrlObj = yield utils.getResumeWaching(type, id);
                        var continueUrlObj = yield utils.getContinueWaching(type, id);
                        if (This.type == 'anime') {
                            var curEp = parseInt(el['num_watched_episodes']);
                        }
                        else {
                            var curEp = parseInt(el['num_read_chapters']);
                        }
                        con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj);
                        if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (curEp + 1)) {
                            element.find('.mal-sync-stream').after(`<a class="nextStream" title="Continue watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${continueUrlObj.url}">
                <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16">
              </a>`);
                        }
                        else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === curEp) {
                            element.find('.mal-sync-stream').after(`<a class="resumeStream" title="Resume watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${resumeUrlObj.url}">
                <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16">
              </a>`);
                        }
                    }
                    utils.epPredictionUI(id, function (prediction) {
                        var element = book.getElement(malUrl);
                        book.predictionPos(element, prediction.tag);
                    });
                });
            });
            book.cleanTags();
        });
    }
    related() {
        $(document).ready(function () {
            $('.anime_detail_related_anime a').each(function () {
                var el = $(this);
                var url = utils.absoluteLink(el.attr('href'), 'https://myanimelist.net');
                if (typeof url != 'undefined') {
                    var malObj = new _utils_mal__WEBPACK_IMPORTED_MODULE_1__[/* mal */ "a"](url);
                    malObj.init().then(() => {
                        var tag = utils.statusTag(malObj.getStatus(), malObj.type, malObj.id);
                        if (tag) {
                            el.after(tag);
                        }
                    });
                }
            });
        });
    }
    relatedTag() {
        $(document).ready(function () {
            $('a.button_edit').each(function () {
                var el = $(this);
                var href = $(this).attr('href');
                var type = utils.urlPart(href, 4);
                var id = utils.urlPart(href, 5);
                var state = el.attr('title');
                if (typeof state != 'undefined' && state) {
                    var tag = utils.statusTag(state, type, id);
                    el.parent().parent().find('> a').after(tag);
                    el.remove();
                }
            });
        });
    }
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(0)))

/***/ }),
/* 23 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return scheduleUpdate; });
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
function scheduleUpdate() {
    return __awaiter(this, void 0, void 0, function* () {
        var url = 'https://myanimelist.net/anime/season/schedule';
        return api.request.xhr('GET', url).then((response) => __awaiter(this, void 0, void 0, function* () {
            console.groupCollapsed('Schedule');
            con.log('Recived');
            var found = 0;
            var parsed = $.parseHTML(response.responseText);
            var se = '.js-seasonal-anime-list-key-';
            se = se + 'monday, ' + se + 'tuesday ,' + se + 'wednesday ,' + se + 'thursday ,' + se + 'friday ,' + se + 'saturday ,' + se + 'sunday';
            var seasons = $(parsed).find(se).find('.seasonal-anime');
            if (seasons.length)
                yield clearScheduleCache();
            seasons.each(function () {
                if ($(this).find('.info .remain-time').text().match(/\w+\ \d+.\ \d+,\ \d+:\d+\ \(JST\)/i)) {
                    var malId = $(this).find('a.link-title').attr('href').split('/')[4];
                    var jpdate = $(this).find('.info .remain-time').text().trim();
                    //day
                    var day = jpdate.split(' ')[1].replace(',', '').trim();
                    //month
                    var month = jpdate.split(' ')[0].trim();
                    //@ts-ignore
                    month = ("JanFebMarAprMayJunJulAugSepOctNovDec".indexOf(month) / 3 + 1);
                    //year
                    var year = jpdate.split(' ')[2].replace(',', '').trim();
                    //time
                    var time = jpdate.split(' ')[3].trim();
                    var minute = time.split(':')[1];
                    var hour = time.split(':')[0];
                    //timezone
                    var timestamp = toTimestamp(year, month, day, hour, minute, 0);
                    con.log(malId, timestamp);
                    api.storage.set('mal/' + malId + '/release', timestamp);
                    var episode = $(this).find('.eps a span').last().text();
                    if (episode.match(/^\d+/)) {
                        api.storage.set('mal/' + malId + '/eps', parseInt(episode.match(/^\d+/)[0]));
                    }
                }
                found++;
            });
            con.log('Schedule updated (' + found + ')');
            console.groupEnd();
        }));
        function toTimestamp(year, month, day, hour, minute, second) {
            var datum = new Date(Date.UTC(year, month - 1, day, hour, minute, second));
            return (datum.getTime()) - 32400000; //for GMT
        }
        function clearScheduleCache() {
            return __awaiter(this, void 0, void 0, function* () {
                var cacheArray = yield api.storage.list();
                var deleted = 0;
                $.each(cacheArray, function (index, cache) {
                    //@ts-ignore
                    if (/^mal\/[^/]+\/(release|eps)$/.test(index)) {
                        api.storage.remove(index);
                        deleted++;
                    }
                });
                con.log("Cache Cleared [" + deleted + "]");
            });
        }
    });
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(2)))

/***/ }),
/* 24 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(api, j, con, utils) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return firebaseNotification; });
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
function firebaseNotification() {
    return __awaiter(this, void 0, void 0, function* () {
        var schedule = yield api.storage.get('timestampUpdate/firebaseNotification');
        if (typeof schedule === 'undefined' || (j.$.now() - schedule) > 10 * 60 * 1000) {
            checkNotifications();
            api.storage.set('timestampUpdate/firebaseNotification', j.$.now());
        }
    });
}
function checkNotifications() {
    con.log('checkNotifications');
    var url = 'https://kissanimelist.firebaseio.com/Data2/Notification/Current.json';
    api.request.xhr('GET', url).then((response) => __awaiter(this, void 0, void 0, function* () {
        var current = parseInt(JSON.parse(response.responseText));
        if (!isNaN(current)) {
            con.log("Current Notification", current);
            var last = parseInt(yield api.storage.get('firebaseNotification'));
            var next = last + 1;
            if (typeof last == undefined || isNaN(last)) {
                api.storage.set('firebaseNotification', current);
                return;
            }
            if (current >= next) {
                var notificationUrl = 'https://kissanimelist.firebaseio.com/Data2/Notification/list/N' + next + '.json';
                api.request.xhr('GET', notificationUrl).then((response) => __awaiter(this, void 0, void 0, function* () {
                    var message = JSON.parse(response.responseText);
                    if (message != 'null' && message != null) {
                        j.$(document).ready(function () {
                            var flashm = utils.flashm('<div style="text-align: left;">' + message + '</div><button class="okChangelog" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Close</button>', { permanent: true, position: "top" });
                            flashm.find('.okChangelog').click(function () {
                                flashm.remove();
                                api.storage.set('firebaseNotification', next).then(function () {
                                    checkNotifications();
                                });
                            });
                        });
                    }
                    else {
                        con.info('Notification empty', response.responseText);
                        api.storage.set('firebaseNotification', next).then(function () {
                            checkNotifications();
                        });
                    }
                }));
            }
            else {
                con.log('No new notifications');
            }
        }
        else {
            con.error('Could not read current Notification number');
        }
    }));
}

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(1), __webpack_require__(2), __webpack_require__(3)))

/***/ }),
/* 25 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(api, j) {/* harmony import */ var _pages_syncPage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);
/* harmony import */ var _myanimelist_myanimelistClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(22);
/* harmony import */ var _utils_scheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(23);
/* harmony import */ var _utils_firebaseNotification__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24);
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};




function main() {
    if (window.location.href.indexOf("myanimelist.net") > -1) {
        var mal = new _myanimelist_myanimelistClass__WEBPACK_IMPORTED_MODULE_1__[/* myanimelistClass */ "a"](window.location.href);
        mal.init();
    }
    else {
        var page = new _pages_syncPage__WEBPACK_IMPORTED_MODULE_0__[/* syncPage */ "a"](window.location.href);
        page.init();
    }
    Object(_utils_firebaseNotification__WEBPACK_IMPORTED_MODULE_3__[/* firebaseNotification */ "a"])();
}
var css = "font-size: 40px; padding-bottom: 3px; color: white; text-shadow: -1px -1px #2e51a2, 1px -1px #2e51a2, -1px 1px #2e51a2, 1px 1px #2e51a2, 2px 2px #2e51a2, 3px 3px #2e51a2;";
console.log("%cMAL-Sync", css, "Version: " + api.storage.version());
api.settings.init()
    .then(() => {
    main();
    scheduler();
});
function scheduler() {
    return __awaiter(this, void 0, void 0, function* () {
        var schedule = yield api.storage.get('timestampUpdate/release');
        if (typeof schedule === 'undefined' || (j.$.now() - schedule) > 345600000) {
            yield Object(_utils_scheduler__WEBPACK_IMPORTED_MODULE_2__[/* scheduleUpdate */ "a"])();
            api.storage.set('timestampUpdate/release', j.$.now());
        }
    });
}
//temp
/*con.log('log');
con.error('error');
con.info('info');
con.log(utils.urlPart('https://greasyfork.org/de/scripts/27564-kissanimelist/code', 5));

api.storage.set('test', 'test123').then(() => {
  return api.storage.get('test');
}).then((value) => {
  con.log(value);
});

api.request.xhr('GET', 'https://myanimelist.net/').then((response) => {
  con.log(response);
});

const style = require('./style.less').toString();
api.storage.addStyle(style);

$(document).ready(function(){
  utils.flashm('test');
  utils.flashm('test', {type: "test", error: true});
  utils.flashm('permanent', {type: "permanent", permanent: true, position: "top"});
  utils.flashm('permanent hover', {hoverInfo: true});
  setTimeout(function(){
    utils.flashm('test');
    utils.flashm('test', {type: "test", error: true});
    utils.flashm('test', {type: "test", error: true});
    utils.flashm('test', {type: "test", error: true, position: "top"});
    utils.flashm('test', {type: "test", error: true, position: "top"});
    utils.flashm('permanent2', {type: "permanent", permanent: true});
    utils.flashConfirm('Add?', 'add', function(){alert('yes')}, function(){alert('no')});
  }, 3000)
  utils.flashConfirm('Add?', 'add', function(){alert('yes')}, function(){alert('no')});
});*/

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(1)))

/***/ }),
/* 26 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(27);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 27 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n  color: #d5f406;\n}\n.mal-sync-active {\n  background-color: #002966;\n}\n#footer {\n  z-index: 2;\n}\n", ""]);

// exports


/***/ }),
/* 28 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(29);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 29 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n  color: #72cefe;\n}\n.mal-sync-active {\n  background-color: #002966;\n}\n#footer {\n  z-index: 2;\n}\n", ""]);

// exports


/***/ }),
/* 30 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(31);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 31 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n  color: #694ba1;\n}\n.mal-sync-active {\n  background-color: #002966;\n}\n", ""]);

// exports


/***/ }),
/* 32 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(33);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 33 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n  color: white;\n}\n.mal-sync-active {\n  background-color: #b2d1ff !important;\n}\n#malp {\n  background-color: #555;\n  padding: 10px 7px 5px 7px;\n}\n#malp span {\n  color: white;\n}\n#malp select > * {\n  background-color: #555 !important;\n}\n", ""]);

// exports


/***/ }),
/* 34 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(35);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 35 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n  color: white;\n}\n.mal-sync-active {\n  background-color: #002966;\n}\n", ""]);

// exports


/***/ }),
/* 36 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(37);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 37 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n  color: black;\n}\n.mal-sync-active {\n  background-color: #cee1ff;\n}\n#malp span {\n  color: black;\n}\n#malp select > * {\n  background-color: white !important;\n}\n", ""]);

// exports


/***/ }),
/* 38 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(39);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 39 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n  color: black;\n}\n.mal-sync-active {\n  background-color: #cee1ff !important;\n}\n#malp {\n  background-color: #fff;\n  padding: 20px;\n  border-radius: 2px;\n  -webkit-box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.14);\n  box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.14);\n  margin-bottom: 20px;\n  position: relative;\n}\n#malp span {\n  color: black;\n}\n#malp select > * {\n  background-color: white !important;\n}\n", ""]);

// exports


/***/ }),
/* 40 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(41);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 41 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n  color: #ffc119;\n}\n.mal-sync-active {\n  background-color: #002966 !important;\n}\n", ""]);

// exports


/***/ }),
/* 42 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(43);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 43 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n  color: #e81e30;\n}\n.mal-sync-active {\n  background-color: #002966;\n}\n.mal-sync-active .infoept {\n  background-color: #002966;\n}\n.mal-sync-active div {\n  color: white !important;\n}\n#malp {\n  background-color: #121212;\n  color: white;\n  margin: 0;\n  padding: 20px;\n  margin-left: 1px;\n  margin-bottom: 1px;\n}\n#malp input {\n  width: auto;\n}\n#malp a {\n  font-size: 16px;\n}\n.white #malp {\n  background-color: #ffffff !important;\n  color: black !important;\n}\n", ""]);

// exports


/***/ }),
/* 44 */
/***/ (function(module, exports, __webpack_require__) {


        var result = __webpack_require__(45);

        if (typeof result === "string") {
            module.exports = result;
        } else {
            module.exports = result.toString();
        }
    

/***/ }),
/* 45 */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(4)(false);
// imports


// module
exports.push([module.i, "#material .mdl-card__supporting-text {\n  width: initial;\n}\n.mdl-layout__header .mdl-textfield__label:after {\n  background-color: red !important;\n}\n.alternative-list .mdl-list {\n  max-width: 100%;\n  margin: 0;\n  padding: 0;\n}\n.alternative-list .mdl-list__item {\n  height: auto;\n}\n.alternative-list .mdl-list__item-primary-content {\n  height: auto !important;\n}\n.alternative-list .mdl-list__item-primary-content a {\n  display: inline-block;\n}\n.alternative-list .mdl-list__item-text-body {\n  height: auto !important;\n}\n.coverinfo .mdl-chip {\n  height: auto;\n}\n.coverinfo .mdl-chip .mdl-chip__text {\n  white-space: normal;\n  line-height: 24px;\n}\n.mdl-layout__content::-webkit-scrollbar {\n  width: 10px !important;\n  background-color: #F5F5F5;\n}\n.mdl-layout__content::-webkit-scrollbar-thumb {\n  background-color: #c1c1c1 !important;\n}\n.simplebar-track {\n  width: 10px !important;\n  background-color: #F5F5F5;\n}\n.simplebar-scrollbar {\n  background-color: #c1c1c1 !important;\n}\n.simplebar-track.horizontal {\n  display: none;\n}\n.simplebar-scrollbar {\n  transition: height 100ms;\n  border-radius: 0px !important;\n  right: 0 !important;\n  width: 100% !important;\n  opacity: 1 !important;\n}\n.simplebar-scrollbar.visible:before {\n  display: none;\n}\n.simplebar-content {\n  margin-right: -7px !important;\n}\n.simplebar-track {\n  margin-top: -2px;\n  margin-bottom: -2px;\n}\na {\n  text-decoration: none;\n}\n.mdl-layout__tab-panel a:hover {\n  text-decoration: underline;\n}\n.mdl-cell {\n  background-color: #fefefe;\n}\n#material.simple-header .mdl-layout__header .mdl-layout__tab-bar-container {\n  display: none;\n}\n.newEp {\n  position: absolute;\n  background-color: #dedede;\n  height: 25px;\n  width: 29px;\n  top: 3px;\n  right: -4px;\n  background-repeat: no-repeat;\n  background-position: 4px 3px;\n  background-image: url(https://github.com/google/material-design-icons/blob/master/social/1x_web/ic_notifications_none_black_18dp.png?raw=true);\n}\n.searchItem {\n  text-decoration: none !important;\n  color: black;\n}\n#material.settings-only .mdl-layout__header .mdl-layout__tab-bar-container,\n#material.pop-over .mdl-layout__header .mdl-layout__tab-bar-container {\n  display: none;\n}\n#material.settings-only .mdl-layout__tab-panel,\n#material.pop-over .mdl-layout__tab-panel {\n  display: none !important;\n}\n#material.settings-only #fixed-tab-5.mdl-layout__tab-panel {\n  display: block !important;\n}\n#material.pop-over #fixed-tab-5.mdl-layout__tab-panel {\n  display: none !important;\n}\n#material.pop-over #fixed-tab-4.mdl-layout__tab-panel {\n  display: block !important;\n}\n#Mal-Sync-Popup #material-fullscreen {\n  display: none !important;\n}\n#Mal-Sync-Popup .settings-only #book.open .bookIcon {\n  display: none;\n}\n#Mal-Sync-Popup .settings-only #book.open .settingsIcon {\n  display: block !important;\n}\n#material a.button_edit {\n  text-decoration: none;\n  background-color: #efefef;\n  border-bottom: 1px solid #ebebeb;\n  font-size: 10px;\n  line-height: 1em;\n  margin: 0;\n  opacity: 1;\n  padding: 2px 4px;\n  -webkit-transition-duration: 0.3s;\n  transition-duration: 0.3s;\n  -webkit-transition-property: all;\n  transition-property: all;\n  -webkit-transition-timing-function: ease-in-out;\n  transition-timing-function: ease-in-out;\n  display: inline-block;\n  font-family: Avenir, lucida grande, tahoma, verdana, arial, sans-serif;\n  height: 9px;\n}\n#material a.button_edit.reading,\n#material a.button_edit.watching {\n  background-color: #2db039;\n  color: #fff;\n}\n#material a.button_edit.reading:hover,\n#material a.button_edit.watching:hover {\n  opacity: 0.7;\n}\n#material a.button_edit.plantoread,\n#material a.button_edit.plantowatch {\n  background-color: #c3c3c3;\n  color: #fff;\n}\n#material a.button_edit.plantoread:hover,\n#material a.button_edit.plantowatch:hover {\n  opacity: 0.7;\n}\n#material a.button_edit.completed {\n  background-color: #26448f;\n  color: #fff;\n}\n#material a.button_edit.completed:hover {\n  opacity: 0.7;\n}\n#material a.button_edit.on-hold {\n  background-color: #f1c83e;\n  color: #fff;\n}\n#material a.button_edit.dropped {\n  background-color: #a12f31;\n  color: #fff;\n}\n#material a.button_edit.dropped:hover {\n  opacity: 0.7;\n}\n", ""]);

// exports


/***/ })
/******/ ]);