您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
可能是目前最好用的P站批量抓图工具
// ==UserScript== // @name Pxer: the tool for pixiv.net // @name:zh-CN 像素猎手: Pixiv 批量下载工具 // @name:en-US Pxer: the tool for pixiv.net // @name:ja-JP Pxer: Pixiv に向くクローラー // @description Maybe the best tool for pixiv.net for capture pictures // @description:zh-CN 可能是目前最好用的P站批量抓图工具 // @description:en-US Maybe the best tool for pixiv.net for capture pictures // @description:ja-JP Pixiv の全てのツールで一番使いやすいバッチキャプチャーソフトかもしれない // @icon https://pxer-app.pea3nut.org/public/favicon.ico // @version 7.1.0 // @namespace http://pxer.pea3nut.org/sfp // @homepageURL http://pxer.pea3nut.org/ // @supportURL https://github.com/FoXZilla/Pxer/issues/new/choose // @author pea3nut / eternal-flame-AD // @license MIT // @grant none // @noframes // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js // @include https://www.pixiv.net* // @include http://www.pixiv.net** // ==/UserScript== javascript: void(function() { window['PXER_URL'] = 'https://pxer-app.pea3nut.org/'; window['PXER_MODE'] = 'sfp'; window["pxer"] = window["pxer"] || {}; pxer.util = pxer.util || {}; pxer.util.afterLoad = function (fn) { if (document.readyState !== "loading") { setTimeout(fn); } else { document.addEventListener("DOMContentLoaded", fn); } }; pxer.util.compile = function (str, scope = window) { let matchResult = null; while ((matchResult = str.match(/{{\s*([\w_]+)\s*}}/))) { str = str.replace(matchResult[0], scope[matchResult[1]]); } return str; }; pxer.util.set = function (obj, key, val) { const keys = key.split("."); let pointer = obj; for (let i = 0; i < keys.length; i++) { if (i === keys.length - 1) { pointer[keys[i]] = val; } else { pointer[keys[i]] = pointer[keys[i]] || {}; pointer = pointer[keys[i]]; } } }; // @ref https://www.jianshu.com/p/162dad820f48 pxer.util.get = function self(data, f) { if (f.substr) f = f.split(/\.|\\|\//); if (f.length && data) { return self(data[f.shift()], f); } else if (!f.length && data) { return data; } else { return ""; } }; pxer.util.chunk = function self(data, chunkSize) { let R = []; for (let i = 0; i < data.length; i += chunkSize) R.push(data.slice(i, i + chunkSize)); return R; }; pxer.util.addFile = async function (url) { const sector = url.includes("?") ? "&" : "?"; const pxerVersion = /*@auto-fill*/"7.1.0"/*@auto-fill*/ if (!/^(https?:)?\/\//.test(url)) url = pxer.url + url; url = url + sector + `pxer-version=${pxerVersion}`; const createScript = () => new Promise(function (resolve, reject) { const elt = document.createElement("script"); elt.addEventListener("error", reject); elt.addEventListener("load", resolve); elt.addEventListener("load", () => pxer.log("Loaded " + url)); elt.src = url; elt.crossOrigin = "anonymous"; document.documentElement.appendChild(elt); return elt; }); const createCss = () => new Promise(function (resolve) { const elt = document.createElement("link"); elt.rel = "stylesheet"; elt.href = url; document.documentElement.appendChild(elt); resolve(); }); const createIcon = () => new Promise(function (resolve) { pxer.util.afterLoad(() => { Array.from(document.querySelectorAll("link[rel*='icon']")).forEach( (elt) => (elt.href = url) ); }); (document.head || document.documentElement).appendChild( (function () { const elt = document.createElement("link"); elt.rel = "shortcut icon"; elt.type = "image/x-icon"; elt.href = url; return elt; })() ); resolve(); }); const fileFormat = url.match(/\.([^.]+?)(\?.+?)?$/)[1]; switch (fileFormat) { case "js": return createScript(); case "css": return createCss(); case "ico": return createIcon(); case "json": return fetch(url).then((res) => res.json()); default: return fetch(url).then((res) => res.text()); } }; (async function () { window["PXER_URL"] = window["PXER_URL"] || "https://pxer-app.pea3nut.org/"; window["PXER_MODE"] = window["PXER_MODE"] || "native"; window["PXER_LANG"] = window["PXER_LANG"] || (document.documentElement.lang || window.navigator.language).split("-")[0]; pxer.url = PXER_URL; pxer.mode = PXER_MODE; pxer.lang = PXER_LANG; pxer.log = (...msg) => console.log("[Pxer]", ...msg); switch (PXER_MODE) { case "dev": case "master": // old version doesn't declare "@require vuejs" await pxer.util.addFile( "https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js" ); case "native": await pxer.util.addFile("native.js"); break; case "local": await pxer.util.addFile("src/local.js"); break; case "sfp": break; } })().catch(console.error); // package.json pxer.util.set(pxer, 'package', { "name": "pxer", "version": "7.1.0", "private": false, "scripts": { "dev": "npm run build && ws --https --port 18125 --cors.origin=https://www.pixiv.net", "build": "sass src/:src/ --no-source-map && node build/build-launcher && node build/build-native && node build/build-sfp", "test-build": "ws --directory dist/ --https --port 18125 --cors.origin *", "prettier": "prettier --write ." }, "dependencies": { "request": "^2.88.0", "vue": "^2.6.10" }, "devDependencies": { "bootstrap": "^4.6.2", "ejs": "^2.7.1", "local-web-server": "^3.0.7", "sass": "^1.62.1", "prettier": "^2.8.8" } } ) ; // src/view/template.html pxer.util.set(pxer, 'uiTemplate', `<div id="pxerApp" class="pxer-app"> <div class="pxer-nav"> <div class="pn-header"> <a href="https://github.com/renmu123/Pxer" target="_blank" >Pxer <small>{{ pxerVersion }}</small></a > </div> <div v-if="errmsg" class="pn-message" v-text="errmsg"> oops~ get some error </div> <div v-if="showAll || canCrawl" class="pn-buttons"> <div v-show="showAll || isRunning || ['ready','re-ready'].includes(state)" class="pnb-progress" > <span >{{ finishCount >= 0 ? finishCount : '-' }} / {{ taskCount }}</span > </div> <button v-show="showAll || ['ready'].includes(state)" class="btn btn-outline-info" @click="showTaskOption = !showTaskOption" > {{ t('button.option') }} </button> <div v-if="state==='init' || showLoadingButton" id="wave"> <span class="dot"></span> <span class="dot"></span> <span class="dot"></span> </div> <button v-else-if="canCrawlDirectly" class="btn btn-outline-primary" @click="crawlDirectly" > {{ t('button.crawl') }} </button> <template v-else> <button v-if="state==='standby'&&showLoadBtn" class="btn btn-outline-success" @click="load" > {{ t('button.load') }} </button> <button v-if="state==='ready' || (state==='re-ready'&&pxer.taskList.length)" class="btn btn-outline-primary" @click="run" > {{ t('button.crawl') }} </button> <button v-if="isRunning" class="btn btn-outline-danger" @click="stop"> {{ t('button.stop') }} </button> <template v-if="showAll || showFailTaskList.length"> <button class="btn btn-outline-warning" @click="showPxerFailWindow=!showPxerFailWindow" > {{ t('button.successBut') }} </button> <span class="pnb-warn-number" v-text="showFailTaskList.length>99?99:showFailTaskList.length" ></span> </template> </template> </div> </div> <div v-if="showAll ||(showPxerFailWindow &&showFailTaskList.length)" class="pxer-fail" > <table class="table"> <thead class="pft-head"> <tr> <td>{{ t('label.pictureId') }}</td> <td width="100">{{ t('label.reason') }}</td> <td>{{ t('label.way') }}</td> <td class="text-right" width="170"> <button class="btn btn-outline-secondary" @click="checkedFailWorksList =pxer.failList" > {{ t('button.selectAll') }} </button> <button class="btn btn-outline-success" @click="tryCheckedPfi"> {{ t('button.retryTheSelected') }} </button> </td> </tr> </thead> <tbody> <tr v-for="pfi of showFailTaskList"> <td><a :href="pfi.url">{{ pfi.task.id }}</a></td> <td v-text="formatFailType(pfi.type)"></td> <td v-html="formatFailSolution(pfi.type)"></td> <td class="text-right"> <input v-model="checkedFailWorksList" :value="pfi" type="checkbox" /> </td> </tr> </tbody> </table> </div> <div v-if="showAll ||(showTaskOption&&state==='ready')" class="pxer-task-option form-inline" > <div class="form-group"> <label class="pcf-title">{{ t('label.onlyGetTop') }}</label> <input v-model="taskOption.limit" class="form-control" type="number" /> </div> <div class="form-group"> <label class="pcf-title">{{ t('label.onlyGetBeforeId') }}</label> <input v-model="taskOption.stopId" class="form-control" type="number" /> </div> <div class="form-group" title="快速模式下速度约快二十倍,但是下载时会出现下载失败的图片,不会实际影响图片" > <svg t="1685161225381" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2338" width="18" height="18" > <path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" p-id="2339" ></path> <path d="M623.6 316.7C593.6 290.4 554 276 512 276s-81.6 14.5-111.6 40.7C369.2 344 352 380.7 352 420v7.6c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V420c0-44.1 43.1-80 96-80s96 35.9 96 80c0 31.1-22 59.6-56.1 72.7-21.2 8.1-39.2 22.3-52.1 40.9-13.1 19-19.9 41.8-19.9 64.9V620c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-22.7c0-19.7 12.4-37.7 30.9-44.8 59-22.7 97.1-74.7 97.1-132.5 0.1-39.3-17.1-76-48.3-103.3z" p-id="2340" ></path> <path d="M512 732m-40 0a40 40 0 1 0 80 0 40 40 0 1 0-80 0Z" p-id="2341" ></path> </svg> <label class="pcf-title">快速模式:</label> <input v-model="taskOption.isQuick" class="form-control" type="checkbox" /> </div> <div class="form-group ptp-buttons"> <button class="btn btn-outline-success" @click="useTaskOption"> {{ t('button.apply') }} </button> </div> </div> <div v-if="showAll ||['finish'].indexOf(state)!==-1" class="pxer-print"> <div class="pp-filter pxer-class-fieldset"> <div class="ppf-title pcf-title">{{ t('title.filterOptions') }}</div> <div class="ppf-form"> <div class="form-row"> <div class="form-row"> <template v-if="!taskOption.isQuick"> <div class="form-group col"> <label>{{ t('label.likeCount') }} ≥</label> <input v-model.number="pxer.pfConfig.rated" class="form-control" type="number" /> </div> <div class="form-group col"> <label>{{ t('label.viewCount') }} ≥</label> <input v-model.number="pxer.pfConfig.view" class="form-control" type="number" /> </div> <div class="form-group col"> <label>{{ t('label.likeProportion') }} ≥</label> <input v-model.number="pxer.pfConfig.rated_pro" :placeholder="t('phrase.likeProportion')" class="form-control" type="number" /> </div> </template> </div> </div> <div class="card ppf-tag-card"> <div class="card-header"> {{ t('title.filterByTag') }} <div class="float-right"> <span class="badge badge-secondary" >{{ t('label.whatever') }}</span > <span class="badge badge-danger">{{ t('label.exclude') }}</span> <span class="badge badge-success" >{{ t('label.mustInclude') }}</span > </div> </div> <div :style="tagFilterFolded ? 'height: 500px' : ''" class="card-body" > <button v-for="tagName in tagInfo.tags" :class="countTagTheme(tagName)" class="btn btn-sm ppf-tag" @click="onTagClick(tagName)" @dblclick.stop > {{ tagName }} <span class="badge badge-light" >{{ tagInfo.count[tagName] }}</span > </button> <div v-if="tagFilterFolded" class="ppf-show-all-tag" @click="showAllTagFilter = true" > {{ t('button.showAll') }} </div> </div> </div> </div> </div> <div class="pp-print pxer-class-fieldset"> <div class="ppp-title pcf-title">{{ t('title.printOptions') }}</div> <div class="ppp-form"> <div class="form-group"> <label>{{ t('label.singleIllust') }}</label> <select v-model="pxer.ppConfig.illust_single" class="form-control"> <option value="max">{{ t('option.max') }}</option> <option value="600p">600p</option> <option value="no">{{ t('option.no') }}</option> </select> </div> <div class="form-group"> <label>{{ t('label.multipleIllust') }}</label> <select v-model="pxer.ppConfig.illust_multiple" class="form-control"> <option value="max">{{ t('option.max') }}</option> <option value="1200p">1200p</option> <option value="cover_600p">{{ t('option.cover600p') }}</option> <option value="no">{{ t('option.no') }}</option> </select> </div> <div class="form-group"> <label>{{ t('label.singleManga') }}</label> <select v-model="pxer.ppConfig.manga_single" class="form-control"> <option value="max">{{ t('option.max') }}</option> <option value="600p">600p</option> <option value="no">{{ t('option.no') }}</option> </select> </div> <div class="form-group"> <label>{{ t('label.multipleManga') }}</label> <select v-model="pxer.ppConfig.manga_multiple" class="form-control"> <option value="max">{{ t('option.max') }}</option> <option value="1200p">1200p</option> <option value="cover_600p">{{ t('option.cover600p') }}</option> <option value="no">{{ t('option.no') }}</option> </select> </div> <div class="form-group"> <label>{{ t('label.ugoira') }}</label> <select v-model="printConfigUgoira" class="form-control"> <option value="max-no">{{ t('option.ugoiraMax') }}</option> <option value="600p-no">{{ t('option.ugoira600p') }}</option> <option value="max-yes"> {{ t('option.ugoiraMax') }} + {{ t('option.ugoiraConfig') }} </option> <option value="600p-yes"> {{ t('option.ugoira600p') }} + {{ t('option.ugoiraConfig') }} </option> <option value="no-no">{{ t('option.no') }}</option> </select> </div> <div class="pppf-buttons"> <p v-if="taskInfo" class="pppfb-msg" v-html="taskInfo"></p> <button class="btn btn-outline-info" @click="count"> {{ t('button.preview') }} </button> <button class="btn btn-outline-success" @click="printWorks"> {{ t('button.print') }} </button> </div> </div> </div> </div> </div> `) ; // src/view/style.css document.documentElement.appendChild( document.createElement('style') ).innerHTML = `.pxer-app { /*! * Bootstrap Grid v4.6.2 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors * Copyright 2011-2022 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ max-width: 970px; width: 100%; margin: 0 auto; box-sizing: border-box; color: #212529; font-size: 14px; } .pxer-app html { box-sizing: border-box; -ms-overflow-style: scrollbar; } .pxer-app *, .pxer-app *::before, .pxer-app *::after { box-sizing: inherit; } .pxer-app .container, .pxer-app .container-fluid, .pxer-app .container-xl, .pxer-app .container-lg, .pxer-app .container-md, .pxer-app .container-sm { width: 100%; padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } @media (min-width: 576px) { .pxer-app .container-sm, .pxer-app .container { max-width: 540px; } } @media (min-width: 768px) { .pxer-app .container-md, .pxer-app .container-sm, .pxer-app .container { max-width: 720px; } } @media (min-width: 992px) { .pxer-app .container-lg, .pxer-app .container-md, .pxer-app .container-sm, .pxer-app .container { max-width: 960px; } } @media (min-width: 1200px) { .pxer-app .container-xl, .pxer-app .container-lg, .pxer-app .container-md, .pxer-app .container-sm, .pxer-app .container { max-width: 1140px; } } .pxer-app .row { display: flex; flex-wrap: wrap; margin-right: -15px; margin-left: -15px; } .pxer-app .no-gutters { margin-right: 0; margin-left: 0; } .pxer-app .no-gutters > .col, .pxer-app .no-gutters > [class*=col-] { padding-right: 0; padding-left: 0; } .pxer-app .col-xl, .pxer-app .col-xl-auto, .pxer-app .col-xl-12, .pxer-app .col-xl-11, .pxer-app .col-xl-10, .pxer-app .col-xl-9, .pxer-app .col-xl-8, .pxer-app .col-xl-7, .pxer-app .col-xl-6, .pxer-app .col-xl-5, .pxer-app .col-xl-4, .pxer-app .col-xl-3, .pxer-app .col-xl-2, .pxer-app .col-xl-1, .pxer-app .col-lg, .pxer-app .col-lg-auto, .pxer-app .col-lg-12, .pxer-app .col-lg-11, .pxer-app .col-lg-10, .pxer-app .col-lg-9, .pxer-app .col-lg-8, .pxer-app .col-lg-7, .pxer-app .col-lg-6, .pxer-app .col-lg-5, .pxer-app .col-lg-4, .pxer-app .col-lg-3, .pxer-app .col-lg-2, .pxer-app .col-lg-1, .pxer-app .col-md, .pxer-app .col-md-auto, .pxer-app .col-md-12, .pxer-app .col-md-11, .pxer-app .col-md-10, .pxer-app .col-md-9, .pxer-app .col-md-8, .pxer-app .col-md-7, .pxer-app .col-md-6, .pxer-app .col-md-5, .pxer-app .col-md-4, .pxer-app .col-md-3, .pxer-app .col-md-2, .pxer-app .col-md-1, .pxer-app .col-sm, .pxer-app .col-sm-auto, .pxer-app .col-sm-12, .pxer-app .col-sm-11, .pxer-app .col-sm-10, .pxer-app .col-sm-9, .pxer-app .col-sm-8, .pxer-app .col-sm-7, .pxer-app .col-sm-6, .pxer-app .col-sm-5, .pxer-app .col-sm-4, .pxer-app .col-sm-3, .pxer-app .col-sm-2, .pxer-app .col-sm-1, .pxer-app .col, .pxer-app .col-auto, .pxer-app .col-12, .pxer-app .col-11, .pxer-app .col-10, .pxer-app .col-9, .pxer-app .col-8, .pxer-app .col-7, .pxer-app .col-6, .pxer-app .col-5, .pxer-app .col-4, .pxer-app .col-3, .pxer-app .col-2, .pxer-app .col-1 { position: relative; width: 100%; padding-right: 15px; padding-left: 15px; } .pxer-app .col { flex-basis: 0; flex-grow: 1; max-width: 100%; } .pxer-app .row-cols-1 > * { flex: 0 0 100%; max-width: 100%; } .pxer-app .row-cols-2 > * { flex: 0 0 50%; max-width: 50%; } .pxer-app .row-cols-3 > * { flex: 0 0 33.3333333333%; max-width: 33.3333333333%; } .pxer-app .row-cols-4 > * { flex: 0 0 25%; max-width: 25%; } .pxer-app .row-cols-5 > * { flex: 0 0 20%; max-width: 20%; } .pxer-app .row-cols-6 > * { flex: 0 0 16.6666666667%; max-width: 16.6666666667%; } .pxer-app .col-auto { flex: 0 0 auto; width: auto; max-width: 100%; } .pxer-app .col-1 { flex: 0 0 8.33333333%; max-width: 8.33333333%; } .pxer-app .col-2 { flex: 0 0 16.66666667%; max-width: 16.66666667%; } .pxer-app .col-3 { flex: 0 0 25%; max-width: 25%; } .pxer-app .col-4 { flex: 0 0 33.33333333%; max-width: 33.33333333%; } .pxer-app .col-5 { flex: 0 0 41.66666667%; max-width: 41.66666667%; } .pxer-app .col-6 { flex: 0 0 50%; max-width: 50%; } .pxer-app .col-7 { flex: 0 0 58.33333333%; max-width: 58.33333333%; } .pxer-app .col-8 { flex: 0 0 66.66666667%; max-width: 66.66666667%; } .pxer-app .col-9 { flex: 0 0 75%; max-width: 75%; } .pxer-app .col-10 { flex: 0 0 83.33333333%; max-width: 83.33333333%; } .pxer-app .col-11 { flex: 0 0 91.66666667%; max-width: 91.66666667%; } .pxer-app .col-12 { flex: 0 0 100%; max-width: 100%; } .pxer-app .order-first { order: -1; } .pxer-app .order-last { order: 13; } .pxer-app .order-0 { order: 0; } .pxer-app .order-1 { order: 1; } .pxer-app .order-2 { order: 2; } .pxer-app .order-3 { order: 3; } .pxer-app .order-4 { order: 4; } .pxer-app .order-5 { order: 5; } .pxer-app .order-6 { order: 6; } .pxer-app .order-7 { order: 7; } .pxer-app .order-8 { order: 8; } .pxer-app .order-9 { order: 9; } .pxer-app .order-10 { order: 10; } .pxer-app .order-11 { order: 11; } .pxer-app .order-12 { order: 12; } .pxer-app .offset-1 { margin-left: 8.33333333%; } .pxer-app .offset-2 { margin-left: 16.66666667%; } .pxer-app .offset-3 { margin-left: 25%; } .pxer-app .offset-4 { margin-left: 33.33333333%; } .pxer-app .offset-5 { margin-left: 41.66666667%; } .pxer-app .offset-6 { margin-left: 50%; } .pxer-app .offset-7 { margin-left: 58.33333333%; } .pxer-app .offset-8 { margin-left: 66.66666667%; } .pxer-app .offset-9 { margin-left: 75%; } .pxer-app .offset-10 { margin-left: 83.33333333%; } .pxer-app .offset-11 { margin-left: 91.66666667%; } @media (min-width: 576px) { .pxer-app .col-sm { flex-basis: 0; flex-grow: 1; max-width: 100%; } .pxer-app .row-cols-sm-1 > * { flex: 0 0 100%; max-width: 100%; } .pxer-app .row-cols-sm-2 > * { flex: 0 0 50%; max-width: 50%; } .pxer-app .row-cols-sm-3 > * { flex: 0 0 33.3333333333%; max-width: 33.3333333333%; } .pxer-app .row-cols-sm-4 > * { flex: 0 0 25%; max-width: 25%; } .pxer-app .row-cols-sm-5 > * { flex: 0 0 20%; max-width: 20%; } .pxer-app .row-cols-sm-6 > * { flex: 0 0 16.6666666667%; max-width: 16.6666666667%; } .pxer-app .col-sm-auto { flex: 0 0 auto; width: auto; max-width: 100%; } .pxer-app .col-sm-1 { flex: 0 0 8.33333333%; max-width: 8.33333333%; } .pxer-app .col-sm-2 { flex: 0 0 16.66666667%; max-width: 16.66666667%; } .pxer-app .col-sm-3 { flex: 0 0 25%; max-width: 25%; } .pxer-app .col-sm-4 { flex: 0 0 33.33333333%; max-width: 33.33333333%; } .pxer-app .col-sm-5 { flex: 0 0 41.66666667%; max-width: 41.66666667%; } .pxer-app .col-sm-6 { flex: 0 0 50%; max-width: 50%; } .pxer-app .col-sm-7 { flex: 0 0 58.33333333%; max-width: 58.33333333%; } .pxer-app .col-sm-8 { flex: 0 0 66.66666667%; max-width: 66.66666667%; } .pxer-app .col-sm-9 { flex: 0 0 75%; max-width: 75%; } .pxer-app .col-sm-10 { flex: 0 0 83.33333333%; max-width: 83.33333333%; } .pxer-app .col-sm-11 { flex: 0 0 91.66666667%; max-width: 91.66666667%; } .pxer-app .col-sm-12 { flex: 0 0 100%; max-width: 100%; } .pxer-app .order-sm-first { order: -1; } .pxer-app .order-sm-last { order: 13; } .pxer-app .order-sm-0 { order: 0; } .pxer-app .order-sm-1 { order: 1; } .pxer-app .order-sm-2 { order: 2; } .pxer-app .order-sm-3 { order: 3; } .pxer-app .order-sm-4 { order: 4; } .pxer-app .order-sm-5 { order: 5; } .pxer-app .order-sm-6 { order: 6; } .pxer-app .order-sm-7 { order: 7; } .pxer-app .order-sm-8 { order: 8; } .pxer-app .order-sm-9 { order: 9; } .pxer-app .order-sm-10 { order: 10; } .pxer-app .order-sm-11 { order: 11; } .pxer-app .order-sm-12 { order: 12; } .pxer-app .offset-sm-0 { margin-left: 0; } .pxer-app .offset-sm-1 { margin-left: 8.33333333%; } .pxer-app .offset-sm-2 { margin-left: 16.66666667%; } .pxer-app .offset-sm-3 { margin-left: 25%; } .pxer-app .offset-sm-4 { margin-left: 33.33333333%; } .pxer-app .offset-sm-5 { margin-left: 41.66666667%; } .pxer-app .offset-sm-6 { margin-left: 50%; } .pxer-app .offset-sm-7 { margin-left: 58.33333333%; } .pxer-app .offset-sm-8 { margin-left: 66.66666667%; } .pxer-app .offset-sm-9 { margin-left: 75%; } .pxer-app .offset-sm-10 { margin-left: 83.33333333%; } .pxer-app .offset-sm-11 { margin-left: 91.66666667%; } } @media (min-width: 768px) { .pxer-app .col-md { flex-basis: 0; flex-grow: 1; max-width: 100%; } .pxer-app .row-cols-md-1 > * { flex: 0 0 100%; max-width: 100%; } .pxer-app .row-cols-md-2 > * { flex: 0 0 50%; max-width: 50%; } .pxer-app .row-cols-md-3 > * { flex: 0 0 33.3333333333%; max-width: 33.3333333333%; } .pxer-app .row-cols-md-4 > * { flex: 0 0 25%; max-width: 25%; } .pxer-app .row-cols-md-5 > * { flex: 0 0 20%; max-width: 20%; } .pxer-app .row-cols-md-6 > * { flex: 0 0 16.6666666667%; max-width: 16.6666666667%; } .pxer-app .col-md-auto { flex: 0 0 auto; width: auto; max-width: 100%; } .pxer-app .col-md-1 { flex: 0 0 8.33333333%; max-width: 8.33333333%; } .pxer-app .col-md-2 { flex: 0 0 16.66666667%; max-width: 16.66666667%; } .pxer-app .col-md-3 { flex: 0 0 25%; max-width: 25%; } .pxer-app .col-md-4 { flex: 0 0 33.33333333%; max-width: 33.33333333%; } .pxer-app .col-md-5 { flex: 0 0 41.66666667%; max-width: 41.66666667%; } .pxer-app .col-md-6 { flex: 0 0 50%; max-width: 50%; } .pxer-app .col-md-7 { flex: 0 0 58.33333333%; max-width: 58.33333333%; } .pxer-app .col-md-8 { flex: 0 0 66.66666667%; max-width: 66.66666667%; } .pxer-app .col-md-9 { flex: 0 0 75%; max-width: 75%; } .pxer-app .col-md-10 { flex: 0 0 83.33333333%; max-width: 83.33333333%; } .pxer-app .col-md-11 { flex: 0 0 91.66666667%; max-width: 91.66666667%; } .pxer-app .col-md-12 { flex: 0 0 100%; max-width: 100%; } .pxer-app .order-md-first { order: -1; } .pxer-app .order-md-last { order: 13; } .pxer-app .order-md-0 { order: 0; } .pxer-app .order-md-1 { order: 1; } .pxer-app .order-md-2 { order: 2; } .pxer-app .order-md-3 { order: 3; } .pxer-app .order-md-4 { order: 4; } .pxer-app .order-md-5 { order: 5; } .pxer-app .order-md-6 { order: 6; } .pxer-app .order-md-7 { order: 7; } .pxer-app .order-md-8 { order: 8; } .pxer-app .order-md-9 { order: 9; } .pxer-app .order-md-10 { order: 10; } .pxer-app .order-md-11 { order: 11; } .pxer-app .order-md-12 { order: 12; } .pxer-app .offset-md-0 { margin-left: 0; } .pxer-app .offset-md-1 { margin-left: 8.33333333%; } .pxer-app .offset-md-2 { margin-left: 16.66666667%; } .pxer-app .offset-md-3 { margin-left: 25%; } .pxer-app .offset-md-4 { margin-left: 33.33333333%; } .pxer-app .offset-md-5 { margin-left: 41.66666667%; } .pxer-app .offset-md-6 { margin-left: 50%; } .pxer-app .offset-md-7 { margin-left: 58.33333333%; } .pxer-app .offset-md-8 { margin-left: 66.66666667%; } .pxer-app .offset-md-9 { margin-left: 75%; } .pxer-app .offset-md-10 { margin-left: 83.33333333%; } .pxer-app .offset-md-11 { margin-left: 91.66666667%; } } @media (min-width: 992px) { .pxer-app .col-lg { flex-basis: 0; flex-grow: 1; max-width: 100%; } .pxer-app .row-cols-lg-1 > * { flex: 0 0 100%; max-width: 100%; } .pxer-app .row-cols-lg-2 > * { flex: 0 0 50%; max-width: 50%; } .pxer-app .row-cols-lg-3 > * { flex: 0 0 33.3333333333%; max-width: 33.3333333333%; } .pxer-app .row-cols-lg-4 > * { flex: 0 0 25%; max-width: 25%; } .pxer-app .row-cols-lg-5 > * { flex: 0 0 20%; max-width: 20%; } .pxer-app .row-cols-lg-6 > * { flex: 0 0 16.6666666667%; max-width: 16.6666666667%; } .pxer-app .col-lg-auto { flex: 0 0 auto; width: auto; max-width: 100%; } .pxer-app .col-lg-1 { flex: 0 0 8.33333333%; max-width: 8.33333333%; } .pxer-app .col-lg-2 { flex: 0 0 16.66666667%; max-width: 16.66666667%; } .pxer-app .col-lg-3 { flex: 0 0 25%; max-width: 25%; } .pxer-app .col-lg-4 { flex: 0 0 33.33333333%; max-width: 33.33333333%; } .pxer-app .col-lg-5 { flex: 0 0 41.66666667%; max-width: 41.66666667%; } .pxer-app .col-lg-6 { flex: 0 0 50%; max-width: 50%; } .pxer-app .col-lg-7 { flex: 0 0 58.33333333%; max-width: 58.33333333%; } .pxer-app .col-lg-8 { flex: 0 0 66.66666667%; max-width: 66.66666667%; } .pxer-app .col-lg-9 { flex: 0 0 75%; max-width: 75%; } .pxer-app .col-lg-10 { flex: 0 0 83.33333333%; max-width: 83.33333333%; } .pxer-app .col-lg-11 { flex: 0 0 91.66666667%; max-width: 91.66666667%; } .pxer-app .col-lg-12 { flex: 0 0 100%; max-width: 100%; } .pxer-app .order-lg-first { order: -1; } .pxer-app .order-lg-last { order: 13; } .pxer-app .order-lg-0 { order: 0; } .pxer-app .order-lg-1 { order: 1; } .pxer-app .order-lg-2 { order: 2; } .pxer-app .order-lg-3 { order: 3; } .pxer-app .order-lg-4 { order: 4; } .pxer-app .order-lg-5 { order: 5; } .pxer-app .order-lg-6 { order: 6; } .pxer-app .order-lg-7 { order: 7; } .pxer-app .order-lg-8 { order: 8; } .pxer-app .order-lg-9 { order: 9; } .pxer-app .order-lg-10 { order: 10; } .pxer-app .order-lg-11 { order: 11; } .pxer-app .order-lg-12 { order: 12; } .pxer-app .offset-lg-0 { margin-left: 0; } .pxer-app .offset-lg-1 { margin-left: 8.33333333%; } .pxer-app .offset-lg-2 { margin-left: 16.66666667%; } .pxer-app .offset-lg-3 { margin-left: 25%; } .pxer-app .offset-lg-4 { margin-left: 33.33333333%; } .pxer-app .offset-lg-5 { margin-left: 41.66666667%; } .pxer-app .offset-lg-6 { margin-left: 50%; } .pxer-app .offset-lg-7 { margin-left: 58.33333333%; } .pxer-app .offset-lg-8 { margin-left: 66.66666667%; } .pxer-app .offset-lg-9 { margin-left: 75%; } .pxer-app .offset-lg-10 { margin-left: 83.33333333%; } .pxer-app .offset-lg-11 { margin-left: 91.66666667%; } } @media (min-width: 1200px) { .pxer-app .col-xl { flex-basis: 0; flex-grow: 1; max-width: 100%; } .pxer-app .row-cols-xl-1 > * { flex: 0 0 100%; max-width: 100%; } .pxer-app .row-cols-xl-2 > * { flex: 0 0 50%; max-width: 50%; } .pxer-app .row-cols-xl-3 > * { flex: 0 0 33.3333333333%; max-width: 33.3333333333%; } .pxer-app .row-cols-xl-4 > * { flex: 0 0 25%; max-width: 25%; } .pxer-app .row-cols-xl-5 > * { flex: 0 0 20%; max-width: 20%; } .pxer-app .row-cols-xl-6 > * { flex: 0 0 16.6666666667%; max-width: 16.6666666667%; } .pxer-app .col-xl-auto { flex: 0 0 auto; width: auto; max-width: 100%; } .pxer-app .col-xl-1 { flex: 0 0 8.33333333%; max-width: 8.33333333%; } .pxer-app .col-xl-2 { flex: 0 0 16.66666667%; max-width: 16.66666667%; } .pxer-app .col-xl-3 { flex: 0 0 25%; max-width: 25%; } .pxer-app .col-xl-4 { flex: 0 0 33.33333333%; max-width: 33.33333333%; } .pxer-app .col-xl-5 { flex: 0 0 41.66666667%; max-width: 41.66666667%; } .pxer-app .col-xl-6 { flex: 0 0 50%; max-width: 50%; } .pxer-app .col-xl-7 { flex: 0 0 58.33333333%; max-width: 58.33333333%; } .pxer-app .col-xl-8 { flex: 0 0 66.66666667%; max-width: 66.66666667%; } .pxer-app .col-xl-9 { flex: 0 0 75%; max-width: 75%; } .pxer-app .col-xl-10 { flex: 0 0 83.33333333%; max-width: 83.33333333%; } .pxer-app .col-xl-11 { flex: 0 0 91.66666667%; max-width: 91.66666667%; } .pxer-app .col-xl-12 { flex: 0 0 100%; max-width: 100%; } .pxer-app .order-xl-first { order: -1; } .pxer-app .order-xl-last { order: 13; } .pxer-app .order-xl-0 { order: 0; } .pxer-app .order-xl-1 { order: 1; } .pxer-app .order-xl-2 { order: 2; } .pxer-app .order-xl-3 { order: 3; } .pxer-app .order-xl-4 { order: 4; } .pxer-app .order-xl-5 { order: 5; } .pxer-app .order-xl-6 { order: 6; } .pxer-app .order-xl-7 { order: 7; } .pxer-app .order-xl-8 { order: 8; } .pxer-app .order-xl-9 { order: 9; } .pxer-app .order-xl-10 { order: 10; } .pxer-app .order-xl-11 { order: 11; } .pxer-app .order-xl-12 { order: 12; } .pxer-app .offset-xl-0 { margin-left: 0; } .pxer-app .offset-xl-1 { margin-left: 8.33333333%; } .pxer-app .offset-xl-2 { margin-left: 16.66666667%; } .pxer-app .offset-xl-3 { margin-left: 25%; } .pxer-app .offset-xl-4 { margin-left: 33.33333333%; } .pxer-app .offset-xl-5 { margin-left: 41.66666667%; } .pxer-app .offset-xl-6 { margin-left: 50%; } .pxer-app .offset-xl-7 { margin-left: 58.33333333%; } .pxer-app .offset-xl-8 { margin-left: 66.66666667%; } .pxer-app .offset-xl-9 { margin-left: 75%; } .pxer-app .offset-xl-10 { margin-left: 83.33333333%; } .pxer-app .offset-xl-11 { margin-left: 91.66666667%; } } .pxer-app .d-none { display: none !important; } .pxer-app .d-inline { display: inline !important; } .pxer-app .d-inline-block { display: inline-block !important; } .pxer-app .d-block { display: block !important; } .pxer-app .d-table { display: table !important; } .pxer-app .d-table-row { display: table-row !important; } .pxer-app .d-table-cell { display: table-cell !important; } .pxer-app .d-flex { display: flex !important; } .pxer-app .d-inline-flex { display: inline-flex !important; } @media (min-width: 576px) { .pxer-app .d-sm-none { display: none !important; } .pxer-app .d-sm-inline { display: inline !important; } .pxer-app .d-sm-inline-block { display: inline-block !important; } .pxer-app .d-sm-block { display: block !important; } .pxer-app .d-sm-table { display: table !important; } .pxer-app .d-sm-table-row { display: table-row !important; } .pxer-app .d-sm-table-cell { display: table-cell !important; } .pxer-app .d-sm-flex { display: flex !important; } .pxer-app .d-sm-inline-flex { display: inline-flex !important; } } @media (min-width: 768px) { .pxer-app .d-md-none { display: none !important; } .pxer-app .d-md-inline { display: inline !important; } .pxer-app .d-md-inline-block { display: inline-block !important; } .pxer-app .d-md-block { display: block !important; } .pxer-app .d-md-table { display: table !important; } .pxer-app .d-md-table-row { display: table-row !important; } .pxer-app .d-md-table-cell { display: table-cell !important; } .pxer-app .d-md-flex { display: flex !important; } .pxer-app .d-md-inline-flex { display: inline-flex !important; } } @media (min-width: 992px) { .pxer-app .d-lg-none { display: none !important; } .pxer-app .d-lg-inline { display: inline !important; } .pxer-app .d-lg-inline-block { display: inline-block !important; } .pxer-app .d-lg-block { display: block !important; } .pxer-app .d-lg-table { display: table !important; } .pxer-app .d-lg-table-row { display: table-row !important; } .pxer-app .d-lg-table-cell { display: table-cell !important; } .pxer-app .d-lg-flex { display: flex !important; } .pxer-app .d-lg-inline-flex { display: inline-flex !important; } } @media (min-width: 1200px) { .pxer-app .d-xl-none { display: none !important; } .pxer-app .d-xl-inline { display: inline !important; } .pxer-app .d-xl-inline-block { display: inline-block !important; } .pxer-app .d-xl-block { display: block !important; } .pxer-app .d-xl-table { display: table !important; } .pxer-app .d-xl-table-row { display: table-row !important; } .pxer-app .d-xl-table-cell { display: table-cell !important; } .pxer-app .d-xl-flex { display: flex !important; } .pxer-app .d-xl-inline-flex { display: inline-flex !important; } } @media print { .pxer-app .d-print-none { display: none !important; } .pxer-app .d-print-inline { display: inline !important; } .pxer-app .d-print-inline-block { display: inline-block !important; } .pxer-app .d-print-block { display: block !important; } .pxer-app .d-print-table { display: table !important; } .pxer-app .d-print-table-row { display: table-row !important; } .pxer-app .d-print-table-cell { display: table-cell !important; } .pxer-app .d-print-flex { display: flex !important; } .pxer-app .d-print-inline-flex { display: inline-flex !important; } } .pxer-app .flex-row { flex-direction: row !important; } .pxer-app .flex-column { flex-direction: column !important; } .pxer-app .flex-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-wrap { flex-wrap: wrap !important; } .pxer-app .flex-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-fill { flex: 1 1 auto !important; } .pxer-app .flex-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-start { justify-content: flex-start !important; } .pxer-app .justify-content-end { justify-content: flex-end !important; } .pxer-app .justify-content-center { justify-content: center !important; } .pxer-app .justify-content-between { justify-content: space-between !important; } .pxer-app .justify-content-around { justify-content: space-around !important; } .pxer-app .align-items-start { align-items: flex-start !important; } .pxer-app .align-items-end { align-items: flex-end !important; } .pxer-app .align-items-center { align-items: center !important; } .pxer-app .align-items-baseline { align-items: baseline !important; } .pxer-app .align-items-stretch { align-items: stretch !important; } .pxer-app .align-content-start { align-content: flex-start !important; } .pxer-app .align-content-end { align-content: flex-end !important; } .pxer-app .align-content-center { align-content: center !important; } .pxer-app .align-content-between { align-content: space-between !important; } .pxer-app .align-content-around { align-content: space-around !important; } .pxer-app .align-content-stretch { align-content: stretch !important; } .pxer-app .align-self-auto { align-self: auto !important; } .pxer-app .align-self-start { align-self: flex-start !important; } .pxer-app .align-self-end { align-self: flex-end !important; } .pxer-app .align-self-center { align-self: center !important; } .pxer-app .align-self-baseline { align-self: baseline !important; } .pxer-app .align-self-stretch { align-self: stretch !important; } @media (min-width: 576px) { .pxer-app .flex-sm-row { flex-direction: row !important; } .pxer-app .flex-sm-column { flex-direction: column !important; } .pxer-app .flex-sm-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-sm-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-sm-wrap { flex-wrap: wrap !important; } .pxer-app .flex-sm-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-sm-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-sm-fill { flex: 1 1 auto !important; } .pxer-app .flex-sm-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-sm-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-sm-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-sm-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-sm-start { justify-content: flex-start !important; } .pxer-app .justify-content-sm-end { justify-content: flex-end !important; } .pxer-app .justify-content-sm-center { justify-content: center !important; } .pxer-app .justify-content-sm-between { justify-content: space-between !important; } .pxer-app .justify-content-sm-around { justify-content: space-around !important; } .pxer-app .align-items-sm-start { align-items: flex-start !important; } .pxer-app .align-items-sm-end { align-items: flex-end !important; } .pxer-app .align-items-sm-center { align-items: center !important; } .pxer-app .align-items-sm-baseline { align-items: baseline !important; } .pxer-app .align-items-sm-stretch { align-items: stretch !important; } .pxer-app .align-content-sm-start { align-content: flex-start !important; } .pxer-app .align-content-sm-end { align-content: flex-end !important; } .pxer-app .align-content-sm-center { align-content: center !important; } .pxer-app .align-content-sm-between { align-content: space-between !important; } .pxer-app .align-content-sm-around { align-content: space-around !important; } .pxer-app .align-content-sm-stretch { align-content: stretch !important; } .pxer-app .align-self-sm-auto { align-self: auto !important; } .pxer-app .align-self-sm-start { align-self: flex-start !important; } .pxer-app .align-self-sm-end { align-self: flex-end !important; } .pxer-app .align-self-sm-center { align-self: center !important; } .pxer-app .align-self-sm-baseline { align-self: baseline !important; } .pxer-app .align-self-sm-stretch { align-self: stretch !important; } } @media (min-width: 768px) { .pxer-app .flex-md-row { flex-direction: row !important; } .pxer-app .flex-md-column { flex-direction: column !important; } .pxer-app .flex-md-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-md-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-md-wrap { flex-wrap: wrap !important; } .pxer-app .flex-md-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-md-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-md-fill { flex: 1 1 auto !important; } .pxer-app .flex-md-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-md-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-md-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-md-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-md-start { justify-content: flex-start !important; } .pxer-app .justify-content-md-end { justify-content: flex-end !important; } .pxer-app .justify-content-md-center { justify-content: center !important; } .pxer-app .justify-content-md-between { justify-content: space-between !important; } .pxer-app .justify-content-md-around { justify-content: space-around !important; } .pxer-app .align-items-md-start { align-items: flex-start !important; } .pxer-app .align-items-md-end { align-items: flex-end !important; } .pxer-app .align-items-md-center { align-items: center !important; } .pxer-app .align-items-md-baseline { align-items: baseline !important; } .pxer-app .align-items-md-stretch { align-items: stretch !important; } .pxer-app .align-content-md-start { align-content: flex-start !important; } .pxer-app .align-content-md-end { align-content: flex-end !important; } .pxer-app .align-content-md-center { align-content: center !important; } .pxer-app .align-content-md-between { align-content: space-between !important; } .pxer-app .align-content-md-around { align-content: space-around !important; } .pxer-app .align-content-md-stretch { align-content: stretch !important; } .pxer-app .align-self-md-auto { align-self: auto !important; } .pxer-app .align-self-md-start { align-self: flex-start !important; } .pxer-app .align-self-md-end { align-self: flex-end !important; } .pxer-app .align-self-md-center { align-self: center !important; } .pxer-app .align-self-md-baseline { align-self: baseline !important; } .pxer-app .align-self-md-stretch { align-self: stretch !important; } } @media (min-width: 992px) { .pxer-app .flex-lg-row { flex-direction: row !important; } .pxer-app .flex-lg-column { flex-direction: column !important; } .pxer-app .flex-lg-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-lg-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-lg-wrap { flex-wrap: wrap !important; } .pxer-app .flex-lg-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-lg-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-lg-fill { flex: 1 1 auto !important; } .pxer-app .flex-lg-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-lg-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-lg-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-lg-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-lg-start { justify-content: flex-start !important; } .pxer-app .justify-content-lg-end { justify-content: flex-end !important; } .pxer-app .justify-content-lg-center { justify-content: center !important; } .pxer-app .justify-content-lg-between { justify-content: space-between !important; } .pxer-app .justify-content-lg-around { justify-content: space-around !important; } .pxer-app .align-items-lg-start { align-items: flex-start !important; } .pxer-app .align-items-lg-end { align-items: flex-end !important; } .pxer-app .align-items-lg-center { align-items: center !important; } .pxer-app .align-items-lg-baseline { align-items: baseline !important; } .pxer-app .align-items-lg-stretch { align-items: stretch !important; } .pxer-app .align-content-lg-start { align-content: flex-start !important; } .pxer-app .align-content-lg-end { align-content: flex-end !important; } .pxer-app .align-content-lg-center { align-content: center !important; } .pxer-app .align-content-lg-between { align-content: space-between !important; } .pxer-app .align-content-lg-around { align-content: space-around !important; } .pxer-app .align-content-lg-stretch { align-content: stretch !important; } .pxer-app .align-self-lg-auto { align-self: auto !important; } .pxer-app .align-self-lg-start { align-self: flex-start !important; } .pxer-app .align-self-lg-end { align-self: flex-end !important; } .pxer-app .align-self-lg-center { align-self: center !important; } .pxer-app .align-self-lg-baseline { align-self: baseline !important; } .pxer-app .align-self-lg-stretch { align-self: stretch !important; } } @media (min-width: 1200px) { .pxer-app .flex-xl-row { flex-direction: row !important; } .pxer-app .flex-xl-column { flex-direction: column !important; } .pxer-app .flex-xl-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-xl-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-xl-wrap { flex-wrap: wrap !important; } .pxer-app .flex-xl-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-xl-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-xl-fill { flex: 1 1 auto !important; } .pxer-app .flex-xl-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-xl-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-xl-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-xl-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-xl-start { justify-content: flex-start !important; } .pxer-app .justify-content-xl-end { justify-content: flex-end !important; } .pxer-app .justify-content-xl-center { justify-content: center !important; } .pxer-app .justify-content-xl-between { justify-content: space-between !important; } .pxer-app .justify-content-xl-around { justify-content: space-around !important; } .pxer-app .align-items-xl-start { align-items: flex-start !important; } .pxer-app .align-items-xl-end { align-items: flex-end !important; } .pxer-app .align-items-xl-center { align-items: center !important; } .pxer-app .align-items-xl-baseline { align-items: baseline !important; } .pxer-app .align-items-xl-stretch { align-items: stretch !important; } .pxer-app .align-content-xl-start { align-content: flex-start !important; } .pxer-app .align-content-xl-end { align-content: flex-end !important; } .pxer-app .align-content-xl-center { align-content: center !important; } .pxer-app .align-content-xl-between { align-content: space-between !important; } .pxer-app .align-content-xl-around { align-content: space-around !important; } .pxer-app .align-content-xl-stretch { align-content: stretch !important; } .pxer-app .align-self-xl-auto { align-self: auto !important; } .pxer-app .align-self-xl-start { align-self: flex-start !important; } .pxer-app .align-self-xl-end { align-self: flex-end !important; } .pxer-app .align-self-xl-center { align-self: center !important; } .pxer-app .align-self-xl-baseline { align-self: baseline !important; } .pxer-app .align-self-xl-stretch { align-self: stretch !important; } } .pxer-app .m-0 { margin: 0 !important; } .pxer-app .mt-0, .pxer-app .my-0 { margin-top: 0 !important; } .pxer-app .mr-0, .pxer-app .mx-0 { margin-right: 0 !important; } .pxer-app .mb-0, .pxer-app .my-0 { margin-bottom: 0 !important; } .pxer-app .ml-0, .pxer-app .mx-0 { margin-left: 0 !important; } .pxer-app .m-1 { margin: 0.25rem !important; } .pxer-app .mt-1, .pxer-app .my-1 { margin-top: 0.25rem !important; } .pxer-app .mr-1, .pxer-app .mx-1 { margin-right: 0.25rem !important; } .pxer-app .mb-1, .pxer-app .my-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-1, .pxer-app .mx-1 { margin-left: 0.25rem !important; } .pxer-app .m-2 { margin: 0.5rem !important; } .pxer-app .mt-2, .pxer-app .my-2 { margin-top: 0.5rem !important; } .pxer-app .mr-2, .pxer-app .mx-2 { margin-right: 0.5rem !important; } .pxer-app .mb-2, .pxer-app .my-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-2, .pxer-app .mx-2 { margin-left: 0.5rem !important; } .pxer-app .m-3 { margin: 1rem !important; } .pxer-app .mt-3, .pxer-app .my-3 { margin-top: 1rem !important; } .pxer-app .mr-3, .pxer-app .mx-3 { margin-right: 1rem !important; } .pxer-app .mb-3, .pxer-app .my-3 { margin-bottom: 1rem !important; } .pxer-app .ml-3, .pxer-app .mx-3 { margin-left: 1rem !important; } .pxer-app .m-4 { margin: 1.5rem !important; } .pxer-app .mt-4, .pxer-app .my-4 { margin-top: 1.5rem !important; } .pxer-app .mr-4, .pxer-app .mx-4 { margin-right: 1.5rem !important; } .pxer-app .mb-4, .pxer-app .my-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-4, .pxer-app .mx-4 { margin-left: 1.5rem !important; } .pxer-app .m-5 { margin: 3rem !important; } .pxer-app .mt-5, .pxer-app .my-5 { margin-top: 3rem !important; } .pxer-app .mr-5, .pxer-app .mx-5 { margin-right: 3rem !important; } .pxer-app .mb-5, .pxer-app .my-5 { margin-bottom: 3rem !important; } .pxer-app .ml-5, .pxer-app .mx-5 { margin-left: 3rem !important; } .pxer-app .p-0 { padding: 0 !important; } .pxer-app .pt-0, .pxer-app .py-0 { padding-top: 0 !important; } .pxer-app .pr-0, .pxer-app .px-0 { padding-right: 0 !important; } .pxer-app .pb-0, .pxer-app .py-0 { padding-bottom: 0 !important; } .pxer-app .pl-0, .pxer-app .px-0 { padding-left: 0 !important; } .pxer-app .p-1 { padding: 0.25rem !important; } .pxer-app .pt-1, .pxer-app .py-1 { padding-top: 0.25rem !important; } .pxer-app .pr-1, .pxer-app .px-1 { padding-right: 0.25rem !important; } .pxer-app .pb-1, .pxer-app .py-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-1, .pxer-app .px-1 { padding-left: 0.25rem !important; } .pxer-app .p-2 { padding: 0.5rem !important; } .pxer-app .pt-2, .pxer-app .py-2 { padding-top: 0.5rem !important; } .pxer-app .pr-2, .pxer-app .px-2 { padding-right: 0.5rem !important; } .pxer-app .pb-2, .pxer-app .py-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-2, .pxer-app .px-2 { padding-left: 0.5rem !important; } .pxer-app .p-3 { padding: 1rem !important; } .pxer-app .pt-3, .pxer-app .py-3 { padding-top: 1rem !important; } .pxer-app .pr-3, .pxer-app .px-3 { padding-right: 1rem !important; } .pxer-app .pb-3, .pxer-app .py-3 { padding-bottom: 1rem !important; } .pxer-app .pl-3, .pxer-app .px-3 { padding-left: 1rem !important; } .pxer-app .p-4 { padding: 1.5rem !important; } .pxer-app .pt-4, .pxer-app .py-4 { padding-top: 1.5rem !important; } .pxer-app .pr-4, .pxer-app .px-4 { padding-right: 1.5rem !important; } .pxer-app .pb-4, .pxer-app .py-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-4, .pxer-app .px-4 { padding-left: 1.5rem !important; } .pxer-app .p-5 { padding: 3rem !important; } .pxer-app .pt-5, .pxer-app .py-5 { padding-top: 3rem !important; } .pxer-app .pr-5, .pxer-app .px-5 { padding-right: 3rem !important; } .pxer-app .pb-5, .pxer-app .py-5 { padding-bottom: 3rem !important; } .pxer-app .pl-5, .pxer-app .px-5 { padding-left: 3rem !important; } .pxer-app .m-n1 { margin: -0.25rem !important; } .pxer-app .mt-n1, .pxer-app .my-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-n1, .pxer-app .mx-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-n1, .pxer-app .my-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-n1, .pxer-app .mx-n1 { margin-left: -0.25rem !important; } .pxer-app .m-n2 { margin: -0.5rem !important; } .pxer-app .mt-n2, .pxer-app .my-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-n2, .pxer-app .mx-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-n2, .pxer-app .my-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-n2, .pxer-app .mx-n2 { margin-left: -0.5rem !important; } .pxer-app .m-n3 { margin: -1rem !important; } .pxer-app .mt-n3, .pxer-app .my-n3 { margin-top: -1rem !important; } .pxer-app .mr-n3, .pxer-app .mx-n3 { margin-right: -1rem !important; } .pxer-app .mb-n3, .pxer-app .my-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-n3, .pxer-app .mx-n3 { margin-left: -1rem !important; } .pxer-app .m-n4 { margin: -1.5rem !important; } .pxer-app .mt-n4, .pxer-app .my-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-n4, .pxer-app .mx-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-n4, .pxer-app .my-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-n4, .pxer-app .mx-n4 { margin-left: -1.5rem !important; } .pxer-app .m-n5 { margin: -3rem !important; } .pxer-app .mt-n5, .pxer-app .my-n5 { margin-top: -3rem !important; } .pxer-app .mr-n5, .pxer-app .mx-n5 { margin-right: -3rem !important; } .pxer-app .mb-n5, .pxer-app .my-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-n5, .pxer-app .mx-n5 { margin-left: -3rem !important; } .pxer-app .m-auto { margin: auto !important; } .pxer-app .mt-auto, .pxer-app .my-auto { margin-top: auto !important; } .pxer-app .mr-auto, .pxer-app .mx-auto { margin-right: auto !important; } .pxer-app .mb-auto, .pxer-app .my-auto { margin-bottom: auto !important; } .pxer-app .ml-auto, .pxer-app .mx-auto { margin-left: auto !important; } @media (min-width: 576px) { .pxer-app .m-sm-0 { margin: 0 !important; } .pxer-app .mt-sm-0, .pxer-app .my-sm-0 { margin-top: 0 !important; } .pxer-app .mr-sm-0, .pxer-app .mx-sm-0 { margin-right: 0 !important; } .pxer-app .mb-sm-0, .pxer-app .my-sm-0 { margin-bottom: 0 !important; } .pxer-app .ml-sm-0, .pxer-app .mx-sm-0 { margin-left: 0 !important; } .pxer-app .m-sm-1 { margin: 0.25rem !important; } .pxer-app .mt-sm-1, .pxer-app .my-sm-1 { margin-top: 0.25rem !important; } .pxer-app .mr-sm-1, .pxer-app .mx-sm-1 { margin-right: 0.25rem !important; } .pxer-app .mb-sm-1, .pxer-app .my-sm-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-sm-1, .pxer-app .mx-sm-1 { margin-left: 0.25rem !important; } .pxer-app .m-sm-2 { margin: 0.5rem !important; } .pxer-app .mt-sm-2, .pxer-app .my-sm-2 { margin-top: 0.5rem !important; } .pxer-app .mr-sm-2, .pxer-app .mx-sm-2 { margin-right: 0.5rem !important; } .pxer-app .mb-sm-2, .pxer-app .my-sm-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-sm-2, .pxer-app .mx-sm-2 { margin-left: 0.5rem !important; } .pxer-app .m-sm-3 { margin: 1rem !important; } .pxer-app .mt-sm-3, .pxer-app .my-sm-3 { margin-top: 1rem !important; } .pxer-app .mr-sm-3, .pxer-app .mx-sm-3 { margin-right: 1rem !important; } .pxer-app .mb-sm-3, .pxer-app .my-sm-3 { margin-bottom: 1rem !important; } .pxer-app .ml-sm-3, .pxer-app .mx-sm-3 { margin-left: 1rem !important; } .pxer-app .m-sm-4 { margin: 1.5rem !important; } .pxer-app .mt-sm-4, .pxer-app .my-sm-4 { margin-top: 1.5rem !important; } .pxer-app .mr-sm-4, .pxer-app .mx-sm-4 { margin-right: 1.5rem !important; } .pxer-app .mb-sm-4, .pxer-app .my-sm-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-sm-4, .pxer-app .mx-sm-4 { margin-left: 1.5rem !important; } .pxer-app .m-sm-5 { margin: 3rem !important; } .pxer-app .mt-sm-5, .pxer-app .my-sm-5 { margin-top: 3rem !important; } .pxer-app .mr-sm-5, .pxer-app .mx-sm-5 { margin-right: 3rem !important; } .pxer-app .mb-sm-5, .pxer-app .my-sm-5 { margin-bottom: 3rem !important; } .pxer-app .ml-sm-5, .pxer-app .mx-sm-5 { margin-left: 3rem !important; } .pxer-app .p-sm-0 { padding: 0 !important; } .pxer-app .pt-sm-0, .pxer-app .py-sm-0 { padding-top: 0 !important; } .pxer-app .pr-sm-0, .pxer-app .px-sm-0 { padding-right: 0 !important; } .pxer-app .pb-sm-0, .pxer-app .py-sm-0 { padding-bottom: 0 !important; } .pxer-app .pl-sm-0, .pxer-app .px-sm-0 { padding-left: 0 !important; } .pxer-app .p-sm-1 { padding: 0.25rem !important; } .pxer-app .pt-sm-1, .pxer-app .py-sm-1 { padding-top: 0.25rem !important; } .pxer-app .pr-sm-1, .pxer-app .px-sm-1 { padding-right: 0.25rem !important; } .pxer-app .pb-sm-1, .pxer-app .py-sm-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-sm-1, .pxer-app .px-sm-1 { padding-left: 0.25rem !important; } .pxer-app .p-sm-2 { padding: 0.5rem !important; } .pxer-app .pt-sm-2, .pxer-app .py-sm-2 { padding-top: 0.5rem !important; } .pxer-app .pr-sm-2, .pxer-app .px-sm-2 { padding-right: 0.5rem !important; } .pxer-app .pb-sm-2, .pxer-app .py-sm-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-sm-2, .pxer-app .px-sm-2 { padding-left: 0.5rem !important; } .pxer-app .p-sm-3 { padding: 1rem !important; } .pxer-app .pt-sm-3, .pxer-app .py-sm-3 { padding-top: 1rem !important; } .pxer-app .pr-sm-3, .pxer-app .px-sm-3 { padding-right: 1rem !important; } .pxer-app .pb-sm-3, .pxer-app .py-sm-3 { padding-bottom: 1rem !important; } .pxer-app .pl-sm-3, .pxer-app .px-sm-3 { padding-left: 1rem !important; } .pxer-app .p-sm-4 { padding: 1.5rem !important; } .pxer-app .pt-sm-4, .pxer-app .py-sm-4 { padding-top: 1.5rem !important; } .pxer-app .pr-sm-4, .pxer-app .px-sm-4 { padding-right: 1.5rem !important; } .pxer-app .pb-sm-4, .pxer-app .py-sm-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-sm-4, .pxer-app .px-sm-4 { padding-left: 1.5rem !important; } .pxer-app .p-sm-5 { padding: 3rem !important; } .pxer-app .pt-sm-5, .pxer-app .py-sm-5 { padding-top: 3rem !important; } .pxer-app .pr-sm-5, .pxer-app .px-sm-5 { padding-right: 3rem !important; } .pxer-app .pb-sm-5, .pxer-app .py-sm-5 { padding-bottom: 3rem !important; } .pxer-app .pl-sm-5, .pxer-app .px-sm-5 { padding-left: 3rem !important; } .pxer-app .m-sm-n1 { margin: -0.25rem !important; } .pxer-app .mt-sm-n1, .pxer-app .my-sm-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-sm-n1, .pxer-app .mx-sm-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-sm-n1, .pxer-app .my-sm-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-sm-n1, .pxer-app .mx-sm-n1 { margin-left: -0.25rem !important; } .pxer-app .m-sm-n2 { margin: -0.5rem !important; } .pxer-app .mt-sm-n2, .pxer-app .my-sm-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-sm-n2, .pxer-app .mx-sm-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-sm-n2, .pxer-app .my-sm-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-sm-n2, .pxer-app .mx-sm-n2 { margin-left: -0.5rem !important; } .pxer-app .m-sm-n3 { margin: -1rem !important; } .pxer-app .mt-sm-n3, .pxer-app .my-sm-n3 { margin-top: -1rem !important; } .pxer-app .mr-sm-n3, .pxer-app .mx-sm-n3 { margin-right: -1rem !important; } .pxer-app .mb-sm-n3, .pxer-app .my-sm-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-sm-n3, .pxer-app .mx-sm-n3 { margin-left: -1rem !important; } .pxer-app .m-sm-n4 { margin: -1.5rem !important; } .pxer-app .mt-sm-n4, .pxer-app .my-sm-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-sm-n4, .pxer-app .mx-sm-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-sm-n4, .pxer-app .my-sm-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-sm-n4, .pxer-app .mx-sm-n4 { margin-left: -1.5rem !important; } .pxer-app .m-sm-n5 { margin: -3rem !important; } .pxer-app .mt-sm-n5, .pxer-app .my-sm-n5 { margin-top: -3rem !important; } .pxer-app .mr-sm-n5, .pxer-app .mx-sm-n5 { margin-right: -3rem !important; } .pxer-app .mb-sm-n5, .pxer-app .my-sm-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-sm-n5, .pxer-app .mx-sm-n5 { margin-left: -3rem !important; } .pxer-app .m-sm-auto { margin: auto !important; } .pxer-app .mt-sm-auto, .pxer-app .my-sm-auto { margin-top: auto !important; } .pxer-app .mr-sm-auto, .pxer-app .mx-sm-auto { margin-right: auto !important; } .pxer-app .mb-sm-auto, .pxer-app .my-sm-auto { margin-bottom: auto !important; } .pxer-app .ml-sm-auto, .pxer-app .mx-sm-auto { margin-left: auto !important; } } @media (min-width: 768px) { .pxer-app .m-md-0 { margin: 0 !important; } .pxer-app .mt-md-0, .pxer-app .my-md-0 { margin-top: 0 !important; } .pxer-app .mr-md-0, .pxer-app .mx-md-0 { margin-right: 0 !important; } .pxer-app .mb-md-0, .pxer-app .my-md-0 { margin-bottom: 0 !important; } .pxer-app .ml-md-0, .pxer-app .mx-md-0 { margin-left: 0 !important; } .pxer-app .m-md-1 { margin: 0.25rem !important; } .pxer-app .mt-md-1, .pxer-app .my-md-1 { margin-top: 0.25rem !important; } .pxer-app .mr-md-1, .pxer-app .mx-md-1 { margin-right: 0.25rem !important; } .pxer-app .mb-md-1, .pxer-app .my-md-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-md-1, .pxer-app .mx-md-1 { margin-left: 0.25rem !important; } .pxer-app .m-md-2 { margin: 0.5rem !important; } .pxer-app .mt-md-2, .pxer-app .my-md-2 { margin-top: 0.5rem !important; } .pxer-app .mr-md-2, .pxer-app .mx-md-2 { margin-right: 0.5rem !important; } .pxer-app .mb-md-2, .pxer-app .my-md-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-md-2, .pxer-app .mx-md-2 { margin-left: 0.5rem !important; } .pxer-app .m-md-3 { margin: 1rem !important; } .pxer-app .mt-md-3, .pxer-app .my-md-3 { margin-top: 1rem !important; } .pxer-app .mr-md-3, .pxer-app .mx-md-3 { margin-right: 1rem !important; } .pxer-app .mb-md-3, .pxer-app .my-md-3 { margin-bottom: 1rem !important; } .pxer-app .ml-md-3, .pxer-app .mx-md-3 { margin-left: 1rem !important; } .pxer-app .m-md-4 { margin: 1.5rem !important; } .pxer-app .mt-md-4, .pxer-app .my-md-4 { margin-top: 1.5rem !important; } .pxer-app .mr-md-4, .pxer-app .mx-md-4 { margin-right: 1.5rem !important; } .pxer-app .mb-md-4, .pxer-app .my-md-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-md-4, .pxer-app .mx-md-4 { margin-left: 1.5rem !important; } .pxer-app .m-md-5 { margin: 3rem !important; } .pxer-app .mt-md-5, .pxer-app .my-md-5 { margin-top: 3rem !important; } .pxer-app .mr-md-5, .pxer-app .mx-md-5 { margin-right: 3rem !important; } .pxer-app .mb-md-5, .pxer-app .my-md-5 { margin-bottom: 3rem !important; } .pxer-app .ml-md-5, .pxer-app .mx-md-5 { margin-left: 3rem !important; } .pxer-app .p-md-0 { padding: 0 !important; } .pxer-app .pt-md-0, .pxer-app .py-md-0 { padding-top: 0 !important; } .pxer-app .pr-md-0, .pxer-app .px-md-0 { padding-right: 0 !important; } .pxer-app .pb-md-0, .pxer-app .py-md-0 { padding-bottom: 0 !important; } .pxer-app .pl-md-0, .pxer-app .px-md-0 { padding-left: 0 !important; } .pxer-app .p-md-1 { padding: 0.25rem !important; } .pxer-app .pt-md-1, .pxer-app .py-md-1 { padding-top: 0.25rem !important; } .pxer-app .pr-md-1, .pxer-app .px-md-1 { padding-right: 0.25rem !important; } .pxer-app .pb-md-1, .pxer-app .py-md-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-md-1, .pxer-app .px-md-1 { padding-left: 0.25rem !important; } .pxer-app .p-md-2 { padding: 0.5rem !important; } .pxer-app .pt-md-2, .pxer-app .py-md-2 { padding-top: 0.5rem !important; } .pxer-app .pr-md-2, .pxer-app .px-md-2 { padding-right: 0.5rem !important; } .pxer-app .pb-md-2, .pxer-app .py-md-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-md-2, .pxer-app .px-md-2 { padding-left: 0.5rem !important; } .pxer-app .p-md-3 { padding: 1rem !important; } .pxer-app .pt-md-3, .pxer-app .py-md-3 { padding-top: 1rem !important; } .pxer-app .pr-md-3, .pxer-app .px-md-3 { padding-right: 1rem !important; } .pxer-app .pb-md-3, .pxer-app .py-md-3 { padding-bottom: 1rem !important; } .pxer-app .pl-md-3, .pxer-app .px-md-3 { padding-left: 1rem !important; } .pxer-app .p-md-4 { padding: 1.5rem !important; } .pxer-app .pt-md-4, .pxer-app .py-md-4 { padding-top: 1.5rem !important; } .pxer-app .pr-md-4, .pxer-app .px-md-4 { padding-right: 1.5rem !important; } .pxer-app .pb-md-4, .pxer-app .py-md-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-md-4, .pxer-app .px-md-4 { padding-left: 1.5rem !important; } .pxer-app .p-md-5 { padding: 3rem !important; } .pxer-app .pt-md-5, .pxer-app .py-md-5 { padding-top: 3rem !important; } .pxer-app .pr-md-5, .pxer-app .px-md-5 { padding-right: 3rem !important; } .pxer-app .pb-md-5, .pxer-app .py-md-5 { padding-bottom: 3rem !important; } .pxer-app .pl-md-5, .pxer-app .px-md-5 { padding-left: 3rem !important; } .pxer-app .m-md-n1 { margin: -0.25rem !important; } .pxer-app .mt-md-n1, .pxer-app .my-md-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-md-n1, .pxer-app .mx-md-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-md-n1, .pxer-app .my-md-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-md-n1, .pxer-app .mx-md-n1 { margin-left: -0.25rem !important; } .pxer-app .m-md-n2 { margin: -0.5rem !important; } .pxer-app .mt-md-n2, .pxer-app .my-md-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-md-n2, .pxer-app .mx-md-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-md-n2, .pxer-app .my-md-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-md-n2, .pxer-app .mx-md-n2 { margin-left: -0.5rem !important; } .pxer-app .m-md-n3 { margin: -1rem !important; } .pxer-app .mt-md-n3, .pxer-app .my-md-n3 { margin-top: -1rem !important; } .pxer-app .mr-md-n3, .pxer-app .mx-md-n3 { margin-right: -1rem !important; } .pxer-app .mb-md-n3, .pxer-app .my-md-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-md-n3, .pxer-app .mx-md-n3 { margin-left: -1rem !important; } .pxer-app .m-md-n4 { margin: -1.5rem !important; } .pxer-app .mt-md-n4, .pxer-app .my-md-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-md-n4, .pxer-app .mx-md-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-md-n4, .pxer-app .my-md-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-md-n4, .pxer-app .mx-md-n4 { margin-left: -1.5rem !important; } .pxer-app .m-md-n5 { margin: -3rem !important; } .pxer-app .mt-md-n5, .pxer-app .my-md-n5 { margin-top: -3rem !important; } .pxer-app .mr-md-n5, .pxer-app .mx-md-n5 { margin-right: -3rem !important; } .pxer-app .mb-md-n5, .pxer-app .my-md-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-md-n5, .pxer-app .mx-md-n5 { margin-left: -3rem !important; } .pxer-app .m-md-auto { margin: auto !important; } .pxer-app .mt-md-auto, .pxer-app .my-md-auto { margin-top: auto !important; } .pxer-app .mr-md-auto, .pxer-app .mx-md-auto { margin-right: auto !important; } .pxer-app .mb-md-auto, .pxer-app .my-md-auto { margin-bottom: auto !important; } .pxer-app .ml-md-auto, .pxer-app .mx-md-auto { margin-left: auto !important; } } @media (min-width: 992px) { .pxer-app .m-lg-0 { margin: 0 !important; } .pxer-app .mt-lg-0, .pxer-app .my-lg-0 { margin-top: 0 !important; } .pxer-app .mr-lg-0, .pxer-app .mx-lg-0 { margin-right: 0 !important; } .pxer-app .mb-lg-0, .pxer-app .my-lg-0 { margin-bottom: 0 !important; } .pxer-app .ml-lg-0, .pxer-app .mx-lg-0 { margin-left: 0 !important; } .pxer-app .m-lg-1 { margin: 0.25rem !important; } .pxer-app .mt-lg-1, .pxer-app .my-lg-1 { margin-top: 0.25rem !important; } .pxer-app .mr-lg-1, .pxer-app .mx-lg-1 { margin-right: 0.25rem !important; } .pxer-app .mb-lg-1, .pxer-app .my-lg-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-lg-1, .pxer-app .mx-lg-1 { margin-left: 0.25rem !important; } .pxer-app .m-lg-2 { margin: 0.5rem !important; } .pxer-app .mt-lg-2, .pxer-app .my-lg-2 { margin-top: 0.5rem !important; } .pxer-app .mr-lg-2, .pxer-app .mx-lg-2 { margin-right: 0.5rem !important; } .pxer-app .mb-lg-2, .pxer-app .my-lg-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-lg-2, .pxer-app .mx-lg-2 { margin-left: 0.5rem !important; } .pxer-app .m-lg-3 { margin: 1rem !important; } .pxer-app .mt-lg-3, .pxer-app .my-lg-3 { margin-top: 1rem !important; } .pxer-app .mr-lg-3, .pxer-app .mx-lg-3 { margin-right: 1rem !important; } .pxer-app .mb-lg-3, .pxer-app .my-lg-3 { margin-bottom: 1rem !important; } .pxer-app .ml-lg-3, .pxer-app .mx-lg-3 { margin-left: 1rem !important; } .pxer-app .m-lg-4 { margin: 1.5rem !important; } .pxer-app .mt-lg-4, .pxer-app .my-lg-4 { margin-top: 1.5rem !important; } .pxer-app .mr-lg-4, .pxer-app .mx-lg-4 { margin-right: 1.5rem !important; } .pxer-app .mb-lg-4, .pxer-app .my-lg-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-lg-4, .pxer-app .mx-lg-4 { margin-left: 1.5rem !important; } .pxer-app .m-lg-5 { margin: 3rem !important; } .pxer-app .mt-lg-5, .pxer-app .my-lg-5 { margin-top: 3rem !important; } .pxer-app .mr-lg-5, .pxer-app .mx-lg-5 { margin-right: 3rem !important; } .pxer-app .mb-lg-5, .pxer-app .my-lg-5 { margin-bottom: 3rem !important; } .pxer-app .ml-lg-5, .pxer-app .mx-lg-5 { margin-left: 3rem !important; } .pxer-app .p-lg-0 { padding: 0 !important; } .pxer-app .pt-lg-0, .pxer-app .py-lg-0 { padding-top: 0 !important; } .pxer-app .pr-lg-0, .pxer-app .px-lg-0 { padding-right: 0 !important; } .pxer-app .pb-lg-0, .pxer-app .py-lg-0 { padding-bottom: 0 !important; } .pxer-app .pl-lg-0, .pxer-app .px-lg-0 { padding-left: 0 !important; } .pxer-app .p-lg-1 { padding: 0.25rem !important; } .pxer-app .pt-lg-1, .pxer-app .py-lg-1 { padding-top: 0.25rem !important; } .pxer-app .pr-lg-1, .pxer-app .px-lg-1 { padding-right: 0.25rem !important; } .pxer-app .pb-lg-1, .pxer-app .py-lg-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-lg-1, .pxer-app .px-lg-1 { padding-left: 0.25rem !important; } .pxer-app .p-lg-2 { padding: 0.5rem !important; } .pxer-app .pt-lg-2, .pxer-app .py-lg-2 { padding-top: 0.5rem !important; } .pxer-app .pr-lg-2, .pxer-app .px-lg-2 { padding-right: 0.5rem !important; } .pxer-app .pb-lg-2, .pxer-app .py-lg-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-lg-2, .pxer-app .px-lg-2 { padding-left: 0.5rem !important; } .pxer-app .p-lg-3 { padding: 1rem !important; } .pxer-app .pt-lg-3, .pxer-app .py-lg-3 { padding-top: 1rem !important; } .pxer-app .pr-lg-3, .pxer-app .px-lg-3 { padding-right: 1rem !important; } .pxer-app .pb-lg-3, .pxer-app .py-lg-3 { padding-bottom: 1rem !important; } .pxer-app .pl-lg-3, .pxer-app .px-lg-3 { padding-left: 1rem !important; } .pxer-app .p-lg-4 { padding: 1.5rem !important; } .pxer-app .pt-lg-4, .pxer-app .py-lg-4 { padding-top: 1.5rem !important; } .pxer-app .pr-lg-4, .pxer-app .px-lg-4 { padding-right: 1.5rem !important; } .pxer-app .pb-lg-4, .pxer-app .py-lg-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-lg-4, .pxer-app .px-lg-4 { padding-left: 1.5rem !important; } .pxer-app .p-lg-5 { padding: 3rem !important; } .pxer-app .pt-lg-5, .pxer-app .py-lg-5 { padding-top: 3rem !important; } .pxer-app .pr-lg-5, .pxer-app .px-lg-5 { padding-right: 3rem !important; } .pxer-app .pb-lg-5, .pxer-app .py-lg-5 { padding-bottom: 3rem !important; } .pxer-app .pl-lg-5, .pxer-app .px-lg-5 { padding-left: 3rem !important; } .pxer-app .m-lg-n1 { margin: -0.25rem !important; } .pxer-app .mt-lg-n1, .pxer-app .my-lg-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-lg-n1, .pxer-app .mx-lg-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-lg-n1, .pxer-app .my-lg-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-lg-n1, .pxer-app .mx-lg-n1 { margin-left: -0.25rem !important; } .pxer-app .m-lg-n2 { margin: -0.5rem !important; } .pxer-app .mt-lg-n2, .pxer-app .my-lg-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-lg-n2, .pxer-app .mx-lg-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-lg-n2, .pxer-app .my-lg-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-lg-n2, .pxer-app .mx-lg-n2 { margin-left: -0.5rem !important; } .pxer-app .m-lg-n3 { margin: -1rem !important; } .pxer-app .mt-lg-n3, .pxer-app .my-lg-n3 { margin-top: -1rem !important; } .pxer-app .mr-lg-n3, .pxer-app .mx-lg-n3 { margin-right: -1rem !important; } .pxer-app .mb-lg-n3, .pxer-app .my-lg-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-lg-n3, .pxer-app .mx-lg-n3 { margin-left: -1rem !important; } .pxer-app .m-lg-n4 { margin: -1.5rem !important; } .pxer-app .mt-lg-n4, .pxer-app .my-lg-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-lg-n4, .pxer-app .mx-lg-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-lg-n4, .pxer-app .my-lg-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-lg-n4, .pxer-app .mx-lg-n4 { margin-left: -1.5rem !important; } .pxer-app .m-lg-n5 { margin: -3rem !important; } .pxer-app .mt-lg-n5, .pxer-app .my-lg-n5 { margin-top: -3rem !important; } .pxer-app .mr-lg-n5, .pxer-app .mx-lg-n5 { margin-right: -3rem !important; } .pxer-app .mb-lg-n5, .pxer-app .my-lg-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-lg-n5, .pxer-app .mx-lg-n5 { margin-left: -3rem !important; } .pxer-app .m-lg-auto { margin: auto !important; } .pxer-app .mt-lg-auto, .pxer-app .my-lg-auto { margin-top: auto !important; } .pxer-app .mr-lg-auto, .pxer-app .mx-lg-auto { margin-right: auto !important; } .pxer-app .mb-lg-auto, .pxer-app .my-lg-auto { margin-bottom: auto !important; } .pxer-app .ml-lg-auto, .pxer-app .mx-lg-auto { margin-left: auto !important; } } @media (min-width: 1200px) { .pxer-app .m-xl-0 { margin: 0 !important; } .pxer-app .mt-xl-0, .pxer-app .my-xl-0 { margin-top: 0 !important; } .pxer-app .mr-xl-0, .pxer-app .mx-xl-0 { margin-right: 0 !important; } .pxer-app .mb-xl-0, .pxer-app .my-xl-0 { margin-bottom: 0 !important; } .pxer-app .ml-xl-0, .pxer-app .mx-xl-0 { margin-left: 0 !important; } .pxer-app .m-xl-1 { margin: 0.25rem !important; } .pxer-app .mt-xl-1, .pxer-app .my-xl-1 { margin-top: 0.25rem !important; } .pxer-app .mr-xl-1, .pxer-app .mx-xl-1 { margin-right: 0.25rem !important; } .pxer-app .mb-xl-1, .pxer-app .my-xl-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-xl-1, .pxer-app .mx-xl-1 { margin-left: 0.25rem !important; } .pxer-app .m-xl-2 { margin: 0.5rem !important; } .pxer-app .mt-xl-2, .pxer-app .my-xl-2 { margin-top: 0.5rem !important; } .pxer-app .mr-xl-2, .pxer-app .mx-xl-2 { margin-right: 0.5rem !important; } .pxer-app .mb-xl-2, .pxer-app .my-xl-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-xl-2, .pxer-app .mx-xl-2 { margin-left: 0.5rem !important; } .pxer-app .m-xl-3 { margin: 1rem !important; } .pxer-app .mt-xl-3, .pxer-app .my-xl-3 { margin-top: 1rem !important; } .pxer-app .mr-xl-3, .pxer-app .mx-xl-3 { margin-right: 1rem !important; } .pxer-app .mb-xl-3, .pxer-app .my-xl-3 { margin-bottom: 1rem !important; } .pxer-app .ml-xl-3, .pxer-app .mx-xl-3 { margin-left: 1rem !important; } .pxer-app .m-xl-4 { margin: 1.5rem !important; } .pxer-app .mt-xl-4, .pxer-app .my-xl-4 { margin-top: 1.5rem !important; } .pxer-app .mr-xl-4, .pxer-app .mx-xl-4 { margin-right: 1.5rem !important; } .pxer-app .mb-xl-4, .pxer-app .my-xl-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-xl-4, .pxer-app .mx-xl-4 { margin-left: 1.5rem !important; } .pxer-app .m-xl-5 { margin: 3rem !important; } .pxer-app .mt-xl-5, .pxer-app .my-xl-5 { margin-top: 3rem !important; } .pxer-app .mr-xl-5, .pxer-app .mx-xl-5 { margin-right: 3rem !important; } .pxer-app .mb-xl-5, .pxer-app .my-xl-5 { margin-bottom: 3rem !important; } .pxer-app .ml-xl-5, .pxer-app .mx-xl-5 { margin-left: 3rem !important; } .pxer-app .p-xl-0 { padding: 0 !important; } .pxer-app .pt-xl-0, .pxer-app .py-xl-0 { padding-top: 0 !important; } .pxer-app .pr-xl-0, .pxer-app .px-xl-0 { padding-right: 0 !important; } .pxer-app .pb-xl-0, .pxer-app .py-xl-0 { padding-bottom: 0 !important; } .pxer-app .pl-xl-0, .pxer-app .px-xl-0 { padding-left: 0 !important; } .pxer-app .p-xl-1 { padding: 0.25rem !important; } .pxer-app .pt-xl-1, .pxer-app .py-xl-1 { padding-top: 0.25rem !important; } .pxer-app .pr-xl-1, .pxer-app .px-xl-1 { padding-right: 0.25rem !important; } .pxer-app .pb-xl-1, .pxer-app .py-xl-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-xl-1, .pxer-app .px-xl-1 { padding-left: 0.25rem !important; } .pxer-app .p-xl-2 { padding: 0.5rem !important; } .pxer-app .pt-xl-2, .pxer-app .py-xl-2 { padding-top: 0.5rem !important; } .pxer-app .pr-xl-2, .pxer-app .px-xl-2 { padding-right: 0.5rem !important; } .pxer-app .pb-xl-2, .pxer-app .py-xl-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-xl-2, .pxer-app .px-xl-2 { padding-left: 0.5rem !important; } .pxer-app .p-xl-3 { padding: 1rem !important; } .pxer-app .pt-xl-3, .pxer-app .py-xl-3 { padding-top: 1rem !important; } .pxer-app .pr-xl-3, .pxer-app .px-xl-3 { padding-right: 1rem !important; } .pxer-app .pb-xl-3, .pxer-app .py-xl-3 { padding-bottom: 1rem !important; } .pxer-app .pl-xl-3, .pxer-app .px-xl-3 { padding-left: 1rem !important; } .pxer-app .p-xl-4 { padding: 1.5rem !important; } .pxer-app .pt-xl-4, .pxer-app .py-xl-4 { padding-top: 1.5rem !important; } .pxer-app .pr-xl-4, .pxer-app .px-xl-4 { padding-right: 1.5rem !important; } .pxer-app .pb-xl-4, .pxer-app .py-xl-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-xl-4, .pxer-app .px-xl-4 { padding-left: 1.5rem !important; } .pxer-app .p-xl-5 { padding: 3rem !important; } .pxer-app .pt-xl-5, .pxer-app .py-xl-5 { padding-top: 3rem !important; } .pxer-app .pr-xl-5, .pxer-app .px-xl-5 { padding-right: 3rem !important; } .pxer-app .pb-xl-5, .pxer-app .py-xl-5 { padding-bottom: 3rem !important; } .pxer-app .pl-xl-5, .pxer-app .px-xl-5 { padding-left: 3rem !important; } .pxer-app .m-xl-n1 { margin: -0.25rem !important; } .pxer-app .mt-xl-n1, .pxer-app .my-xl-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-xl-n1, .pxer-app .mx-xl-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-xl-n1, .pxer-app .my-xl-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-xl-n1, .pxer-app .mx-xl-n1 { margin-left: -0.25rem !important; } .pxer-app .m-xl-n2 { margin: -0.5rem !important; } .pxer-app .mt-xl-n2, .pxer-app .my-xl-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-xl-n2, .pxer-app .mx-xl-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-xl-n2, .pxer-app .my-xl-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-xl-n2, .pxer-app .mx-xl-n2 { margin-left: -0.5rem !important; } .pxer-app .m-xl-n3 { margin: -1rem !important; } .pxer-app .mt-xl-n3, .pxer-app .my-xl-n3 { margin-top: -1rem !important; } .pxer-app .mr-xl-n3, .pxer-app .mx-xl-n3 { margin-right: -1rem !important; } .pxer-app .mb-xl-n3, .pxer-app .my-xl-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-xl-n3, .pxer-app .mx-xl-n3 { margin-left: -1rem !important; } .pxer-app .m-xl-n4 { margin: -1.5rem !important; } .pxer-app .mt-xl-n4, .pxer-app .my-xl-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-xl-n4, .pxer-app .mx-xl-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-xl-n4, .pxer-app .my-xl-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-xl-n4, .pxer-app .mx-xl-n4 { margin-left: -1.5rem !important; } .pxer-app .m-xl-n5 { margin: -3rem !important; } .pxer-app .mt-xl-n5, .pxer-app .my-xl-n5 { margin-top: -3rem !important; } .pxer-app .mr-xl-n5, .pxer-app .mx-xl-n5 { margin-right: -3rem !important; } .pxer-app .mb-xl-n5, .pxer-app .my-xl-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-xl-n5, .pxer-app .mx-xl-n5 { margin-left: -3rem !important; } .pxer-app .m-xl-auto { margin: auto !important; } .pxer-app .mt-xl-auto, .pxer-app .my-xl-auto { margin-top: auto !important; } .pxer-app .mr-xl-auto, .pxer-app .mx-xl-auto { margin-right: auto !important; } .pxer-app .mb-xl-auto, .pxer-app .my-xl-auto { margin-bottom: auto !important; } .pxer-app .ml-xl-auto, .pxer-app .mx-xl-auto { margin-left: auto !important; } } .pxer-app *, .pxer-app *::before, .pxer-app *::after { box-sizing: border-box; } .pxer-app html { font-family: sans-serif; line-height: 1.15; -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .pxer-app article, .pxer-app aside, .pxer-app figcaption, .pxer-app figure, .pxer-app footer, .pxer-app header, .pxer-app hgroup, .pxer-app main, .pxer-app nav, .pxer-app section { display: block; } .pxer-app body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 1rem; font-weight: 400; line-height: 1.5; color: #212529; text-align: left; background-color: #fff; } .pxer-app [tabindex="-1"]:focus:not(:focus-visible) { outline: 0 !important; } .pxer-app hr { box-sizing: content-box; height: 0; overflow: visible; } .pxer-app h1, .pxer-app h2, .pxer-app h3, .pxer-app h4, .pxer-app h5, .pxer-app h6 { margin-top: 0; margin-bottom: 0.5rem; } .pxer-app p { margin-top: 0; margin-bottom: 1rem; } .pxer-app abbr[title], .pxer-app abbr[data-original-title] { text-decoration: underline; text-decoration: underline dotted; cursor: help; border-bottom: 0; text-decoration-skip-ink: none; } .pxer-app address { margin-bottom: 1rem; font-style: normal; line-height: inherit; } .pxer-app ol, .pxer-app ul, .pxer-app dl { margin-top: 0; margin-bottom: 1rem; } .pxer-app ol ol, .pxer-app ul ul, .pxer-app ol ul, .pxer-app ul ol { margin-bottom: 0; } .pxer-app dt { font-weight: 700; } .pxer-app dd { margin-bottom: 0.5rem; margin-left: 0; } .pxer-app blockquote { margin: 0 0 1rem; } .pxer-app b, .pxer-app strong { font-weight: bolder; } .pxer-app small { font-size: 80%; } .pxer-app sub, .pxer-app sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } .pxer-app sub { bottom: -0.25em; } .pxer-app sup { top: -0.5em; } .pxer-app a { color: #007bff; text-decoration: none; background-color: transparent; } .pxer-app a:hover { color: #0056b3; text-decoration: underline; } .pxer-app a:not([href]):not([class]) { color: inherit; text-decoration: none; } .pxer-app a:not([href]):not([class]):hover { color: inherit; text-decoration: none; } .pxer-app pre, .pxer-app code, .pxer-app kbd, .pxer-app samp { font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 1em; } .pxer-app pre { margin-top: 0; margin-bottom: 1rem; overflow: auto; -ms-overflow-style: scrollbar; } .pxer-app figure { margin: 0 0 1rem; } .pxer-app img { vertical-align: middle; border-style: none; } .pxer-app svg { overflow: hidden; vertical-align: middle; } .pxer-app table { border-collapse: collapse; } .pxer-app caption { padding-top: 0.75rem; padding-bottom: 0.75rem; color: #6c757d; text-align: left; caption-side: bottom; } .pxer-app th { text-align: inherit; text-align: -webkit-match-parent; } .pxer-app label { display: inline-block; margin-bottom: 0.5rem; } .pxer-app button { border-radius: 0; } .pxer-app button:focus:not(:focus-visible) { outline: 0; } .pxer-app input, .pxer-app button, .pxer-app select, .pxer-app optgroup, .pxer-app textarea { margin: 0; font-family: inherit; font-size: inherit; line-height: inherit; } .pxer-app button, .pxer-app input { overflow: visible; } .pxer-app button, .pxer-app select { text-transform: none; } .pxer-app [role=button] { cursor: pointer; } .pxer-app select { word-wrap: normal; } .pxer-app button, .pxer-app [type=button], .pxer-app [type=reset], .pxer-app [type=submit] { -webkit-appearance: button; } .pxer-app button:not(:disabled), .pxer-app [type=button]:not(:disabled), .pxer-app [type=reset]:not(:disabled), .pxer-app [type=submit]:not(:disabled) { cursor: pointer; } .pxer-app button::-moz-focus-inner, .pxer-app [type=button]::-moz-focus-inner, .pxer-app [type=reset]::-moz-focus-inner, .pxer-app [type=submit]::-moz-focus-inner { padding: 0; border-style: none; } .pxer-app input[type=radio], .pxer-app input[type=checkbox] { box-sizing: border-box; padding: 0; } .pxer-app textarea { overflow: auto; resize: vertical; } .pxer-app fieldset { min-width: 0; padding: 0; margin: 0; border: 0; } .pxer-app legend { display: block; width: 100%; max-width: 100%; padding: 0; margin-bottom: 0.5rem; font-size: 1.5rem; line-height: inherit; color: inherit; white-space: normal; } .pxer-app progress { vertical-align: baseline; } .pxer-app [type=number]::-webkit-inner-spin-button, .pxer-app [type=number]::-webkit-outer-spin-button { height: auto; } .pxer-app [type=search] { outline-offset: -2px; -webkit-appearance: none; } .pxer-app [type=search]::-webkit-search-decoration { -webkit-appearance: none; } .pxer-app ::-webkit-file-upload-button { font: inherit; -webkit-appearance: button; } .pxer-app output { display: inline-block; } .pxer-app summary { display: list-item; cursor: pointer; } .pxer-app template { display: none; } .pxer-app [hidden] { display: none !important; } .pxer-app .table { width: 100%; margin-bottom: 1rem; color: #212529; } .pxer-app .table th, .pxer-app .table td { padding: 0.75rem; vertical-align: top; border-top: 1px solid #dee2e6; } .pxer-app .table thead th { vertical-align: bottom; border-bottom: 2px solid #dee2e6; } .pxer-app .table tbody + tbody { border-top: 2px solid #dee2e6; } .pxer-app .table-sm th, .pxer-app .table-sm td { padding: 0.3rem; } .pxer-app .table-bordered { border: 1px solid #dee2e6; } .pxer-app .table-bordered th, .pxer-app .table-bordered td { border: 1px solid #dee2e6; } .pxer-app .table-bordered thead th, .pxer-app .table-bordered thead td { border-bottom-width: 2px; } .pxer-app .table-borderless th, .pxer-app .table-borderless td, .pxer-app .table-borderless thead th, .pxer-app .table-borderless tbody + tbody { border: 0; } .pxer-app .table-striped tbody tr:nth-of-type(odd) { background-color: rgba(0, 0, 0, 0.05); } .pxer-app .table-hover tbody tr:hover { color: #212529; background-color: rgba(0, 0, 0, 0.075); } .pxer-app .table-primary, .pxer-app .table-primary > th, .pxer-app .table-primary > td { background-color: #b8daff; } .pxer-app .table-primary th, .pxer-app .table-primary td, .pxer-app .table-primary thead th, .pxer-app .table-primary tbody + tbody { border-color: #7abaff; } .pxer-app .table-hover .table-primary:hover { background-color: #9fcdff; } .pxer-app .table-hover .table-primary:hover > td, .pxer-app .table-hover .table-primary:hover > th { background-color: #9fcdff; } .pxer-app .table-secondary, .pxer-app .table-secondary > th, .pxer-app .table-secondary > td { background-color: #d6d8db; } .pxer-app .table-secondary th, .pxer-app .table-secondary td, .pxer-app .table-secondary thead th, .pxer-app .table-secondary tbody + tbody { border-color: #b3b7bb; } .pxer-app .table-hover .table-secondary:hover { background-color: #c8cbcf; } .pxer-app .table-hover .table-secondary:hover > td, .pxer-app .table-hover .table-secondary:hover > th { background-color: #c8cbcf; } .pxer-app .table-success, .pxer-app .table-success > th, .pxer-app .table-success > td { background-color: #c3e6cb; } .pxer-app .table-success th, .pxer-app .table-success td, .pxer-app .table-success thead th, .pxer-app .table-success tbody + tbody { border-color: #8fd19e; } .pxer-app .table-hover .table-success:hover { background-color: #b1dfbb; } .pxer-app .table-hover .table-success:hover > td, .pxer-app .table-hover .table-success:hover > th { background-color: #b1dfbb; } .pxer-app .table-info, .pxer-app .table-info > th, .pxer-app .table-info > td { background-color: #bee5eb; } .pxer-app .table-info th, .pxer-app .table-info td, .pxer-app .table-info thead th, .pxer-app .table-info tbody + tbody { border-color: #86cfda; } .pxer-app .table-hover .table-info:hover { background-color: #abdde5; } .pxer-app .table-hover .table-info:hover > td, .pxer-app .table-hover .table-info:hover > th { background-color: #abdde5; } .pxer-app .table-warning, .pxer-app .table-warning > th, .pxer-app .table-warning > td { background-color: #ffeeba; } .pxer-app .table-warning th, .pxer-app .table-warning td, .pxer-app .table-warning thead th, .pxer-app .table-warning tbody + tbody { border-color: #ffdf7e; } .pxer-app .table-hover .table-warning:hover { background-color: #ffe8a1; } .pxer-app .table-hover .table-warning:hover > td, .pxer-app .table-hover .table-warning:hover > th { background-color: #ffe8a1; } .pxer-app .table-danger, .pxer-app .table-danger > th, .pxer-app .table-danger > td { background-color: #f5c6cb; } .pxer-app .table-danger th, .pxer-app .table-danger td, .pxer-app .table-danger thead th, .pxer-app .table-danger tbody + tbody { border-color: #ed969e; } .pxer-app .table-hover .table-danger:hover { background-color: #f1b0b7; } .pxer-app .table-hover .table-danger:hover > td, .pxer-app .table-hover .table-danger:hover > th { background-color: #f1b0b7; } .pxer-app .table-light, .pxer-app .table-light > th, .pxer-app .table-light > td { background-color: #fdfdfe; } .pxer-app .table-light th, .pxer-app .table-light td, .pxer-app .table-light thead th, .pxer-app .table-light tbody + tbody { border-color: #fbfcfc; } .pxer-app .table-hover .table-light:hover { background-color: #ececf6; } .pxer-app .table-hover .table-light:hover > td, .pxer-app .table-hover .table-light:hover > th { background-color: #ececf6; } .pxer-app .table-dark, .pxer-app .table-dark > th, .pxer-app .table-dark > td { background-color: #c6c8ca; } .pxer-app .table-dark th, .pxer-app .table-dark td, .pxer-app .table-dark thead th, .pxer-app .table-dark tbody + tbody { border-color: #95999c; } .pxer-app .table-hover .table-dark:hover { background-color: #b9bbbe; } .pxer-app .table-hover .table-dark:hover > td, .pxer-app .table-hover .table-dark:hover > th { background-color: #b9bbbe; } .pxer-app .table-active, .pxer-app .table-active > th, .pxer-app .table-active > td { background-color: rgba(0, 0, 0, 0.075); } .pxer-app .table-hover .table-active:hover { background-color: rgba(0, 0, 0, 0.075); } .pxer-app .table-hover .table-active:hover > td, .pxer-app .table-hover .table-active:hover > th { background-color: rgba(0, 0, 0, 0.075); } .pxer-app .table .thead-dark th { color: #fff; background-color: #343a40; border-color: #454d55; } .pxer-app .table .thead-light th { color: #495057; background-color: #e9ecef; border-color: #dee2e6; } .pxer-app .table-dark { color: #fff; background-color: #343a40; } .pxer-app .table-dark th, .pxer-app .table-dark td, .pxer-app .table-dark thead th { border-color: #454d55; } .pxer-app .table-dark.table-bordered { border: 0; } .pxer-app .table-dark.table-striped tbody tr:nth-of-type(odd) { background-color: rgba(255, 255, 255, 0.05); } .pxer-app .table-dark.table-hover tbody tr:hover { color: #fff; background-color: rgba(255, 255, 255, 0.075); } @media (max-width: 575.98px) { .pxer-app .table-responsive-sm { display: block; width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } .pxer-app .table-responsive-sm > .table-bordered { border: 0; } } @media (max-width: 767.98px) { .pxer-app .table-responsive-md { display: block; width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } .pxer-app .table-responsive-md > .table-bordered { border: 0; } } @media (max-width: 991.98px) { .pxer-app .table-responsive-lg { display: block; width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } .pxer-app .table-responsive-lg > .table-bordered { border: 0; } } @media (max-width: 1199.98px) { .pxer-app .table-responsive-xl { display: block; width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } .pxer-app .table-responsive-xl > .table-bordered { border: 0; } } .pxer-app .table-responsive { display: block; width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } .pxer-app .table-responsive > .table-bordered { border: 0; } .pxer-app .form-control { display: block; width: 100%; height: calc(1.5em + 0.75rem + 2px); padding: 0.375rem 0.75rem; font-size: 1rem; font-weight: 400; line-height: 1.5; color: #495057; background-color: #fff; background-clip: padding-box; border: 1px solid #ced4da; border-radius: 0.25rem; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } @media (prefers-reduced-motion: reduce) { .pxer-app .form-control { transition: none; } } .pxer-app .form-control::-ms-expand { background-color: transparent; border: 0; } .pxer-app .form-control:focus { color: #495057; background-color: #fff; border-color: #80bdff; outline: 0; box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } .pxer-app .form-control::placeholder { color: #6c757d; opacity: 1; } .pxer-app .form-control:disabled, .pxer-app .form-control[readonly] { background-color: #e9ecef; opacity: 1; } .pxer-app input[type=date].form-control, .pxer-app input[type=time].form-control, .pxer-app input[type=datetime-local].form-control, .pxer-app input[type=month].form-control { appearance: none; } .pxer-app select.form-control:-moz-focusring { color: transparent; text-shadow: 0 0 0 #495057; } .pxer-app select.form-control:focus::-ms-value { color: #495057; background-color: #fff; } .pxer-app .form-control-file, .pxer-app .form-control-range { display: block; width: 100%; } .pxer-app .col-form-label { padding-top: calc(0.375rem + 1px); padding-bottom: calc(0.375rem + 1px); margin-bottom: 0; font-size: inherit; line-height: 1.5; } .pxer-app .col-form-label-lg { padding-top: calc(0.5rem + 1px); padding-bottom: calc(0.5rem + 1px); font-size: 1.25rem; line-height: 1.5; } .pxer-app .col-form-label-sm { padding-top: calc(0.25rem + 1px); padding-bottom: calc(0.25rem + 1px); font-size: 0.875rem; line-height: 1.5; } .pxer-app .form-control-plaintext { display: block; width: 100%; padding: 0.375rem 0; margin-bottom: 0; font-size: 1rem; line-height: 1.5; color: #212529; background-color: transparent; border: solid transparent; border-width: 1px 0; } .pxer-app .form-control-plaintext.form-control-sm, .pxer-app input.form-control-plaintext.form-control, .pxer-app select.form-control-plaintext.form-control, .pxer-app .form-control-plaintext.form-control-lg { padding-right: 0; padding-left: 0; } .pxer-app .form-control-sm, .pxer-app input.form-control, .pxer-app select.form-control { height: calc(1.5em + 0.5rem + 2px); padding: 0.25rem 0.5rem; font-size: 0.875rem; line-height: 1.5; border-radius: 0.2rem; } .pxer-app .form-control-lg { height: calc(1.5em + 1rem + 2px); padding: 0.5rem 1rem; font-size: 1.25rem; line-height: 1.5; border-radius: 0.3rem; } .pxer-app select.form-control[size], .pxer-app select.form-control[multiple] { height: auto; } .pxer-app textarea.form-control { height: auto; } .pxer-app .form-group { margin-bottom: 1rem; } .pxer-app .form-text { display: block; margin-top: 0.25rem; } .pxer-app .form-row { display: flex; flex-wrap: wrap; margin-right: -5px; margin-left: -5px; } .pxer-app .form-row > .col, .pxer-app .form-row > [class*=col-] { padding-right: 5px; padding-left: 5px; } .pxer-app .form-check { position: relative; display: block; padding-left: 1.25rem; } .pxer-app .form-check-input { position: absolute; margin-top: 0.3rem; margin-left: -1.25rem; } .pxer-app .form-check-input[disabled] ~ .form-check-label, .pxer-app .form-check-input:disabled ~ .form-check-label { color: #6c757d; } .pxer-app .form-check-label { margin-bottom: 0; } .pxer-app .form-check-inline { display: inline-flex; align-items: center; padding-left: 0; margin-right: 0.75rem; } .pxer-app .form-check-inline .form-check-input { position: static; margin-top: 0; margin-right: 0.3125rem; margin-left: 0; } .pxer-app .valid-feedback { display: none; width: 100%; margin-top: 0.25rem; font-size: 0.875em; color: #28a745; } .pxer-app .valid-tooltip { position: absolute; top: 100%; left: 0; z-index: 5; display: none; max-width: 100%; padding: 0.25rem 0.5rem; margin-top: 0.1rem; font-size: 0.875rem; line-height: 1.5; color: #fff; background-color: rgba(40, 167, 69, 0.9); border-radius: 0.25rem; } .form-row > .col > .pxer-app .valid-tooltip, .form-row > [class*=col-] > .pxer-app .valid-tooltip { left: 5px; } .was-validated .pxer-app:valid ~ .valid-feedback, .was-validated .pxer-app:valid ~ .valid-tooltip, .pxer-app.is-valid ~ .valid-feedback, .pxer-app.is-valid ~ .valid-tooltip { display: block; } .was-validated .pxer-app .form-control:valid, .pxer-app .form-control.is-valid { border-color: #28a745; padding-right: calc(1.5em + 0.75rem) !important; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right calc(0.375em + 0.1875rem) center; background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } .was-validated .pxer-app .form-control:valid:focus, .pxer-app .form-control.is-valid:focus { border-color: #28a745; box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } .was-validated .pxer-app select.form-control:valid, .pxer-app select.form-control.is-valid { padding-right: 3rem !important; background-position: right 1.5rem center; } .was-validated .pxer-app textarea.form-control:valid, .pxer-app textarea.form-control.is-valid { padding-right: calc(1.5em + 0.75rem); background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } .was-validated .pxer-app .custom-select:valid, .pxer-app .custom-select.is-valid { border-color: #28a745; padding-right: calc(0.75em + 2.3125rem) !important; background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; } .was-validated .pxer-app .custom-select:valid:focus, .pxer-app .custom-select.is-valid:focus { border-color: #28a745; box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } .was-validated .pxer-app .form-check-input:valid ~ .form-check-label, .pxer-app .form-check-input.is-valid ~ .form-check-label { color: #28a745; } .was-validated .pxer-app .form-check-input:valid ~ .valid-feedback, .was-validated .pxer-app .form-check-input:valid ~ .valid-tooltip, .pxer-app .form-check-input.is-valid ~ .valid-feedback, .pxer-app .form-check-input.is-valid ~ .valid-tooltip { display: block; } .was-validated .pxer-app .custom-control-input:valid ~ .custom-control-label, .pxer-app .custom-control-input.is-valid ~ .custom-control-label { color: #28a745; } .was-validated .pxer-app .custom-control-input:valid ~ .custom-control-label::before, .pxer-app .custom-control-input.is-valid ~ .custom-control-label::before { border-color: #28a745; } .was-validated .pxer-app .custom-control-input:valid:checked ~ .custom-control-label::before, .pxer-app .custom-control-input.is-valid:checked ~ .custom-control-label::before { border-color: #34ce57; background-color: #34ce57; } .was-validated .pxer-app .custom-control-input:valid:focus ~ .custom-control-label::before, .pxer-app .custom-control-input.is-valid:focus ~ .custom-control-label::before { box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } .was-validated .pxer-app .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .pxer-app .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { border-color: #28a745; } .was-validated .pxer-app .custom-file-input:valid ~ .custom-file-label, .pxer-app .custom-file-input.is-valid ~ .custom-file-label { border-color: #28a745; } .was-validated .pxer-app .custom-file-input:valid:focus ~ .custom-file-label, .pxer-app .custom-file-input.is-valid:focus ~ .custom-file-label { border-color: #28a745; box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } .pxer-app .invalid-feedback { display: none; width: 100%; margin-top: 0.25rem; font-size: 0.875em; color: #dc3545; } .pxer-app .invalid-tooltip { position: absolute; top: 100%; left: 0; z-index: 5; display: none; max-width: 100%; padding: 0.25rem 0.5rem; margin-top: 0.1rem; font-size: 0.875rem; line-height: 1.5; color: #fff; background-color: rgba(220, 53, 69, 0.9); border-radius: 0.25rem; } .form-row > .col > .pxer-app .invalid-tooltip, .form-row > [class*=col-] > .pxer-app .invalid-tooltip { left: 5px; } .was-validated .pxer-app:invalid ~ .invalid-feedback, .was-validated .pxer-app:invalid ~ .invalid-tooltip, .pxer-app.is-invalid ~ .invalid-feedback, .pxer-app.is-invalid ~ .invalid-tooltip { display: block; } .was-validated .pxer-app .form-control:invalid, .pxer-app .form-control.is-invalid { border-color: #dc3545; padding-right: calc(1.5em + 0.75rem) !important; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right calc(0.375em + 0.1875rem) center; background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } .was-validated .pxer-app .form-control:invalid:focus, .pxer-app .form-control.is-invalid:focus { border-color: #dc3545; box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } .was-validated .pxer-app select.form-control:invalid, .pxer-app select.form-control.is-invalid { padding-right: 3rem !important; background-position: right 1.5rem center; } .was-validated .pxer-app textarea.form-control:invalid, .pxer-app textarea.form-control.is-invalid { padding-right: calc(1.5em + 0.75rem); background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } .was-validated .pxer-app .custom-select:invalid, .pxer-app .custom-select.is-invalid { border-color: #dc3545; padding-right: calc(0.75em + 2.3125rem) !important; background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; } .was-validated .pxer-app .custom-select:invalid:focus, .pxer-app .custom-select.is-invalid:focus { border-color: #dc3545; box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } .was-validated .pxer-app .form-check-input:invalid ~ .form-check-label, .pxer-app .form-check-input.is-invalid ~ .form-check-label { color: #dc3545; } .was-validated .pxer-app .form-check-input:invalid ~ .invalid-feedback, .was-validated .pxer-app .form-check-input:invalid ~ .invalid-tooltip, .pxer-app .form-check-input.is-invalid ~ .invalid-feedback, .pxer-app .form-check-input.is-invalid ~ .invalid-tooltip { display: block; } .was-validated .pxer-app .custom-control-input:invalid ~ .custom-control-label, .pxer-app .custom-control-input.is-invalid ~ .custom-control-label { color: #dc3545; } .was-validated .pxer-app .custom-control-input:invalid ~ .custom-control-label::before, .pxer-app .custom-control-input.is-invalid ~ .custom-control-label::before { border-color: #dc3545; } .was-validated .pxer-app .custom-control-input:invalid:checked ~ .custom-control-label::before, .pxer-app .custom-control-input.is-invalid:checked ~ .custom-control-label::before { border-color: #e4606d; background-color: #e4606d; } .was-validated .pxer-app .custom-control-input:invalid:focus ~ .custom-control-label::before, .pxer-app .custom-control-input.is-invalid:focus ~ .custom-control-label::before { box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } .was-validated .pxer-app .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .pxer-app .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { border-color: #dc3545; } .was-validated .pxer-app .custom-file-input:invalid ~ .custom-file-label, .pxer-app .custom-file-input.is-invalid ~ .custom-file-label { border-color: #dc3545; } .was-validated .pxer-app .custom-file-input:invalid:focus ~ .custom-file-label, .pxer-app .custom-file-input.is-invalid:focus ~ .custom-file-label { border-color: #dc3545; box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } .pxer-app .form-inline { display: flex; flex-flow: row wrap; align-items: center; } .pxer-app .form-inline .form-check { width: 100%; } @media (min-width: 576px) { .pxer-app .form-inline label { display: flex; align-items: center; justify-content: center; margin-bottom: 0; } .pxer-app .form-inline .form-group { display: flex; flex: 0 0 auto; flex-flow: row wrap; align-items: center; margin-bottom: 0; } .pxer-app .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .pxer-app .form-inline .form-control-plaintext { display: inline-block; } .pxer-app .form-inline .input-group, .pxer-app .form-inline .custom-select { width: auto; } .pxer-app .form-inline .form-check { display: flex; align-items: center; justify-content: center; width: auto; padding-left: 0; } .pxer-app .form-inline .form-check-input { position: relative; flex-shrink: 0; margin-top: 0; margin-right: 0.25rem; margin-left: 0; } .pxer-app .form-inline .custom-control { align-items: center; justify-content: center; } .pxer-app .form-inline .custom-control-label { margin-bottom: 0; } } .pxer-app .btn { display: inline-block; font-weight: 400; color: #212529; text-align: center; vertical-align: middle; user-select: none; background-color: transparent; border: 1px solid transparent; padding: 0.375rem 0.75rem; font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } @media (prefers-reduced-motion: reduce) { .pxer-app .btn { transition: none; } } .pxer-app .btn:hover { color: #212529; text-decoration: none; } .pxer-app .btn:focus, .pxer-app .btn.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } .pxer-app .btn.disabled, .pxer-app .btn:disabled { opacity: 0.65; } .pxer-app .btn:not(:disabled):not(.disabled) { cursor: pointer; } .pxer-app a.btn.disabled, .pxer-app fieldset:disabled a.btn { pointer-events: none; } .pxer-app .btn-primary { color: #fff; background-color: #007bff; border-color: #007bff; } .pxer-app .btn-primary:hover { color: #fff; background-color: #0069d9; border-color: #0062cc; } .pxer-app .btn-primary:focus, .pxer-app .btn-primary.focus { color: #fff; background-color: #0069d9; border-color: #0062cc; box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); } .pxer-app .btn-primary.disabled, .pxer-app .btn-primary:disabled { color: #fff; background-color: #007bff; border-color: #007bff; } .pxer-app .btn-primary:not(:disabled):not(.disabled):active, .pxer-app .btn-primary:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-primary.dropdown-toggle { color: #fff; background-color: #0062cc; border-color: #005cbf; } .pxer-app .btn-primary:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-primary.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); } .pxer-app .btn-secondary { color: #fff; background-color: #6c757d; border-color: #6c757d; } .pxer-app .btn-secondary:hover { color: #fff; background-color: #5a6268; border-color: #545b62; } .pxer-app .btn-secondary:focus, .pxer-app .btn-secondary.focus { color: #fff; background-color: #5a6268; border-color: #545b62; box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); } .pxer-app .btn-secondary.disabled, .pxer-app .btn-secondary:disabled { color: #fff; background-color: #6c757d; border-color: #6c757d; } .pxer-app .btn-secondary:not(:disabled):not(.disabled):active, .pxer-app .btn-secondary:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-secondary.dropdown-toggle { color: #fff; background-color: #545b62; border-color: #4e555b; } .pxer-app .btn-secondary:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-secondary.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); } .pxer-app .btn-success { color: #fff; background-color: #28a745; border-color: #28a745; } .pxer-app .btn-success:hover { color: #fff; background-color: #218838; border-color: #1e7e34; } .pxer-app .btn-success:focus, .pxer-app .btn-success.focus { color: #fff; background-color: #218838; border-color: #1e7e34; box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } .pxer-app .btn-success.disabled, .pxer-app .btn-success:disabled { color: #fff; background-color: #28a745; border-color: #28a745; } .pxer-app .btn-success:not(:disabled):not(.disabled):active, .pxer-app .btn-success:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-success.dropdown-toggle { color: #fff; background-color: #1e7e34; border-color: #1c7430; } .pxer-app .btn-success:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-success:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-success.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } .pxer-app .btn-info { color: #fff; background-color: #17a2b8; border-color: #17a2b8; } .pxer-app .btn-info:hover { color: #fff; background-color: #138496; border-color: #117a8b; } .pxer-app .btn-info:focus, .pxer-app .btn-info.focus { color: #fff; background-color: #138496; border-color: #117a8b; box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); } .pxer-app .btn-info.disabled, .pxer-app .btn-info:disabled { color: #fff; background-color: #17a2b8; border-color: #17a2b8; } .pxer-app .btn-info:not(:disabled):not(.disabled):active, .pxer-app .btn-info:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-info.dropdown-toggle { color: #fff; background-color: #117a8b; border-color: #10707f; } .pxer-app .btn-info:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-info:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-info.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); } .pxer-app .btn-warning { color: #212529; background-color: #ffc107; border-color: #ffc107; } .pxer-app .btn-warning:hover { color: #212529; background-color: #e0a800; border-color: #d39e00; } .pxer-app .btn-warning:focus, .pxer-app .btn-warning.focus { color: #212529; background-color: #e0a800; border-color: #d39e00; box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); } .pxer-app .btn-warning.disabled, .pxer-app .btn-warning:disabled { color: #212529; background-color: #ffc107; border-color: #ffc107; } .pxer-app .btn-warning:not(:disabled):not(.disabled):active, .pxer-app .btn-warning:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-warning.dropdown-toggle { color: #212529; background-color: #d39e00; border-color: #c69500; } .pxer-app .btn-warning:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-warning.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); } .pxer-app .btn-danger { color: #fff; background-color: #dc3545; border-color: #dc3545; } .pxer-app .btn-danger:hover { color: #fff; background-color: #c82333; border-color: #bd2130; } .pxer-app .btn-danger:focus, .pxer-app .btn-danger.focus { color: #fff; background-color: #c82333; border-color: #bd2130; box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); } .pxer-app .btn-danger.disabled, .pxer-app .btn-danger:disabled { color: #fff; background-color: #dc3545; border-color: #dc3545; } .pxer-app .btn-danger:not(:disabled):not(.disabled):active, .pxer-app .btn-danger:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-danger.dropdown-toggle { color: #fff; background-color: #bd2130; border-color: #b21f2d; } .pxer-app .btn-danger:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-danger.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); } .pxer-app .btn-light { color: #212529; background-color: #f8f9fa; border-color: #f8f9fa; } .pxer-app .btn-light:hover { color: #212529; background-color: #e2e6ea; border-color: #dae0e5; } .pxer-app .btn-light:focus, .pxer-app .btn-light.focus { color: #212529; background-color: #e2e6ea; border-color: #dae0e5; box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); } .pxer-app .btn-light.disabled, .pxer-app .btn-light:disabled { color: #212529; background-color: #f8f9fa; border-color: #f8f9fa; } .pxer-app .btn-light:not(:disabled):not(.disabled):active, .pxer-app .btn-light:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-light.dropdown-toggle { color: #212529; background-color: #dae0e5; border-color: #d3d9df; } .pxer-app .btn-light:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-light:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-light.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); } .pxer-app .btn-dark { color: #fff; background-color: #343a40; border-color: #343a40; } .pxer-app .btn-dark:hover { color: #fff; background-color: #23272b; border-color: #1d2124; } .pxer-app .btn-dark:focus, .pxer-app .btn-dark.focus { color: #fff; background-color: #23272b; border-color: #1d2124; box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); } .pxer-app .btn-dark.disabled, .pxer-app .btn-dark:disabled { color: #fff; background-color: #343a40; border-color: #343a40; } .pxer-app .btn-dark:not(:disabled):not(.disabled):active, .pxer-app .btn-dark:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-dark.dropdown-toggle { color: #fff; background-color: #1d2124; border-color: #171a1d; } .pxer-app .btn-dark:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-dark.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); } .pxer-app .btn-outline-primary { color: #007bff; border-color: #007bff; } .pxer-app .btn-outline-primary:hover { color: #fff; background-color: #007bff; border-color: #007bff; } .pxer-app .btn-outline-primary:focus, .pxer-app .btn-outline-primary.focus { box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); } .pxer-app .btn-outline-primary.disabled, .pxer-app .btn-outline-primary:disabled { color: #007bff; background-color: transparent; } .pxer-app .btn-outline-primary:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-outline-primary.dropdown-toggle { color: #fff; background-color: #007bff; border-color: #007bff; } .pxer-app .btn-outline-primary:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-outline-primary.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); } .pxer-app .btn-outline-secondary { color: #6c757d; border-color: #6c757d; } .pxer-app .btn-outline-secondary:hover { color: #fff; background-color: #6c757d; border-color: #6c757d; } .pxer-app .btn-outline-secondary:focus, .pxer-app .btn-outline-secondary.focus { box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); } .pxer-app .btn-outline-secondary.disabled, .pxer-app .btn-outline-secondary:disabled { color: #6c757d; background-color: transparent; } .pxer-app .btn-outline-secondary:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-outline-secondary.dropdown-toggle { color: #fff; background-color: #6c757d; border-color: #6c757d; } .pxer-app .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-outline-secondary.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); } .pxer-app .btn-outline-success { color: #28a745; border-color: #28a745; } .pxer-app .btn-outline-success:hover { color: #fff; background-color: #28a745; border-color: #28a745; } .pxer-app .btn-outline-success:focus, .pxer-app .btn-outline-success.focus { box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } .pxer-app .btn-outline-success.disabled, .pxer-app .btn-outline-success:disabled { color: #28a745; background-color: transparent; } .pxer-app .btn-outline-success:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-success:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-outline-success.dropdown-toggle { color: #fff; background-color: #28a745; border-color: #28a745; } .pxer-app .btn-outline-success:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-outline-success.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } .pxer-app .btn-outline-info { color: #17a2b8; border-color: #17a2b8; } .pxer-app .btn-outline-info:hover { color: #fff; background-color: #17a2b8; border-color: #17a2b8; } .pxer-app .btn-outline-info:focus, .pxer-app .btn-outline-info.focus { box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } .pxer-app .btn-outline-info.disabled, .pxer-app .btn-outline-info:disabled { color: #17a2b8; background-color: transparent; } .pxer-app .btn-outline-info:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-info:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-outline-info.dropdown-toggle { color: #fff; background-color: #17a2b8; border-color: #17a2b8; } .pxer-app .btn-outline-info:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-outline-info.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } .pxer-app .btn-outline-warning { color: #ffc107; border-color: #ffc107; } .pxer-app .btn-outline-warning:hover { color: #212529; background-color: #ffc107; border-color: #ffc107; } .pxer-app .btn-outline-warning:focus, .pxer-app .btn-outline-warning.focus { box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); } .pxer-app .btn-outline-warning.disabled, .pxer-app .btn-outline-warning:disabled { color: #ffc107; background-color: transparent; } .pxer-app .btn-outline-warning:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-outline-warning.dropdown-toggle { color: #212529; background-color: #ffc107; border-color: #ffc107; } .pxer-app .btn-outline-warning:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-outline-warning.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); } .pxer-app .btn-outline-danger { color: #dc3545; border-color: #dc3545; } .pxer-app .btn-outline-danger:hover { color: #fff; background-color: #dc3545; border-color: #dc3545; } .pxer-app .btn-outline-danger:focus, .pxer-app .btn-outline-danger.focus { box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } .pxer-app .btn-outline-danger.disabled, .pxer-app .btn-outline-danger:disabled { color: #dc3545; background-color: transparent; } .pxer-app .btn-outline-danger:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-outline-danger.dropdown-toggle { color: #fff; background-color: #dc3545; border-color: #dc3545; } .pxer-app .btn-outline-danger:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-outline-danger.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } .pxer-app .btn-outline-light { color: #f8f9fa; border-color: #f8f9fa; } .pxer-app .btn-outline-light:hover { color: #212529; background-color: #f8f9fa; border-color: #f8f9fa; } .pxer-app .btn-outline-light:focus, .pxer-app .btn-outline-light.focus { box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } .pxer-app .btn-outline-light.disabled, .pxer-app .btn-outline-light:disabled { color: #f8f9fa; background-color: transparent; } .pxer-app .btn-outline-light:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-light:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-outline-light.dropdown-toggle { color: #212529; background-color: #f8f9fa; border-color: #f8f9fa; } .pxer-app .btn-outline-light:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-outline-light.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } .pxer-app .btn-outline-dark { color: #343a40; border-color: #343a40; } .pxer-app .btn-outline-dark:hover { color: #fff; background-color: #343a40; border-color: #343a40; } .pxer-app .btn-outline-dark:focus, .pxer-app .btn-outline-dark.focus { box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } .pxer-app .btn-outline-dark.disabled, .pxer-app .btn-outline-dark:disabled { color: #343a40; background-color: transparent; } .pxer-app .btn-outline-dark:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .pxer-app .btn-outline-dark.dropdown-toggle { color: #fff; background-color: #343a40; border-color: #343a40; } .pxer-app .btn-outline-dark:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .pxer-app .btn-outline-dark.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } .pxer-app .btn-link { font-weight: 400; color: #007bff; text-decoration: none; } .pxer-app .btn-link:hover { color: #0056b3; text-decoration: underline; } .pxer-app .btn-link:focus, .pxer-app .btn-link.focus { text-decoration: underline; } .pxer-app .btn-link:disabled, .pxer-app .btn-link.disabled { color: #6c757d; pointer-events: none; } .pxer-app .btn-lg { padding: 0.5rem 1rem; font-size: 1.25rem; line-height: 1.5; border-radius: 0.3rem; } .pxer-app .btn-sm, .pxer-app .btn { padding: 0.25rem 0.5rem; font-size: 0.875rem; line-height: 1.5; border-radius: 0.2rem; } .pxer-app .btn-block { display: block; width: 100%; } .pxer-app .btn-block + .btn-block { margin-top: 0.5rem; } .pxer-app input[type=submit].btn-block, .pxer-app input[type=reset].btn-block, .pxer-app input[type=button].btn-block { width: 100%; } .pxer-app .badge { display: inline-block; padding: 0.25em 0.4em; font-size: 75%; font-weight: 700; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: 0.25rem; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } @media (prefers-reduced-motion: reduce) { .pxer-app .badge { transition: none; } } a.pxer-app .badge:hover, a.pxer-app .badge:focus { text-decoration: none; } .pxer-app .badge:empty { display: none; } .pxer-app .btn .badge { position: relative; top: -1px; } .pxer-app .badge-pill { padding-right: 0.6em; padding-left: 0.6em; border-radius: 10rem; } .pxer-app .badge-primary { color: #fff; background-color: #007bff; } a.pxer-app .badge-primary:hover, a.pxer-app .badge-primary:focus { color: #fff; background-color: #0062cc; } a.pxer-app .badge-primary:focus, a.pxer-app .badge-primary.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); } .pxer-app .badge-secondary { color: #fff; background-color: #6c757d; } a.pxer-app .badge-secondary:hover, a.pxer-app .badge-secondary:focus { color: #fff; background-color: #545b62; } a.pxer-app .badge-secondary:focus, a.pxer-app .badge-secondary.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); } .pxer-app .badge-success { color: #fff; background-color: #28a745; } a.pxer-app .badge-success:hover, a.pxer-app .badge-success:focus { color: #fff; background-color: #1e7e34; } a.pxer-app .badge-success:focus, a.pxer-app .badge-success.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } .pxer-app .badge-info { color: #fff; background-color: #17a2b8; } a.pxer-app .badge-info:hover, a.pxer-app .badge-info:focus { color: #fff; background-color: #117a8b; } a.pxer-app .badge-info:focus, a.pxer-app .badge-info.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } .pxer-app .badge-warning { color: #212529; background-color: #ffc107; } a.pxer-app .badge-warning:hover, a.pxer-app .badge-warning:focus { color: #212529; background-color: #d39e00; } a.pxer-app .badge-warning:focus, a.pxer-app .badge-warning.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); } .pxer-app .badge-danger { color: #fff; background-color: #dc3545; } a.pxer-app .badge-danger:hover, a.pxer-app .badge-danger:focus { color: #fff; background-color: #bd2130; } a.pxer-app .badge-danger:focus, a.pxer-app .badge-danger.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } .pxer-app .badge-light { color: #212529; background-color: #f8f9fa; } a.pxer-app .badge-light:hover, a.pxer-app .badge-light:focus { color: #212529; background-color: #dae0e5; } a.pxer-app .badge-light:focus, a.pxer-app .badge-light.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } .pxer-app .badge-dark { color: #fff; background-color: #343a40; } a.pxer-app .badge-dark:hover, a.pxer-app .badge-dark:focus { color: #fff; background-color: #1d2124; } a.pxer-app .badge-dark:focus, a.pxer-app .badge-dark.focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } .pxer-app .align-baseline { vertical-align: baseline !important; } .pxer-app .align-top { vertical-align: top !important; } .pxer-app .align-middle { vertical-align: middle !important; } .pxer-app .align-bottom { vertical-align: bottom !important; } .pxer-app .align-text-bottom { vertical-align: text-bottom !important; } .pxer-app .align-text-top { vertical-align: text-top !important; } .pxer-app .bg-primary { background-color: #007bff !important; } .pxer-app a.bg-primary:hover, .pxer-app a.bg-primary:focus, .pxer-app button.bg-primary:hover, .pxer-app button.bg-primary:focus { background-color: #0062cc !important; } .pxer-app .bg-secondary { background-color: #6c757d !important; } .pxer-app a.bg-secondary:hover, .pxer-app a.bg-secondary:focus, .pxer-app button.bg-secondary:hover, .pxer-app button.bg-secondary:focus { background-color: #545b62 !important; } .pxer-app .bg-success { background-color: #28a745 !important; } .pxer-app a.bg-success:hover, .pxer-app a.bg-success:focus, .pxer-app button.bg-success:hover, .pxer-app button.bg-success:focus { background-color: #1e7e34 !important; } .pxer-app .bg-info { background-color: #17a2b8 !important; } .pxer-app a.bg-info:hover, .pxer-app a.bg-info:focus, .pxer-app button.bg-info:hover, .pxer-app button.bg-info:focus { background-color: #117a8b !important; } .pxer-app .bg-warning { background-color: #ffc107 !important; } .pxer-app a.bg-warning:hover, .pxer-app a.bg-warning:focus, .pxer-app button.bg-warning:hover, .pxer-app button.bg-warning:focus { background-color: #d39e00 !important; } .pxer-app .bg-danger { background-color: #dc3545 !important; } .pxer-app a.bg-danger:hover, .pxer-app a.bg-danger:focus, .pxer-app button.bg-danger:hover, .pxer-app button.bg-danger:focus { background-color: #bd2130 !important; } .pxer-app .bg-light { background-color: #f8f9fa !important; } .pxer-app a.bg-light:hover, .pxer-app a.bg-light:focus, .pxer-app button.bg-light:hover, .pxer-app button.bg-light:focus { background-color: #dae0e5 !important; } .pxer-app .bg-dark { background-color: #343a40 !important; } .pxer-app a.bg-dark:hover, .pxer-app a.bg-dark:focus, .pxer-app button.bg-dark:hover, .pxer-app button.bg-dark:focus { background-color: #1d2124 !important; } .pxer-app .bg-white { background-color: #fff !important; } .pxer-app .bg-transparent { background-color: transparent !important; } .pxer-app .border { border: 1px solid #dee2e6 !important; } .pxer-app .border-top { border-top: 1px solid #dee2e6 !important; } .pxer-app .border-right { border-right: 1px solid #dee2e6 !important; } .pxer-app .border-bottom { border-bottom: 1px solid #dee2e6 !important; } .pxer-app .border-left { border-left: 1px solid #dee2e6 !important; } .pxer-app .border-0 { border: 0 !important; } .pxer-app .border-top-0 { border-top: 0 !important; } .pxer-app .border-right-0 { border-right: 0 !important; } .pxer-app .border-bottom-0 { border-bottom: 0 !important; } .pxer-app .border-left-0 { border-left: 0 !important; } .pxer-app .border-primary { border-color: #007bff !important; } .pxer-app .border-secondary { border-color: #6c757d !important; } .pxer-app .border-success { border-color: #28a745 !important; } .pxer-app .border-info { border-color: #17a2b8 !important; } .pxer-app .border-warning { border-color: #ffc107 !important; } .pxer-app .border-danger { border-color: #dc3545 !important; } .pxer-app .border-light { border-color: #f8f9fa !important; } .pxer-app .border-dark { border-color: #343a40 !important; } .pxer-app .border-white { border-color: #fff !important; } .pxer-app .rounded-sm { border-radius: 0.2rem !important; } .pxer-app .rounded { border-radius: 0.25rem !important; } .pxer-app .rounded-top { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .pxer-app .rounded-right { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .pxer-app .rounded-bottom { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .pxer-app .rounded-left { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .pxer-app .rounded-lg { border-radius: 0.3rem !important; } .pxer-app .rounded-circle { border-radius: 50% !important; } .pxer-app .rounded-pill { border-radius: 50rem !important; } .pxer-app .rounded-0 { border-radius: 0 !important; } .pxer-app .clearfix::after { display: block; clear: both; content: ""; } .pxer-app .d-none { display: none !important; } .pxer-app .d-inline { display: inline !important; } .pxer-app .d-inline-block { display: inline-block !important; } .pxer-app .d-block { display: block !important; } .pxer-app .d-table { display: table !important; } .pxer-app .d-table-row { display: table-row !important; } .pxer-app .d-table-cell { display: table-cell !important; } .pxer-app .d-flex { display: flex !important; } .pxer-app .d-inline-flex { display: inline-flex !important; } @media (min-width: 576px) { .pxer-app .d-sm-none { display: none !important; } .pxer-app .d-sm-inline { display: inline !important; } .pxer-app .d-sm-inline-block { display: inline-block !important; } .pxer-app .d-sm-block { display: block !important; } .pxer-app .d-sm-table { display: table !important; } .pxer-app .d-sm-table-row { display: table-row !important; } .pxer-app .d-sm-table-cell { display: table-cell !important; } .pxer-app .d-sm-flex { display: flex !important; } .pxer-app .d-sm-inline-flex { display: inline-flex !important; } } @media (min-width: 768px) { .pxer-app .d-md-none { display: none !important; } .pxer-app .d-md-inline { display: inline !important; } .pxer-app .d-md-inline-block { display: inline-block !important; } .pxer-app .d-md-block { display: block !important; } .pxer-app .d-md-table { display: table !important; } .pxer-app .d-md-table-row { display: table-row !important; } .pxer-app .d-md-table-cell { display: table-cell !important; } .pxer-app .d-md-flex { display: flex !important; } .pxer-app .d-md-inline-flex { display: inline-flex !important; } } @media (min-width: 992px) { .pxer-app .d-lg-none { display: none !important; } .pxer-app .d-lg-inline { display: inline !important; } .pxer-app .d-lg-inline-block { display: inline-block !important; } .pxer-app .d-lg-block { display: block !important; } .pxer-app .d-lg-table { display: table !important; } .pxer-app .d-lg-table-row { display: table-row !important; } .pxer-app .d-lg-table-cell { display: table-cell !important; } .pxer-app .d-lg-flex { display: flex !important; } .pxer-app .d-lg-inline-flex { display: inline-flex !important; } } @media (min-width: 1200px) { .pxer-app .d-xl-none { display: none !important; } .pxer-app .d-xl-inline { display: inline !important; } .pxer-app .d-xl-inline-block { display: inline-block !important; } .pxer-app .d-xl-block { display: block !important; } .pxer-app .d-xl-table { display: table !important; } .pxer-app .d-xl-table-row { display: table-row !important; } .pxer-app .d-xl-table-cell { display: table-cell !important; } .pxer-app .d-xl-flex { display: flex !important; } .pxer-app .d-xl-inline-flex { display: inline-flex !important; } } @media print { .pxer-app .d-print-none { display: none !important; } .pxer-app .d-print-inline { display: inline !important; } .pxer-app .d-print-inline-block { display: inline-block !important; } .pxer-app .d-print-block { display: block !important; } .pxer-app .d-print-table { display: table !important; } .pxer-app .d-print-table-row { display: table-row !important; } .pxer-app .d-print-table-cell { display: table-cell !important; } .pxer-app .d-print-flex { display: flex !important; } .pxer-app .d-print-inline-flex { display: inline-flex !important; } } .pxer-app .embed-responsive { position: relative; display: block; width: 100%; padding: 0; overflow: hidden; } .pxer-app .embed-responsive::before { display: block; content: ""; } .pxer-app .embed-responsive .embed-responsive-item, .pxer-app .embed-responsive iframe, .pxer-app .embed-responsive embed, .pxer-app .embed-responsive object, .pxer-app .embed-responsive video { position: absolute; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; border: 0; } .pxer-app .embed-responsive-21by9::before { padding-top: 42.85714286%; } .pxer-app .embed-responsive-16by9::before { padding-top: 56.25%; } .pxer-app .embed-responsive-4by3::before { padding-top: 75%; } .pxer-app .embed-responsive-1by1::before { padding-top: 100%; } .pxer-app .flex-row { flex-direction: row !important; } .pxer-app .flex-column { flex-direction: column !important; } .pxer-app .flex-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-wrap { flex-wrap: wrap !important; } .pxer-app .flex-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-fill { flex: 1 1 auto !important; } .pxer-app .flex-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-start { justify-content: flex-start !important; } .pxer-app .justify-content-end { justify-content: flex-end !important; } .pxer-app .justify-content-center { justify-content: center !important; } .pxer-app .justify-content-between { justify-content: space-between !important; } .pxer-app .justify-content-around { justify-content: space-around !important; } .pxer-app .align-items-start { align-items: flex-start !important; } .pxer-app .align-items-end { align-items: flex-end !important; } .pxer-app .align-items-center { align-items: center !important; } .pxer-app .align-items-baseline { align-items: baseline !important; } .pxer-app .align-items-stretch { align-items: stretch !important; } .pxer-app .align-content-start { align-content: flex-start !important; } .pxer-app .align-content-end { align-content: flex-end !important; } .pxer-app .align-content-center { align-content: center !important; } .pxer-app .align-content-between { align-content: space-between !important; } .pxer-app .align-content-around { align-content: space-around !important; } .pxer-app .align-content-stretch { align-content: stretch !important; } .pxer-app .align-self-auto { align-self: auto !important; } .pxer-app .align-self-start { align-self: flex-start !important; } .pxer-app .align-self-end { align-self: flex-end !important; } .pxer-app .align-self-center { align-self: center !important; } .pxer-app .align-self-baseline { align-self: baseline !important; } .pxer-app .align-self-stretch { align-self: stretch !important; } @media (min-width: 576px) { .pxer-app .flex-sm-row { flex-direction: row !important; } .pxer-app .flex-sm-column { flex-direction: column !important; } .pxer-app .flex-sm-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-sm-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-sm-wrap { flex-wrap: wrap !important; } .pxer-app .flex-sm-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-sm-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-sm-fill { flex: 1 1 auto !important; } .pxer-app .flex-sm-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-sm-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-sm-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-sm-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-sm-start { justify-content: flex-start !important; } .pxer-app .justify-content-sm-end { justify-content: flex-end !important; } .pxer-app .justify-content-sm-center { justify-content: center !important; } .pxer-app .justify-content-sm-between { justify-content: space-between !important; } .pxer-app .justify-content-sm-around { justify-content: space-around !important; } .pxer-app .align-items-sm-start { align-items: flex-start !important; } .pxer-app .align-items-sm-end { align-items: flex-end !important; } .pxer-app .align-items-sm-center { align-items: center !important; } .pxer-app .align-items-sm-baseline { align-items: baseline !important; } .pxer-app .align-items-sm-stretch { align-items: stretch !important; } .pxer-app .align-content-sm-start { align-content: flex-start !important; } .pxer-app .align-content-sm-end { align-content: flex-end !important; } .pxer-app .align-content-sm-center { align-content: center !important; } .pxer-app .align-content-sm-between { align-content: space-between !important; } .pxer-app .align-content-sm-around { align-content: space-around !important; } .pxer-app .align-content-sm-stretch { align-content: stretch !important; } .pxer-app .align-self-sm-auto { align-self: auto !important; } .pxer-app .align-self-sm-start { align-self: flex-start !important; } .pxer-app .align-self-sm-end { align-self: flex-end !important; } .pxer-app .align-self-sm-center { align-self: center !important; } .pxer-app .align-self-sm-baseline { align-self: baseline !important; } .pxer-app .align-self-sm-stretch { align-self: stretch !important; } } @media (min-width: 768px) { .pxer-app .flex-md-row { flex-direction: row !important; } .pxer-app .flex-md-column { flex-direction: column !important; } .pxer-app .flex-md-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-md-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-md-wrap { flex-wrap: wrap !important; } .pxer-app .flex-md-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-md-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-md-fill { flex: 1 1 auto !important; } .pxer-app .flex-md-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-md-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-md-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-md-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-md-start { justify-content: flex-start !important; } .pxer-app .justify-content-md-end { justify-content: flex-end !important; } .pxer-app .justify-content-md-center { justify-content: center !important; } .pxer-app .justify-content-md-between { justify-content: space-between !important; } .pxer-app .justify-content-md-around { justify-content: space-around !important; } .pxer-app .align-items-md-start { align-items: flex-start !important; } .pxer-app .align-items-md-end { align-items: flex-end !important; } .pxer-app .align-items-md-center { align-items: center !important; } .pxer-app .align-items-md-baseline { align-items: baseline !important; } .pxer-app .align-items-md-stretch { align-items: stretch !important; } .pxer-app .align-content-md-start { align-content: flex-start !important; } .pxer-app .align-content-md-end { align-content: flex-end !important; } .pxer-app .align-content-md-center { align-content: center !important; } .pxer-app .align-content-md-between { align-content: space-between !important; } .pxer-app .align-content-md-around { align-content: space-around !important; } .pxer-app .align-content-md-stretch { align-content: stretch !important; } .pxer-app .align-self-md-auto { align-self: auto !important; } .pxer-app .align-self-md-start { align-self: flex-start !important; } .pxer-app .align-self-md-end { align-self: flex-end !important; } .pxer-app .align-self-md-center { align-self: center !important; } .pxer-app .align-self-md-baseline { align-self: baseline !important; } .pxer-app .align-self-md-stretch { align-self: stretch !important; } } @media (min-width: 992px) { .pxer-app .flex-lg-row { flex-direction: row !important; } .pxer-app .flex-lg-column { flex-direction: column !important; } .pxer-app .flex-lg-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-lg-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-lg-wrap { flex-wrap: wrap !important; } .pxer-app .flex-lg-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-lg-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-lg-fill { flex: 1 1 auto !important; } .pxer-app .flex-lg-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-lg-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-lg-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-lg-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-lg-start { justify-content: flex-start !important; } .pxer-app .justify-content-lg-end { justify-content: flex-end !important; } .pxer-app .justify-content-lg-center { justify-content: center !important; } .pxer-app .justify-content-lg-between { justify-content: space-between !important; } .pxer-app .justify-content-lg-around { justify-content: space-around !important; } .pxer-app .align-items-lg-start { align-items: flex-start !important; } .pxer-app .align-items-lg-end { align-items: flex-end !important; } .pxer-app .align-items-lg-center { align-items: center !important; } .pxer-app .align-items-lg-baseline { align-items: baseline !important; } .pxer-app .align-items-lg-stretch { align-items: stretch !important; } .pxer-app .align-content-lg-start { align-content: flex-start !important; } .pxer-app .align-content-lg-end { align-content: flex-end !important; } .pxer-app .align-content-lg-center { align-content: center !important; } .pxer-app .align-content-lg-between { align-content: space-between !important; } .pxer-app .align-content-lg-around { align-content: space-around !important; } .pxer-app .align-content-lg-stretch { align-content: stretch !important; } .pxer-app .align-self-lg-auto { align-self: auto !important; } .pxer-app .align-self-lg-start { align-self: flex-start !important; } .pxer-app .align-self-lg-end { align-self: flex-end !important; } .pxer-app .align-self-lg-center { align-self: center !important; } .pxer-app .align-self-lg-baseline { align-self: baseline !important; } .pxer-app .align-self-lg-stretch { align-self: stretch !important; } } @media (min-width: 1200px) { .pxer-app .flex-xl-row { flex-direction: row !important; } .pxer-app .flex-xl-column { flex-direction: column !important; } .pxer-app .flex-xl-row-reverse { flex-direction: row-reverse !important; } .pxer-app .flex-xl-column-reverse { flex-direction: column-reverse !important; } .pxer-app .flex-xl-wrap { flex-wrap: wrap !important; } .pxer-app .flex-xl-nowrap { flex-wrap: nowrap !important; } .pxer-app .flex-xl-wrap-reverse { flex-wrap: wrap-reverse !important; } .pxer-app .flex-xl-fill { flex: 1 1 auto !important; } .pxer-app .flex-xl-grow-0 { flex-grow: 0 !important; } .pxer-app .flex-xl-grow-1 { flex-grow: 1 !important; } .pxer-app .flex-xl-shrink-0 { flex-shrink: 0 !important; } .pxer-app .flex-xl-shrink-1 { flex-shrink: 1 !important; } .pxer-app .justify-content-xl-start { justify-content: flex-start !important; } .pxer-app .justify-content-xl-end { justify-content: flex-end !important; } .pxer-app .justify-content-xl-center { justify-content: center !important; } .pxer-app .justify-content-xl-between { justify-content: space-between !important; } .pxer-app .justify-content-xl-around { justify-content: space-around !important; } .pxer-app .align-items-xl-start { align-items: flex-start !important; } .pxer-app .align-items-xl-end { align-items: flex-end !important; } .pxer-app .align-items-xl-center { align-items: center !important; } .pxer-app .align-items-xl-baseline { align-items: baseline !important; } .pxer-app .align-items-xl-stretch { align-items: stretch !important; } .pxer-app .align-content-xl-start { align-content: flex-start !important; } .pxer-app .align-content-xl-end { align-content: flex-end !important; } .pxer-app .align-content-xl-center { align-content: center !important; } .pxer-app .align-content-xl-between { align-content: space-between !important; } .pxer-app .align-content-xl-around { align-content: space-around !important; } .pxer-app .align-content-xl-stretch { align-content: stretch !important; } .pxer-app .align-self-xl-auto { align-self: auto !important; } .pxer-app .align-self-xl-start { align-self: flex-start !important; } .pxer-app .align-self-xl-end { align-self: flex-end !important; } .pxer-app .align-self-xl-center { align-self: center !important; } .pxer-app .align-self-xl-baseline { align-self: baseline !important; } .pxer-app .align-self-xl-stretch { align-self: stretch !important; } } .pxer-app .float-left { float: left !important; } .pxer-app .float-right { float: right !important; } .pxer-app .float-none { float: none !important; } @media (min-width: 576px) { .pxer-app .float-sm-left { float: left !important; } .pxer-app .float-sm-right { float: right !important; } .pxer-app .float-sm-none { float: none !important; } } @media (min-width: 768px) { .pxer-app .float-md-left { float: left !important; } .pxer-app .float-md-right { float: right !important; } .pxer-app .float-md-none { float: none !important; } } @media (min-width: 992px) { .pxer-app .float-lg-left { float: left !important; } .pxer-app .float-lg-right { float: right !important; } .pxer-app .float-lg-none { float: none !important; } } @media (min-width: 1200px) { .pxer-app .float-xl-left { float: left !important; } .pxer-app .float-xl-right { float: right !important; } .pxer-app .float-xl-none { float: none !important; } } .pxer-app .user-select-all { user-select: all !important; } .pxer-app .user-select-auto { user-select: auto !important; } .pxer-app .user-select-none { user-select: none !important; } .pxer-app .overflow-auto { overflow: auto !important; } .pxer-app .overflow-hidden { overflow: hidden !important; } .pxer-app .position-static { position: static !important; } .pxer-app .position-relative { position: relative !important; } .pxer-app .position-absolute { position: absolute !important; } .pxer-app .position-fixed { position: fixed !important; } .pxer-app .position-sticky { position: sticky !important; } .pxer-app .fixed-top { position: fixed; top: 0; right: 0; left: 0; z-index: 1030; } .pxer-app .fixed-bottom { position: fixed; right: 0; bottom: 0; left: 0; z-index: 1030; } @supports (position: sticky) { .pxer-app .sticky-top { position: sticky; top: 0; z-index: 1020; } } .pxer-app .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .pxer-app .sr-only-focusable:active, .pxer-app .sr-only-focusable:focus { position: static; width: auto; height: auto; overflow: visible; clip: auto; white-space: normal; } .pxer-app .shadow-sm { box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; } .pxer-app .shadow { box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } .pxer-app .shadow-lg { box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; } .pxer-app .shadow-none { box-shadow: none !important; } .pxer-app .w-25 { width: 25% !important; } .pxer-app .w-50 { width: 50% !important; } .pxer-app .w-75 { width: 75% !important; } .pxer-app .w-100 { width: 100% !important; } .pxer-app .w-auto { width: auto !important; } .pxer-app .h-25 { height: 25% !important; } .pxer-app .h-50 { height: 50% !important; } .pxer-app .h-75 { height: 75% !important; } .pxer-app .h-100 { height: 100% !important; } .pxer-app .h-auto { height: auto !important; } .pxer-app .mw-100 { max-width: 100% !important; } .pxer-app .mh-100 { max-height: 100% !important; } .pxer-app .min-vw-100 { min-width: 100vw !important; } .pxer-app .min-vh-100 { min-height: 100vh !important; } .pxer-app .vw-100 { width: 100vw !important; } .pxer-app .vh-100 { height: 100vh !important; } .pxer-app .m-0 { margin: 0 !important; } .pxer-app .mt-0, .pxer-app .my-0 { margin-top: 0 !important; } .pxer-app .mr-0, .pxer-app .mx-0 { margin-right: 0 !important; } .pxer-app .mb-0, .pxer-app .my-0 { margin-bottom: 0 !important; } .pxer-app .ml-0, .pxer-app .mx-0 { margin-left: 0 !important; } .pxer-app .m-1 { margin: 0.25rem !important; } .pxer-app .mt-1, .pxer-app .my-1 { margin-top: 0.25rem !important; } .pxer-app .mr-1, .pxer-app .mx-1 { margin-right: 0.25rem !important; } .pxer-app .mb-1, .pxer-app .my-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-1, .pxer-app .mx-1 { margin-left: 0.25rem !important; } .pxer-app .m-2 { margin: 0.5rem !important; } .pxer-app .mt-2, .pxer-app .my-2 { margin-top: 0.5rem !important; } .pxer-app .mr-2, .pxer-app .mx-2 { margin-right: 0.5rem !important; } .pxer-app .mb-2, .pxer-app .my-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-2, .pxer-app .mx-2 { margin-left: 0.5rem !important; } .pxer-app .m-3 { margin: 1rem !important; } .pxer-app .mt-3, .pxer-app .my-3 { margin-top: 1rem !important; } .pxer-app .mr-3, .pxer-app .mx-3 { margin-right: 1rem !important; } .pxer-app .mb-3, .pxer-app .my-3 { margin-bottom: 1rem !important; } .pxer-app .ml-3, .pxer-app .mx-3 { margin-left: 1rem !important; } .pxer-app .m-4 { margin: 1.5rem !important; } .pxer-app .mt-4, .pxer-app .my-4 { margin-top: 1.5rem !important; } .pxer-app .mr-4, .pxer-app .mx-4 { margin-right: 1.5rem !important; } .pxer-app .mb-4, .pxer-app .my-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-4, .pxer-app .mx-4 { margin-left: 1.5rem !important; } .pxer-app .m-5 { margin: 3rem !important; } .pxer-app .mt-5, .pxer-app .my-5 { margin-top: 3rem !important; } .pxer-app .mr-5, .pxer-app .mx-5 { margin-right: 3rem !important; } .pxer-app .mb-5, .pxer-app .my-5 { margin-bottom: 3rem !important; } .pxer-app .ml-5, .pxer-app .mx-5 { margin-left: 3rem !important; } .pxer-app .p-0 { padding: 0 !important; } .pxer-app .pt-0, .pxer-app .py-0 { padding-top: 0 !important; } .pxer-app .pr-0, .pxer-app .px-0 { padding-right: 0 !important; } .pxer-app .pb-0, .pxer-app .py-0 { padding-bottom: 0 !important; } .pxer-app .pl-0, .pxer-app .px-0 { padding-left: 0 !important; } .pxer-app .p-1 { padding: 0.25rem !important; } .pxer-app .pt-1, .pxer-app .py-1 { padding-top: 0.25rem !important; } .pxer-app .pr-1, .pxer-app .px-1 { padding-right: 0.25rem !important; } .pxer-app .pb-1, .pxer-app .py-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-1, .pxer-app .px-1 { padding-left: 0.25rem !important; } .pxer-app .p-2 { padding: 0.5rem !important; } .pxer-app .pt-2, .pxer-app .py-2 { padding-top: 0.5rem !important; } .pxer-app .pr-2, .pxer-app .px-2 { padding-right: 0.5rem !important; } .pxer-app .pb-2, .pxer-app .py-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-2, .pxer-app .px-2 { padding-left: 0.5rem !important; } .pxer-app .p-3 { padding: 1rem !important; } .pxer-app .pt-3, .pxer-app .py-3 { padding-top: 1rem !important; } .pxer-app .pr-3, .pxer-app .px-3 { padding-right: 1rem !important; } .pxer-app .pb-3, .pxer-app .py-3 { padding-bottom: 1rem !important; } .pxer-app .pl-3, .pxer-app .px-3 { padding-left: 1rem !important; } .pxer-app .p-4 { padding: 1.5rem !important; } .pxer-app .pt-4, .pxer-app .py-4 { padding-top: 1.5rem !important; } .pxer-app .pr-4, .pxer-app .px-4 { padding-right: 1.5rem !important; } .pxer-app .pb-4, .pxer-app .py-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-4, .pxer-app .px-4 { padding-left: 1.5rem !important; } .pxer-app .p-5 { padding: 3rem !important; } .pxer-app .pt-5, .pxer-app .py-5 { padding-top: 3rem !important; } .pxer-app .pr-5, .pxer-app .px-5 { padding-right: 3rem !important; } .pxer-app .pb-5, .pxer-app .py-5 { padding-bottom: 3rem !important; } .pxer-app .pl-5, .pxer-app .px-5 { padding-left: 3rem !important; } .pxer-app .m-n1 { margin: -0.25rem !important; } .pxer-app .mt-n1, .pxer-app .my-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-n1, .pxer-app .mx-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-n1, .pxer-app .my-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-n1, .pxer-app .mx-n1 { margin-left: -0.25rem !important; } .pxer-app .m-n2 { margin: -0.5rem !important; } .pxer-app .mt-n2, .pxer-app .my-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-n2, .pxer-app .mx-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-n2, .pxer-app .my-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-n2, .pxer-app .mx-n2 { margin-left: -0.5rem !important; } .pxer-app .m-n3 { margin: -1rem !important; } .pxer-app .mt-n3, .pxer-app .my-n3 { margin-top: -1rem !important; } .pxer-app .mr-n3, .pxer-app .mx-n3 { margin-right: -1rem !important; } .pxer-app .mb-n3, .pxer-app .my-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-n3, .pxer-app .mx-n3 { margin-left: -1rem !important; } .pxer-app .m-n4 { margin: -1.5rem !important; } .pxer-app .mt-n4, .pxer-app .my-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-n4, .pxer-app .mx-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-n4, .pxer-app .my-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-n4, .pxer-app .mx-n4 { margin-left: -1.5rem !important; } .pxer-app .m-n5 { margin: -3rem !important; } .pxer-app .mt-n5, .pxer-app .my-n5 { margin-top: -3rem !important; } .pxer-app .mr-n5, .pxer-app .mx-n5 { margin-right: -3rem !important; } .pxer-app .mb-n5, .pxer-app .my-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-n5, .pxer-app .mx-n5 { margin-left: -3rem !important; } .pxer-app .m-auto { margin: auto !important; } .pxer-app .mt-auto, .pxer-app .my-auto { margin-top: auto !important; } .pxer-app .mr-auto, .pxer-app .mx-auto { margin-right: auto !important; } .pxer-app .mb-auto, .pxer-app .my-auto { margin-bottom: auto !important; } .pxer-app .ml-auto, .pxer-app .mx-auto { margin-left: auto !important; } @media (min-width: 576px) { .pxer-app .m-sm-0 { margin: 0 !important; } .pxer-app .mt-sm-0, .pxer-app .my-sm-0 { margin-top: 0 !important; } .pxer-app .mr-sm-0, .pxer-app .mx-sm-0 { margin-right: 0 !important; } .pxer-app .mb-sm-0, .pxer-app .my-sm-0 { margin-bottom: 0 !important; } .pxer-app .ml-sm-0, .pxer-app .mx-sm-0 { margin-left: 0 !important; } .pxer-app .m-sm-1 { margin: 0.25rem !important; } .pxer-app .mt-sm-1, .pxer-app .my-sm-1 { margin-top: 0.25rem !important; } .pxer-app .mr-sm-1, .pxer-app .mx-sm-1 { margin-right: 0.25rem !important; } .pxer-app .mb-sm-1, .pxer-app .my-sm-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-sm-1, .pxer-app .mx-sm-1 { margin-left: 0.25rem !important; } .pxer-app .m-sm-2 { margin: 0.5rem !important; } .pxer-app .mt-sm-2, .pxer-app .my-sm-2 { margin-top: 0.5rem !important; } .pxer-app .mr-sm-2, .pxer-app .mx-sm-2 { margin-right: 0.5rem !important; } .pxer-app .mb-sm-2, .pxer-app .my-sm-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-sm-2, .pxer-app .mx-sm-2 { margin-left: 0.5rem !important; } .pxer-app .m-sm-3 { margin: 1rem !important; } .pxer-app .mt-sm-3, .pxer-app .my-sm-3 { margin-top: 1rem !important; } .pxer-app .mr-sm-3, .pxer-app .mx-sm-3 { margin-right: 1rem !important; } .pxer-app .mb-sm-3, .pxer-app .my-sm-3 { margin-bottom: 1rem !important; } .pxer-app .ml-sm-3, .pxer-app .mx-sm-3 { margin-left: 1rem !important; } .pxer-app .m-sm-4 { margin: 1.5rem !important; } .pxer-app .mt-sm-4, .pxer-app .my-sm-4 { margin-top: 1.5rem !important; } .pxer-app .mr-sm-4, .pxer-app .mx-sm-4 { margin-right: 1.5rem !important; } .pxer-app .mb-sm-4, .pxer-app .my-sm-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-sm-4, .pxer-app .mx-sm-4 { margin-left: 1.5rem !important; } .pxer-app .m-sm-5 { margin: 3rem !important; } .pxer-app .mt-sm-5, .pxer-app .my-sm-5 { margin-top: 3rem !important; } .pxer-app .mr-sm-5, .pxer-app .mx-sm-5 { margin-right: 3rem !important; } .pxer-app .mb-sm-5, .pxer-app .my-sm-5 { margin-bottom: 3rem !important; } .pxer-app .ml-sm-5, .pxer-app .mx-sm-5 { margin-left: 3rem !important; } .pxer-app .p-sm-0 { padding: 0 !important; } .pxer-app .pt-sm-0, .pxer-app .py-sm-0 { padding-top: 0 !important; } .pxer-app .pr-sm-0, .pxer-app .px-sm-0 { padding-right: 0 !important; } .pxer-app .pb-sm-0, .pxer-app .py-sm-0 { padding-bottom: 0 !important; } .pxer-app .pl-sm-0, .pxer-app .px-sm-0 { padding-left: 0 !important; } .pxer-app .p-sm-1 { padding: 0.25rem !important; } .pxer-app .pt-sm-1, .pxer-app .py-sm-1 { padding-top: 0.25rem !important; } .pxer-app .pr-sm-1, .pxer-app .px-sm-1 { padding-right: 0.25rem !important; } .pxer-app .pb-sm-1, .pxer-app .py-sm-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-sm-1, .pxer-app .px-sm-1 { padding-left: 0.25rem !important; } .pxer-app .p-sm-2 { padding: 0.5rem !important; } .pxer-app .pt-sm-2, .pxer-app .py-sm-2 { padding-top: 0.5rem !important; } .pxer-app .pr-sm-2, .pxer-app .px-sm-2 { padding-right: 0.5rem !important; } .pxer-app .pb-sm-2, .pxer-app .py-sm-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-sm-2, .pxer-app .px-sm-2 { padding-left: 0.5rem !important; } .pxer-app .p-sm-3 { padding: 1rem !important; } .pxer-app .pt-sm-3, .pxer-app .py-sm-3 { padding-top: 1rem !important; } .pxer-app .pr-sm-3, .pxer-app .px-sm-3 { padding-right: 1rem !important; } .pxer-app .pb-sm-3, .pxer-app .py-sm-3 { padding-bottom: 1rem !important; } .pxer-app .pl-sm-3, .pxer-app .px-sm-3 { padding-left: 1rem !important; } .pxer-app .p-sm-4 { padding: 1.5rem !important; } .pxer-app .pt-sm-4, .pxer-app .py-sm-4 { padding-top: 1.5rem !important; } .pxer-app .pr-sm-4, .pxer-app .px-sm-4 { padding-right: 1.5rem !important; } .pxer-app .pb-sm-4, .pxer-app .py-sm-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-sm-4, .pxer-app .px-sm-4 { padding-left: 1.5rem !important; } .pxer-app .p-sm-5 { padding: 3rem !important; } .pxer-app .pt-sm-5, .pxer-app .py-sm-5 { padding-top: 3rem !important; } .pxer-app .pr-sm-5, .pxer-app .px-sm-5 { padding-right: 3rem !important; } .pxer-app .pb-sm-5, .pxer-app .py-sm-5 { padding-bottom: 3rem !important; } .pxer-app .pl-sm-5, .pxer-app .px-sm-5 { padding-left: 3rem !important; } .pxer-app .m-sm-n1 { margin: -0.25rem !important; } .pxer-app .mt-sm-n1, .pxer-app .my-sm-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-sm-n1, .pxer-app .mx-sm-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-sm-n1, .pxer-app .my-sm-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-sm-n1, .pxer-app .mx-sm-n1 { margin-left: -0.25rem !important; } .pxer-app .m-sm-n2 { margin: -0.5rem !important; } .pxer-app .mt-sm-n2, .pxer-app .my-sm-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-sm-n2, .pxer-app .mx-sm-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-sm-n2, .pxer-app .my-sm-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-sm-n2, .pxer-app .mx-sm-n2 { margin-left: -0.5rem !important; } .pxer-app .m-sm-n3 { margin: -1rem !important; } .pxer-app .mt-sm-n3, .pxer-app .my-sm-n3 { margin-top: -1rem !important; } .pxer-app .mr-sm-n3, .pxer-app .mx-sm-n3 { margin-right: -1rem !important; } .pxer-app .mb-sm-n3, .pxer-app .my-sm-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-sm-n3, .pxer-app .mx-sm-n3 { margin-left: -1rem !important; } .pxer-app .m-sm-n4 { margin: -1.5rem !important; } .pxer-app .mt-sm-n4, .pxer-app .my-sm-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-sm-n4, .pxer-app .mx-sm-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-sm-n4, .pxer-app .my-sm-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-sm-n4, .pxer-app .mx-sm-n4 { margin-left: -1.5rem !important; } .pxer-app .m-sm-n5 { margin: -3rem !important; } .pxer-app .mt-sm-n5, .pxer-app .my-sm-n5 { margin-top: -3rem !important; } .pxer-app .mr-sm-n5, .pxer-app .mx-sm-n5 { margin-right: -3rem !important; } .pxer-app .mb-sm-n5, .pxer-app .my-sm-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-sm-n5, .pxer-app .mx-sm-n5 { margin-left: -3rem !important; } .pxer-app .m-sm-auto { margin: auto !important; } .pxer-app .mt-sm-auto, .pxer-app .my-sm-auto { margin-top: auto !important; } .pxer-app .mr-sm-auto, .pxer-app .mx-sm-auto { margin-right: auto !important; } .pxer-app .mb-sm-auto, .pxer-app .my-sm-auto { margin-bottom: auto !important; } .pxer-app .ml-sm-auto, .pxer-app .mx-sm-auto { margin-left: auto !important; } } @media (min-width: 768px) { .pxer-app .m-md-0 { margin: 0 !important; } .pxer-app .mt-md-0, .pxer-app .my-md-0 { margin-top: 0 !important; } .pxer-app .mr-md-0, .pxer-app .mx-md-0 { margin-right: 0 !important; } .pxer-app .mb-md-0, .pxer-app .my-md-0 { margin-bottom: 0 !important; } .pxer-app .ml-md-0, .pxer-app .mx-md-0 { margin-left: 0 !important; } .pxer-app .m-md-1 { margin: 0.25rem !important; } .pxer-app .mt-md-1, .pxer-app .my-md-1 { margin-top: 0.25rem !important; } .pxer-app .mr-md-1, .pxer-app .mx-md-1 { margin-right: 0.25rem !important; } .pxer-app .mb-md-1, .pxer-app .my-md-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-md-1, .pxer-app .mx-md-1 { margin-left: 0.25rem !important; } .pxer-app .m-md-2 { margin: 0.5rem !important; } .pxer-app .mt-md-2, .pxer-app .my-md-2 { margin-top: 0.5rem !important; } .pxer-app .mr-md-2, .pxer-app .mx-md-2 { margin-right: 0.5rem !important; } .pxer-app .mb-md-2, .pxer-app .my-md-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-md-2, .pxer-app .mx-md-2 { margin-left: 0.5rem !important; } .pxer-app .m-md-3 { margin: 1rem !important; } .pxer-app .mt-md-3, .pxer-app .my-md-3 { margin-top: 1rem !important; } .pxer-app .mr-md-3, .pxer-app .mx-md-3 { margin-right: 1rem !important; } .pxer-app .mb-md-3, .pxer-app .my-md-3 { margin-bottom: 1rem !important; } .pxer-app .ml-md-3, .pxer-app .mx-md-3 { margin-left: 1rem !important; } .pxer-app .m-md-4 { margin: 1.5rem !important; } .pxer-app .mt-md-4, .pxer-app .my-md-4 { margin-top: 1.5rem !important; } .pxer-app .mr-md-4, .pxer-app .mx-md-4 { margin-right: 1.5rem !important; } .pxer-app .mb-md-4, .pxer-app .my-md-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-md-4, .pxer-app .mx-md-4 { margin-left: 1.5rem !important; } .pxer-app .m-md-5 { margin: 3rem !important; } .pxer-app .mt-md-5, .pxer-app .my-md-5 { margin-top: 3rem !important; } .pxer-app .mr-md-5, .pxer-app .mx-md-5 { margin-right: 3rem !important; } .pxer-app .mb-md-5, .pxer-app .my-md-5 { margin-bottom: 3rem !important; } .pxer-app .ml-md-5, .pxer-app .mx-md-5 { margin-left: 3rem !important; } .pxer-app .p-md-0 { padding: 0 !important; } .pxer-app .pt-md-0, .pxer-app .py-md-0 { padding-top: 0 !important; } .pxer-app .pr-md-0, .pxer-app .px-md-0 { padding-right: 0 !important; } .pxer-app .pb-md-0, .pxer-app .py-md-0 { padding-bottom: 0 !important; } .pxer-app .pl-md-0, .pxer-app .px-md-0 { padding-left: 0 !important; } .pxer-app .p-md-1 { padding: 0.25rem !important; } .pxer-app .pt-md-1, .pxer-app .py-md-1 { padding-top: 0.25rem !important; } .pxer-app .pr-md-1, .pxer-app .px-md-1 { padding-right: 0.25rem !important; } .pxer-app .pb-md-1, .pxer-app .py-md-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-md-1, .pxer-app .px-md-1 { padding-left: 0.25rem !important; } .pxer-app .p-md-2 { padding: 0.5rem !important; } .pxer-app .pt-md-2, .pxer-app .py-md-2 { padding-top: 0.5rem !important; } .pxer-app .pr-md-2, .pxer-app .px-md-2 { padding-right: 0.5rem !important; } .pxer-app .pb-md-2, .pxer-app .py-md-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-md-2, .pxer-app .px-md-2 { padding-left: 0.5rem !important; } .pxer-app .p-md-3 { padding: 1rem !important; } .pxer-app .pt-md-3, .pxer-app .py-md-3 { padding-top: 1rem !important; } .pxer-app .pr-md-3, .pxer-app .px-md-3 { padding-right: 1rem !important; } .pxer-app .pb-md-3, .pxer-app .py-md-3 { padding-bottom: 1rem !important; } .pxer-app .pl-md-3, .pxer-app .px-md-3 { padding-left: 1rem !important; } .pxer-app .p-md-4 { padding: 1.5rem !important; } .pxer-app .pt-md-4, .pxer-app .py-md-4 { padding-top: 1.5rem !important; } .pxer-app .pr-md-4, .pxer-app .px-md-4 { padding-right: 1.5rem !important; } .pxer-app .pb-md-4, .pxer-app .py-md-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-md-4, .pxer-app .px-md-4 { padding-left: 1.5rem !important; } .pxer-app .p-md-5 { padding: 3rem !important; } .pxer-app .pt-md-5, .pxer-app .py-md-5 { padding-top: 3rem !important; } .pxer-app .pr-md-5, .pxer-app .px-md-5 { padding-right: 3rem !important; } .pxer-app .pb-md-5, .pxer-app .py-md-5 { padding-bottom: 3rem !important; } .pxer-app .pl-md-5, .pxer-app .px-md-5 { padding-left: 3rem !important; } .pxer-app .m-md-n1 { margin: -0.25rem !important; } .pxer-app .mt-md-n1, .pxer-app .my-md-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-md-n1, .pxer-app .mx-md-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-md-n1, .pxer-app .my-md-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-md-n1, .pxer-app .mx-md-n1 { margin-left: -0.25rem !important; } .pxer-app .m-md-n2 { margin: -0.5rem !important; } .pxer-app .mt-md-n2, .pxer-app .my-md-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-md-n2, .pxer-app .mx-md-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-md-n2, .pxer-app .my-md-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-md-n2, .pxer-app .mx-md-n2 { margin-left: -0.5rem !important; } .pxer-app .m-md-n3 { margin: -1rem !important; } .pxer-app .mt-md-n3, .pxer-app .my-md-n3 { margin-top: -1rem !important; } .pxer-app .mr-md-n3, .pxer-app .mx-md-n3 { margin-right: -1rem !important; } .pxer-app .mb-md-n3, .pxer-app .my-md-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-md-n3, .pxer-app .mx-md-n3 { margin-left: -1rem !important; } .pxer-app .m-md-n4 { margin: -1.5rem !important; } .pxer-app .mt-md-n4, .pxer-app .my-md-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-md-n4, .pxer-app .mx-md-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-md-n4, .pxer-app .my-md-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-md-n4, .pxer-app .mx-md-n4 { margin-left: -1.5rem !important; } .pxer-app .m-md-n5 { margin: -3rem !important; } .pxer-app .mt-md-n5, .pxer-app .my-md-n5 { margin-top: -3rem !important; } .pxer-app .mr-md-n5, .pxer-app .mx-md-n5 { margin-right: -3rem !important; } .pxer-app .mb-md-n5, .pxer-app .my-md-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-md-n5, .pxer-app .mx-md-n5 { margin-left: -3rem !important; } .pxer-app .m-md-auto { margin: auto !important; } .pxer-app .mt-md-auto, .pxer-app .my-md-auto { margin-top: auto !important; } .pxer-app .mr-md-auto, .pxer-app .mx-md-auto { margin-right: auto !important; } .pxer-app .mb-md-auto, .pxer-app .my-md-auto { margin-bottom: auto !important; } .pxer-app .ml-md-auto, .pxer-app .mx-md-auto { margin-left: auto !important; } } @media (min-width: 992px) { .pxer-app .m-lg-0 { margin: 0 !important; } .pxer-app .mt-lg-0, .pxer-app .my-lg-0 { margin-top: 0 !important; } .pxer-app .mr-lg-0, .pxer-app .mx-lg-0 { margin-right: 0 !important; } .pxer-app .mb-lg-0, .pxer-app .my-lg-0 { margin-bottom: 0 !important; } .pxer-app .ml-lg-0, .pxer-app .mx-lg-0 { margin-left: 0 !important; } .pxer-app .m-lg-1 { margin: 0.25rem !important; } .pxer-app .mt-lg-1, .pxer-app .my-lg-1 { margin-top: 0.25rem !important; } .pxer-app .mr-lg-1, .pxer-app .mx-lg-1 { margin-right: 0.25rem !important; } .pxer-app .mb-lg-1, .pxer-app .my-lg-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-lg-1, .pxer-app .mx-lg-1 { margin-left: 0.25rem !important; } .pxer-app .m-lg-2 { margin: 0.5rem !important; } .pxer-app .mt-lg-2, .pxer-app .my-lg-2 { margin-top: 0.5rem !important; } .pxer-app .mr-lg-2, .pxer-app .mx-lg-2 { margin-right: 0.5rem !important; } .pxer-app .mb-lg-2, .pxer-app .my-lg-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-lg-2, .pxer-app .mx-lg-2 { margin-left: 0.5rem !important; } .pxer-app .m-lg-3 { margin: 1rem !important; } .pxer-app .mt-lg-3, .pxer-app .my-lg-3 { margin-top: 1rem !important; } .pxer-app .mr-lg-3, .pxer-app .mx-lg-3 { margin-right: 1rem !important; } .pxer-app .mb-lg-3, .pxer-app .my-lg-3 { margin-bottom: 1rem !important; } .pxer-app .ml-lg-3, .pxer-app .mx-lg-3 { margin-left: 1rem !important; } .pxer-app .m-lg-4 { margin: 1.5rem !important; } .pxer-app .mt-lg-4, .pxer-app .my-lg-4 { margin-top: 1.5rem !important; } .pxer-app .mr-lg-4, .pxer-app .mx-lg-4 { margin-right: 1.5rem !important; } .pxer-app .mb-lg-4, .pxer-app .my-lg-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-lg-4, .pxer-app .mx-lg-4 { margin-left: 1.5rem !important; } .pxer-app .m-lg-5 { margin: 3rem !important; } .pxer-app .mt-lg-5, .pxer-app .my-lg-5 { margin-top: 3rem !important; } .pxer-app .mr-lg-5, .pxer-app .mx-lg-5 { margin-right: 3rem !important; } .pxer-app .mb-lg-5, .pxer-app .my-lg-5 { margin-bottom: 3rem !important; } .pxer-app .ml-lg-5, .pxer-app .mx-lg-5 { margin-left: 3rem !important; } .pxer-app .p-lg-0 { padding: 0 !important; } .pxer-app .pt-lg-0, .pxer-app .py-lg-0 { padding-top: 0 !important; } .pxer-app .pr-lg-0, .pxer-app .px-lg-0 { padding-right: 0 !important; } .pxer-app .pb-lg-0, .pxer-app .py-lg-0 { padding-bottom: 0 !important; } .pxer-app .pl-lg-0, .pxer-app .px-lg-0 { padding-left: 0 !important; } .pxer-app .p-lg-1 { padding: 0.25rem !important; } .pxer-app .pt-lg-1, .pxer-app .py-lg-1 { padding-top: 0.25rem !important; } .pxer-app .pr-lg-1, .pxer-app .px-lg-1 { padding-right: 0.25rem !important; } .pxer-app .pb-lg-1, .pxer-app .py-lg-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-lg-1, .pxer-app .px-lg-1 { padding-left: 0.25rem !important; } .pxer-app .p-lg-2 { padding: 0.5rem !important; } .pxer-app .pt-lg-2, .pxer-app .py-lg-2 { padding-top: 0.5rem !important; } .pxer-app .pr-lg-2, .pxer-app .px-lg-2 { padding-right: 0.5rem !important; } .pxer-app .pb-lg-2, .pxer-app .py-lg-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-lg-2, .pxer-app .px-lg-2 { padding-left: 0.5rem !important; } .pxer-app .p-lg-3 { padding: 1rem !important; } .pxer-app .pt-lg-3, .pxer-app .py-lg-3 { padding-top: 1rem !important; } .pxer-app .pr-lg-3, .pxer-app .px-lg-3 { padding-right: 1rem !important; } .pxer-app .pb-lg-3, .pxer-app .py-lg-3 { padding-bottom: 1rem !important; } .pxer-app .pl-lg-3, .pxer-app .px-lg-3 { padding-left: 1rem !important; } .pxer-app .p-lg-4 { padding: 1.5rem !important; } .pxer-app .pt-lg-4, .pxer-app .py-lg-4 { padding-top: 1.5rem !important; } .pxer-app .pr-lg-4, .pxer-app .px-lg-4 { padding-right: 1.5rem !important; } .pxer-app .pb-lg-4, .pxer-app .py-lg-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-lg-4, .pxer-app .px-lg-4 { padding-left: 1.5rem !important; } .pxer-app .p-lg-5 { padding: 3rem !important; } .pxer-app .pt-lg-5, .pxer-app .py-lg-5 { padding-top: 3rem !important; } .pxer-app .pr-lg-5, .pxer-app .px-lg-5 { padding-right: 3rem !important; } .pxer-app .pb-lg-5, .pxer-app .py-lg-5 { padding-bottom: 3rem !important; } .pxer-app .pl-lg-5, .pxer-app .px-lg-5 { padding-left: 3rem !important; } .pxer-app .m-lg-n1 { margin: -0.25rem !important; } .pxer-app .mt-lg-n1, .pxer-app .my-lg-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-lg-n1, .pxer-app .mx-lg-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-lg-n1, .pxer-app .my-lg-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-lg-n1, .pxer-app .mx-lg-n1 { margin-left: -0.25rem !important; } .pxer-app .m-lg-n2 { margin: -0.5rem !important; } .pxer-app .mt-lg-n2, .pxer-app .my-lg-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-lg-n2, .pxer-app .mx-lg-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-lg-n2, .pxer-app .my-lg-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-lg-n2, .pxer-app .mx-lg-n2 { margin-left: -0.5rem !important; } .pxer-app .m-lg-n3 { margin: -1rem !important; } .pxer-app .mt-lg-n3, .pxer-app .my-lg-n3 { margin-top: -1rem !important; } .pxer-app .mr-lg-n3, .pxer-app .mx-lg-n3 { margin-right: -1rem !important; } .pxer-app .mb-lg-n3, .pxer-app .my-lg-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-lg-n3, .pxer-app .mx-lg-n3 { margin-left: -1rem !important; } .pxer-app .m-lg-n4 { margin: -1.5rem !important; } .pxer-app .mt-lg-n4, .pxer-app .my-lg-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-lg-n4, .pxer-app .mx-lg-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-lg-n4, .pxer-app .my-lg-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-lg-n4, .pxer-app .mx-lg-n4 { margin-left: -1.5rem !important; } .pxer-app .m-lg-n5 { margin: -3rem !important; } .pxer-app .mt-lg-n5, .pxer-app .my-lg-n5 { margin-top: -3rem !important; } .pxer-app .mr-lg-n5, .pxer-app .mx-lg-n5 { margin-right: -3rem !important; } .pxer-app .mb-lg-n5, .pxer-app .my-lg-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-lg-n5, .pxer-app .mx-lg-n5 { margin-left: -3rem !important; } .pxer-app .m-lg-auto { margin: auto !important; } .pxer-app .mt-lg-auto, .pxer-app .my-lg-auto { margin-top: auto !important; } .pxer-app .mr-lg-auto, .pxer-app .mx-lg-auto { margin-right: auto !important; } .pxer-app .mb-lg-auto, .pxer-app .my-lg-auto { margin-bottom: auto !important; } .pxer-app .ml-lg-auto, .pxer-app .mx-lg-auto { margin-left: auto !important; } } @media (min-width: 1200px) { .pxer-app .m-xl-0 { margin: 0 !important; } .pxer-app .mt-xl-0, .pxer-app .my-xl-0 { margin-top: 0 !important; } .pxer-app .mr-xl-0, .pxer-app .mx-xl-0 { margin-right: 0 !important; } .pxer-app .mb-xl-0, .pxer-app .my-xl-0 { margin-bottom: 0 !important; } .pxer-app .ml-xl-0, .pxer-app .mx-xl-0 { margin-left: 0 !important; } .pxer-app .m-xl-1 { margin: 0.25rem !important; } .pxer-app .mt-xl-1, .pxer-app .my-xl-1 { margin-top: 0.25rem !important; } .pxer-app .mr-xl-1, .pxer-app .mx-xl-1 { margin-right: 0.25rem !important; } .pxer-app .mb-xl-1, .pxer-app .my-xl-1 { margin-bottom: 0.25rem !important; } .pxer-app .ml-xl-1, .pxer-app .mx-xl-1 { margin-left: 0.25rem !important; } .pxer-app .m-xl-2 { margin: 0.5rem !important; } .pxer-app .mt-xl-2, .pxer-app .my-xl-2 { margin-top: 0.5rem !important; } .pxer-app .mr-xl-2, .pxer-app .mx-xl-2 { margin-right: 0.5rem !important; } .pxer-app .mb-xl-2, .pxer-app .my-xl-2 { margin-bottom: 0.5rem !important; } .pxer-app .ml-xl-2, .pxer-app .mx-xl-2 { margin-left: 0.5rem !important; } .pxer-app .m-xl-3 { margin: 1rem !important; } .pxer-app .mt-xl-3, .pxer-app .my-xl-3 { margin-top: 1rem !important; } .pxer-app .mr-xl-3, .pxer-app .mx-xl-3 { margin-right: 1rem !important; } .pxer-app .mb-xl-3, .pxer-app .my-xl-3 { margin-bottom: 1rem !important; } .pxer-app .ml-xl-3, .pxer-app .mx-xl-3 { margin-left: 1rem !important; } .pxer-app .m-xl-4 { margin: 1.5rem !important; } .pxer-app .mt-xl-4, .pxer-app .my-xl-4 { margin-top: 1.5rem !important; } .pxer-app .mr-xl-4, .pxer-app .mx-xl-4 { margin-right: 1.5rem !important; } .pxer-app .mb-xl-4, .pxer-app .my-xl-4 { margin-bottom: 1.5rem !important; } .pxer-app .ml-xl-4, .pxer-app .mx-xl-4 { margin-left: 1.5rem !important; } .pxer-app .m-xl-5 { margin: 3rem !important; } .pxer-app .mt-xl-5, .pxer-app .my-xl-5 { margin-top: 3rem !important; } .pxer-app .mr-xl-5, .pxer-app .mx-xl-5 { margin-right: 3rem !important; } .pxer-app .mb-xl-5, .pxer-app .my-xl-5 { margin-bottom: 3rem !important; } .pxer-app .ml-xl-5, .pxer-app .mx-xl-5 { margin-left: 3rem !important; } .pxer-app .p-xl-0 { padding: 0 !important; } .pxer-app .pt-xl-0, .pxer-app .py-xl-0 { padding-top: 0 !important; } .pxer-app .pr-xl-0, .pxer-app .px-xl-0 { padding-right: 0 !important; } .pxer-app .pb-xl-0, .pxer-app .py-xl-0 { padding-bottom: 0 !important; } .pxer-app .pl-xl-0, .pxer-app .px-xl-0 { padding-left: 0 !important; } .pxer-app .p-xl-1 { padding: 0.25rem !important; } .pxer-app .pt-xl-1, .pxer-app .py-xl-1 { padding-top: 0.25rem !important; } .pxer-app .pr-xl-1, .pxer-app .px-xl-1 { padding-right: 0.25rem !important; } .pxer-app .pb-xl-1, .pxer-app .py-xl-1 { padding-bottom: 0.25rem !important; } .pxer-app .pl-xl-1, .pxer-app .px-xl-1 { padding-left: 0.25rem !important; } .pxer-app .p-xl-2 { padding: 0.5rem !important; } .pxer-app .pt-xl-2, .pxer-app .py-xl-2 { padding-top: 0.5rem !important; } .pxer-app .pr-xl-2, .pxer-app .px-xl-2 { padding-right: 0.5rem !important; } .pxer-app .pb-xl-2, .pxer-app .py-xl-2 { padding-bottom: 0.5rem !important; } .pxer-app .pl-xl-2, .pxer-app .px-xl-2 { padding-left: 0.5rem !important; } .pxer-app .p-xl-3 { padding: 1rem !important; } .pxer-app .pt-xl-3, .pxer-app .py-xl-3 { padding-top: 1rem !important; } .pxer-app .pr-xl-3, .pxer-app .px-xl-3 { padding-right: 1rem !important; } .pxer-app .pb-xl-3, .pxer-app .py-xl-3 { padding-bottom: 1rem !important; } .pxer-app .pl-xl-3, .pxer-app .px-xl-3 { padding-left: 1rem !important; } .pxer-app .p-xl-4 { padding: 1.5rem !important; } .pxer-app .pt-xl-4, .pxer-app .py-xl-4 { padding-top: 1.5rem !important; } .pxer-app .pr-xl-4, .pxer-app .px-xl-4 { padding-right: 1.5rem !important; } .pxer-app .pb-xl-4, .pxer-app .py-xl-4 { padding-bottom: 1.5rem !important; } .pxer-app .pl-xl-4, .pxer-app .px-xl-4 { padding-left: 1.5rem !important; } .pxer-app .p-xl-5 { padding: 3rem !important; } .pxer-app .pt-xl-5, .pxer-app .py-xl-5 { padding-top: 3rem !important; } .pxer-app .pr-xl-5, .pxer-app .px-xl-5 { padding-right: 3rem !important; } .pxer-app .pb-xl-5, .pxer-app .py-xl-5 { padding-bottom: 3rem !important; } .pxer-app .pl-xl-5, .pxer-app .px-xl-5 { padding-left: 3rem !important; } .pxer-app .m-xl-n1 { margin: -0.25rem !important; } .pxer-app .mt-xl-n1, .pxer-app .my-xl-n1 { margin-top: -0.25rem !important; } .pxer-app .mr-xl-n1, .pxer-app .mx-xl-n1 { margin-right: -0.25rem !important; } .pxer-app .mb-xl-n1, .pxer-app .my-xl-n1 { margin-bottom: -0.25rem !important; } .pxer-app .ml-xl-n1, .pxer-app .mx-xl-n1 { margin-left: -0.25rem !important; } .pxer-app .m-xl-n2 { margin: -0.5rem !important; } .pxer-app .mt-xl-n2, .pxer-app .my-xl-n2 { margin-top: -0.5rem !important; } .pxer-app .mr-xl-n2, .pxer-app .mx-xl-n2 { margin-right: -0.5rem !important; } .pxer-app .mb-xl-n2, .pxer-app .my-xl-n2 { margin-bottom: -0.5rem !important; } .pxer-app .ml-xl-n2, .pxer-app .mx-xl-n2 { margin-left: -0.5rem !important; } .pxer-app .m-xl-n3 { margin: -1rem !important; } .pxer-app .mt-xl-n3, .pxer-app .my-xl-n3 { margin-top: -1rem !important; } .pxer-app .mr-xl-n3, .pxer-app .mx-xl-n3 { margin-right: -1rem !important; } .pxer-app .mb-xl-n3, .pxer-app .my-xl-n3 { margin-bottom: -1rem !important; } .pxer-app .ml-xl-n3, .pxer-app .mx-xl-n3 { margin-left: -1rem !important; } .pxer-app .m-xl-n4 { margin: -1.5rem !important; } .pxer-app .mt-xl-n4, .pxer-app .my-xl-n4 { margin-top: -1.5rem !important; } .pxer-app .mr-xl-n4, .pxer-app .mx-xl-n4 { margin-right: -1.5rem !important; } .pxer-app .mb-xl-n4, .pxer-app .my-xl-n4 { margin-bottom: -1.5rem !important; } .pxer-app .ml-xl-n4, .pxer-app .mx-xl-n4 { margin-left: -1.5rem !important; } .pxer-app .m-xl-n5 { margin: -3rem !important; } .pxer-app .mt-xl-n5, .pxer-app .my-xl-n5 { margin-top: -3rem !important; } .pxer-app .mr-xl-n5, .pxer-app .mx-xl-n5 { margin-right: -3rem !important; } .pxer-app .mb-xl-n5, .pxer-app .my-xl-n5 { margin-bottom: -3rem !important; } .pxer-app .ml-xl-n5, .pxer-app .mx-xl-n5 { margin-left: -3rem !important; } .pxer-app .m-xl-auto { margin: auto !important; } .pxer-app .mt-xl-auto, .pxer-app .my-xl-auto { margin-top: auto !important; } .pxer-app .mr-xl-auto, .pxer-app .mx-xl-auto { margin-right: auto !important; } .pxer-app .mb-xl-auto, .pxer-app .my-xl-auto { margin-bottom: auto !important; } .pxer-app .ml-xl-auto, .pxer-app .mx-xl-auto { margin-left: auto !important; } } .pxer-app .stretched-link::after { position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1; pointer-events: auto; content: ""; background-color: rgba(0, 0, 0, 0); } .pxer-app .text-monospace { font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; } .pxer-app .text-justify { text-align: justify !important; } .pxer-app .text-wrap { white-space: normal !important; } .pxer-app .text-nowrap { white-space: nowrap !important; } .pxer-app .text-truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pxer-app .text-left { text-align: left !important; } .pxer-app .text-right { text-align: right !important; } .pxer-app .text-center { text-align: center !important; } @media (min-width: 576px) { .pxer-app .text-sm-left { text-align: left !important; } .pxer-app .text-sm-right { text-align: right !important; } .pxer-app .text-sm-center { text-align: center !important; } } @media (min-width: 768px) { .pxer-app .text-md-left { text-align: left !important; } .pxer-app .text-md-right { text-align: right !important; } .pxer-app .text-md-center { text-align: center !important; } } @media (min-width: 992px) { .pxer-app .text-lg-left { text-align: left !important; } .pxer-app .text-lg-right { text-align: right !important; } .pxer-app .text-lg-center { text-align: center !important; } } @media (min-width: 1200px) { .pxer-app .text-xl-left { text-align: left !important; } .pxer-app .text-xl-right { text-align: right !important; } .pxer-app .text-xl-center { text-align: center !important; } } .pxer-app .text-lowercase { text-transform: lowercase !important; } .pxer-app .text-uppercase { text-transform: uppercase !important; } .pxer-app .text-capitalize { text-transform: capitalize !important; } .pxer-app .font-weight-light { font-weight: 300 !important; } .pxer-app .font-weight-lighter { font-weight: lighter !important; } .pxer-app .font-weight-normal { font-weight: 400 !important; } .pxer-app .font-weight-bold { font-weight: 700 !important; } .pxer-app .font-weight-bolder { font-weight: bolder !important; } .pxer-app .font-italic { font-style: italic !important; } .pxer-app .text-white { color: #fff !important; } .pxer-app .text-primary { color: #007bff !important; } .pxer-app a.text-primary:hover, .pxer-app a.text-primary:focus { color: #0056b3 !important; } .pxer-app .text-secondary { color: #6c757d !important; } .pxer-app a.text-secondary:hover, .pxer-app a.text-secondary:focus { color: #494f54 !important; } .pxer-app .text-success { color: #28a745 !important; } .pxer-app a.text-success:hover, .pxer-app a.text-success:focus { color: #19692c !important; } .pxer-app .text-info { color: #17a2b8 !important; } .pxer-app a.text-info:hover, .pxer-app a.text-info:focus { color: #0f6674 !important; } .pxer-app .text-warning { color: #ffc107 !important; } .pxer-app a.text-warning:hover, .pxer-app a.text-warning:focus { color: #ba8b00 !important; } .pxer-app .text-danger { color: #dc3545 !important; } .pxer-app a.text-danger:hover, .pxer-app a.text-danger:focus { color: #a71d2a !important; } .pxer-app .text-light { color: #f8f9fa !important; } .pxer-app a.text-light:hover, .pxer-app a.text-light:focus { color: #cbd3da !important; } .pxer-app .text-dark { color: #343a40 !important; } .pxer-app a.text-dark:hover, .pxer-app a.text-dark:focus { color: #121416 !important; } .pxer-app .text-body { color: #212529 !important; } .pxer-app .text-muted { color: #6c757d !important; } .pxer-app .text-black-50 { color: rgba(0, 0, 0, 0.5) !important; } .pxer-app .text-white-50 { color: rgba(255, 255, 255, 0.5) !important; } .pxer-app .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .pxer-app .text-decoration-none { text-decoration: none !important; } .pxer-app .text-break { word-break: break-word !important; word-wrap: break-word !important; } .pxer-app .text-reset { color: inherit !important; } .pxer-app .visible { visibility: visible !important; } .pxer-app .invisible { visibility: hidden !important; } .pxer-app .card { position: relative; display: flex; flex-direction: column; min-width: 0; word-wrap: break-word; background-color: #fff; background-clip: border-box; border: 1px solid rgba(0, 0, 0, 0.125); border-radius: 0.25rem; } .pxer-app .card > hr { margin-right: 0; margin-left: 0; } .pxer-app .card > .list-group { border-top: inherit; border-bottom: inherit; } .pxer-app .card > .list-group:first-child { border-top-width: 0; border-top-left-radius: calc(0.25rem - 1px); border-top-right-radius: calc(0.25rem - 1px); } .pxer-app .card > .list-group:last-child { border-bottom-width: 0; border-bottom-right-radius: calc(0.25rem - 1px); border-bottom-left-radius: calc(0.25rem - 1px); } .pxer-app .card > .card-header + .list-group, .pxer-app .card > .list-group + .card-footer { border-top: 0; } .pxer-app .card-body { flex: 1 1 auto; min-height: 1px; padding: 1.25rem; } .pxer-app .card-title { margin-bottom: 0.75rem; } .pxer-app .card-subtitle { margin-top: -0.375rem; margin-bottom: 0; } .pxer-app .card-text:last-child { margin-bottom: 0; } .pxer-app .card-link:hover { text-decoration: none; } .pxer-app .card-link + .card-link { margin-left: 1.25rem; } .pxer-app .card-header { padding: 0.75rem 1.25rem; margin-bottom: 0; background-color: rgba(0, 0, 0, 0.03); border-bottom: 1px solid rgba(0, 0, 0, 0.125); } .pxer-app .card-header:first-child { border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; } .pxer-app .card-footer { padding: 0.75rem 1.25rem; background-color: rgba(0, 0, 0, 0.03); border-top: 1px solid rgba(0, 0, 0, 0.125); } .pxer-app .card-footer:last-child { border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); } .pxer-app .card-header-tabs { margin-right: -0.625rem; margin-bottom: -0.75rem; margin-left: -0.625rem; border-bottom: 0; } .pxer-app .card-header-pills { margin-right: -0.625rem; margin-left: -0.625rem; } .pxer-app .card-img-overlay { position: absolute; top: 0; right: 0; bottom: 0; left: 0; padding: 1.25rem; border-radius: calc(0.25rem - 1px); } .pxer-app .card-img, .pxer-app .card-img-top, .pxer-app .card-img-bottom { flex-shrink: 0; width: 100%; } .pxer-app .card-img, .pxer-app .card-img-top { border-top-left-radius: calc(0.25rem - 1px); border-top-right-radius: calc(0.25rem - 1px); } .pxer-app .card-img, .pxer-app .card-img-bottom { border-bottom-right-radius: calc(0.25rem - 1px); border-bottom-left-radius: calc(0.25rem - 1px); } .pxer-app .card-deck .card { margin-bottom: 15px; } @media (min-width: 576px) { .pxer-app .card-deck { display: flex; flex-flow: row wrap; margin-right: -15px; margin-left: -15px; } .pxer-app .card-deck .card { flex: 1 0 0%; margin-right: 15px; margin-bottom: 0; margin-left: 15px; } } .pxer-app .card-group > .card { margin-bottom: 15px; } @media (min-width: 576px) { .pxer-app .card-group { display: flex; flex-flow: row wrap; } .pxer-app .card-group > .card { flex: 1 0 0%; margin-bottom: 0; } .pxer-app .card-group > .card + .card { margin-left: 0; border-left: 0; } .pxer-app .card-group > .card:not(:last-child) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .pxer-app .card-group > .card:not(:last-child) .card-img-top, .pxer-app .card-group > .card:not(:last-child) .card-header { border-top-right-radius: 0; } .pxer-app .card-group > .card:not(:last-child) .card-img-bottom, .pxer-app .card-group > .card:not(:last-child) .card-footer { border-bottom-right-radius: 0; } .pxer-app .card-group > .card:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .pxer-app .card-group > .card:not(:first-child) .card-img-top, .pxer-app .card-group > .card:not(:first-child) .card-header { border-top-left-radius: 0; } .pxer-app .card-group > .card:not(:first-child) .card-img-bottom, .pxer-app .card-group > .card:not(:first-child) .card-footer { border-bottom-left-radius: 0; } } .pxer-app .card-columns .card { margin-bottom: 0.75rem; } @media (min-width: 576px) { .pxer-app .card-columns { column-count: 3; column-gap: 1.25rem; orphans: 1; widows: 1; } .pxer-app .card-columns .card { display: inline-block; width: 100%; } } .pxer-app .accordion { overflow-anchor: none; } .pxer-app .accordion > .card { overflow: hidden; } .pxer-app .accordion > .card:not(:last-of-type) { border-bottom: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .pxer-app .accordion > .card:not(:first-of-type) { border-top-left-radius: 0; border-top-right-radius: 0; } .pxer-app .accordion > .card > .card-header { border-radius: 0; margin-bottom: -1px; } .pxer-app > * { background-color: #fff; border: 1px solid #d6dee5; border-radius: 5px; margin-top: 10px; margin-bottom: 10px; min-height: 40px; display: flex; } .pxer-app .pxer-nav { background-color: #fff; justify-content: space-between; padding: 5px 12px; align-items: center; } .pxer-app .pxer-nav .pn-header a, .pxer-app .pxer-nav .pn-header a:active, .pxer-app .pxer-nav .pn-header a:hover { text-decoration: none; color: #258fb8; font-family: sans-serif; font-size: 24px; } .pxer-app .pxer-nav .pn-header a small, .pxer-app .pxer-nav .pn-header a:active small, .pxer-app .pxer-nav .pn-header a:hover small { font-size: 0.3em; } .pxer-app .pxer-nav .pn-header a:hover { color: #24749c; } .pxer-app .pxer-nav .pn-buttons { display: flex; align-items: center; } .pxer-app .pxer-nav .pn-buttons .btn { margin-left: 10px; } .pxer-app .pxer-nav .pn-buttons .pnb-warn-number { background-color: #fd7e14; font-family: sans-serif; width: 20px; height: 20px; font-size: 14px; transform: scale(0.7); line-height: 20px; color: #fff; border-radius: 1000px; display: inline-block; text-align: center; margin-left: -20px; position: relative; top: -10px; left: 8px; } .pxer-app .pxer-fail > table thead tr td { padding: 3px 12px; vertical-align: middle; font-size: 16px; } .pxer-app .pxer-task-option { padding: 5px 0; } .pxer-app .pxer-task-option > * { margin-left: 12px; } .pxer-app .pxer-task-option .ptp-buttons { margin-left: auto; margin-right: 12px; } .pxer-app .pxer-task-option .ptp-buttons button { margin-left: 10px; } .pxer-app .pxer-print > * { flex-grow: 1; margin: 12px; } .pxer-app .pxer-print .pp-filter, .pxer-app .pxer-print .pp-print { margin-top: 1.5em; padding: 12px; } .pxer-app .pxer-print .pp-print { width: 35%; } .pxer-app .pxer-print .pp-print .pppf-buttons { text-align: right; } .pxer-app .pxer-print .pp-print .pppf-buttons .pppfb-msg { padding: 5px; text-align: left; border: 1px solid #e9ecef; color: #6c757d; border-radius: 1px; } .pxer-app .pxer-print .pp-filter { width: 55%; } .pxer-app .pxer-print .pp-filter .ppf-tag-card .card-body { display: flex; flex-wrap: wrap; justify-content: space-between; padding: 5px; position: relative; overflow: hidden; } .pxer-app .pxer-print .pp-filter .ppf-tag-card .ppf-show-all-tag { position: absolute; bottom: 0; width: 100%; display: block; padding: 20px 0 5px; text-align: center; cursor: pointer; color: #258fb8; background: linear-gradient(rgba(255, 255, 255, 0), white 50%); } .pxer-app .pxer-print .pp-filter .ppf-tag-card .ppf-tag { margin: 5px 2px; cursor: pointer; } .pxer-app .pxer-print .pp-filter .ppf-tag-card .ppf-tag:last-child { margin-right: auto; } .pxer-app input.form-control, .pxer-app select.form-control { height: 24px; padding-top: 1px; padding-bottom: 1px; line-height: 1em; } .pxer-app .pxer-class-fieldset { border: 1px solid #ccc; position: relative; padding-top: 1em; margin-top: 1em; } .pxer-app .pxer-class-fieldset .pcf-title { background-color: #fff; display: inline-block; position: absolute; top: -0.75em; left: 0.45em; font-size: 16px; } .pxer-app .text-right { text-align: right; } div#wave { position: relative; margin-left: auto; margin-right: auto; } div#wave .dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; margin-right: 3px; background: #303131; animation: wave 1.3s linear infinite; } div#wave .dot:nth-child(2) { animation-delay: -1.1s; } div#wave .dot:nth-child(3) { animation-delay: -0.9s; } @keyframes wave { 0%, 60%, 100% { transform: initial; } 30% { transform: translateY(-8px); } } `; ; // public/favicon.ico pxer.util.addFile('public/favicon.ico') ; // https://point.pea3nut.org/sdk/1.0/browser.js "use strict"; var EventSender = /** @class */ (function () { function EventSender(remoteUrl, userOptions) { this.remoteUrl = remoteUrl; this.userOptions = userOptions; this.startTime = new Date; this.content = {}; var that = this; this.defaultOptions = { sdk_version: '1.0', get time() { return new Date; }, get duration() { return new Date().getTime() - that.startTime.getTime(); }, }; } EventSender.prototype.setContent = function (content) { Object.assign(this.content, content); }; EventSender.prototype.send = function (eventFlag, content) { var mergedContent = Object.assign({}, this.content, content); var body = Object.assign({}, this.defaultOptions, this.userOptions, { content: JSON.stringify(mergedContent), event_flag: eventFlag, }); this.sendRequest(body); }; EventSender.prototype.sendRequest = function (body) { var xhr = new XMLHttpRequest(); xhr.open('POST', this.remoteUrl); xhr.onload = function () { if (['2', '3'].includes(xhr.status.toString()[0])) { var res = JSON.parse(xhr.responseText); if (res.errcode) { console.error("Error in point sent! Server response " + xhr.responseText); } } else { console.error("Error in point sent! Server response HTTP code " + xhr.status); } }; xhr.send(JSON.stringify(body)); }; return EventSender; }()); //# sourceMappingURL=browser.js.map ; // src/app/util.js "use strict"; pxer.util = pxer.util || {}; // 全局函数 pxer.util.blinkTitle = function (addMsg, spaceMsg) { var addMsg = addMsg || "[ OK ] "; var spaceMsg = spaceMsg || "[ ] "; var timer = setInterval(() => { if (document.title.indexOf(addMsg) !== -1) { document.title = document.title.replace(addMsg, spaceMsg); } else if (document.title.indexOf(spaceMsg) !== -1) { document.title = document.title.replace(spaceMsg, addMsg); } else { document.title = addMsg + document.title; } }, 500); window.addEventListener("mousemove", function _self() { window.addEventListener("mousemove", _self); clearInterval(timer); document.title = document.title.replace(spaceMsg, "").replace(addMsg, ""); }); }; pxer.util.parseURL = function (url = document.URL) { var arr = url.match( /^(?:(https?):)?\/\/([\w_\d.:\-]+?)((?:\/[^\/?]*)*)\/?(?:\?(.+))?$/ ); var data = { protocol: arr[1], domain: arr[2], path: arr[3], query: arr[4], }; if (data.query && data.query.indexOf("=") !== -1) { data.query = {}; for (let item of arr[4].split("&")) { let tmp = item.split("="); data.query[tmp[0]] = tmp[1]; } } return data; }; pxer.util.createScript = function (url) { if (!/^(https?:)?\/\//.test(url)) url = window["PXER_URL"] + url; var elt = document.createElement("script"); elt.charset = "utf-8"; return function (resolve, reject) { elt.addEventListener("load", resolve); elt.addEventListener("load", function () { if (window["PXER_MODE"] === "dev") console.log("Loaded " + url); }); elt.addEventListener("error", reject); elt.src = url; document.documentElement.appendChild(elt); return elt; }; }; pxer.util.createResource = function (url) { if (!/^(https?:)?\/\//.test(url)) url = window["PXER_URL"] + url; let fx = url.match(/\.([^\.]+?)$/)[1]; let elt = document.createElement("link"); switch (fx) { case "css": elt.rel = "stylesheet"; break; case "ico": elt.rel = "shortcut icon"; elt.type = "image/x-icon"; break; default: throw new Error(`unknown filename extension "${fx}"`); } return function (resolve, reject) { elt.href = url; document.documentElement.appendChild(elt); if (window["PXER_MODE"] === "dev") console.log("Linked " + url); resolve(); }; }; pxer.util.execPromise = function (taskList, call) { var promise = Promise.resolve(); if (Array.isArray(taskList) && Array.isArray(taskList[0])) { for (let array of taskList) { promise = promise.then(() => Promise.all(array.map((item) => new Promise(call(item)))) ); } } else if (Array.isArray(taskList)) { for (let item of taskList) { promise = promise.then(() => new Promise(call(item))); } } else { promise = promise.then(() => new Promise(call(taskList))); } return promise; }; /** * 当前页面类型。可能的值 * - bookmark_user 自己/其他人关注的用户列表 * - bookmark_works 自己/其他人收藏的作品 * - member_info 自己/其他人的主页 * - works_medium 查看某个作品 * - works_manga 查看某个多张作品的多张页 * - works_big 查看某个作品的某张图片的大图 * - member_works 自己/其他人作品列表页 * - member_works_new 自己/其他人作品列表页 * - search 检索页 * - index 首页 * - discovery 探索 * - rank 排行榜 * - bookmark_new 关注的新作品 * - unknown 未知 * @param {Document} doc * @return {string} - 页面类型 * */ pxer.util.getPageType = function (doc = document) { const url = doc.URL; var URLData = pxer.util.parseURL(url); switch (true) { case pxer.regexp.urlWorkDetail.test(URLData.path): return "works_medium"; } var type = null; var isnew = !( Boolean(document.querySelector(".count-badge")) || Boolean(document.querySelector(".profile")) ); if (URLData.domain !== "www.pixiv.net") return "unknown"; if (pxer.regexp.isBookmarksUrl.test(URLData.path)) { type = "bookmark_works"; } else if (URLData.path.startsWith("/users/")) { type = "member_works_new"; } else if (URLData.path.startsWith("/tags/")) { type = "search_tag"; } else if (URLData.path === "/bookmark.php") { if (URLData.query && URLData.query.type) { switch (URLData.query.type) { case "user": type = "bookmark_user"; break; default: type = "unknown"; } } else { type = "bookmark_works"; } } else if (URLData.path === "/bookmark_new_illust.php") { type = "bookmark_new"; } else if (URLData.path === "/member.php") { type = isnew ? "member_works_new" : "member_info"; } else if (URLData.path === "/ranking.php") { type = "rank"; } else if (URLData.path === "/member_illust.php") { if (URLData.query && URLData.query.mode) { switch (URLData.query.mode) { case "medium": type = "works_medium"; break; case "manga": type = "works_manga"; break; case "manga_big": type = "works_big"; break; default: type = "unknown"; } } else { type = isnew ? "member_works_new" : "member_works"; } } else if (URLData.path === "/search.php") { // TODO: Not all of search is carried in SPA // But new version seems batter? type = "search_spa"; } else if (URLData.path === "/discovery") { type = "discovery"; } else if (URLData.path === "/") { type = "index"; } else { type = "unknown"; } return type; }; /** * 查询对应页面类型每页作品数量 * @param {string} type - 作品类型 * @return {number} - 每页作品数 */ pxer.util.getOnePageWorkCount = function (type) { switch (type) { case "search_spa": return 48; case "search_tag": return 60; case "search": return 40; case "rank": return 50; case "discovery": return 3000; case "bookmark_works": return 48; case "bookmark_new": return 60; case "member_works_new": return Number.MAX_SAFE_INTEGER; default: return 20; } }; pxer.util.getIDfromURL = function (key = "id", url = document.URL) { const urlInfo = new URL(url, document.URL); var query = urlInfo.search; var params = new URLSearchParams(query); const result = params.get(key); if (result) return result; // read id from url const matchResult = url.match(/\d{4,}/); return matchResult ? matchResult[0] : null; }; pxer.util.fetchPixivApi = async function (url) { return (await (await fetch(url, { credentials: "include" })).json()).body; }; Object.assign(window, pxer.util); ; // src/app/regexp.js pxer.regexp = pxer.regexp || {}; pxer.regexp.urlWorkDetail = /\/artworks\/(\d+)/; pxer.regexp.parseKeyword = /\/tags\/([^\/]+?)\//; pxer.regexp.isBookmarksUrl = /users\/\d+\/bookmarks\/artworks/; ; // src/app/PxerData.js "use strict"; /** * Pxer任务队列中的任务对象 * @constructor * @abstract * */ class PxerRequest { constructor({ url, html } = {}) { this.url = url; this.html = html; this.completed = false; } } /** * 页面任务对象 * @constructor * @extends {PxerRequest} * */ class PxerPageRequest extends PxerRequest { constructor(...argn) { super(...argn); this.type = argn[0].type; } } /** * 作品任务对象 * @constructor * @extends {PxerRequest} * */ class PxerWorksRequest extends PxerRequest { constructor({ url = [], html = {}, type, isMultiple, id } = {}) { super({ url, html }); this.type = type; //[manga|ugoira|illust] this.isMultiple = isMultiple; //[true|false] this.id = id; } } /** * 作品任务对象 * @constructor * @extends {PxerRequest} * */ class PxerFailInfo { constructor({ url, type, task } = {}) { this.url = url; this.type = type; this.task = task; } } /** * 抓取到的作品对象 * @constructor * */ class PxerWorks { constructor( { id, type, date, domain, tagList, viewCount, ratedCount, fileFormat } = {}, strict = true ) { /**作品ID*/ this.id = id; /** * 投稿日期,格式:Y/m/d/h/m/s * @type {string} * */ this.date = date; this.type = type; //[manga|ugoira|illust] /**作品存放的域名*/ this.domain = domain; /** * 作品标签列表 * @type {Array} * */ this.tagList = tagList; /**作品被浏览的次数*/ this.viewCount = viewCount; /**作品被赞的次数*/ this.ratedCount = ratedCount; /**作品的图片文件扩展名*/ this.fileFormat = fileFormat; } } /** * 抓取到的多张插画/漫画作品对象 * @extends {PxerWorks} * @constructor * */ class PxerMultipleWorks extends PxerWorks { constructor(data = {}) { super(data, false); /**作品的图片张数*/ this.isMultiple = true; this.multiple = data.multiple; } } /** * 抓取到的动图作品对象 * @extends {PxerWorks} * @constructor * */ class PxerUgoiraWorks extends PxerWorks { constructor(data = {}) { super(data, false); this.type = "ugoira"; this.fileFormat = "zip"; /**动图动画参数*/ this.frames = data.frames; } } ; // src/app/PxerEvent.js "use strict"; class PxerEvent { constructor(eventList = [], shortName = true) { this._pe_eventList = eventList; this._pe_event = {}; this._pe_oneEvent = {}; if (!shortName || typeof Proxy === "undefined") return this; else return new Proxy(this, { get(target, property) { if (property in target) { return target[property]; } else if (target._pe_eventList.indexOf(property) !== -1) { return target.dispatch.bind(target, property); } else { return target[property]; } }, }); } on(type, listener) { if (!PxerEvent.check(this, type, listener)) return false; if (!this._pe_event[type]) this._pe_event[type] = []; this._pe_event[type].push(listener); return true; } one(type, listener) { if (!PxerEvent.check(this, type, listener)) return false; if (!this._pe_oneEvent[type]) this._pe_oneEvent[type] = []; this._pe_oneEvent[type].push(listener); return true; } dispatch(type, ...data) { if (this._pe_eventList.indexOf(type) === -1) return false; if (this._pe_event[type]) this._pe_event[type].forEach((fn) => fn(...data)); if (this._pe_oneEvent[type]) { this._pe_oneEvent[type].forEach((fn) => fn(...data)); delete this._pe_oneEvent[type]; } if (this._pe_event["*"]) this._pe_event["*"].forEach((fn) => fn(...data)); if (this._pe_oneEvent["*"]) { this._pe_oneEvent["*"].forEach((fn) => fn(...data)); delete this._pe_oneEvent["*"]; } return true; } off(eventType, listener) { if (!PxerEvent.checkEvent(this, eventType)) return false; if (listener && !PxerEvent.checkListener(listener)) return false; if (eventType === true) { this._pe_event = {}; this._pe_oneEvent = {}; return true; } if (listener === true || listener === "*") { delete this._pe_event[eventType]; delete this._pe_oneEvent[eventType]; return true; } let index1 = this._pe_event[type].lastIndexOf(listener); if (index1 !== -1) { this._pe_event[type].splice(index1, 1); } let index2 = this._pe_oneEvent[type].lastIndexOf(listener); if (index2 !== -1) { this._pe_oneEvent[type].splice(index2, 1); } return true; } } PxerEvent.check = function (pe, eventType, listener) { return ( PxerEvent.checkEvent(pe, eventType) && PxerEvent.checkListener(listener) ); }; PxerEvent.checkEvent = function (pe, eventType) { if (eventType !== "*" && pe._pe_eventList.indexOf(eventType) === -1) { console.warn( `PxerEvent : "${eventType}" is not in eventList[${pe._pe_eventList}]` ); return false; } return true; }; PxerEvent.checkListener = function (listener) { if ( !(listener instanceof Function || listener === true || listener === "*") ) { console.warn(`PxerEvent: "${listener}" is not a function`); return false; } return true; }; ; // src/view/i18n.js pxer.t = function (key) { const defaultLang = "en"; return ( pxer.util.get(pxer.i18nMap[pxer.lang], key) || pxer.util.get(pxer.i18nMap[defaultLang], key) || key ); }; ; // public/i18n/en.json pxer.util.set(pxer, 'i18nMap.en', { "phrase": { "taskInfo": "`There are ${worksNum} works and ${address} picture address.<br />The single works is ${(single/worksNum*100).toFixed(1)}%<br /> and the multiple works ${(multiple/worksNum*100).toFixed(1)}%<br />`", "blockOpen": "Pxer:\nThe browser blocked Pup-up window. Please check the hint of browser and allow it.", "likeProportion": "Input a number less than 1", "pointPage": "There is a page to show url of pictures. <strong>Don't</strong> openning in the browser. You can copy them to the downloader tools for download picture.<br />Have no idea? Look at <a href=\"https://github.com/FoXZilla/Pxer/issues/166\" target=\"_blank\">there</a> for what does the senior .<br />" }, "button": { "selectAll": "Select All", "retryTheSelected": "Retry Selected", "preview": "Preview", "print": "Print", "showAll": "Show All", "crawl": "Get", "load": "Load", "stop": "Stop", "option": "Option", "apply": "Apply", "successBut": "Trouble" }, "option": { "ugoiraMax": "Max ZIP", "ugoira600p": "600p ZIP", "ugoiraConfig": "config", "max": "MAX", "cover600p": "Cover Only(600p)", "no": "No" }, "label": { "pictureId": "ID", "reason": "Reason", "way": "Way", "onlyGetTop": "Only get top:", "onlyGetBeforeId": "Only get the picture before id (newer than that):", "likeCount": "Like Count", "viewCount": "View Count", "singleIllust": "Single Illust", "multipleIllust": "Multiple Illust", "singleManga": "Single Manga", "multipleManga": "Multiple Manga", "ugoira": "Ugoira", "likeProportion": "Like Proportion", "whatever": "Whatever", "exclude": "Exclude", "mustInclude": "Must Include" }, "title": { "printOptions": "Print Options", "filterByTag": "Filter by tag", "filterOptions": "Filter Options" }, "pageType": { "member_works": "List of Works", "member_works_new": "SPA List of Works", "search": "Search", "search_spa": "SPA Tag Search", "search_tag": "Tag Search", "bookmark_works": "List of bookmark", "rank": "Rank", "bookmark_new": "New Works", "discovery": "Discovery", "unknown": "Unknown" }, "hello": "yahello" }) ; // public/i18n/zh.json pxer.util.set(pxer, 'i18nMap.zh', { "phrase": { "taskInfo": "`共计${worksNum}个作品,${address}个下载地址。<br />单张图片作品占 ${(single/worksNum*100).toFixed(1)}%<br />多张图片作品占 ${(multiple/worksNum*100).toFixed(1)}%<br />`", "blockOpen": "Pxer:\n浏览器拦截了弹出窗口,请检查浏览器提示,设置允许此站点的弹出式窗口。", "likeProportion": "若输入,则必须为一个小于1的数字", "pointPage": "这个页面是抓取到的下载地址,<strong>不要</strong>直接在浏览器打开,你可以将它们复制到第三方下载工具中下载<br />不知道用什么工具?<a href=\"https://github.com/FoXZilla/Pxer/issues/8\" target=\"_blank\">访问这里</a>来看看大家都在用什么工具下载<br />" }, "button": { "selectAll": "全选", "retryTheSelected": "重试选中", "preview": "预览", "print": "输出", "showAll": "展开全部", "crawl": "抓取", "load": "载入", "stop": "停止", "option": "设置", "apply": "保存", "successBut": "部分成功" }, "option": { "ugoiraMax": "最大压缩包", "ugoira600p": "600p压缩包", "ugoiraConfig": "参数", "max": "最大", "cover600p": "仅封面(600p)", "no": "不输出" }, "label": { "pictureId": "图片ID", "reason": "失败原因", "way": "解决方案", "onlyGetTop": "仅抓取前x副:", "onlyGetBeforeId": "仅抓取id为x之前的(比x更加新的):", "likeCount": "点赞数", "viewCount": "浏览数", "singleIllust": "单张插画", "multipleIllust": "多张插画", "singleManga": "单张漫画", "multipleManga": "多张漫画", "ugoira": "动图", "likeProportion": "点赞率", "whatever": "无所谓", "exclude": "不能包含", "mustInclude": "必须包含" }, "title": { "printOptions": "输出选项", "filterByTag": "按标签过滤", "filterOptions": "过滤选项" }, "pageType": { "member_works": "作品列表页", "member_works_new": "作品列表页_", "search": "检索页", "search_spa": "SPA检索页", "search_tag": "标签搜索页", "bookmark_works": "收藏列表页", "rank": "排行榜", "bookmark_new": "关注的新作品", "discovery": "探索", "unknown": "未知" }, "hello": "你好" }) ; // public/i18n/ja.json pxer.util.set(pxer, 'i18nMap.ja', { "phrase": { "taskInfo": "`小計${worksNum}個作品,${address}個ダウンロードアドレス。<br />シングル画像作品割合 ${(single/worksNum*100).toFixed(1)}%<br />複数画像作品割合 ${(multiple/worksNum*100).toFixed(1)}%<br />`", "blockOpen": "Pxer:\nブラウザでポップアップがブロックされています。ブラウザのプロンプトを確認して、このサイトのポップアップブロックを許可する操作を行ってください。", "likeProportion": "1 未満の数値を入力してください。", "pointPage": "このページはクロールされたダウンロードアドレスです。ブラウザで直接<strong>開かないで下さい</strong>。サードパーティのダウンロードツールにコピーして実行します。<br />適用ツールが分からない場合<a href=\"https://github.com/FoXZilla/Pxer/issues/8\" target=\"_blank\">こちら</a>皆さんはどんなツールが使用していますか<br />" }, "button": { "selectAll": "全て選択", "retryTheSelected": "選択を再試行", "preview": "プレビュー", "print": "プリント", "showAll": "全て表示", "crawl": "クロール", "load": "ロード", "stop": "ストップ", "option": "設定", "apply": "適用", "successBut": "トラブル" }, "option": { "ugoiraMax": "Max ZIP", "ugoira600p": "600p ZIP", "ugoiraConfig": "config", "max": "Max", "cover600p": "カバーのみ(600p)", "no": "プリント不要" }, "label": { "pictureId": "画像ID", "reason": "失敗原因", "way": "解決方法", "onlyGetTop": "Top X 枚のみ:", "onlyGetBeforeId": "ID<Xの画像のみ:", "likeCount": "いいね!数", "viewCount": "ビュー数", "singleIllust": "シングルイラスト", "multipleIllust": "複数のイラスト", "singleManga": "シングル漫画", "multipleManga": "複数の漫画", "ugoira": "うごイラ", "likeProportion": "いいね!割合", "whatever": "何でもOK", "exclude": "含まない", "mustInclude": "含む必要" }, "title": { "printOptions": "プリントオプション", "filterByTag": "タグでフィルター", "filterOptions": "フィルターオプション" }, "pageType": { "member_works": "作品リスト", "member_works_new": "SPA 作品リスト", "search": "検索", "search_spa": "SPA タグ検索", "search_tag": "タグ検索", "bookmark_works": "お気に入りリスト", "rank": "ランク", "bookmark_new": "お気に入り新作品", "discovery": "発見", "unknown": "アンノウン" }, "hello": "ようこそ" }) ; // src/app/PxerFilter.js "use strict"; class PxerFilter { /** * @param {Object} config - 过滤参数 * @see PxerFilter.filterInfo * @see PxerFilter.filterTag * */ constructor(config) { /** * 每次过滤后得到的累计的作品集合 * @type {PxerWorks[]} * */ this.passWorks = []; /** * 过滤的配置信息 * @see PxerFilter.filterInfo * @see PxerFilter.filterTag * */ this.config = Object.assign(PxerFilter.defaultConfig(), config); } /** * 对作品进行过滤 * @param {PxerWorks[]} worksList - 要过滤的作品数组 * @return {PxerWorks[]} - 过滤后的结果 * */ filter(worksList) { var resultSet = PxerFilter.filterInfo( PxerFilter.filterTag(worksList, this.config), this.config ); this.passWorks.push(...resultSet); return resultSet; } } /** * 返回PxerFilter的默认配置参数 * @see PxerFilter.filterInfo * @see PxerFilter.filterTag * */ PxerFilter.defaultConfig = function () { return { rated: 0, //赞的数量 rated_pro: 0, //点赞率 view: 0, //浏览数 has_tag_every: [], // 作品中不能含有以下任意一个标签 has_tag_some: [], // 作品中不能同时含有以下所有标签 no_tag_any: [], // 作品中必须含有以下任意一个标签 no_tag_every: [], // 作品中必须同时含有以下所有标签 }; }; /** * 根据标签作品信息过滤作品 * @param {PxerWorks[]} worksList * @param {number} rated - 作品不小于的赞的数量 * @param {number} rated_pro - 作品不小于的点赞率,小于0的数字 * @param {number} view - 作品不小于的浏览数 * @return {PxerWorks[]} * */ PxerFilter.filterInfo = function ( worksList, { rated = 0, rated_pro = 0, view = 0 } ) { return worksList.filter(function (works) { return ( works.ratedCount >= rated && works.viewCount >= view && works.ratedCount / works.viewCount >= rated_pro ); }); }; /** * 根据标签过滤作品 * @param {PxerWorks[]} worksList * @param {string[]} no_tag_any - 作品中不能含有里面的任意一个标签 * @param {string[]} no_tag_every - 作品中不能同时含有里面的所有标签 * @param {string[]} has_tag_some - 作品中必须含有有里面的任意一个标签 * @param {string[]} has_tag_every - 作品中必须同时含有里面的所有标签 * @return {PxerWorks[]} * */ PxerFilter.filterTag = function ( worksList, { has_tag_every, has_tag_some, no_tag_any, no_tag_every } ) { var passWorks = worksList; if (has_tag_every && has_tag_every.length !== 0) { passWorks = passWorks.filter(function (works) { return has_tag_every.every((tag) => works.tagList.indexOf(tag) !== -1); }); } if (has_tag_some && has_tag_some.length !== 0) { passWorks = passWorks.filter(function (works) { return has_tag_some.some((tag) => works.tagList.indexOf(tag) !== -1); }); } if (no_tag_any && no_tag_any.length !== 0) { passWorks = passWorks.filter(function (works) { return !no_tag_any.some((tag) => works.tagList.indexOf(tag) !== -1); }); } if (no_tag_every && no_tag_every.length !== 0) { passWorks = passWorks.filter(function (works) { return !no_tag_every.every((tag) => works.tagList.indexOf(tag) !== -1); }); } return passWorks; }; ; // src/app/PxerHtmlParser.js "use strict"; class PxerHtmlParser { constructor() { throw new Error("PxerHtmlParse could not construct"); } } /** * 解析页码任务对象 * @param {PxerPageRequest} task - 抓取后的页码任务对象 * @return {PxerWorksRequest[]|false} - 解析得到的作品任务对象 * */ PxerHtmlParser.parsePage = function (task) { if (!(task instanceof PxerPageRequest)) { window["PXER_ERROR"] = "PxerHtmlParser.parsePage: task is not PxerPageRequest"; return false; } if (!task.url || !task.html) { window["PXER_ERROR"] = "PxerHtmlParser.parsePage: task illegal"; return false; } const parseList = function (elt) { return JSON.parse(elt.getAttribute("data-items")).filter( (i) => !i.isAdContainer ); // skip AD }; var taskList = []; switch (task.type) { case "userprofile_manga": case "userprofile_illust": case "userprofile_all": var response = JSON.parse(task.html).body; if (task.type !== "userprofile_illust") { for (let elt in response.manga) { let tsk = new PxerWorksRequest({ html: {}, type: null, isMultiple: null, id: elt, }); tsk.url = PxerHtmlParser.getUrlList(tsk); taskList.push(tsk); } } if (task.type !== "userprofile_manga") { for (let elt in response.illusts) { var tsk = new PxerWorksRequest({ html: {}, type: null, isMultiple: null, id: elt, }); tsk.url = PxerHtmlParser.getUrlList(tsk); taskList.push(tsk); } } break; case "bookmark_works": var response = JSON.parse(task.html).body; for (let worki in response.works) { let work = response.works[worki]; let tsk = new PxerWorksRequest({ html: {}, type: this.parseIllustType(work.illustType), isMultiple: work.pageCount > 1, id: work.id, }); tsk.url = PxerHtmlParser.getUrlList(tsk); taskList.push(tsk); } break; case "member_works": var dom = PxerHtmlParser.HTMLParser(task.html); var elts = dom.body.querySelectorAll("a.work._work"); for (let elt of elts) { var task = new PxerWorksRequest({ html: {}, type: (function (elt) { switch (true) { case elt.matches(".ugoku-illust"): return "ugoira"; case elt.matches(".manga"): return "manga"; default: return "illust"; } })(elt), isMultiple: elt.matches(".multiple"), id: elt.getAttribute("href").match(/illust_id=(\d+)/)[1], }); task.url = PxerHtmlParser.getUrlList(task); taskList.push(task); } break; case "rank": var data = JSON.parse(task.html); for (var task of data["contents"]) { var task = new PxerWorksRequest({ html: {}, type: this.parseIllustType(task["illust_type"]), isMultiple: task["illust_page_count"] > 1, id: task["illust_id"].toString(), }); task.url = PxerHtmlParser.getUrlList(task); taskList.push(task); } break; case "discovery": var data = JSON.parse(task.html); for (var id of data.recommendations) { var task = new PxerWorksRequest({ html: {}, type: null, isMultiple: null, id: id.toString(), }); task.url = PxerHtmlParser.getUrlList(task); taskList.push(task); } break; case "search": var dom = PxerHtmlParser.HTMLParser(task.html); var searchData = parseList( dom.body.querySelector("input#js-mount-point-search-result-list") ); for (var searchItem of searchData) { var task = new PxerWorksRequest({ html: {}, type: this.parseIllustType(searchItem.illustType), isMultiple: searchItem.pageCount > 1, id: searchItem.illustId, }); task.url = PxerHtmlParser.getUrlList(task); taskList.push(task); } break; case "bookmark_new": var data = JSON.parse(task.html); for (var task of data.body.thumbnails.illust) { var task = new PxerWorksRequest({ html: {}, type: this.parseIllustType(task.illustType), isMultiple: task.pageCount > 1, id: task.id, }); task.url = PxerHtmlParser.getUrlList(task); taskList.push(task); } break; case "search_spa": case "search_tag": var response = JSON.parse(task.html).body; for (let illust of response.illustManga.data) { var tsk = new PxerWorksRequest({ html: {}, type: null, isMultiple: null, id: illust.id, }); tsk.url = PxerHtmlParser.getUrlList(tsk); taskList.push(tsk); } break; default: const msg = `Unknown PageWorks type ${task.type}`; pxer.log(msg); throw new Error(msg); } if (taskList.length < 1) { window["PXER_ERROR"] = "PxerHtmlParser.parsePage: result empty"; return false; } return taskList; }; /** * 解析作品任务对象 * @param {PxerWorksRequest} task - 抓取后的页码任务对象 * @return {PxerWorks} - 解析得到的作品任务对象 * */ PxerHtmlParser.parseWorks = function (task, options) { if (!(task instanceof PxerWorksRequest)) { window["PXER_ERROR"] = "PxerHtmlParser.parseWorks: task is not PxerWorksRequest"; return false; } if (!task.url.every((item) => task.html[item])) { window["PXER_ERROR"] = "PxerHtmlParser.parseWorks: task illegal"; return false; } for (let url in task.html) { if (options.isQuick) { let works = Object.entries(JSON.parse(task.html[url]).body.works); works = works.map(([id, work]) => { work.tags = { tags: work.tags.map((tag) => { return { tag, }; }), }; work.viewCount = work.viewCount ?? 100000000; work.bookmarkCount = work.bookmarkCount ?? 100000000; work.urls = { original: work.url.replace("_square1200", ""), }; let tsk = new PxerWorksRequest({ html: { [`https://www.pixiv.net/ajax/illust/${id}`]: JSON.stringify({ body: work, }), }, type: null, isMultiple: null, id: id, completed: true, }); return tsk; }); const pw = []; for (let work of works) { let data = { dom: "", task: work, }; try { pw.push(PxerHtmlParser.parseMediumHtml(data)); } catch (e) { pxer.log(`Error in parsing task of`, task); pxer.log(e); window["PXER_ERROR"] = `${task.id}:${e.message}`; if (window["PXER_MODE"] === "dev") console.error(task, e); continue; } } return pw; } else { let data = { dom: PxerHtmlParser.HTMLParser(task.html[url]), task: task, }; try { var pw = PxerHtmlParser.parseMediumHtml(data); } catch (e) { pxer.log(`Error in parsing task of`, task); pxer.log(e); window["PXER_ERROR"] = `${task.id}:${e.message}`; if (window["PXER_MODE"] === "dev") console.error(task, e); return false; } } return pw; } }; /** * @param {PxerWorksRequest} task * @return {Array} * */ PxerHtmlParser.getUrlList = function (task) { return [ pxer.URLGetter.illustInfoById(task.id), // "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=" + task.id, ]; }; PxerHtmlParser.parseMediumHtml = function ({ task, dom }) { var illustData = JSON.parse( task.html[pxer.URLGetter.illustInfoById(task.id)] ).body; var pw; switch (true) { case illustData.illustType === 2: pw = new PxerUgoiraWorks(); break; case illustData.pageCount > 1: pw = new PxerMultipleWorks(); break; default: pw = new PxerWorks(); break; } pw.id = task.id; pw.type = this.parseIllustType(illustData.illustType); pw.tagList = illustData.tags.tags.map((e) => e.tag); pw.viewCount = illustData.viewCount; pw.ratedCount = illustData.bookmarkCount; if (pw instanceof PxerMultipleWorks) { pw.multiple = illustData.pageCount; } if (pw.type === "ugoira") { var xhr = new XMLHttpRequest(); xhr.open( "GET", "https://www.pixiv.net/ajax/illust/" + task.id + "/ugoira_meta", false ); xhr.send(); var meta = JSON.parse(xhr.responseText); let src = meta["body"]["originalSrc"]; let URLObj = parseURL(src); pw.domain = URLObj.domain; pw.date = src.match(PxerHtmlParser.REGEXP["getDate"])[1]; pw.frames = { framedef: meta["body"]["frames"], height: illustData.height, width: illustData.width, }; } else { let src = illustData.urls.original; let URLObj = parseURL(src); pw.domain = URLObj.domain; pw.date = src.match(PxerHtmlParser.REGEXP["getDate"])[1]; pw.fileFormat = src.match(/\.(jpg|gif|png)$/)[1]; } return pw; }; PxerHtmlParser.parseIllustType = function (type) { switch (type.toString()) { case "0": case "illust": return "illust"; case "1": case "manga": return "manga"; case "2": case "ugoira": return "ugoira"; } return null; }; PxerHtmlParser.REGEXP = { getDate: /img\/((?:\d+\/){5}\d+)/, getInitData: /\{token:.*\}(?=\);)/, }; PxerHtmlParser.HTMLParser = function (aHTMLString) { var dom = document.implementation.createHTMLDocument(""); dom.documentElement.innerHTML = aHTMLString; return dom; }; /**@param {Element} img*/ PxerHtmlParser.getImageUrl = function (img) { return img.getAttribute("src") || img.getAttribute("data-src"); }; PxerHtmlParser.parseObjectLiteral = (function () { // Javascript object literal parser // Splits an object literal string into a set of top-level key-value pairs // (c) Michael Best (https://github.com/mbest) // License: MIT (http://www.opensource.org/licenses/mit-license.php) // Version 2.1.0 // https://github.com/mbest/js-object-literal-parse // This parser is inspired by json-sans-eval by Mike Samuel (http://code.google.com/p/json-sans-eval/) // These two match strings, either with double quotes or single quotes var stringDouble = '"(?:[^"\\\\]|\\\\.)*"', stringSingle = "'(?:[^'\\\\]|\\\\.)*'", // Matches a regular expression (text enclosed by slashes), but will also match sets of divisions // as a regular expression (this is handled by the parsing loop below). stringRegexp = "/(?:[^/\\\\]|\\\\.)*/w*", // These characters have special meaning to the parser and must not appear in the middle of a // token, except as part of a string. specials = ",\"'{}()/:[\\]", // Match text (at least two characters) that does not contain any of the above special characters, // although some of the special characters are allowed to start it (all but the colon and comma). // The text can contain spaces, but leading or trailing spaces are skipped. everyThingElse = "[^\\s:,/][^" + specials + "]*[^\\s" + specials + "]", // Match any non-space character not matched already. This will match colons and commas, since they're // not matched by "everyThingElse", but will also match any other single character that wasn't already // matched (for example: in "a: 1, b: 2", each of the non-space characters will be matched by oneNotSpace). oneNotSpace = "[^\\s]", // Create the actual regular expression by or-ing the above strings. The order is important. token = RegExp( stringDouble + "|" + stringSingle + "|" + stringRegexp + "|" + everyThingElse + "|" + oneNotSpace, "g" ), // Match end of previous token to determine whether a slash is a division or regex. divisionLookBehind = /[\])"'A-Za-z0-9_$]+$/, keywordRegexLookBehind = { in: 1, return: 1, typeof: 1 }; function trim(string) { return string == null ? "" : string.trim ? string.trim() : string.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g, ""); } return function (objectLiteralString) { // Trim leading and trailing spaces from the string var str = trim(objectLiteralString); // Trim braces '{' surrounding the whole object literal if (str.charCodeAt(0) === 123) str = str.slice(1, -1); // Split into tokens var result = [], toks = str.match(token), key, values = [], depth = 0; if (toks) { // Append a comma so that we don't need a separate code block to deal with the last item toks.push(","); for (var i = 0, tok; (tok = toks[i]); ++i) { var c = tok.charCodeAt(0); // A comma signals the end of a key/value pair if depth is zero if (c === 44) { // "," if (depth <= 0) { if (!key && values.length === 1) { key = values.pop(); } result.push([key, values.length ? values.join("") : undefined]); key = undefined; values = []; depth = 0; continue; } // Simply skip the colon that separates the name and value } else if (c === 58) { // ":" if (!depth && !key && values.length === 1) { key = values.pop(); continue; } // A set of slashes is initially matched as a regular expression, but could be division } else if (c === 47 && i && tok.length > 1) { // "/" // Look at the end of the previous token to determine if the slash is actually division var match = toks[i - 1].match(divisionLookBehind); if (match && !keywordRegexLookBehind[match[0]]) { // The slash is actually a division punctuator; re-parse the remainder of the string (not including the slash) str = str.substr(str.indexOf(tok) + 1); toks = str.match(token); toks.push(","); i = -1; // Continue with just the slash tok = "/"; } // Increment depth for parentheses, braces, and brackets so that interior commas are ignored } else if (c === 40 || c === 123 || c === 91) { // '(', '{', '[' ++depth; } else if (c === 41 || c === 125 || c === 93) { // ')', '}', ']' --depth; // The key will be the first token; if it's a string, trim the quotes } else if (!key && !values.length && (c === 34 || c === 39)) { // '"', "'" tok = tok.slice(1, -1); } values.push(tok); } } return result; }; })(); PxerHtmlParser.getKeyFromStringObjectLiteral = function (s, key) { var resolvedpairs = this.parseObjectLiteral(s); for (var pair of resolvedpairs) { if (pair[0] === key) return pair[1]; } return false; }; pxer.URLGetter = { illustInfoById(id) { return "https://www.pixiv.net/ajax/illust/" + id; }, search({ url = document.URL, page = 0 } = {}) { const defaultQueryString = "s_mode=s_tag_full"; const queryString = url.split("?")[1]; const query = new URLSearchParams(queryString); const tagsMatch = url.match(pxer.regexp.parseKeyword); let word = null; if (tagsMatch) { word = tagsMatch[1]; } else { word = encodeURIComponent(query.get("word")); } return `https://www.pixiv.net/ajax/search/artworks/${word}?${defaultQueryString}&${queryString}&p=${ page + 1 }`; }, bookmarkNew({ page = 0 }) { return ( "https://www.pixiv.net/ajax/follow_latest/illust?mode=all&lang=zh&p=" + (page + 1) ); }, }; ; // src/app/PxerPrinter.js class PxerPrinter { constructor(config, taskOption) { this.taskOption = taskOption; /** * 计算得到的下载地址 * @type {string[]} * */ this.address = []; /**计算得到的任务信息*/ this.taskInfo = ""; /**剥离的动图参数*/ this.ugoiraFrames = {}; /**配置信息*/ this.config = PxerPrinter.defaultConfig(); config && this.setConfig(config); } /** * 设置配置信息 * @param {string|Object} key - 要设置的key或是一个将被遍历合并的对象 * @param {string} [value] - 要设置的value * */ setConfig(key, value) { if (arguments.length === 1 && typeof key === "object") { let obj = key; for (let objKey in obj) { if (objKey in this.config) this.config[objKey] = obj[objKey]; else console.warn(`PxerPrinter.setConfig: skip key "${objKey}"`); } } else { if (!(key in this.config)) throw new Error(`PxerPrinter.setConfig: ${key} is not in config`); this.config[key] = value; } return this; } } /** * 根据作品列表将下载地址填充到PxerPrinter#address * @param {PxerWorks[]} worksList * @return {void} * */ PxerPrinter.prototype["fillAddress"] = function (worksList) { for (let works of worksList) { let configKey = PxerPrinter.getWorksKey(works); if (configKey === "ugoira_zip" && this.config["ugoira_frames"] === "yes") { this.ugoiraFrames[works.id] = works.frames; } if (!(configKey in this.config)) throw new Error(`PxerPrinter.fillAddress: ${configKey} in not in config`); if (this.config[configKey] === "no") continue; this.address.push( ...PxerPrinter.countAddress( works, this.taskOption, this.config[configKey] ) ); } }; /** * 根据作品将可读的下载信息填充到PxerPrinter#taskInfo * @param {PxerWorks[]} worksList * @return {void} * */ PxerPrinter.prototype["fillTaskInfo"] = function (worksList) { var [manga, ugoira, illust, multiple, single, worksNum, address] = new Array( 20 ).fill(0); for (let works of worksList) { let configKey = PxerPrinter.getWorksKey(works); if (this.config[configKey] === "no") continue; worksNum++; switch (works.type) { case "manga": manga++; break; case "ugoira": ugoira++; break; case "illust": illust++; break; default: console.error(works); throw new Error(`PxerPrinter.fillTaskInfo: works.type illegal`); break; } if (works.isMultiple) { multiple++; address += works.multiple; } else { address++; single++; } } this.taskInfo = eval(pxer.t("phrase.taskInfo")); }; /** * 将结果输出 * 确保下载地址和任务信息已被填充 * */ PxerPrinter.prototype["print"] = function () { /**判断输出动图参数*/ if ( this.config["ugoira_frames"] === "yes" && Object.keys(this.ugoiraFrames).length !== 0 ) { let win = window.open(document.URL, "_blank"); if (!win) { alert(pxer.t("phrase.blockOpen")); return; } var scriptname = ""; switch (navigator.platform) { case "Win32": scriptname = "bat批处理"; break; default: scriptname = "bash"; break; } let str = [ "<p>/** 这个页面是自动生成的使用FFmpeg自行合成动图的" + scriptname + '脚本,详细使用教程见<a href="http://pxer.pea3nut.org/md/ugoira_concat" target="_blank" >http://pxer.pea3nut.org/md/ugoira_concat</a> */</p>', '<textarea style="height:100%; width:100%" readonly>', ...this.generateUgoiraScript(this.ugoiraFrames), "</textarea>", ]; win.document.write(str.join("\n")); } { /**输出下载地址*/ let win = window.open(document.URL, "_blank"); if (!win) { alert(pxer.t("phrase.blockOpen")); return; } let str = [ `<p>${pxer.t("phrase.pointPage")}</p>`, `<p>${this.taskInfo}</p>`, '<textarea style="height:100%; width:100%" readonly>', this.address.join("\n"), "</textarea>", ]; win.document.write(str.join("\n")); } }; /** * 根据作品类型,生成配置信息的key * @param {PxerWorks} works * @return {string} * @see PxerPrinter.defaultConfig * */ PxerPrinter.getWorksKey = function (works) { var configKey = null; if (works.type === "ugoira") { configKey = "ugoira_zip"; } else { configKey = works.type + (works.isMultiple ? "_multiple" : "_single"); } return configKey; }; /** * 根据动图参数,生成ffmpeg脚本 * @param 动图参数 * @return {String[]} 生成的脚本行 * @see PxerPrinter.prototype['print'] */ PxerPrinter.prototype["generateUgoiraScript"] = function (frames) { var lines = []; var resstring; var ffmpeg; var isWindows = ["Win32", "Win64", "Windows", "WinCE"].indexOf(navigator.platform) !== -1; switch (this.config.ugoira_zip) { case "max": resstring = "1920x1080"; break; case "600p": resstring = "600x338"; break; } var slashstr = ""; if (isWindows) { slashstr = "^"; ffmpeg = "ffmpeg"; lines.push("@echo off"); lines.push("set /p ext=请输入输出文件扩展名(mp4/gif/...):"); } else { slashstr = "\\"; ffmpeg = "$ffmpeg"; lines.push("#!/bin/bash"); lines.push(""); lines.push( '{ hash ffmpeg 2>/dev/null && ffmpeg=ffmpeg;} || { [ -x ./ffmpeg ] && ffmpeg=./ffmpeg;} || { echo >&2 "Failed to locate ffmpeg executable. Aborting."; exit 1;}' ); lines.push("read -p '请输入输出文件扩展名(mp4/gif/...):' ext"); } for (let key in frames) { var foldername = key + "_ugoira" + resstring; var confpath = foldername + "/config.txt"; var height = frames[key].height; var width = frames[key].width; if (this.config.ugoira_zip === "600p") { var scale = Math.max(height, width) / 600; height = parseInt(height / scale); width = parseInt(width / scale); } lines.push( isWindows ? "del " + foldername + "\\config.txt >nul 2>nul" : "rm " + foldername + "/config.txt &> /dev/null" ); for (let frame of frames[key].framedef) { lines.push( "echo file " + slashstr + "'" + frame["file"] + slashstr + "' >> " + confpath ); lines.push("echo duration " + frame["delay"] / 1000 + " >> " + confpath); } lines.push( "echo file " + slashstr + "'" + frames[key].framedef[frames[key].framedef.length - 1]["file"] + slashstr + "' >> " + confpath ); lines.push(isWindows ? "if %ext%==gif (" : 'if [ $ext == "gif"]; then'); lines.push( ffmpeg + " -f concat -i " + confpath + " -vf palettegen " + foldername + "/palette.png" ); lines.push( ffmpeg + " -f concat -i " + confpath + " -i " + foldername + "/palette.png -lavfi paletteuse -framerate 30 -vsync -1 -s " + width + "x" + height + " " + foldername + "/remux." + (isWindows ? "%ext%" : "$ext") ); lines.push(isWindows ? ") else (" : "else"); lines.push( ffmpeg + " -f concat -i " + confpath + " -framerate 30 -vsync -1 -s " + width + "x" + height + " " + foldername + "/remux." + (isWindows ? "%ext%" : "$ext") ); lines.push(isWindows ? ")" : "fi"); } if (isWindows) { lines.push("echo 完成 & pause"); } else { lines.push('read -n 1 -p "完成,按任意键退出" m && echo'); } return lines; }; /**返回默认的配置对象*/ PxerPrinter.defaultConfig = function () { return { manga_single: "max", //[max|600p|no] manga_multiple: "max", //[max|1200p|cover_600p|no] illust_single: "max", //[max|600p|no] illust_multiple: "max", //[max|1200p|cover_600p|no] ugoira_zip: "no", //[max|600p|no] ugoira_frames: "no", //[yes|no] }; }; /**作品页跳过过滤 */ PxerPrinter.printAllConfig = function () { return { manga_single: "max", //[max|600p|no] manga_multiple: "max", //[max|1200p|cover_600p|no] illust_single: "max", //[max|600p|no] illust_multiple: "max", //[max|1200p|cover_600p|no] ugoira_zip: "max", //[max|600p|no] ugoira_frames: "yes", //[yes|no] }; }; /** * 拼装动图原始地址 * @param {PxerUgoiraWorks} works - 作品 * @param {string} [type] - 拼装类型 [max|600p] * @return {Array} * */ PxerPrinter.getUgoira = function (works, taskOption, type = "max") { const tpl = { max: "https://#domain#/img-zip-ugoira/img/#date#/#id#_ugoira1920x1080.zip", "600p": "https://#domain#/img-zip-ugoira/img/#date#/#id#_ugoira600x600.zip", }; var address = tpl[type]; if (!address) throw new Error(`PxerPrint.getUgoira: unknown type "${type}"`); for (let key in works) { address = address.replace(`#${key}#`, works[key]); } return [address]; }; /** * 拼装多副原始地址 * @param {PxerMultipleWorks} works - 作品 * @param {string} [type] - 拼装类型 [max|1200p|cover_600p] * @return {Array} * */ PxerPrinter.getMultiple = function (works, taskOption, type = "max") { const tpl = { max: "https://#domain#/img-original/img/#date#/#id#_p#index#.#fileFormat#", "1200p": "https://#domain#/c/1200x1200/img-master/img/#date#/#id#_p#index#_master1200.jpg", cover_600p: "https://#domain#/c/600x600/img-master/img/#date#/#id#_p0_master1200.jpg", }; if (taskOption.isQuick) { let address = tpl[type]; if (!address) throw new Error(`PxerPrint.getMultiple: unknown type "${type}"`); // 由于不知道是jpg还是png,所以要渲染两次 works["fileFormat"] = "jpg"; for (let key in works) { address = address.replace(`#${key}#`, works[key]); } //渲染多张 var addressList1 = []; for (let i = 0; i < works.multiple; i++) { addressList1.push(address.replace("#index#", i)); } address = tpl[type]; works["fileFormat"] = "png"; for (let key in works) { address = address.replace(`#${key}#`, works[key]); } //渲染多张 var addressList2 = []; for (let i = 0; i < works.multiple; i++) { addressList2.push(address.replace("#index#", i)); } console.log([...addressList1, ...addressList2]); return [...addressList1, ...addressList2]; } else { let address = tpl[type]; if (!address) throw new Error(`PxerPrint.getMultiple: unknown type "${type}"`); for (let key in works) { address = address.replace(`#${key}#`, works[key]); } //渲染多张 var addressList = []; for (let i = 0; i < works.multiple; i++) { addressList.push(address.replace("#index#", i)); } return addressList; } }; /** * 拼装单副原始地址 * @param {PxerWorks} works - 作品 * @param {string=max} [type] - 拼装类型 [max|600p] * @return {Array} * */ PxerPrinter.getWorks = function (works, taskOption, type = "max") { const tpl = { max: "https://#domain#/img-original/img/#date#/#id#_p0.#fileFormat#", "600p": "https://#domain#/c/600x600/img-master/img/#date#/#id#_p0_master1200.jpg", }; if (taskOption.isQuick) { const addressList = []; var addressTemplate = tpl[type]; if (!addressTemplate) throw new Error(`PxerPrint.getWorks: unknown type "${type}"`); works["fileFormat"] = "jpg"; let address = addressTemplate; for (let key in works) { address = address.replace(`#${key}#`, works[key]); } addressList.push(address); works["fileFormat"] = "png"; address = addressTemplate; for (let key in works) { address = address.replace(`#${key}#`, works[key]); } addressList.push(address); return addressList; } else { let address = tpl[type]; if (!address) throw new Error(`PxerPrint.getWorks: unknown type "${type}"`); for (let key in works) { address = address.replace(`#${key}#`, works[key]); } return [address]; } }; /** * 智能拼装原始地址,对上述的简单封装 * @param {PxerWorks} [works] * @param {...arguments} [argn] * @return {Array} * */ PxerPrinter.countAddress = function (works, taskOption, argn) { switch (true) { case works.type === "ugoira": return PxerPrinter.getUgoira(...arguments); case works.isMultiple: return PxerPrinter.getMultiple(...arguments); default: return PxerPrinter.getWorks(...arguments); } }; ; // src/app/PxerThread.js class PxerThread extends PxerEvent { /** * @param id {string} 线程的ID,便于调试 * @param {Object} config 线程的配置信息 * */ constructor({ id, config } = {}) { super(["load", "error", "fail"]); /**当前线程的ID*/ this.id = id; /** * 当前线程的状态 * - free * - ready * - error * - fail * - running * */ this.state = "free"; /**线程执行的任务*/ this.task = null; /** * * */ this.config = config || { /**ajax超时重试时间*/ timeout: 8000, /**最多重试次数*/ retry: 5, }; /**运行时参数*/ this.runtime = {}; /**使用的xhr对象*/ this.xhr = null; } } /** * 对抓取到的URL和HTML进行校验 * @param {string} url * @param {string} html * @return {string|true} 返回字符串表示失败 * */ PxerThread.checkRequest = function (url, html) { if (!html) return "empty"; if (html.indexOf("_no-item _error") !== -1) { if (html.indexOf("sprites-r-18g-badge") !== -1) return "r-18g"; if (html.indexOf("sprites-r-18-badge") !== -1) return "r-18"; } if (html.indexOf("sprites-mypixiv-badge") !== -1) return "mypixiv"; return true; }; /**终止线程的执行*/ PxerThread.prototype["stop"] = function () { this.xhr.abort(); }; /** * 初始化线程 * @param {PxerRequest} task * */ PxerThread.prototype["init"] = function (task) { this.task = task; this.runtime = {}; this.state = "ready"; // 必要的检查 if (Number.isNaN(+this.config.timeout) || Number.isNaN(+this.config.retry)) { throw new Error(`PxerThread#init: ${this.id} config illegal`); } //判断行为,读取要请求的URL if (this.task instanceof PxerWorksRequest) { this.runtime.urlList = this.task.url.slice(); // this.runtime.urlList.push(pxer.URLGetter.illustInfoById(this.task.id)); } else if (this.task instanceof PxerPageRequest) { this.runtime.urlList = [this.task.url]; } else { this.dispatch("error", `PxerThread#${this.id}.init: unknown task`); return false; } }; /** * 使用PxerThread#xhr发送请求 * @param {string} url * */ PxerThread.prototype["sendRequest"] = function (url) { this.state = "running"; this.xhr.open("GET", url, true); // 单副漫画请求需要更改Referer头信息 if ( this.task instanceof PxerWorksRequest && this.task.type === "manga" && this.task.isMultiple === false && /mode=big/.test(url) ) { var referer = this.task.url.find( (item) => item.indexOf("mode=medium") !== -1 ); var origin = document.URL; if (!referer) { this.dispatch("error", "PxerThread.sendRequest: cannot find referer"); } history.replaceState({}, null, referer); this.xhr.send(); history.replaceState({}, null, origin); } else { this.xhr.send(); } }; /**运行线程*/ PxerThread.prototype["run"] = function _self(oldUrl) { const startTime = +new Date(); const URL = oldUrl || this.runtime.urlList.shift(); if (!URL) { this.state = "free"; this.task.completed = true; this.dispatch("load", this.task); return true; } const XHR = new XMLHttpRequest(); this.xhr = XHR; XHR.timeout = this.config.timeout; XHR.responseType = "text"; var retry = 0; XHR.addEventListener("timeout", () => { if (++retry > this.config.retry) { this.state = "fail"; this.dispatch( "fail", new PxerFailInfo({ task: this.task, url: URL, type: "timeout", xhr: XHR, }) ); return false; } else { this.sendRequest(URL); } }); XHR.addEventListener("load", () => { if (XHR.status === 429) { setTimeout(() => { _self.call(this, URL); //递归 }, 5000); return false; } if (XHR.status.toString()[0] !== "2" && XHR.status !== 304) { this.state = "fail"; this.dispatch( "fail", new PxerFailInfo({ task: this.task, url: URL, type: "http:" + XHR.status, }) ); return false; } // 判断是否真的请求成功 var msg = PxerThread.checkRequest(URL, XHR.responseText); if (msg !== true) { this.state = "fail"; this.dispatch("fail", { task: this.task, url: URL, type: msg, }); return false; } // 执行成功回调 if (this.task instanceof PxerWorksRequest) { this.task.html[URL] = XHR.responseText; } else { this.task.html = XHR.responseText; } setTimeout(() => { _self.call(this); //递归 }, 2000 - (+new Date() - startTime)); return true; }); XHR.addEventListener("error", () => { this.state = "error"; this.dispatch("error", { task: this.task, url: URL, }); }); this.sendRequest(URL); }; ; // src/app/PxerThreadManager.js class PxerThreadManager extends PxerEvent { /** * @param {number} timeout - 超时时间 * @param {number} retry - 重试次数 * @param {number} thread - 线程数 * */ constructor({ timeout = 5000, retry = 3, thread = 1 } = {}) { super(["load", "error", "fail", "warn"]); this.config = { timeout, retry, thread }; /** * 任务列表 * @type {PxerRequest[]} * */ this.taskList = []; /**执行的任务列表的指针,指派了下一条要执行的任务*/ this.pointer = 0; /** * 存放的线程对象 * @type {PxerThread[]} * */ this.threads = []; /** * 每当执行任务开始前调用的中间件 * @type {Function[]} 返回true继续执行,false终止执行 * */ this.middleware = [ function (task) { return !!task; }, ]; /**运行时用到的变量*/ this.runtime = {}; } } /** * 停止线程的执行,实际上假装任务都执行完了 * 停止后还会触发load事件,需要一段时间 * */ PxerThreadManager.prototype["stop"] = function () { this.pointer = this.taskList.length + 1; }; /** * 初始化线程管理器 * @param {PxerRequest[]} taskList * */ PxerThreadManager.prototype["init"] = function (taskList) { if (!this.taskList.every((request) => request instanceof PxerRequest)) { this.dispatch("error", "PxerThreadManager.init: taskList is illegal"); return false; } // 初始任务与结果 this.taskList = taskList; this.runtime = {}; this.pointer = 0; // 建立线程对象 this.threads = []; for (let i = 0; i < this.config.thread; i++) { this.threads.push( new PxerThread({ id: i, config: { timeout: this.config.timeout, retry: this.config.retry, }, }) ); } return this; }; /** * 运行线程管理器 * */ PxerThreadManager.prototype["run"] = function () { if (this.taskList.length === 0) { this.dispatch("warn", "PxerApp#run: taskList.length is 0"); this.dispatch("load", []); return false; } for (let thread of this.threads) { thread.on("load", (data) => { next(this, thread); }); thread.on("fail", (pfi) => { this.dispatch("fail", pfi); next(this, thread); }); thread.on("error", this.dispatch.bind(this, "error")); next(this, thread); } function next(ptm, thread) { if (ptm.middleware.every((fn) => fn(ptm.taskList[ptm.pointer]))) { thread.init(ptm.taskList[ptm.pointer++]); thread.run(); } else if ( ptm.threads.every( (thread) => ["free", "fail", "error"].indexOf(thread.state) !== -1 ) ) { ptm.dispatch("load", ptm.taskList); } } }; ; // src/app/PxerApp.js "use strict"; /** * Pxer主程序对象,与所有模块都是强耦合关系 * 若你想阅读源码,建议不要从这个类开始 * @class * */ class PxerApp extends PxerEvent { constructor() { /** * 可能被触发的事件 * - stop 被终止时 * - error 出错时 * - executeWroksTask 执行作品抓取时 * - finishWorksTask 完成作品抓取时 * - executePageTask 执行页码抓取时 * - finishPageTask 完成页码抓取时 * - finishTask 完成所有任务 * */ super([ "executeWroksTask", "executePageTask", "finishWorksTask", "finishPageTask", "error", "stop", ]); /** * 当前页面类型。可能的值 * @type {string} * */ this.pageType = getPageType(document); /** * 页面的作品数量 * @type {number|null} * @see PxerApp.init * */ this.worksNum = null; /** * 任务队列 * @type {PxerRequest[]} * */ this.taskList = []; /** * 失败的任务信息 * @type {PxerFailInfo[]} * */ this.failList = []; /** * 抓取到的结果集 * @type {PxerWorks[]} * */ this.resultSet = []; /** * 过滤得到的结果集 * @type {PxerWorks[]} * */ this.filterResult = []; /** * 任务配置选项,用来指派任务执行过程中的一些逻辑 * 必须在PxerApp#initPageTask调用前配置 * */ this.taskOption = { /**仅抓取前几副作品*/ limit: null, /**遇到id为x的作品停止后续,不包括本id*/ stopId: null, isQuick: true, }; // 其他对象的配置参数 this.ptmConfig = { //PxerThreadManager timeout: 5000, retry: 3, thread: 2, }; this.ppConfig = this.pageType.startsWith("works_") ? PxerPrinter.printAllConfig() : PxerPrinter.defaultConfig(); //PxerPrinter this.pfConfig = PxerFilter.defaultConfig(); //PxerFilter // 使用的PxerThreadManager实例 this.ptm = null; pxer.app = this; } static canCrawl(doc = document) { return [ "search", "search_spa", "search_tag", "works_medium", "rank", "bookmark_new", "discovery", "bookmark_works", "member_works_new", ].includes(pxer.util.getPageType(doc)); } /** * 初始化时的耗时任务 */ async init() { this.worksNum = await PxerApp.getWorksNum(document); } /** * 停止执行当前任务 * 调用后仍会触发对应的finish*事件 * */ stop() { this.dispatch("stop"); this.ptm.stop(); } /**初始化批量任务*/ initPageTask() { if ( typeof this.pageType !== "string" || typeof this.worksNum !== "number" ) { this.dispatch( "error", "PxerApp.initPageTask: pageType or number illegal" ); return false; } let onePageWorksNumber = getOnePageWorkCount(this.pageType); var pageNum = Math.ceil(this.taskOption.limit ? this.taskOption.limit : this.worksNum) / onePageWorksNumber; if (this.pageType === "discovery") { var mode; switch (true) { case document.URL.match(/mode=(r18|safe|all)/) === null: mode = "all"; break; default: mode = document.URL.match(/mode=(r18|safe|all)/)[1]; break; } var recomCount = this.taskOption.limit ? this.taskOption.limit : this.worksNum; this.taskList.push( new PxerPageRequest({ url: `https://www.pixiv.net/rpc/recommender.php?type=illust&sample_illusts=auto&num_recommendations=${recomCount}&page=discovery&mode=${mode}&tt=${pixiv.context.token}`, type: this.pageType, }) ); } else if (this.pageType === "member_works_new") { var uid = getIDfromURL(); var type = document.URL.match(/type=(\w+)/) ? document.URL.match(/type=(\w+)/)[1] : "all"; this.taskList.push( new PxerPageRequest({ url: `https://www.pixiv.net/ajax/user/${uid}/profile/all`, type: type ? `userprofile_${type}` : "userprofile_all", }) ); } else if (this.pageType === "bookmark_works") { const queryInfo = new URLSearchParams(location.search); for (let offset = 0; offset < 48 * pageNum; offset += 48) { let id = getIDfromURL() || getIDfromURL( "id", document.querySelector("a.user-name").getAttribute("href") ); // old bookmark page this.taskList.push( new PxerPageRequest({ type: this.pageType, url: `https://www.pixiv.net/ajax/user/${id}/illusts/bookmarks?tag=&offset=${offset}&limit=48&rest=${ queryInfo.get("rest") || "show" }`, }) ); } } else if (["search_spa", "search_tag"].includes(this.pageType)) { for (let page = 0; page < pageNum; page++) { this.taskList.push( new PxerPageRequest({ url: pxer.URLGetter.search({ page }), type: this.pageType, }) ); } } else if (this.pageType === "bookmark_new") { for (let page = 0; page < pageNum; page++) { this.taskList.push( new PxerPageRequest({ url: pxer.URLGetter.bookmarkNew({ page }), type: this.pageType, }) ); } } else { var separator = document.URL.includes("?") ? "&" : "?"; var extraparam = this.pageType === "rank" ? "&format=json" : ""; for (var i = 0; i < pageNum; i++) { this.taskList.push( new PxerPageRequest({ type: this.pageType, url: document.URL + separator + "p=" + (i + 1) + extraparam, }) ); } } } /**抓取页码*/ executePageTask() { if (this.taskList.length === 0) { this.dispatch("error", "PxerApp.executePageTask: taskList is empty"); return false; } if (!this.taskList.every((request) => request instanceof PxerPageRequest)) { this.dispatch("error", "PxerApp.executePageTask: taskList is illegal"); return false; } this.dispatch("executePageTask"); var ptm = (this.ptm = new PxerThreadManager(this.ptmConfig)); ptm.on("error", (...argn) => this.dispatch("error", argn)); ptm.on("warn", (...argn) => this.dispatch("error", argn)); ptm.on("load", () => { var parseResult = []; for (let result of this.taskList) { result = PxerHtmlParser.parsePage(result); if (!result) { this.dispatch("error", window["PXER_ERROR"]); continue; } parseResult.push(...result); } this.resultSet = this.filterWorks(parseResult); this.dispatch("finishPageTask", this.resultSet); }); ptm.on("fail", (pfi) => { ptm.pointer--; //失败就不停的尝试 }); ptm.init(this.taskList); ptm.run(); } // 作品筛选 filterWorks(parseResult = this.resultSet) { let data = parseResult; if (this.taskOption.limit) { data = data.slice(0, this.taskOption.limit); } if (this.taskOption.stopId) { data = data.filter((item) => item.id > this.taskOption.stopId); } this.worksNum = data.length; return data; } /** * 抓取作品 * @param {PxerWorksRequest[]} tasks - 要执行的作品请求数组 * */ executeWroksTask(tasks = this.taskList) { if (tasks.length === 0) { this.dispatch("error", "PxerApp.executeWroksTask: taskList is empty"); return false; } if (!tasks.every((request) => request instanceof PxerWorksRequest)) { this.dispatch("error", "PxerApp.executeWroksTask: taskList is illegal"); return false; } // 任务按ID降序排列(#133) if ( ["member_info", "member_works_new", "member_works"].includes( this.pageType ) ) { tasks.sort((a, b) => Number(b.id) - Number(a.id)); } this.dispatch("executeWroksTask"); var ptm = (this.ptm = new PxerThreadManager(this.ptmConfig)); ptm.on("error", (...argn) => this.dispatch("error", argn)); ptm.on("warn", (...argn) => this.dispatch("error", argn)); ptm.on("load", () => { this.resultSet = []; let tl = this.taskList; if (!this.taskOption.isQuick) { tl = this.taskList.slice( //限制结果集条数 0, this.taskOption.limit ? this.taskOption.limit : undefined ); } for (let pwr of tl) { if (!pwr.completed) continue; //跳过未完成的任务 let pw = PxerHtmlParser.parseWorks(pwr, this.taskOption); if (!pw) { pwr.completed = false; ptm.dispatch( "fail", new PxerFailInfo({ type: "parse", task: pwr, url: pwr.url[0], }) ); this.dispatch("error", window["PXER_ERROR"]); continue; } if (this.taskOption.isQuick) { this.resultSet.push(...pw); } else { this.resultSet.push(pw); } } this.dispatch("finishWorksTask", this.resultSet); }); ptm.on("fail", (pfi) => { this.failList.push(pfi); }); if (this.taskOption.isQuick) { tasks = pxer.util.chunk(tasks, 48).map((chunk) => { let tsk = new PxerWorksRequest({ html: {}, type: null, isMultiple: null, id: chunk[0].id, }); tsk.url = [ `https://www.pixiv.net/ajax/user/7356311/profile/illusts?${chunk .map((c) => `ids[]=${c.id}&`) .join("")}work_category=illustManga&is_first_page=0`, ]; return tsk; }); this.taskList = tasks; } ptm.init(tasks); ptm.run(); return true; } /**对失败的作品进行再抓取*/ executeFailWroks(list = this.failList) { // 把重试的任务从失败列表中减去 this.failList = this.failList.filter((pfi) => list.indexOf(pfi) === -1); // 执行抓取 this.executeWroksTask(list.map((pfi) => pfi.task)); } /**抓取页码完成后,初始化,准备抓取作品*/ switchPage2Works(len = this.resultSet.length) { this.taskList = this.resultSet.slice(0, len); this.resultSet = []; } /** * 获取当前抓取到的可读的任务信息 * @return {string} * */ getWorksInfo() { var pp = new PxerPrinter(this.ppConfig, this.taskOption); var pf = new PxerFilter(this.pfConfig); pp.fillTaskInfo(pf.filter(this.resultSet)); return pp.taskInfo; } /** * 输出抓取到的作品 * */ printWorks() { var pp = new PxerPrinter(this.ppConfig, this.taskOption); var pf = new PxerFilter(this.pfConfig); var works = pf.filter(this.resultSet); pp.fillTaskInfo(works); pp.fillAddress(works); pp.print(); } } /**直接抓取本页面的作品*/ PxerApp.prototype["getThis"] = async function () { // 生成任务对象 var id = pxer.util.getIDfromURL("illust_id") || document.URL.match(pxer.regexp.urlWorkDetail)[1]; var initdata = await pxer.util.fetchPixivApi( pxer.URLGetter.illustInfoById(id) ); var type = initdata.illustType; var pageCount = initdata.pageCount; var pwr = new PxerWorksRequest({ isMultiple: pageCount > 1, id: id, }); //[manga|ugoira|illust] switch (type) { case 2: pwr.type = "ugoira"; break; case 1: pwr.type = "illust"; break; case 0: pwr.type = "manga"; break; default: throw new Error("Unknown work type. id:" + id); } pwr.url = PxerHtmlParser.getUrlList(pwr); // 添加执行 this.taskList = [pwr]; this.one("finishWorksTask", () => this.printWorks()); this.executeWroksTask(); return true; }; /** * 获取当前页面的总作品数 * @param {Document=document} dom - 页面的document对象 * @return {number} - 作品数 * */ PxerApp.getWorksNum = function async(dom = document) { return new Promise((resolve, reject) => { const pageType = pxer.util.getPageType(dom); if (pageType === "rank") { let queryurl = dom.URL + "&format=json"; let xhr = new XMLHttpRequest(); xhr.open("GET", queryurl); xhr.onload = (e) => resolve(JSON.parse(xhr.responseText)["rank_total"]); xhr.send(); } else if (pageType === "bookmark_new") { // 关注的新作品页数最多100页 // 因为一般用户关注的用户数作品都足够填满100页,所以从100开始尝试页数 // 如果没有100页进行一次二分查找 this.getFollowingBookmarkWorksNum(0, 100).then((res) => resolve(res)); } else if (pageType === "discovery") { resolve(3000); } else if (pageType === "bookmark_works") { const queryInfo = new URLSearchParams(location.search); let id = getIDfromURL("id", dom.URL) || getIDfromURL( "id", dom.querySelector("a.user-name").getAttribute("href") ); // old bookmark page let queryurl = `https://www.pixiv.net/ajax/user/${id}/illusts/bookmarks?tag=&offset=0&limit=48&rest=${ queryInfo.get("rest") || "show" }`; let xhr = new XMLHttpRequest(); xhr.open("GET", queryurl); xhr.onload = (e) => { resolve(JSON.parse(xhr.responseText).body.total); }; xhr.send(); } else if (pageType === "member_works_new") { let queryurl = `https://www.pixiv.net/ajax/user/${getIDfromURL()}/profile/all`; let xhr = new XMLHttpRequest(); xhr.open("GET", queryurl); xhr.onload = (e) => { var resp = JSON.parse(xhr.responseText).body; var type = dom.URL.match(/type=(manga|illust)/); var getKeyCount = function (obj) { return Object.keys(obj).length; }; if (!type) { resolve(getKeyCount(resp.illusts) + getKeyCount(resp.manga)); } else if (type[1] === "illust") { resolve(getKeyCount(resp.illusts)); } else { resolve(getKeyCount(resp.manga)); } }; xhr.send(); } else if (["search_spa", "search_tag"].includes(pageType)) { pxer.util.fetchPixivApi(pxer.URLGetter.search()).then((data) => { resolve(data.illustManga.total); }); } else { let elt = dom.querySelector(".count-badge"); if (!elt) resolve(null); resolve(parseInt(elt.innerHTML)); } }); }; /** * 获取关注的新作品页的总作品数 * @param {number} startPage - 最小页数 * @param {number} maxPage - 最大页数 * @return {number} - 作品数 */ PxerApp.getFollowingBookmarkWorksNum = async function (startPage, maxPage) { const requestForCount = async (page = 0) => { const data = await fetch(pxer.URLGetter.bookmarkNew({ page })); return (await data.json()).body.page.ids.length; }; // count how many item per page const pageSize = await requestForCount(); // dichotomy search for the last page const [lastPage, lastPageSize] = await (async () => { const maxPageSize = await requestForCount(maxPage); if (maxPageSize > 0) return [maxPage, maxPageSize]; let currentMinPage = startPage; let currentMaxPage = maxPage; let currentPage = ~~(maxPage / 2); while (true) { const currentPageSize = await requestForCount(currentPage); if (currentPageSize > 0 && currentPageSize < pageSize) { return [currentPage, currentPageSize]; } if (currentPage === startPage || currentPage === maxPage) { return [currentPage, pageSize]; } if (currentPageSize === 0) { currentMaxPage = currentPage; currentPage -= Math.ceil((currentPage - currentMinPage - 1) / 2); } else if (currentPageSize === pageSize) { currentMinPage = currentPage; currentPage += Math.ceil((currentMaxPage - currentPage) / 2); } } })(); return (lastPage - startPage) * pageSize + lastPageSize; }; ; // src/view/AutoSuggestControl.js "use strict"; /*! * Copyright (c) 2013 Profoundis Labs Pvt. Ltd., and individual contributors. * * All rights reserved. */ /* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. Neither the name of autojs nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * reuses a lot of code from Nicholas C. Zakas textfield autocomplete example found here * http://oak.cs.ucla.edu/cs144/projects/javascript/suggest1.html * */ /* * An autosuggest textbox control. * @class * @scope public */ class AutoSuggestControl { constructor(id_or_element, provider) { this.provider = provider; /** * The textbox to capture, specified by element_id. * @scope private */ this.textbox /*:HTMLInputElement*/ = typeof id_or_element == "string" ? document.getElementById(id_or_element) : id_or_element; //initialize the control this.init(); } } /** * Autosuggests one or more suggestions for what the user has typed. * If no suggestions are passed in, then no autosuggest occurs. * @scope private * @param aSuggestions An array of suggestion strings. */ AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/) { //make sure there's at least one suggestion if (aSuggestions.length > 0) { this.typeAhead(aSuggestions[0]); } }; /** * Handles keyup events. * @scope private * @param oEvent The event object for the keyup event. */ AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) { var iKeyCode = oEvent.keyCode; var evtobj = oEvent; window.eventobj = evtobj; if ( (iKeyCode != 16 && iKeyCode < 32) || (iKeyCode >= 33 && iKeyCode <= 46) || (iKeyCode >= 112 && iKeyCode <= 123) || (iKeyCode == 65 && evtobj.ctrlKey) || (iKeyCode == 90 && evtobj.ctrlKey) ) { //ignore if (iKeyCode == 90 && evtobj.ctrlKey) { // window.getSelection().deleteFromDocument(); // TODO: need to find a way to select the rest of the text and delete. } } else { //request suggestions from the suggestion provider this.requestSuggestions(this); } }; /** * Initializes the textarea with event handlers for * auto suggest functionality. * @scope private */ AutoSuggestControl.prototype.init = function () { //save a reference to this object var oThis = this; //assign the onkeyup event handler var lastDate = new Date(); oThis.textbox.onkeyup = function (oEvent) { //check for the proper location of the event object if (!oEvent) { oEvent = window.event; } var newDate = new Date(); if (newDate.getTime() > lastDate.getTime() + 200) { oThis.handleKeyUp(oEvent); lastDate = newDate; } }; }; /** * Selects a range of text in the textarea. * @scope public * @param iStart The start index (base 0) of the selection. * @param iLength The number of characters to select. */ AutoSuggestControl.prototype.selectRange = function ( iStart /*:int*/, iLength /*:int*/ ) { //use text ranges for Internet Explorer if (this.textbox.createTextRange) { var oRange = this.textbox.createTextRange(); oRange.moveStart("character", iStart); oRange.moveEnd("character", iLength); oRange.select(); //use setSelectionRange() for Mozilla } else if (this.textbox.setSelectionRange) { this.textbox.setSelectionRange(iStart, iLength); } //set focus back to the textbox this.textbox.focus(); }; /** * Inserts a suggestion into the textbox, highlighting the * suggested part of the text. * @scope private * @param sSuggestion The suggestion for the textbox. */ AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) { //check for support of typeahead functionality if (this.textbox.createTextRange || this.textbox.setSelectionRange) { var lastSpace = this.textbox.value.lastIndexOf(" "); var lastQuote = this.textbox.value.lastIndexOf("'"); var lastHypen = this.textbox.value.lastIndexOf("-"); var lastDoubleQuote = this.textbox.value.lastIndexOf('"'); var lastEnter = this.textbox.value.lastIndexOf("\n"); var lastIndex = Math.max(lastSpace, lastEnter, lastQuote, lastHypen, lastDoubleQuote) + 1; var contentStripped = this.textbox.value.substring(0, lastIndex); var lastWord = this.textbox.value.substring( lastIndex, this.textbox.value.length ); this.textbox.value = contentStripped + sSuggestion; //.replace(lastWord,""); var start = this.textbox.value.length - sSuggestion.replace(lastWord, "").length; var end = this.textbox.value.length; this.selectRange(start, end); } }; /** * Request suggestions for the given autosuggest control. */ AutoSuggestControl.prototype.requestSuggestions = function () { this.words = this.provider(); var aSuggestions = []; var sTextbox = this.textbox.value; var sTextboxSplit = sTextbox.split(/\s+/); var sTextboxLast = sTextboxSplit[sTextboxSplit.length - 1]; var sTextboxValue = sTextboxLast; if (sTextboxValue.length > 0) { //search for matching words for (var i = 0; i < this.words.length; i++) { if (this.words[i].indexOf(sTextboxValue.toLowerCase()) == 0) { if (this.words[i].indexOf(sTextboxValue) == 0) { aSuggestions.push(this.words[i]); } else if ( this.words[i].indexOf( sTextboxValue.charAt(0).toLowerCase() + sTextboxValue.slice(1) ) == 0 ) { aSuggestions.push( this.words[i].charAt(0).toUpperCase() + this.words[i].slice(1) ); } } } } //provide suggestions to the control this.autosuggest(aSuggestions); }; ; // src/view/vm.js pxer.util.afterLoad(function () { const el = document.createElement("div"); const component = { template: pxer.uiTemplate, watch: { currentUrl() { this.state = "standby"; this.taskInfo = ""; this.errmsg = ""; this.pageType = pxer.util.getPageType(); }, isRunning(value) { if (value && this.runTimeTimer === null) { this.runTimeTimer = setInterval(() => this.runTimeTimestamp++, 1000); } else { clearInterval(this.runTimeTimer); this.runTimeTimer = null; } }, tagFilterInfo: { deep: true, handler: "onTagFilterInfoChange", }, }, data() { return { pxer: null, showAll: false, state: "standby", //[standby|init|ready|page|works|finish|re-ready|stop|error] stateMap: { standby: "待命", init: "初始化", ready: "就绪", page: "抓取页码中", works: "抓取作品中", finish: "完成", "re-ready": "再抓取就绪", stop: "用户手动停止", error: "出错", }, pxerVersion: pxer.package.version, showPxerFailWindow: false, runTimeTimestamp: 0, runTimeTimer: null, checkedFailWorksList: [], taskInfo: "", tryFailWroksList: [], showTaskOption: false, taskOption: { limit: "", stopId: "", isQuick: true, }, showLoadBtn: true, errmsg: "", pageType: pxer.util.getPageType(), currentUrl: document.URL, showAllTagFilter: false, showLoadingButton: false, /** * @property {'NECESSARY' | 'EXCLUDE' | 'WHATEVER'} [tagName] - default by WHATEVER * */ tagFilterInfo: {}, }; }, computed: { isRunning() { var runState = ["page", "works"]; return runState.indexOf(this.state) !== -1; }, worksNum() { return this.pxer.taskOption.limit || this.pxer.worksNum; }, taskCount() { if (!this.pxer) return null; var pageWorkCount = getOnePageWorkCount(this.pxer.pageType); // return Math.ceil(this.worksNum / pageWorkCount) + +this.worksNum; // 不知道为什么要加上这一段,先注释了吧Math.ceil(this.worksNum / pageWorkCount) return +this.worksNum; }, // TODO:这里需要修改 finishCount() { if (this.state === "page") { return this.pxer.taskList.filter((pr) => pr.completed).length; } else if (this.state === "works") { return ( this.pxer.taskList.filter((pr) => pr.completed).length + ~~(this.worksNum / 20) + this.pxer.failList.length ); } else { return -1; } }, forecastTime() { if (this.isRunning && this.finishCount) { return Math.ceil( (this.runTimeTimestamp / this.finishCount) * this.taskCount - this.runTimeTimestamp ); } else { return -1; } }, printConfigUgoira: { get() { return ( this.pxer.ppConfig.ugoira_zip + "-" + this.pxer.ppConfig.ugoira_frames ); }, set(value) { var arr = value.split("-"); this.pxer.ppConfig.ugoira_zip = arr[0]; this.pxer.ppConfig.ugoira_frames = arr[1]; }, }, no_tag_any: { get() { return this.pxer.pfConfig.no_tag_any.join(" "); }, set(value) { this.pxer.pfConfig.no_tag_any = value.split(" "); }, }, no_tag_every: { get() { return this.pxer.pfConfig.no_tag_every.join(" "); }, set(value) { this.pxer.pfConfig.no_tag_every = value.split(" "); }, }, has_tag_some: { get() { return this.pxer.pfConfig.has_tag_some.join(" "); }, set(value) { this.pxer.pfConfig.has_tag_some = value.split(" "); }, }, has_tag_every: { get() { return this.pxer.pfConfig.has_tag_every.join(" "); }, set(value) { this.pxer.pfConfig.has_tag_every = value.split(" "); }, }, showFailTaskList() { if (!this.pxer) return []; return this.pxer.failList.filter((pfi) => { return this.tryFailWroksList.indexOf(pfi) === -1; }); }, canCrawlDirectly() { this.currentUrl; return this.pageType === "works_medium"; }, canCrawl() { this.currentUrl; return PxerApp.canCrawl(); }, /** * @return {TagInfo} * * @typedef TagInfo * @property {Array.<string>} tags - all tags without repeat * @property {Object.<string, number>} count - The times of tag included in works * */ tagInfo() { const allTags = this.pxer.resultSet.reduce( (result, works) => result.concat(works.tagList), [] ); const countMap = {}; const noRepeatTags = []; allTags.forEach((tag) => { if (!noRepeatTags.includes(tag)) { noRepeatTags.push(tag); } countMap[tag] = countMap[tag] || 0; countMap[tag]++; }); noRepeatTags.sort((tag1, tag2) => countMap[tag2] - countMap[tag1]); return { tags: noRepeatTags, count: countMap, }; }, needFoldTagFilter() { return this.tagInfo.tags.length > 60; }, tagFilterFolded() { return this.needFoldTagFilter && !this.showAllTagFilter; }, }, methods: { createPxerApp() { this.pxer = new PxerApp(); this.pxer.on("error", (error) => { this.errmsg = error; }); this.pxer.on("finishWorksTask", (result) => {}); }, crawlDirectly() { this.createPxerApp(); this.showLoadingButton = true; this.pxer.one("finishWorksTask", () => { this.showLoadingButton = false; this.state = "standby"; }); this.pxer.getThis(); }, load() { this.createPxerApp(); this.state = "init"; this.pxer .init({ isQuick: true, }) .then(() => (this.state = "ready")); this.pxer.on("finishWorksTask", () => { window.blinkTitle(); }); }, run() { if (this.state === "ready") { this.state = "page"; this.pxer.initPageTask(); this.pxer.one("finishPageTask", () => { this.state = "works"; this.pxer.switchPage2Works(); this.pxer.executeWroksTask(); }); this.pxer.one("finishWorksTask", () => { this.state = "finish"; }); this.pxer.executePageTask(); } else if (this.state === "re-ready") { this.state = "works"; this.pxer.one("finishWorksTask", () => { this.state = "finish"; }); this.pxer.executeFailWroks(this.tryFailWroksList); this.tryFailWroksList = []; } }, stop() { this.state = "stop"; this.pxer.stop(); }, count() { this.taskInfo = this.pxer.getWorksInfo(); }, printWorks() { this.pxer.printWorks(); var sanitizedpfConfig = {}; for (let key in this.pxer.pfConfig) { sanitizedpfConfig[key] = this.pxer.pfConfig[key].length ? this.pxer.pfConfig[key].length : this.pxer.pfConfig[key]; } }, useTaskOption() { this.showTaskOption = false; Object.assign(this.pxer.taskOption, this.taskOption); }, formatFailType(type) { return ( { empty: "获取内容失败", timeout: "获取超时", "r-18": "限制级作品(R-18)", "r-18g": "怪诞作品(R-18G)", mypixiv: "仅好P友可见的作品", parse: "解析错误", }[type] || type ); }, formatFailSolution(type) { return ( { empty: "点击左侧链接确认内容正确,再试一次~", timeout: "增加最大等待时间再试一次~", "r-18": "开启账号R-18选项", "r-18g": "开启账号R-18G选项", mypixiv: "添加画师好友再尝试", parse: '再试一次,若问题依旧,请<a href="https://github.com/pea3nut/Pxer/issues/5" target="_blank">反馈</a>给花生', }[type] || "要不。。。再试一次?" ); }, tryCheckedPfi() { this.tryFailWroksList.push(...this.checkedFailWorksList); this.checkedFailWorksList = []; this.state = "re-ready"; }, formatTime(s) { return `${~~(s / 60)}:${s % 60 >= 10 ? s % 60 : "0" + (s % 60)}`; }, t: pxer.t, listenUrlChange() { const vm = this; const historyPushState = history.pushState; const historyReplaceState = history.replaceState; history.pushState = function (...args) { historyPushState.apply(history, args); setTimeout(() => (vm.currentUrl = document.URL), 0); }; history.replaceState = function (...args) { historyReplaceState.apply(history, args); setTimeout(() => (vm.currentUrl = document.URL), 0); }; }, // about filter by tag countTagTheme(tagName) { switch (this.tagFilterInfo[tagName]) { default: case "WHATEVER": return "btn-secondary"; case "EXCLUDE": return "btn-danger"; case "NECESSARY": return "btn-success"; } }, onTagFilterInfoChange(value) { this.pxer.pfConfig.no_tag_any = []; this.pxer.pfConfig.has_tag_some = []; for (let [tagName, filterOption] of Object.entries(value)) { switch (filterOption) { case "EXCLUDE": this.pxer.pfConfig.no_tag_any.push(tagName); break; case "NECESSARY": this.pxer.pfConfig.has_tag_some.push(tagName); break; } } }, onTagClick(tagName) { switch (this.tagFilterInfo[tagName]) { default: case "WHATEVER": this.$set(this.tagFilterInfo, tagName, "EXCLUDE"); break; case "EXCLUDE": this.$set(this.tagFilterInfo, tagName, "NECESSARY"); break; case "NECESSARY": this.$set(this.tagFilterInfo, tagName, "WHATEVER"); break; } }, }, mounted() { this.listenUrlChange(); pxer.loaded = true; }, }; // find a element as anchor [ (elt) => { const target = document.querySelector("#root > header"); if (!target) return false; target.appendChild(elt); return true; }, (elt) => { const target = document.querySelector("._global-header"); if (!target) return false; target.appendChild(elt); return true; }, (elt) => { const target = document.getElementById("wrapper"); if (!target) return false; target.insertBefore(elt, target.firstChild); return true; }, (elt) => { document.body.insertBefore(elt, document.body.firstChild); return true; }, ].some((fn) => fn(el)); // mount UI pxer.vm = new Vue(component).$mount(el); }); ; }());
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址