Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • Dockerfile
  • feature_invite_validuntil_minmax
  • incremental-sync
  • jwt_encode_inconsistencies
  • master
  • redis-rate-limits
  • roles-recursive-cte
  • typehints
  • v1.0.x
  • v1.1.x
  • v1.2.x
  • v1.x.x
  • v0.1.2
  • v0.1.4
  • v0.1.5
  • v0.2.0
  • v0.3.0
  • v1.0.0
  • v1.0.1
  • v1.0.2
  • v1.1.0
  • v1.1.1
  • v1.1.2
  • v1.2.0
  • v2.0.0
  • v2.0.1
  • v2.1.0
  • v2.2.0
  • v2.3.0
  • v2.3.1
30 results

Target

Select target project
  • uffd/uffd
  • rixx/uffd
  • thies/uffd
  • leona/uffd
  • enbewe/uffd
  • strifel/uffd
  • thies/uffd-2
7 results
Select Git revision
  • Dockerfile
  • claims-in-idtoke
  • feature_invite_validuntil_minmax
  • incremental-sync
  • jwt_encode_inconsistencies
  • master
  • recovery-code-pwhash
  • redis-rate-limits
  • roles-recursive-cte
  • typehints
  • v1.0.x
  • v1.1.x
  • v1.2.x
  • v1.x.x
  • v0.1.2
  • v0.1.4
  • v0.1.5
  • v0.2.0
  • v0.3.0
  • v1.0.0
  • v1.0.1
  • v1.0.2
  • v1.1.0
  • v1.1.1
  • v1.1.2
  • v1.2.0
  • v2.0.0
  • v2.0.1
  • v2.1.0
  • v2.2.0
  • v2.3.0
  • v2.3.1
32 results
Show changes
Showing
with 2423 additions and 781 deletions
from operator import attrgetter
from sqlalchemy import Column, String, Integer, Text, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declared_attr
from uffd.database import db
from uffd.user.models import User, Group
class Role(db.Model):
__tablename__ = 'role'
id = Column(Integer(), primary_key=True, autoincrement=True)
name = Column(String(32), unique=True)
description = Column(Text())
members = relationship("RoleUser", backref="role", cascade="all, delete-orphan")
groups = relationship("RoleGroup", backref="role", cascade="all, delete-orphan")
def __init__(self, name='', description=''):
self.name = name
self.description = description
@classmethod
def get_for_user(cls, user):
return Role.query.join(Role.members, aliased=True).filter_by(dn=user.dn)
def member_ldap(self):
result = []
for dn in self.member_dns():
result.append(User.ldap_get(dn))
return result
def member_dns(self):
return list(map(attrgetter('dn'), self.members))
def add_member(self, member):
newmapping = RoleUser(member.dn, self)
self.members.append(newmapping)
def del_member(self, member):
for i in self.members:
if i.dn == member.dn:
self.members.remove(i)
break
def group_dns(self):
return list(map(attrgetter('dn'), self.groups))
def add_group(self, group):
newmapping = RoleGroup(group.dn, self)
self.groups.append(newmapping)
def del_group(self, group):
for i in self.groups:
if i.dn == group.dn:
self.groups.remove(i)
break
class LdapMapping():
id = Column(Integer(), primary_key=True, autoincrement=True)
dn = Column(String(128))
__table_args__ = (
db.UniqueConstraint('dn', 'role_id'),
)
@declared_attr
def role_id(self):
return Column(ForeignKey('role.id'))
ldapclass = None
def __init__(self, dn='', role=''):
self.dn = dn
self.role = role
def get_ldap(self):
return self.ldapclass.ldap_get(self.dn)
def set_ldap(self, value):
self.dn = value['dn']
class RoleGroup(LdapMapping, db.Model):
__tablename__ = 'role-group'
ldapclass = User
class RoleUser(LdapMapping, db.Model):
__tablename__ = 'role-user'
ldapclass = Group
{% extends 'base.html' %}
{% block body %}
<form action="{{ url_for("role.update", roleid=role.id) }}" method="POST">
<div class="align-self-center">
<div class="form-group col">
<label for="role-name">Role Name</label>
<input type="text" class="form-control" id="role-name" name="name" value="{{ role.name }}">
<small class="form-text text-muted">
</small>
</div>
<div class="form-group col">
<label for="role-description">Description</label>
<textarea class="form-control" id="role-description" name="description" rows="5">{{ role.description }}</textarea>
<small class="form-text text-muted">
</small>
</div>
<div class="form-group col">
<span>Included groups</span>
<table class="table table-striped table-sm">
<thead>
<tr>
<th scope="col"></th>
<th scope="col">name</th>
<th scope="col">description</th>
</tr>
</thead>
<tbody>
{% for group in groups|sort(attribute="name") %}
<tr id="group-{{ group.gid }}">
<td>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="group-{{ group.gid }}-checkbox" name="group-{{ group.gid }}" value="1" aria-label="enabled" {% if group.dn in role.group_dns() %}checked{% endif %}>
</div>
</td>
<td>
<a href="{{ url_for("group.show", gid=group.gid) }}">
{{ group.name }}
</a>
</td>
<td>
{{ group.description }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="form-group col">
<p>
Members
</p>
<ul>
{% for member in role.members %}
<li>{{ member.dn }}</li>
{% endfor %}
</ul>
</div>
<div class="form-group col">
<button type="submit" class="btn btn-primary"><i class="fa fa-save" aria-hidden="true"></i> Save</button>
<a href="{{ url_for("role.index") }}" class="btn btn-secondary">Cancel</a>
{% if role.id %}
<a href="{{ url_for("role.delete", roleid=role.id) }}" class="btn btn-danger"><i class="fa fa-trash" aria-hidden="true"></i> Delete</a>
{% else %}
<a href="#" class="btn btn-danger disabled"><i class="fa fa-trash" aria-hidden="true"></i> Delete</a>
{% endif %}
</div>
</div>
</form>
{% endblock %}
from uffd.role.models import Role
def recalculate_user_groups(user):
newgroups = set()
for role in Role.get_for_user(user).all():
# TODO: improve this after finding a solution for the Role<->Group relation
newgroups.update({Group.ldap_get(dn) for dn in role.group_dns()})
user.groups = newgroups
from flask import Blueprint, render_template, request, url_for, redirect, flash, current_app
from uffd.navbar import register_navbar
from uffd.csrf import csrf_protect
from uffd.role.models import Role
from uffd.role.utils import recalculate_user_groups
from uffd.user.models import Group
from uffd.session import get_current_user, login_required, is_valid_session
from uffd.database import db
bp = Blueprint("role", __name__, template_folder='templates', url_prefix='/role/')
@bp.before_request
@login_required()
def role_acl(): #pylint: disable=inconsistent-return-statements
if not role_acl_check():
flash('Access denied')
return redirect(url_for('index'))
def role_acl_check():
return is_valid_session() and get_current_user().is_in_group(current_app.config['ACL_ADMIN_GROUP'])
@bp.route("/")
@register_navbar('Roles', icon='key', blueprint=bp, visible=role_acl_check)
def index():
return render_template('role_list.html', roles=Role.query.all())
@bp.route("/<int:roleid>")
@bp.route("/new")
def show(roleid=False):
if not roleid:
role = Role()
else:
role = Role.query.filter_by(id=roleid).one()
return render_template('role.html', role=role, groups=Group.ldap_all())
@bp.route("/<int:roleid>/update", methods=['POST'])
@bp.route("/new", methods=['POST'])
@csrf_protect(blueprint=bp)
def update(roleid=False):
is_newrole = bool(not roleid)
session = db.session
if is_newrole:
role = Role()
session.add(role)
else:
role = Role.query.filter_by(id=roleid).one()
role.name = request.values['name']
role.description = request.values['description']
groups = Group.ldap_all()
role_group_dns = role.group_dns()
for group in groups:
if request.values.get('group-{}'.format(group.gid), False):
if group.dn in role_group_dns:
continue
role.add_group(group)
elif group.dn in role_group_dns:
role.del_group(group)
members = role.member_ldap()
for user in members:
recalculate_user_groups(user)
if not user.to_ldap():
flash('updating group membership for user {} failed'.format(user.loginname))
session.commit()
return redirect(url_for('role.index'))
@bp.route("/<int:roleid>/del")
@csrf_protect(blueprint=bp)
def delete(roleid):
session = db.session
role = Role.query.filter_by(id=roleid).one()
members = role.member_ldap()
session.delete(role)
session.commit()
for user in members:
recalculate_user_groups(user)
if not user.to_ldap():
flash('updating group membership for user {} failed'.format(user.loginname))
session.commit()
return redirect(url_for('role.index'))
from flask import redirect
def secure_local_redirect(target):
# Reject URLs that include a scheme or host part
if not target.startswith('/') or target.startswith('//'):
target = '/'
return redirect(target)
from .views import bp as bp_ui, send_passwordreset
bp = [bp_ui]
import datetime
import secrets
from sqlalchemy import Column, String, DateTime
from uffd.database import db
def random_token():
return secrets.token_hex(128)
class Token():
token = Column(String(128), primary_key=True, default=random_token)
created = Column(DateTime, default=datetime.datetime.now)
class PasswordToken(Token, db.Model):
__tablename__ = 'passwordToken'
loginname = Column(String(32))
class MailToken(Token, db.Model):
__tablename__ = 'mailToken'
loginname = Column(String(32))
newmail = Column(String(255))
Hi {{ user.displayname }},
welcome to the CCCV infrastructure. An account was created for you, please visit the following url to set your
password: {{ url_for('selfservice.token_password', token=token, _external=True) }}
**The link is valid for 48h**
You can find more information at https://docs.cccv.de/.
If you have no idea why someone would create an account for you to be used for the next CCC event organization, please
contact the infra team at it@cccv.de.
{% extends 'base.html' %}
{% block body %}
<div class="btn-toolbar">
<a class="ml-auto mb-3 btn btn-primary" href="{{ url_for('mfa.setup') }}">Manage two-factor authentication</a>
</div>
<form action="{{ url_for("selfservice.update") }}" method="POST" onInput="
password2.setCustomValidity(password1.value != password2.value ? 'Passwords do not match.' : '');
password1.setCustomValidity((password1.value.length < 8 && password1.value.length > 0) ? 'Password is too short' : '') ">
<div class="align-self-center row">
<div class="form-group col-md-6">
<label for="user-uid">Uid</label>
<input type="number" class="form-control" id="user-uid" name="uid" value="{{ user.uid }}" readonly>
</div>
<div class="form-group col-md-6">
<label for="user-loginname">Login Name</label>
<input type="text" class="form-control" id="user-loginname" name="loginname" value="{{ user.loginname }}" readonly>
</div>
<div class="form-group col-md-6">
<label for="user-displayname">Display Name</label>
<input type="text" class="form-control" id="user-displayname" name="displayname" value="{{ user.displayname }}">
</div>
<div class="form-group col-md-6">
<label for="user-mail">Mail</label>
<input type="email" class="form-control" id="user-mail" name="mail" value="{{ user.mail }}">
<small class="form-text text-muted">
We will send you a confirmation mail to set a new mail address.
</small>
</div>
<div class="form-group col-md-6">
<label for="user-password1">Password</label>
<input type="password" class="form-control" id="user-password1" name="password1" placeholder="●●●●●●●●">
<small class="form-text text-muted">
At least 8 and at most 256 characters, no other special requirements. But please don't be stupid, do use a password manager.
</small>
</div>
<div class="form-group col-md-6">
<label for="user-password2">Password Repeat</label>
<input type="password" class="form-control" id="user-password2" name="password2" placeholder="●●●●●●●●">
</div>
<div class="form-group col-md-12">
<button type="submit" class="btn btn-primary float-right"><i class="fa fa-save" aria-hidden="true"></i> Save</button>
</div>
</div>
</form>
{% endblock %}
{% extends 'base.html' %}
{% block body %}
<form action="{{ url_for("selfservice.token_password", token=token) }}" method="POST" onInput="password2.setCustomValidity(password1.value != password2.value ? 'Passwords do not match.' : '') ">
<div class="row mt-2 justify-content-center">
<div class="col-lg-6 col-md-10" style="background: #f7f7f7; box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); padding: 30px;">
<div class="text-center">
<img alt="branding logo" src="{{ config.get("BRANDING_LOGO_URL") }}" class="col-lg-8 col-md-12" >
</div>
<div class="col-12">
<h2 class="text-center">Reset password</h2>
</div>
<div class="form-group col-12">
<label for="user-password1">New Password</label>
<input type="password" class="form-control" id="user-password1" name="password1" required="required" tabindex = "2">
<small class="form-text text-muted">
At least 8 and at most 256 characters, no other special requirements. But please don't be stupid, do use a password manager.
</small>
</div>
<div class="form-group col-12">
<label for="user-password2">Repeat Password</label>
<input type="password" class="form-control" id="user-password2" name="password2" required="required" tabindex = "2">
</div>
<div class="form-group col-12">
<button type="submit" class="btn btn-primary btn-block" tabindex = "3">Set password</button>
</div>
</div>
</div>
</form>
{% endblock %}
import datetime
import smtplib
from email.message import EmailMessage
import email.utils
from flask import Blueprint, render_template, request, url_for, redirect, flash, current_app
from uffd.navbar import register_navbar
from uffd.csrf import csrf_protect
from uffd.user.models import User
from uffd.session import get_current_user, login_required, is_valid_session
from uffd.selfservice.models import PasswordToken, MailToken
from uffd.database import db
from uffd.ldap import ldap
from uffd.ratelimit import host_ratelimit, Ratelimit, format_delay
bp = Blueprint("selfservice", __name__, template_folder='templates', url_prefix='/self/')
reset_ratelimit = Ratelimit('passwordreset', 1*60*60, 3)
@bp.route("/")
@register_navbar('Selfservice', icon='portrait', blueprint=bp, visible=is_valid_session)
@login_required()
def index():
return render_template('self.html', user=get_current_user())
@bp.route("/update", methods=(['POST']))
@csrf_protect(blueprint=bp)
@login_required()
def update():
user = get_current_user()
if request.values['displayname'] != user.displayname:
if user.set_displayname(request.values['displayname']):
flash('Display name changed.')
else:
flash('Display name is not valid.')
if request.values['password1']:
if not request.values['password1'] == request.values['password2']:
flash('Passwords do not match')
else:
if user.set_password(request.values['password1']):
flash('Password changed.')
else:
flash('Password could not be set.')
if request.values['mail'] != user.mail:
send_mail_verification(user.loginname, request.values['mail'])
flash('We sent you an email, please verify your mail address.')
ldap.session.commit()
return redirect(url_for('selfservice.index'))
@bp.route("/passwordreset", methods=(['GET', 'POST']))
def forgot_password():
if request.method == 'GET':
return render_template('forgot_password.html')
loginname = request.values['loginname']
mail = request.values['mail']
reset_delay = reset_ratelimit.get_delay(loginname+'/'+mail)
host_delay = host_ratelimit.get_delay()
if reset_delay or host_delay:
if reset_delay > host_delay:
flash('We received too many password reset requests for this user! Please wait at least %s.'%format_delay(reset_delay))
else:
flash('We received too many requests from your ip address/network! Please wait at least %s.'%format_delay(host_delay))
return redirect(url_for('.forgot_password'))
reset_ratelimit.log(loginname+'/'+mail)
host_ratelimit.log()
flash("We sent a mail to this users mail address if you entered the correct mail and login name combination")
user = (User.ldap_filter_by(loginname=loginname) or [None])[0]
if user and user.mail == mail:
send_passwordreset(user)
return redirect(url_for('session.login'))
@bp.route("/token/password/<token>", methods=(['POST', 'GET']))
def token_password(token):
dbtoken = PasswordToken.query.get(token)
if not dbtoken or dbtoken.created < (datetime.datetime.now() - datetime.timedelta(days=2)):
flash('Token expired, please try again.')
if dbtoken:
db.session.delete(dbtoken)
db.session.commit()
return redirect(url_for('session.login'))
if request.method == 'GET':
return render_template('set_password.html', token=token)
if not request.values['password1']:
flash('You need to set a password, please try again.')
return render_template('set_password.html', token=token)
if not request.values['password1'] == request.values['password2']:
flash('Passwords do not match, please try again.')
return render_template('set_password.html', token=token)
user = User.ldap_filter_by(loginname=dbtoken.loginname)[0]
if not user.set_password(request.values['password1']):
flash('Password ist not valid, please try again.')
return render_template('set_password.html', token=token)
db.session.delete(dbtoken)
flash('New password set')
ldap.session.commit()
db.session.commit()
return redirect(url_for('session.login'))
@bp.route("/token/mail_verification/<token>")
@login_required()
def token_mail(token):
dbtoken = MailToken.query.get(token)
if not dbtoken or dbtoken.created < (datetime.datetime.now() - datetime.timedelta(days=2)):
flash('Token expired, please try again.')
if dbtoken:
db.session.delete(dbtoken)
db.session.commit()
return redirect(url_for('selfservice.index'))
user = User.ldap_filter_by(loginname=dbtoken.loginname)[0]
user.set_mail(dbtoken.newmail)
flash('New mail set')
db.session.delete(dbtoken)
ldap.session.commit()
db.session.commit()
return redirect(url_for('selfservice.index'))
def send_mail_verification(loginname, newmail):
expired_tokens = MailToken.query.filter(MailToken.created < (datetime.datetime.now() - datetime.timedelta(days=2))).all()
duplicate_tokens = MailToken.query.filter(MailToken.loginname == loginname).all()
for i in expired_tokens + duplicate_tokens:
db.session.delete(i)
token = MailToken()
token.loginname = loginname
token.newmail = newmail
db.session.add(token)
db.session.commit()
user = User.ldap_filter_by(loginname=loginname)[0]
msg = EmailMessage()
msg.set_content(render_template('mailverification.mail.txt', user=user, token=token.token))
msg['Subject'] = 'Mail verification'
send_mail(newmail, msg)
def send_passwordreset(user, new=False):
expired_tokens = PasswordToken.query.filter(PasswordToken.created < (datetime.datetime.now() - datetime.timedelta(days=2))).all()
duplicate_tokens = PasswordToken.query.filter(PasswordToken.loginname == user.loginname).all()
for i in expired_tokens + duplicate_tokens:
db.session.delete(i)
token = PasswordToken()
token.loginname = user.loginname
db.session.add(token)
db.session.commit()
msg = EmailMessage()
if new:
msg.set_content(render_template('newuser.mail.txt', user=user, token=token.token))
msg['Subject'] = 'Welcome to the CCCV infrastructure'
else:
msg.set_content(render_template('passwordreset.mail.txt', user=user, token=token.token))
msg['Subject'] = 'Password reset'
send_mail(user.mail, msg)
def send_mail(to_address, msg):
msg['From'] = current_app.config['MAIL_FROM_ADDRESS']
msg['To'] = to_address
msg['Date'] = email.utils.formatdate(localtime=1)
msg['Message-ID'] = email.utils.make_msgid()
try:
if current_app.debug:
current_app.last_mail = None
current_app.logger.debug('Trying to send email to %s:\n'%(to_address)+str(msg))
if current_app.debug and current_app.config.get('MAIL_SKIP_SEND', False):
if current_app.config['MAIL_SKIP_SEND'] == 'fail':
raise smtplib.SMTPException()
current_app.last_mail = msg
return True
server = smtplib.SMTP(host=current_app.config['MAIL_SERVER'], port=current_app.config['MAIL_PORT'])
if current_app.config['MAIL_USE_STARTTLS']:
server.starttls()
server.login(current_app.config['MAIL_USERNAME'], current_app.config['MAIL_PASSWORD'])
server.send_message(msg)
server.quit()
if current_app.debug:
current_app.last_mail = msg
return True
except smtplib.SMTPException:
flash('Mail to "{}" could not be sent!'.format(to_address))
return False
import smtplib
from email.message import EmailMessage
import email.utils
from flask import render_template, current_app
def sendmail(addr, subject, template_name, **kwargs):
msg = EmailMessage()
msg.set_content(render_template(template_name, **kwargs))
msg['Subject'] = subject
msg['From'] = current_app.config['MAIL_FROM_ADDRESS']
msg['To'] = addr
msg['Date'] = email.utils.formatdate(localtime=1)
msg['Message-ID'] = email.utils.make_msgid()
try:
if current_app.debug:
current_app.last_mail = None
current_app.logger.debug('Trying to send email to %s:\n'%(addr)+str(msg))
if current_app.debug and current_app.config.get('MAIL_SKIP_SEND', False):
if current_app.config['MAIL_SKIP_SEND'] == 'fail':
raise smtplib.SMTPException()
current_app.last_mail = msg
return True
server = smtplib.SMTP(host=current_app.config['MAIL_SERVER'], port=current_app.config['MAIL_PORT'])
if current_app.config['MAIL_USE_STARTTLS']:
server.starttls()
if current_app.config['MAIL_USERNAME']:
server.login(current_app.config['MAIL_USERNAME'], current_app.config['MAIL_PASSWORD'])
server.send_message(msg)
server.quit()
if current_app.debug:
current_app.last_mail = msg
return True
except smtplib.SMTPException:
return False
from .views import bp as _bp
bp = [_bp]
from flask import Blueprint, render_template, current_app, abort
from uffd.navbar import register_navbar
from uffd.session import is_valid_session, get_current_user
bp = Blueprint("services", __name__, template_folder='templates', url_prefix='/services')
# pylint: disable=too-many-branches
def get_services(user=None):
if not user and not current_app.config['SERVICES_PUBLIC']:
return []
services = []
for service_data in current_app.config['SERVICES']:
if not service_data.get('title'):
continue
service = {
'title': service_data['title'],
'subtitle': service_data.get('subtitle', ''),
'description': service_data.get('description', ''),
'url': service_data.get('url', ''),
'logo_url': service_data.get('logo_url', ''),
'has_access': True,
'permission': '',
'groups': [],
'infos': [],
'links': [],
}
if service_data.get('required_group'):
if not user or not user.has_permission(service_data['required_group']):
service['has_access'] = False
for permission_data in service_data.get('permission_levels', []):
if permission_data.get('required_group'):
if not user or not user.has_permission(permission_data['required_group']):
continue
if not permission_data.get('name'):
continue
service['has_access'] = True
service['permission'] = permission_data['name']
if service_data.get('confidential', False) and not service['has_access']:
continue
for group_data in service_data.get('groups', []):
if group_data.get('required_group'):
if not user or not user.has_permission(group_data['required_group']):
continue
if not group_data.get('name'):
continue
service['groups'].append(group_data)
for info_data in service_data.get('infos', []):
if info_data.get('required_group'):
if not user or not user.has_permission(info_data['required_group']):
continue
if not info_data.get('title') or not info_data.get('html'):
continue
info = {
'title': info_data['title'],
'html': info_data['html'],
'id': '%d-%d'%(len(services), len(service['infos'])),
}
service['infos'].append(info)
for link_data in service_data.get('links', []):
if link_data.get('required_group'):
if not user or not user.has_permission(link_data['required_group']):
continue
if not link_data.get('url') or not link_data.get('title'):
continue
service['links'].append(link_data)
services.append(service)
return services
def services_visible():
user = None
if is_valid_session():
user = get_current_user()
return len(get_services(user)) > 0
@bp.route("/")
@register_navbar('Services', icon='sitemap', blueprint=bp, visible=services_visible)
def index():
user = None
if is_valid_session():
user = get_current_user()
services = get_services(user)
if not current_app.config['SERVICES']:
abort(404)
return render_template('overview.html', user=user, services=services)
from .views import bp as bp_ui, get_current_user, login_required, is_valid_session
bp = [bp_ui]
{% extends 'base.html' %}
{% block body %}
<form action="{{ url_for("session.login", ref=ref) }}" method="POST">
<div class="row mt-2 justify-content-center">
<div class="col-lg-6 col-md-10" style="background: #f7f7f7; box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); padding: 30px;">
<div class="text-center">
<img alt="branding logo" src="{{ config.get("BRANDING_LOGO_URL") }}" class="col-lg-8 col-md-12" >
</div>
<div class="col-12">
<h2 class="text-center">Login</h2>
</div>
<div class="form-group col-12">
<label for="user-loginname">Login Name</label>
<input type="text" class="form-control" id="user-loginname" name="loginname" required="required" tabindex = "1" autofocus>
</div>
<div class="form-group col-12">
<label for="user-password1">Password</label>
<input type="password" class="form-control" id="user-password1" name="password" required="required" tabindex = "2">
</div>
<div class="form-group col-12">
<button type="submit" class="btn btn-primary btn-block" tabindex = "3">Login</button>
</div>
<div class="clearfix col-12">
<a href="#" class="float-left">Register</a>
<a href="{{ url_for("selfservice.forgot_password") }}" class="float-right">Forgot Password?</a>
</div>
</div>
</div>
</form>
{% endblock %}
import datetime
import secrets
import functools
from flask import Blueprint, render_template, request, url_for, redirect, flash, current_app, session, abort
from uffd.user.models import User, Group
from uffd.ldap import user_conn
from uffd.ratelimit import Ratelimit, host_ratelimit, format_delay
bp = Blueprint("session", __name__, template_folder='templates', url_prefix='/')
login_ratelimit = Ratelimit('login', 1*60, 3)
def login_get_user(loginname, password):
print('login with', loginname, password)
dn = User(loginname=loginname).dn
conn = user_conn(dn, password)
if not conn:
print('conn is None')
return None
conn.search(conn.user, '(objectClass=person)')
if len(conn.entries) != 1:
print('wrong number of entries', conn.entries)
return None
return User.ldap_get(dn)
@bp.route("/logout")
def logout():
# The oauth2 module takes data from `session` and injects it into the url,
# so we need to build the url BEFORE we clear the session!
resp = redirect(url_for('oauth2.logout', ref=url_for('.login')))
session.clear()
return resp
@bp.route("/login", methods=('GET', 'POST'))
def login():
if request.method == 'GET':
return render_template('login.html', ref=request.values.get('ref'))
username = request.form['loginname']
password = request.form['password']
login_delay = login_ratelimit.get_delay(username)
host_delay = host_ratelimit.get_delay()
if login_delay or host_delay:
if login_delay > host_delay:
flash('We received too many invalid login attempts for this user! Please wait at least %s.'%format_delay(login_delay))
else:
flash('We received too many requests from your ip address/network! Please wait at least %s.'%format_delay(host_delay))
return render_template('login.html', ref=request.values.get('ref'))
user = login_get_user(username, password)
if user is None:
login_ratelimit.log(username)
host_ratelimit.log()
flash('Login name or password is wrong')
return render_template('login.html', ref=request.values.get('ref'))
if not user.is_in_group(current_app.config['ACL_SELFSERVICE_GROUP']):
flash('You do not have access to this service')
return render_template('login.html', ref=request.values.get('ref'))
session.clear()
session['user_dn'] = user.dn
session['logintime'] = datetime.datetime.now().timestamp()
session['_csrf_token'] = secrets.token_hex(128)
return redirect(url_for('mfa.auth', ref=request.values.get('ref', url_for('index'))))
def get_current_user():
if 'user_dn' not in session:
print(session)
return None
return User.ldap_get(session['user_dn'])
def login_valid():
user = get_current_user()
if user is None:
return False
if datetime.datetime.now().timestamp() > session['logintime'] + current_app.config['SESSION_LIFETIME_SECONDS']:
return False
return True
def is_valid_session():
if not login_valid():
return False
if not session.get('user_mfa'):
return False
return True
bp.add_app_template_global(is_valid_session)
def pre_mfa_login_required(no_redirect=False):
def wrapper(func):
@functools.wraps(func)
def decorator(*args, **kwargs):
if not login_valid() or datetime.datetime.now().timestamp() > session['logintime'] + 10*60:
session.clear()
if no_redirect:
abort(403)
flash('You need to login first')
return redirect(url_for('session.login', ref=request.url))
return func(*args, **kwargs)
return decorator
return wrapper
def login_required(group=None):
def wrapper(func):
@functools.wraps(func)
def decorator(*args, **kwargs):
if not login_valid():
flash('You need to login first')
return redirect(url_for('session.login', ref=request.url))
if not session.get('user_mfa'):
return redirect(url_for('mfa.auth', ref=request.url))
if not get_current_user().is_in_group(group):
flash('Access denied')
return redirect(url_for('index'))
return func(*args, **kwargs)
return decorator
return wrapper
/*!
* Bootstrap-Dark v4.0.0 (https://github.com/ForEvolve/bootstrap-dark)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
@media (prefers-color-scheme:dark) {
body {
color: #d3d3d3;
background-color: #191d21
}
abbr[data-original-title],
abbr[title] {
border-bottom: 0
}
a {
color: #adadad;
background-color: transparent
}
a:hover {
color: #878787
}
a:not([href]):not([class]) {
color: inherit
}
a:not([href]):not([class]):hover {
color: inherit
}
caption {
color: #6c757d
}
fieldset {
border: 0
}
legend {
color: inherit
}
hr {
border: 0;
border-top: 1px solid rgba(255,255,255,.1)
}
.mark,
mark {
background-color: #fcf8e3
}
.blockquote-footer {
color: #6c757d
}
.img-thumbnail {
background-color: #fff;
border: 1px solid #dee2e6
}
.figure-caption {
color: #6c757d
}
code {
color: #e83e8c
}
a > code {
color: inherit
}
kbd {
color: #fff;
background-color: #212529
}
pre {
color: #f8f9fa
}
pre code {
color: inherit
}
}
@media (prefers-color-scheme:dark) {
.table {
color: #d3d3d3
}
.table td,
.table th {
border-top: 1px solid #343a40
}
.table thead th {
border-bottom: 2px solid #343a40
}
.table tbody + tbody {
border-top: 2px solid #343a40
}
.table-bordered {
border: 1px solid #343a40
}
.table-bordered td,
.table-bordered th {
border: 1px solid #343a40
}
.table-borderless tbody + tbody,
.table-borderless td,
.table-borderless th,
.table-borderless thead th {
border: 0
}
.table-striped tbody tr:nth-of-type(odd) {
background-color: rgba(0,0,0,.05)
}
.table-hover tbody tr:hover {
color: #d3d3d3;
background-color: rgba(0,0,0,.075)
}
.table-primary,
.table-primary > td,
.table-primary > th {
background-color: #c6e1ff
}
.table-primary tbody + tbody,
.table-primary td,
.table-primary th,
.table-primary thead th {
border-color: #95c8ff
}
.table-hover .table-primary:hover {
background-color: #add4ff
}
.table-hover .table-primary:hover > td,
.table-hover .table-primary:hover > th {
background-color: #add4ff
}
.table-secondary,
.table-secondary > td,
.table-secondary > th {
background-color: #d6d8db
}
.table-secondary tbody + tbody,
.table-secondary td,
.table-secondary th,
.table-secondary thead th {
border-color: #b3b7bb
}
.table-hover .table-secondary:hover {
background-color: #c8cbcf
}
.table-hover .table-secondary:hover > td,
.table-hover .table-secondary:hover > th {
background-color: #c8cbcf
}
.table-success,
.table-success > td,
.table-success > th {
background-color: #c3e6cb
}
.table-success tbody + tbody,
.table-success td,
.table-success th,
.table-success thead th {
border-color: #8fd19e
}
.table-hover .table-success:hover {
background-color: #b1dfbb
}
.table-hover .table-success:hover > td,
.table-hover .table-success:hover > th {
background-color: #b1dfbb
}
.table-info,
.table-info > td,
.table-info > th {
background-color: #bee5eb
}
.table-info tbody + tbody,
.table-info td,
.table-info th,
.table-info thead th {
border-color: #86cfda
}
.table-hover .table-info:hover {
background-color: #abdde5
}
.table-hover .table-info:hover > td,
.table-hover .table-info:hover > th {
background-color: #abdde5
}
.table-warning,
.table-warning > td,
.table-warning > th {
background-color: #fedbbd
}
.table-warning tbody + tbody,
.table-warning td,
.table-warning th,
.table-warning thead th {
border-color: #febc85
}
.table-hover .table-warning:hover {
background-color: #fecda4
}
.table-hover .table-warning:hover > td,
.table-hover .table-warning:hover > th {
background-color: #fecda4
}
.table-danger,
.table-danger > td,
.table-danger > th {
background-color: #f5c6cb
}
.table-danger tbody + tbody,
.table-danger td,
.table-danger th,
.table-danger thead th {
border-color: #ed969e
}
.table-hover .table-danger:hover {
background-color: #f1b0b7
}
.table-hover .table-danger:hover > td,
.table-hover .table-danger:hover > th {
background-color: #f1b0b7
}
.table-light,
.table-light > td,
.table-light > th {
background-color: #f6f7f8
}
.table-light tbody + tbody,
.table-light td,
.table-light th,
.table-light thead th {
border-color: #eef0f2
}
.table-hover .table-light:hover {
background-color: #e8eaed
}
.table-hover .table-light:hover > td,
.table-hover .table-light:hover > th {
background-color: #e8eaed
}
.table-dark,
.table-dark > td,
.table-dark > th {
background-color: #c6c8ca
}
.table-dark tbody + tbody,
.table-dark td,
.table-dark th,
.table-dark thead th {
border-color: #95999c
}
.table-hover .table-dark:hover {
background-color: #b9bbbe
}
.table-hover .table-dark:hover > td,
.table-hover .table-dark:hover > th {
background-color: #b9bbbe
}
.table-active,
.table-active > td,
.table-active > th {
background-color: rgba(0,0,0,.075)
}
.table-hover .table-active:hover {
background-color: rgba(0,0,0,.075)
}
.table-hover .table-active:hover > td,
.table-hover .table-active:hover > th {
background-color: rgba(0,0,0,.075)
}
.table .thead-dark th {
color: #dee2e6;
background-color: #343a40;
border-color: #454d55
}
.table .thead-light th {
color: #495057;
background-color: #e9ecef;
border-color: #343a40
}
.table-dark {
color: #dee2e6;
background-color: #343a40
}
.table-dark td,
.table-dark th,
.table-dark thead th {
border-color: #454d55
}
.table-dark.table-bordered {
border: 0
}
.table-dark.table-striped tbody tr:nth-of-type(odd) {
background-color: rgba(255,255,255,.05)
}
.table-dark.table-hover tbody tr:hover {
color: #fff;
background-color: rgba(255,255,255,.075)
}
}
@media (prefers-color-scheme:dark) and (max-width:575.98px) {
.table-responsive-sm > .table-bordered {
border: 0
}
}
@media (prefers-color-scheme:dark) and (max-width:767.98px) {
.table-responsive-md > .table-bordered {
border: 0
}
}
@media (prefers-color-scheme:dark) and (max-width:991.98px) {
.table-responsive-lg > .table-bordered {
border: 0
}
}
@media (prefers-color-scheme:dark) and (max-width:1199.98px) {
.table-responsive-xl > .table-bordered {
border: 0
}
}
@media (prefers-color-scheme:dark) {
.table-responsive > .table-bordered {
border: 0
}
.table-primary,
.table-primary > td,
.table-primary > th {
color: #343a40
}
.table-hover .table-primary:hover {
color: #343a40
}
.table-hover .table-primary:hover > td,
.table-hover .table-primary:hover > th {
color: #343a40
}
.table-secondary,
.table-secondary > td,
.table-secondary > th {
color: #343a40
}
.table-hover .table-secondary:hover {
color: #343a40
}
.table-hover .table-secondary:hover > td,
.table-hover .table-secondary:hover > th {
color: #343a40
}
.table-success,
.table-success > td,
.table-success > th {
color: #343a40
}
.table-hover .table-success:hover {
color: #343a40
}
.table-hover .table-success:hover > td,
.table-hover .table-success:hover > th {
color: #343a40
}
.table-info,
.table-info > td,
.table-info > th {
color: #343a40
}
.table-hover .table-info:hover {
color: #343a40
}
.table-hover .table-info:hover > td,
.table-hover .table-info:hover > th {
color: #343a40
}
.table-warning,
.table-warning > td,
.table-warning > th {
color: #343a40
}
.table-hover .table-warning:hover {
color: #343a40
}
.table-hover .table-warning:hover > td,
.table-hover .table-warning:hover > th {
color: #343a40
}
.table-danger,
.table-danger > td,
.table-danger > th {
color: #343a40
}
.table-hover .table-danger:hover {
color: #343a40
}
.table-hover .table-danger:hover > td,
.table-hover .table-danger:hover > th {
color: #343a40
}
.table-light,
.table-light > td,
.table-light > th {
color: #343a40
}
.table-hover .table-light:hover {
color: #343a40
}
.table-hover .table-light:hover > td,
.table-hover .table-light:hover > th {
color: #343a40
}
.table-dark,
.table-dark > td,
.table-dark > th {
color: #343a40
}
.table-hover .table-dark:hover {
color: #343a40
}
.table-hover .table-dark:hover > td,
.table-hover .table-dark:hover > th {
color: #343a40
}
.table-active,
.table-active > td,
.table-active > th {
color: #e9ecef
}
.table-hover .table-active:hover {
color: #e9ecef
}
.table-hover .table-active:hover > td,
.table-hover .table-active:hover > th {
color: #e9ecef
}
.table-dark {
color: #dee2e6
}
.form-control {
color: #dee2e6;
background-color: #000;
border: 1px solid #6c757d
}
}
@media (prefers-color-scheme:dark) {
.form-control::-ms-expand {
background-color: transparent;
border: 0
}
.form-control:focus {
color: #dee2e6;
background-color: #191d21;
border-color: #b3d7ff;
box-shadow: 0 0 0 .2rem rgba(0,123,255,.25)
}
.form-control::-webkit-input-placeholder {
color: #6c757d
}
.form-control::-moz-placeholder {
color: #6c757d
}
.form-control::-ms-input-placeholder {
color: #6c757d
}
.form-control::placeholder {
color: #6c757d
}
.form-control:disabled,
.form-control[readonly] {
background-color: #343a40
}
select.form-control:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 #dee2e6
}
select.form-control:focus::-ms-value {
color: #dee2e6;
background-color: #000
}
.form-control-plaintext {
color: #212529;
background-color: transparent;
border: solid transparent
}
.form-check-input:disabled ~ .form-check-label,
.form-check-input[disabled] ~ .form-check-label {
color: #6c757d
}
.valid-feedback {
color: #28a745
}
.valid-tooltip {
color: #e9ecef;
background-color: rgba(40,167,69,.9)
}
.form-control.is-valid,
.was-validated .form-control:valid {
border-color: #28a745;
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")
}
.form-control.is-valid:focus,
.was-validated .form-control:valid:focus {
border-color: #28a745;
box-shadow: 0 0 0 .2rem rgba(40,167,69,.25)
}
.custom-select.is-valid,
.was-validated .custom-select:valid {
border-color: #28a745;
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 .75rem center/8px 10px no-repeat,#000 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(.75em + .375rem) calc(.75em + .375rem) no-repeat
}
.custom-select.is-valid:focus,
.was-validated .custom-select:valid:focus {
border-color: #28a745;
box-shadow: 0 0 0 .2rem rgba(40,167,69,.25)
}
.form-check-input.is-valid ~ .form-check-label,
.was-validated .form-check-input:valid ~ .form-check-label {
color: #28a745
}
.custom-control-input.is-valid ~ .custom-control-label,
.was-validated .custom-control-input:valid ~ .custom-control-label {
color: #28a745
}
.custom-control-input.is-valid ~ .custom-control-label::before,
.was-validated .custom-control-input:valid ~ .custom-control-label::before {
border-color: #28a745
}
.custom-control-input.is-valid:checked ~ .custom-control-label::before,
.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before {
border-color: #34ce57;
background-color: #34ce57
}
.custom-control-input.is-valid:focus ~ .custom-control-label::before,
.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before {
box-shadow: 0 0 0 .2rem rgba(40,167,69,.25)
}
.custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before,
.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before {
border-color: #28a745
}
.custom-file-input.is-valid ~ .custom-file-label,
.was-validated .custom-file-input:valid ~ .custom-file-label {
border-color: #28a745
}
.custom-file-input.is-valid:focus ~ .custom-file-label,
.was-validated .custom-file-input:valid:focus ~ .custom-file-label {
border-color: #28a745;
box-shadow: 0 0 0 .2rem rgba(40,167,69,.25)
}
.invalid-feedback {
color: #dc3545
}
.invalid-tooltip {
color: #e9ecef;
background-color: rgba(220,53,69,.9)
}
.form-control.is-invalid,
.was-validated .form-control:invalid {
border-color: #dc3545;
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")
}
.form-control.is-invalid:focus,
.was-validated .form-control:invalid:focus {
border-color: #dc3545;
box-shadow: 0 0 0 .2rem rgba(220,53,69,.25)
}
.custom-select.is-invalid,
.was-validated .custom-select:invalid {
border-color: #dc3545;
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 .75rem center/8px 10px no-repeat,#000 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(.75em + .375rem) calc(.75em + .375rem) no-repeat
}
.custom-select.is-invalid:focus,
.was-validated .custom-select:invalid:focus {
border-color: #dc3545;
box-shadow: 0 0 0 .2rem rgba(220,53,69,.25)
}
.form-check-input.is-invalid ~ .form-check-label,
.was-validated .form-check-input:invalid ~ .form-check-label {
color: #dc3545
}
.custom-control-input.is-invalid ~ .custom-control-label,
.was-validated .custom-control-input:invalid ~ .custom-control-label {
color: #dc3545
}
.custom-control-input.is-invalid ~ .custom-control-label::before,
.was-validated .custom-control-input:invalid ~ .custom-control-label::before {
border-color: #dc3545
}
.custom-control-input.is-invalid:checked ~ .custom-control-label::before,
.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before {
border-color: #e4606d;
background-color: #e4606d
}
.custom-control-input.is-invalid:focus ~ .custom-control-label::before,
.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before {
box-shadow: 0 0 0 .2rem rgba(220,53,69,.25)
}
.custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before,
.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before {
border-color: #dc3545
}
.custom-file-input.is-invalid ~ .custom-file-label,
.was-validated .custom-file-input:invalid ~ .custom-file-label {
border-color: #dc3545
}
.custom-file-input.is-invalid:focus ~ .custom-file-label,
.was-validated .custom-file-input:invalid:focus ~ .custom-file-label {
border-color: #dc3545;
box-shadow: 0 0 0 .2rem rgba(220,53,69,.25)
}
}
@media (prefers-color-scheme:dark) {
.btn {
color: #d3d3d3;
background-color: transparent;
border: 1px solid transparent
}
}
@media (prefers-color-scheme:dark) {
.btn:hover {
color: #d3d3d3
}
.btn.focus,
.btn:focus {
box-shadow: 0 0 0 .2rem rgba(0,123,255,.25)
}
.btn-primary {
color: #e9ecef;
background-color: #3395ff;
border-color: #3395ff
}
.btn-primary:hover {
color: #e9ecef;
background-color: #0d82ff;
border-color: #007bff
}
.btn-primary.focus,
.btn-primary:focus {
color: #e9ecef;
background-color: #0d82ff;
border-color: #007bff;
box-shadow: 0 0 0 .2rem rgba(78,162,253,.5)
}
.btn-primary.disabled,
.btn-primary:disabled {
color: #e9ecef;
background-color: #3395ff;
border-color: #3395ff
}
.btn-primary:not(:disabled):not(.disabled).active,
.btn-primary:not(:disabled):not(.disabled):active,
.show > .btn-primary.dropdown-toggle {
color: #e9ecef;
background-color: #007bff;
border-color: #0075f2
}
.btn-primary:not(:disabled):not(.disabled).active:focus,
.btn-primary:not(:disabled):not(.disabled):active:focus,
.show > .btn-primary.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(78,162,253,.5)
}
.btn-secondary {
color: #e9ecef;
background-color: #6c757d;
border-color: #6c757d
}
.btn-secondary:hover {
color: #e9ecef;
background-color: #5a6268;
border-color: #545b62
}
.btn-secondary.focus,
.btn-secondary:focus {
color: #e9ecef;
background-color: #5a6268;
border-color: #545b62;
box-shadow: 0 0 0 .2rem rgba(127,135,142,.5)
}
.btn-secondary.disabled,
.btn-secondary:disabled {
color: #e9ecef;
background-color: #6c757d;
border-color: #6c757d
}
.btn-secondary:not(:disabled):not(.disabled).active,
.btn-secondary:not(:disabled):not(.disabled):active,
.show > .btn-secondary.dropdown-toggle {
color: #e9ecef;
background-color: #545b62;
border-color: #4e555b
}
.btn-secondary:not(:disabled):not(.disabled).active:focus,
.btn-secondary:not(:disabled):not(.disabled):active:focus,
.show > .btn-secondary.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(127,135,142,.5)
}
.btn-success {
color: #e9ecef;
background-color: #28a745;
border-color: #28a745
}
.btn-success:hover {
color: #e9ecef;
background-color: #218838;
border-color: #1e7e34
}
.btn-success.focus,
.btn-success:focus {
color: #e9ecef;
background-color: #218838;
border-color: #1e7e34;
box-shadow: 0 0 0 .2rem rgba(69,177,95,.5)
}
.btn-success.disabled,
.btn-success:disabled {
color: #e9ecef;
background-color: #28a745;
border-color: #28a745
}
.btn-success:not(:disabled):not(.disabled).active,
.btn-success:not(:disabled):not(.disabled):active,
.show > .btn-success.dropdown-toggle {
color: #e9ecef;
background-color: #1e7e34;
border-color: #1c7430
}
.btn-success:not(:disabled):not(.disabled).active:focus,
.btn-success:not(:disabled):not(.disabled):active:focus,
.show > .btn-success.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(69,177,95,.5)
}
.btn-info {
color: #e9ecef;
background-color: #17a2b8;
border-color: #17a2b8
}
.btn-info:hover {
color: #e9ecef;
background-color: #138496;
border-color: #117a8b
}
.btn-info.focus,
.btn-info:focus {
color: #e9ecef;
background-color: #138496;
border-color: #117a8b;
box-shadow: 0 0 0 .2rem rgba(55,173,192,.5)
}
.btn-info.disabled,
.btn-info:disabled {
color: #e9ecef;
background-color: #17a2b8;
border-color: #17a2b8
}
.btn-info:not(:disabled):not(.disabled).active,
.btn-info:not(:disabled):not(.disabled):active,
.show > .btn-info.dropdown-toggle {
color: #e9ecef;
background-color: #117a8b;
border-color: #10707f
}
.btn-info:not(:disabled):not(.disabled).active:focus,
.btn-info:not(:disabled):not(.disabled):active:focus,
.show > .btn-info.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(55,173,192,.5)
}
.btn-warning {
color: #343a40;
background-color: #fd7e14;
border-color: #fd7e14
}
.btn-warning:hover {
color: #e9ecef;
background-color: #e96b02;
border-color: #dc6502
}
.btn-warning.focus,
.btn-warning:focus {
color: #e9ecef;
background-color: #e96b02;
border-color: #dc6502;
box-shadow: 0 0 0 .2rem rgba(223,116,27,.5)
}
.btn-warning.disabled,
.btn-warning:disabled {
color: #343a40;
background-color: #fd7e14;
border-color: #fd7e14
}
.btn-warning:not(:disabled):not(.disabled).active,
.btn-warning:not(:disabled):not(.disabled):active,
.show > .btn-warning.dropdown-toggle {
color: #e9ecef;
background-color: #dc6502;
border-color: #cf5f02
}
.btn-warning:not(:disabled):not(.disabled).active:focus,
.btn-warning:not(:disabled):not(.disabled):active:focus,
.show > .btn-warning.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(223,116,27,.5)
}
.btn-danger {
color: #e9ecef;
background-color: #dc3545;
border-color: #dc3545
}
.btn-danger:hover {
color: #e9ecef;
background-color: #c82333;
border-color: #bd2130
}
.btn-danger.focus,
.btn-danger:focus {
color: #e9ecef;
background-color: #c82333;
border-color: #bd2130;
box-shadow: 0 0 0 .2rem rgba(222,80,95,.5)
}
.btn-danger.disabled,
.btn-danger:disabled {
color: #e9ecef;
background-color: #dc3545;
border-color: #dc3545
}
.btn-danger:not(:disabled):not(.disabled).active,
.btn-danger:not(:disabled):not(.disabled):active,
.show > .btn-danger.dropdown-toggle {
color: #e9ecef;
background-color: #bd2130;
border-color: #b21f2d
}
.btn-danger:not(:disabled):not(.disabled).active:focus,
.btn-danger:not(:disabled):not(.disabled):active:focus,
.show > .btn-danger.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(222,80,95,.5)
}
.btn-light {
color: #343a40;
background-color: #dee2e6;
border-color: #dee2e6
}
.btn-light:hover {
color: #343a40;
background-color: #c8cfd6;
border-color: #c1c9d0
}
.btn-light.focus,
.btn-light:focus {
color: #343a40;
background-color: #c8cfd6;
border-color: #c1c9d0;
box-shadow: 0 0 0 .2rem rgba(197,201,205,.5)
}
.btn-light.disabled,
.btn-light:disabled {
color: #343a40;
background-color: #dee2e6;
border-color: #dee2e6
}
.btn-light:not(:disabled):not(.disabled).active,
.btn-light:not(:disabled):not(.disabled):active,
.show > .btn-light.dropdown-toggle {
color: #343a40;
background-color: #c1c9d0;
border-color: #bac2cb
}
.btn-light:not(:disabled):not(.disabled).active:focus,
.btn-light:not(:disabled):not(.disabled):active:focus,
.show > .btn-light.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(197,201,205,.5)
}
.btn-dark {
color: #e9ecef;
background-color: #343a40;
border-color: #343a40
}
.btn-dark:hover {
color: #e9ecef;
background-color: #23272b;
border-color: #1d2124
}
.btn-dark.focus,
.btn-dark:focus {
color: #e9ecef;
background-color: #23272b;
border-color: #1d2124;
box-shadow: 0 0 0 .2rem rgba(79,85,90,.5)
}
.btn-dark.disabled,
.btn-dark:disabled {
color: #e9ecef;
background-color: #343a40;
border-color: #343a40
}
.btn-dark:not(:disabled):not(.disabled).active,
.btn-dark:not(:disabled):not(.disabled):active,
.show > .btn-dark.dropdown-toggle {
color: #e9ecef;
background-color: #1d2124;
border-color: #171a1d
}
.btn-dark:not(:disabled):not(.disabled).active:focus,
.btn-dark:not(:disabled):not(.disabled):active:focus,
.show > .btn-dark.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(79,85,90,.5)
}
.btn-outline-primary {
color: #3395ff;
border-color: #3395ff
}
.btn-outline-primary:hover {
color: #e9ecef;
background-color: #3395ff;
border-color: #3395ff
}
.btn-outline-primary.focus,
.btn-outline-primary:focus {
box-shadow: 0 0 0 .2rem rgba(51,149,255,.5)
}
.btn-outline-primary.disabled,
.btn-outline-primary:disabled {
color: #3395ff;
background-color: transparent
}
.btn-outline-primary:not(:disabled):not(.disabled).active,
.btn-outline-primary:not(:disabled):not(.disabled):active,
.show > .btn-outline-primary.dropdown-toggle {
color: #e9ecef;
background-color: #3395ff;
border-color: #3395ff
}
.btn-outline-primary:not(:disabled):not(.disabled).active:focus,
.btn-outline-primary:not(:disabled):not(.disabled):active:focus,
.show > .btn-outline-primary.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(51,149,255,.5)
}
.btn-outline-secondary {
color: #6c757d;
border-color: #6c757d
}
.btn-outline-secondary:hover {
color: #e9ecef;
background-color: #6c757d;
border-color: #6c757d
}
.btn-outline-secondary.focus,
.btn-outline-secondary:focus {
box-shadow: 0 0 0 .2rem rgba(108,117,125,.5)
}
.btn-outline-secondary.disabled,
.btn-outline-secondary:disabled {
color: #6c757d;
background-color: transparent
}
.btn-outline-secondary:not(:disabled):not(.disabled).active,
.btn-outline-secondary:not(:disabled):not(.disabled):active,
.show > .btn-outline-secondary.dropdown-toggle {
color: #e9ecef;
background-color: #6c757d;
border-color: #6c757d
}
.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,
.show > .btn-outline-secondary.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(108,117,125,.5)
}
.btn-outline-success {
color: #28a745;
border-color: #28a745
}
.btn-outline-success:hover {
color: #e9ecef;
background-color: #28a745;
border-color: #28a745
}
.btn-outline-success.focus,
.btn-outline-success:focus {
box-shadow: 0 0 0 .2rem rgba(40,167,69,.5)
}
.btn-outline-success.disabled,
.btn-outline-success:disabled {
color: #28a745;
background-color: transparent
}
.btn-outline-success:not(:disabled):not(.disabled).active,
.btn-outline-success:not(:disabled):not(.disabled):active,
.show > .btn-outline-success.dropdown-toggle {
color: #e9ecef;
background-color: #28a745;
border-color: #28a745
}
.btn-outline-success:not(:disabled):not(.disabled).active:focus,
.btn-outline-success:not(:disabled):not(.disabled):active:focus,
.show > .btn-outline-success.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(40,167,69,.5)
}
.btn-outline-info {
color: #17a2b8;
border-color: #17a2b8
}
.btn-outline-info:hover {
color: #e9ecef;
background-color: #17a2b8;
border-color: #17a2b8
}
.btn-outline-info.focus,
.btn-outline-info:focus {
box-shadow: 0 0 0 .2rem rgba(23,162,184,.5)
}
.btn-outline-info.disabled,
.btn-outline-info:disabled {
color: #17a2b8;
background-color: transparent
}
.btn-outline-info:not(:disabled):not(.disabled).active,
.btn-outline-info:not(:disabled):not(.disabled):active,
.show > .btn-outline-info.dropdown-toggle {
color: #e9ecef;
background-color: #17a2b8;
border-color: #17a2b8
}
.btn-outline-info:not(:disabled):not(.disabled).active:focus,
.btn-outline-info:not(:disabled):not(.disabled):active:focus,
.show > .btn-outline-info.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(23,162,184,.5)
}
.btn-outline-warning {
color: #fd7e14;
border-color: #fd7e14
}
.btn-outline-warning:hover {
color: #343a40;
background-color: #fd7e14;
border-color: #fd7e14
}
.btn-outline-warning.focus,
.btn-outline-warning:focus {
box-shadow: 0 0 0 .2rem rgba(253,126,20,.5)
}
.btn-outline-warning.disabled,
.btn-outline-warning:disabled {
color: #fd7e14;
background-color: transparent
}
.btn-outline-warning:not(:disabled):not(.disabled).active,
.btn-outline-warning:not(:disabled):not(.disabled):active,
.show > .btn-outline-warning.dropdown-toggle {
color: #343a40;
background-color: #fd7e14;
border-color: #fd7e14
}
.btn-outline-warning:not(:disabled):not(.disabled).active:focus,
.btn-outline-warning:not(:disabled):not(.disabled):active:focus,
.show > .btn-outline-warning.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(253,126,20,.5)
}
.btn-outline-danger {
color: #dc3545;
border-color: #dc3545
}
.btn-outline-danger:hover {
color: #e9ecef;
background-color: #dc3545;
border-color: #dc3545
}
.btn-outline-danger.focus,
.btn-outline-danger:focus {
box-shadow: 0 0 0 .2rem rgba(220,53,69,.5)
}
.btn-outline-danger.disabled,
.btn-outline-danger:disabled {
color: #dc3545;
background-color: transparent
}
.btn-outline-danger:not(:disabled):not(.disabled).active,
.btn-outline-danger:not(:disabled):not(.disabled):active,
.show > .btn-outline-danger.dropdown-toggle {
color: #e9ecef;
background-color: #dc3545;
border-color: #dc3545
}
.btn-outline-danger:not(:disabled):not(.disabled).active:focus,
.btn-outline-danger:not(:disabled):not(.disabled):active:focus,
.show > .btn-outline-danger.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(220,53,69,.5)
}
.btn-outline-light {
color: #dee2e6;
border-color: #dee2e6
}
.btn-outline-light:hover {
color: #343a40;
background-color: #dee2e6;
border-color: #dee2e6
}
.btn-outline-light.focus,
.btn-outline-light:focus {
box-shadow: 0 0 0 .2rem rgba(222,226,230,.5)
}
.btn-outline-light.disabled,
.btn-outline-light:disabled {
color: #dee2e6;
background-color: transparent
}
.btn-outline-light:not(:disabled):not(.disabled).active,
.btn-outline-light:not(:disabled):not(.disabled):active,
.show > .btn-outline-light.dropdown-toggle {
color: #343a40;
background-color: #dee2e6;
border-color: #dee2e6
}
.btn-outline-light:not(:disabled):not(.disabled).active:focus,
.btn-outline-light:not(:disabled):not(.disabled):active:focus,
.show > .btn-outline-light.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(222,226,230,.5)
}
.btn-outline-dark {
color: #343a40;
border-color: #343a40
}
.btn-outline-dark:hover {
color: #e9ecef;
background-color: #343a40;
border-color: #343a40
}
.btn-outline-dark.focus,
.btn-outline-dark:focus {
box-shadow: 0 0 0 .2rem rgba(52,58,64,.5)
}
.btn-outline-dark.disabled,
.btn-outline-dark:disabled {
color: #343a40;
background-color: transparent
}
.btn-outline-dark:not(:disabled):not(.disabled).active,
.btn-outline-dark:not(:disabled):not(.disabled):active,
.show > .btn-outline-dark.dropdown-toggle {
color: #e9ecef;
background-color: #343a40;
border-color: #343a40
}
.btn-outline-dark:not(:disabled):not(.disabled).active:focus,
.btn-outline-dark:not(:disabled):not(.disabled):active:focus,
.show > .btn-outline-dark.dropdown-toggle:focus {
box-shadow: 0 0 0 .2rem rgba(52,58,64,.5)
}
.btn-link {
color: #adadad
}
.btn-link:hover {
color: #878787
}
.btn-link.disabled,
.btn-link:disabled {
color: #6c757d
}
}
@media (prefers-color-scheme:dark) {
.dropdown-toggle::after {
border-top: .3em solid;
border-right: .3em solid transparent;
border-bottom: 0;
border-left: .3em solid transparent
}
.dropdown-menu {
color: #d3d3d3;
background-color: #000;
border: 1px solid rgba(255,255,255,.15)
}
}
@media (prefers-color-scheme:dark) {
.dropup .dropdown-toggle::after {
border-top: 0;
border-right: .3em solid transparent;
border-bottom: .3em solid;
border-left: .3em solid transparent
}
.dropright .dropdown-toggle::after {
border-top: .3em solid transparent;
border-right: 0;
border-bottom: .3em solid transparent;
border-left: .3em solid
}
.dropleft .dropdown-toggle::before {
border-top: .3em solid transparent;
border-right: .3em solid;
border-bottom: .3em solid transparent
}
.dropdown-divider {
border-top: 1px solid #343a40
}
.dropdown-item {
color: #f8f9fa;
background-color: transparent;
border: 0
}
.dropdown-item:focus,
.dropdown-item:hover {
color: #fff;
background-color: #212529
}
.dropdown-item.active,
.dropdown-item:active {
color: #000;
background-color: #3395ff
}
.dropdown-item.disabled,
.dropdown-item:disabled {
color: #ced4da;
background-color: transparent
}
.dropdown-header {
color: #ced4da
}
.dropdown-item-text {
color: #f8f9fa
}
.input-group-text {
color: #dee2e6;
background-color: #343a40;
border: 1px solid #6c757d
}
.custom-control-input:checked ~ .custom-control-label::before {
color: #fff;
border-color: #007bff;
background-color: #007bff
}
.custom-control-input:focus ~ .custom-control-label::before {
box-shadow: 0 0 0 .2rem rgba(0,123,255,.25)
}
.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {
border-color: #80bdff
}
.custom-control-input:not(:disabled):active ~ .custom-control-label::before {
color: #fff;
background-color: #b3d7ff;
border-color: #b3d7ff
}
.custom-control-input:disabled ~ .custom-control-label,
.custom-control-input[disabled] ~ .custom-control-label {
color: #6c757d
}
.custom-control-input:disabled ~ .custom-control-label::before,
.custom-control-input[disabled] ~ .custom-control-label::before {
background-color: #e9ecef
}
.custom-control-label::before {
background-color: #fff;
border: 1px solid #adb5bd
}
.custom-control-label::after {
background: 50%/50% 50% no-repeat
}
.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
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='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")
}
.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
border-color: #007bff;
background-color: #007bff
}
.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")
}
.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
background-color: rgba(0,123,255,.5)
}
.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
background-color: rgba(0,123,255,.5)
}
.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")
}
.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
background-color: rgba(0,123,255,.5)
}
.custom-switch .custom-control-label::after {
background-color: #adb5bd
}
}
@media (prefers-color-scheme:dark) {
.custom-switch .custom-control-input:checked ~ .custom-control-label::after {
background-color: #fff
}
.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {
background-color: rgba(0,123,255,.5)
}
.custom-select {
color: #dee2e6;
background: #000 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 .75rem center/8px 10px no-repeat;
border: 1px solid #6c757d
}
.custom-select:focus {
border-color: #80bdff;
box-shadow: 0 0 0 .2rem rgba(0,123,255,.25)
}
.custom-select:focus::-ms-value {
color: #dee2e6;
background-color: #000
}
.custom-select[multiple],
.custom-select[size]:not([size="1"]) {
background-image: none
}
.custom-select:disabled {
color: #ced4da;
background-color: #343a40
}
.custom-select:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 #dee2e6
}
.custom-file-input:focus ~ .custom-file-label {
border-color: #80bdff;
box-shadow: 0 0 0 .2rem rgba(0,123,255,.25)
}
.custom-file-input:disabled ~ .custom-file-label,
.custom-file-input[disabled] ~ .custom-file-label {
background-color: #e9ecef
}
.custom-file-label {
color: #495057;
background-color: #fff;
border: 1px solid #ced4da
}
.custom-file-label::after {
color: #495057;
background-color: #e9ecef;
border-left: inherit
}
.custom-range {
background-color: transparent
}
.custom-range:focus::-webkit-slider-thumb {
box-shadow: 0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)
}
.custom-range:focus::-moz-range-thumb {
box-shadow: 0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)
}
.custom-range:focus::-ms-thumb {
box-shadow: 0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)
}
.custom-range::-moz-focus-outer {
border: 0
}
.custom-range::-webkit-slider-thumb {
background-color: #007bff;
border: 0
}
}
@media (prefers-color-scheme:dark) {
.custom-range::-webkit-slider-thumb:active {
background-color: #b3d7ff
}
.custom-range::-webkit-slider-runnable-track {
color: transparent;
background-color: #dee2e6;
border-color: transparent
}
.custom-range::-moz-range-thumb {
background-color: #007bff;
border: 0
}
}
@media (prefers-color-scheme:dark) {
.custom-range::-moz-range-thumb:active {
background-color: #b3d7ff
}
.custom-range::-moz-range-track {
color: transparent;
background-color: #dee2e6;
border-color: transparent
}
.custom-range::-ms-thumb {
background-color: #007bff;
border: 0
}
}
@media (prefers-color-scheme:dark) {
.custom-range::-ms-thumb:active {
background-color: #b3d7ff
}
.custom-range::-ms-track {
color: transparent;
background-color: transparent;
border-color: transparent
}
.custom-range::-ms-fill-lower {
background-color: #dee2e6
}
.custom-range::-ms-fill-upper {
background-color: #dee2e6
}
.custom-range:disabled::-webkit-slider-thumb {
background-color: #adb5bd
}
.custom-range:disabled::-moz-range-thumb {
background-color: #adb5bd
}
.custom-range:disabled::-ms-thumb {
background-color: #adb5bd
}
}
@media (prefers-color-scheme:dark) {
.nav-link.disabled {
color: #6c757d
}
.nav-tabs {
border-bottom: 1px solid rgba(255,255,255,.125)
}
.nav-tabs .nav-link {
background-color: transparent;
border: 1px solid transparent
}
.nav-tabs .nav-link:focus,
.nav-tabs .nav-link:hover {
border-color: #495057 #495057 rgba(255,255,255,.125)
}
.nav-tabs .nav-link.disabled {
color: #6c757d;
background-color: transparent;
border-color: transparent
}
.nav-tabs .nav-item.show .nav-link,
.nav-tabs .nav-link.active {
color: #f8f9fa;
background-color: #191d21;
border-color: #495057 #495057 #191d21
}
.nav-pills .nav-link {
background: 0 0;
border: 0
}
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link {
color: #fff;
background-color: #007bff
}
.navbar-toggler {
background-color: transparent;
border: 1px solid transparent
}
.navbar-toggler-icon {
background: 50%/100% 100% no-repeat
}
}
@media (prefers-color-scheme:dark) {
.navbar-light .navbar-brand {
color: rgba(0,0,0,.9)
}
.navbar-light .navbar-brand:focus,
.navbar-light .navbar-brand:hover {
color: rgba(0,0,0,.9)
}
.navbar-light .navbar-nav .nav-link {
color: rgba(0,0,0,.5)
}
.navbar-light .navbar-nav .nav-link:focus,
.navbar-light .navbar-nav .nav-link:hover {
color: rgba(0,0,0,.7)
}
.navbar-light .navbar-nav .nav-link.disabled {
color: rgba(0,0,0,.3)
}
.navbar-light .navbar-nav .active > .nav-link,
.navbar-light .navbar-nav .nav-link.active,
.navbar-light .navbar-nav .nav-link.show,
.navbar-light .navbar-nav .show > .nav-link {
color: rgba(0,0,0,.9)
}
.navbar-light .navbar-toggler {
color: rgba(0,0,0,.5);
border-color: rgba(0,0,0,.1)
}
.navbar-light .navbar-toggler-icon {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")
}
.navbar-light .navbar-text {
color: rgba(0,0,0,.5)
}
.navbar-light .navbar-text a {
color: rgba(0,0,0,.9)
}
.navbar-light .navbar-text a:focus,
.navbar-light .navbar-text a:hover {
color: rgba(0,0,0,.9)
}
.navbar-dark .navbar-brand,
.navbar-themed .navbar-brand {
color: #fff
}
.navbar-dark .navbar-brand:focus,
.navbar-dark .navbar-brand:hover,
.navbar-themed .navbar-brand:focus,
.navbar-themed .navbar-brand:hover {
color: #fff
}
.navbar-dark .navbar-nav .nav-link,
.navbar-themed .navbar-nav .nav-link {
color: rgba(255,255,255,.5)
}
.navbar-dark .navbar-nav .nav-link:focus,
.navbar-dark .navbar-nav .nav-link:hover,
.navbar-themed .navbar-nav .nav-link:focus,
.navbar-themed .navbar-nav .nav-link:hover {
color: rgba(255,255,255,.75)
}
.navbar-dark .navbar-nav .nav-link.disabled,
.navbar-themed .navbar-nav .nav-link.disabled {
color: rgba(255,255,255,.25)
}
.navbar-dark .navbar-nav .active > .nav-link,
.navbar-dark .navbar-nav .nav-link.active,
.navbar-dark .navbar-nav .nav-link.show,
.navbar-dark .navbar-nav .show > .nav-link,
.navbar-themed .navbar-nav .active > .nav-link,
.navbar-themed .navbar-nav .nav-link.active,
.navbar-themed .navbar-nav .nav-link.show,
.navbar-themed .navbar-nav .show > .nav-link {
color: #fff
}
.navbar-dark .navbar-toggler,
.navbar-themed .navbar-toggler {
color: rgba(255,255,255,.5);
border-color: rgba(255,255,255,.1)
}
.navbar-dark .navbar-toggler-icon,
.navbar-themed .navbar-toggler-icon {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")
}
.navbar-dark .navbar-text,
.navbar-themed .navbar-text {
color: rgba(255,255,255,.5)
}
.navbar-dark .navbar-text a,
.navbar-themed .navbar-text a {
color: #fff
}
.navbar-dark .navbar-text a:focus,
.navbar-dark .navbar-text a:hover,
.navbar-themed .navbar-text a:focus,
.navbar-themed .navbar-text a:hover {
color: #fff
}
.card {
background-color: #212529;
border: 1px solid rgba(255,255,255,.125)
}
.card > .list-group {
border-top: inherit;
border-bottom: inherit
}
.card > .card-header + .list-group,
.card > .list-group + .card-footer {
border-top: 0
}
.card-header {
background-color: rgba(255,255,255,.03);
border-bottom: 1px solid rgba(255,255,255,.125)
}
.card-footer {
background-color: rgba(255,255,255,.03);
border-top: 1px solid rgba(255,255,255,.125)
}
.card-header-tabs {
border-bottom: 0
}
}
@media (prefers-color-scheme:dark) and (min-width:576px) {
.card-group > .card + .card {
border-left: 0
}
}
@media (prefers-color-scheme:dark) {
.accordion > .card:not(:last-of-type) {
border-bottom: 0
}
.breadcrumb {
background-color: #343a40
}
.breadcrumb-item + .breadcrumb-item::before {
color: #ced4da
}
.breadcrumb-item.active {
color: #ced4da
}
.page-link {
color: #adadad;
background-color: #000;
border: 1px solid #495057
}
.page-link:hover {
color: #878787;
background-color: #343a40;
border-color: #495057
}
.page-link:focus {
box-shadow: 0 0 0 .2rem rgba(0,123,255,.25)
}
.page-item.active .page-link {
color: #000;
background-color: #3395ff;
border-color: #3395ff
}
.page-item.disabled .page-link {
color: #ced4da;
background-color: #000;
border-color: #495057
}
}
@media (prefers-color-scheme:dark) {
.badge-primary {
color: #e9ecef;
background-color: #3395ff
}
a.badge-primary:focus,
a.badge-primary:hover {
color: #e9ecef;
background-color: #007bff
}
a.badge-primary.focus,
a.badge-primary:focus {
box-shadow: 0 0 0 .2rem rgba(51,149,255,.5)
}
.badge-secondary {
color: #e9ecef;
background-color: #6c757d
}
a.badge-secondary:focus,
a.badge-secondary:hover {
color: #e9ecef;
background-color: #545b62
}
a.badge-secondary.focus,
a.badge-secondary:focus {
box-shadow: 0 0 0 .2rem rgba(108,117,125,.5)
}
.badge-success {
color: #e9ecef;
background-color: #28a745
}
a.badge-success:focus,
a.badge-success:hover {
color: #e9ecef;
background-color: #1e7e34
}
a.badge-success.focus,
a.badge-success:focus {
box-shadow: 0 0 0 .2rem rgba(40,167,69,.5)
}
.badge-info {
color: #e9ecef;
background-color: #17a2b8
}
a.badge-info:focus,
a.badge-info:hover {
color: #e9ecef;
background-color: #117a8b
}
a.badge-info.focus,
a.badge-info:focus {
box-shadow: 0 0 0 .2rem rgba(23,162,184,.5)
}
.badge-warning {
color: #343a40;
background-color: #fd7e14
}
a.badge-warning:focus,
a.badge-warning:hover {
color: #343a40;
background-color: #dc6502
}
a.badge-warning.focus,
a.badge-warning:focus {
box-shadow: 0 0 0 .2rem rgba(253,126,20,.5)
}
.badge-danger {
color: #e9ecef;
background-color: #dc3545
}
a.badge-danger:focus,
a.badge-danger:hover {
color: #e9ecef;
background-color: #bd2130
}
a.badge-danger.focus,
a.badge-danger:focus {
box-shadow: 0 0 0 .2rem rgba(220,53,69,.5)
}
.badge-light {
color: #343a40;
background-color: #dee2e6
}
a.badge-light:focus,
a.badge-light:hover {
color: #343a40;
background-color: #c1c9d0
}
a.badge-light.focus,
a.badge-light:focus {
box-shadow: 0 0 0 .2rem rgba(222,226,230,.5)
}
.badge-dark {
color: #e9ecef;
background-color: #343a40
}
a.badge-dark:focus,
a.badge-dark:hover {
color: #e9ecef;
background-color: #1d2124
}
a.badge-dark.focus,
a.badge-dark:focus {
box-shadow: 0 0 0 .2rem rgba(52,58,64,.5)
}
.jumbotron {
background-color: #343a40
}
}
@media (prefers-color-scheme:dark) {
.alert {
border: 1px solid transparent
}
.alert-heading {
color: inherit
}
.alert-dismissible .close {
color: inherit
}
.alert-primary {
color: #1b4e85;
background-color: #d6eaff;
border-color: #c6e1ff
}
.alert-primary .alert-link {
color: #12355b
}
.alert-secondary {
color: #383d41;
background-color: #e2e3e5;
border-color: #d6d8db
}
.alert-secondary .alert-link {
color: #202326
}
.alert-success {
color: #155724;
background-color: #d4edda;
border-color: #c3e6cb
}
.alert-success .alert-link {
color: #0b2e13
}
.alert-info {
color: #0c5460;
background-color: #d1ecf1;
border-color: #bee5eb
}
.alert-info .alert-link {
color: #062c33
}
.alert-warning {
color: #84420a;
background-color: #ffe5d0;
border-color: #fedbbd
}
.alert-warning .alert-link {
color: #552a06
}
.alert-danger {
color: #721c24;
background-color: #f8d7da;
border-color: #f5c6cb
}
.alert-danger .alert-link {
color: #491217
}
.alert-light,
.alert-themed-inverted {
color: #737678;
background-color: #f8f9fa;
border-color: #f6f7f8
}
.alert-light .alert-link,
.alert-themed-inverted .alert-link {
color: #5a5c5e
}
.alert-dark,
.alert-themed {
color: #1b1e21;
background-color: #d6d8d9;
border-color: #c6c8ca
}
.alert-dark .alert-link,
.alert-themed .alert-link {
color: #040505
}
@-webkit-keyframes progress-bar-stripes {
from {
background-position: 1rem 0
}
to {
background-position: 0 0
}
}
@keyframes progress-bar-stripes {
from {
background-position: 1rem 0
}
to {
background-position: 0 0
}
}
.progress {
background-color: #e9ecef
}
.progress-bar {
color: #fff;
background-color: #007bff
}
}
@media (prefers-color-scheme:dark) {
.progress-bar-striped {
background-image: linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)
}
}
@media (prefers-color-scheme:dark) {
.list-group-item-action {
color: #dee2e6
}
.list-group-item-action:focus,
.list-group-item-action:hover {
color: #dee2e6;
background-color: #212529
}
.list-group-item-action:active {
color: #d3d3d3;
background-color: #343a40
}
.list-group-item {
background-color: rgba(25,29,33,.05);
border: 1px solid rgba(255,255,255,.125)
}
.list-group-item.disabled,
.list-group-item:disabled {
color: #ced4da;
background-color: rgba(25,29,33,.05)
}
.list-group-item.active {
color: #000;
background-color: #3395ff;
border-color: #3395ff
}
}
@media (prefers-color-scheme:dark) {
.list-group-item-primary {
color: #1b4e85;
background-color: #c6e1ff
}
.list-group-item-primary.list-group-item-action:focus,
.list-group-item-primary.list-group-item-action:hover {
color: #1b4e85;
background-color: #add4ff
}
.list-group-item-primary.list-group-item-action.active {
color: #fff;
background-color: #1b4e85;
border-color: #1b4e85
}
.list-group-item-secondary {
color: #383d41;
background-color: #d6d8db
}
.list-group-item-secondary.list-group-item-action:focus,
.list-group-item-secondary.list-group-item-action:hover {
color: #383d41;
background-color: #c8cbcf
}
.list-group-item-secondary.list-group-item-action.active {
color: #fff;
background-color: #383d41;
border-color: #383d41
}
.list-group-item-success {
color: #155724;
background-color: #c3e6cb
}
.list-group-item-success.list-group-item-action:focus,
.list-group-item-success.list-group-item-action:hover {
color: #155724;
background-color: #b1dfbb
}
.list-group-item-success.list-group-item-action.active {
color: #fff;
background-color: #155724;
border-color: #155724
}
.list-group-item-info {
color: #0c5460;
background-color: #bee5eb
}
.list-group-item-info.list-group-item-action:focus,
.list-group-item-info.list-group-item-action:hover {
color: #0c5460;
background-color: #abdde5
}
.list-group-item-info.list-group-item-action.active {
color: #fff;
background-color: #0c5460;
border-color: #0c5460
}
.list-group-item-warning {
color: #84420a;
background-color: #fedbbd
}
.list-group-item-warning.list-group-item-action:focus,
.list-group-item-warning.list-group-item-action:hover {
color: #84420a;
background-color: #fecda4
}
.list-group-item-warning.list-group-item-action.active {
color: #fff;
background-color: #84420a;
border-color: #84420a
}
.list-group-item-danger {
color: #721c24;
background-color: #f5c6cb
}
.list-group-item-danger.list-group-item-action:focus,
.list-group-item-danger.list-group-item-action:hover {
color: #721c24;
background-color: #f1b0b7
}
.list-group-item-danger.list-group-item-action.active {
color: #fff;
background-color: #721c24;
border-color: #721c24
}
.list-group-item-light {
color: #737678;
background-color: #f6f7f8
}
.list-group-item-light.list-group-item-action:focus,
.list-group-item-light.list-group-item-action:hover {
color: #737678;
background-color: #e8eaed
}
.list-group-item-light.list-group-item-action.active {
color: #fff;
background-color: #737678;
border-color: #737678
}
.list-group-item-dark {
color: #1b1e21;
background-color: #c6c8ca
}
.list-group-item-dark.list-group-item-action:focus,
.list-group-item-dark.list-group-item-action:hover {
color: #1b1e21;
background-color: #b9bbbe
}
.list-group-item-dark.list-group-item-action.active {
color: #fff;
background-color: #1b1e21;
border-color: #1b1e21
}
.close {
color: #fff;
text-shadow: 0 1px 0 #000
}
.close:hover {
color: #fff
}
button.close {
background-color: transparent;
border: 0
}
.toast {
background-color: rgba(0,0,0,.85);
border: 1px solid rgba(255,255,255,.1);
box-shadow: 0 .25rem .75rem rgba(255,255,255,.1)
}
.toast-header {
color: #ced4da;
background-color: rgba(0,0,0,.85);
border-bottom: 1px solid rgba(255,255,255,.05)
}
}
@media (prefers-color-scheme:dark) {
.modal-content {
background-color: #191d21;
border: 1px solid rgba(255,255,255,.2)
}
.modal-backdrop {
background-color: #000
}
.modal-header {
border-bottom: 1px solid #343a40
}
.modal-footer {
border-top: 1px solid #343a40
}
}
@media (prefers-color-scheme:dark) {
.tooltip {
text-shadow: none
}
.tooltip .arrow::before {
border-color: transparent
}
.tooltip-inner {
color: #fff;
background-color: #000
}
.popover {
text-shadow: none;
background-color: #fff;
border: 1px solid rgba(0,0,0,.2)
}
.popover .arrow::after,
.popover .arrow::before {
border-color: transparent
}
.bs-popover-auto[x-placement^=bottom] .popover-header::before,
.bs-popover-bottom .popover-header::before {
border-bottom: 1px solid #f7f7f7
}
.popover-header {
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb
}
.popover-body {
color: #212529
}
}
@media (prefers-color-scheme:dark) {
.carousel-control-next,
.carousel-control-prev {
color: #fff;
background: 0 0;
border: 0
}
}
@media (prefers-color-scheme:dark) {
.carousel-control-next:focus,
.carousel-control-next:hover,
.carousel-control-prev:focus,
.carousel-control-prev:hover {
color: #fff
}
.carousel-control-next-icon,
.carousel-control-prev-icon {
background: 50%/100% 100% no-repeat
}
.carousel-control-prev-icon {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")
}
.carousel-control-next-icon {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")
}
.carousel-indicators li {
background-color: #fff;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent
}
}
@media (prefers-color-scheme:dark) {
.carousel-caption {
color: #fff
}
@-webkit-keyframes spinner-border {
to {
transform: rotate(360deg)
}
}
@keyframes spinner-border {
to {
transform: rotate(360deg)
}
}
.spinner-border {
border: .25em solid currentcolor
}
@-webkit-keyframes spinner-grow {
0% {
transform: scale(0)
}
50% {
opacity: 1;
transform: none
}
}
@keyframes spinner-grow {
0% {
transform: scale(0)
}
50% {
opacity: 1;
transform: none
}
}
.spinner-grow {
background-color: currentcolor
}
}
@media (prefers-color-scheme:dark) {
.bg-primary {
background-color: #3395ff!important
}
a.bg-primary:focus,
a.bg-primary:hover,
button.bg-primary:focus,
button.bg-primary:hover {
background-color: #007bff!important
}
.bg-secondary {
background-color: #6c757d!important
}
a.bg-secondary:focus,
a.bg-secondary:hover,
button.bg-secondary:focus,
button.bg-secondary:hover {
background-color: #545b62!important
}
.bg-success {
background-color: #28a745!important
}
a.bg-success:focus,
a.bg-success:hover,
button.bg-success:focus,
button.bg-success:hover {
background-color: #1e7e34!important
}
.bg-info {
background-color: #17a2b8!important
}
a.bg-info:focus,
a.bg-info:hover,
button.bg-info:focus,
button.bg-info:hover {
background-color: #117a8b!important
}
.bg-warning {
background-color: #fd7e14!important
}
a.bg-warning:focus,
a.bg-warning:hover,
button.bg-warning:focus,
button.bg-warning:hover {
background-color: #dc6502!important
}
.bg-danger {
background-color: #dc3545!important
}
a.bg-danger:focus,
a.bg-danger:hover,
button.bg-danger:focus,
button.bg-danger:hover {
background-color: #bd2130!important
}
.bg-light,
.bg-themed-inverted {
background-color: #dee2e6!important
}
a.bg-light:focus,
a.bg-light:hover,
a.bg-themed-inverted:focus,
a.bg-themed-inverted:hover,
button.bg-light:focus,
button.bg-light:hover,
button.bg-themed-inverted:focus,
button.bg-themed-inverted:hover {
background-color: #c1c9d0!important
}
.bg-dark,
.bg-themed,
.navbar-themed {
background-color: #343a40!important
}
a.bg-dark:focus,
a.bg-dark:hover,
a.bg-themed:focus,
a.bg-themed:hover,
a.navbar-themed:focus,
a.navbar-themed:hover,
button.bg-dark:focus,
button.bg-dark:hover,
button.bg-themed:focus,
button.bg-themed:hover,
button.navbar-themed:focus,
button.navbar-themed:hover {
background-color: #1d2124!important
}
.bg-white {
background-color: #fff!important
}
.bg-transparent {
background-color: transparent!important
}
.border {
border: 1px solid #343a40!important
}
.border-top {
border-top: 1px solid #343a40!important
}
.border-right {
border-right: 1px solid #343a40!important
}
.border-bottom {
border-bottom: 1px solid #343a40!important
}
.border-left {
border-left: 1px solid #343a40!important
}
.border-0 {
border: 0!important
}
.border-top-0 {
border-top: 0!important
}
.border-right-0 {
border-right: 0!important
}
.border-bottom-0 {
border-bottom: 0!important
}
.border-left-0 {
border-left: 0!important
}
.border-primary {
border-color: #3395ff!important
}
.border-secondary {
border-color: #6c757d!important
}
.border-success {
border-color: #28a745!important
}
.border-info {
border-color: #17a2b8!important
}
.border-warning {
border-color: #fd7e14!important
}
.border-danger {
border-color: #dc3545!important
}
.border-light {
border-color: #dee2e6!important
}
.border-dark {
border-color: #343a40!important
}
.border-white {
border-color: #fff!important
}
}
@media (prefers-color-scheme:dark) {
.embed-responsive .embed-responsive-item,
.embed-responsive embed,
.embed-responsive iframe,
.embed-responsive object,
.embed-responsive video {
border: 0
}
}
@media (prefers-color-scheme:dark) {
@supports ((position:-webkit-sticky) or (position:sticky)) {
.sticky-top {
position: -webkit-sticky;
position: sticky;
top: 0;
z-index: 1020
}
}
.sr-only {
border: 0
}
.shadow-sm {
box-shadow: 0 .125rem .25rem rgba(0,0,0,.075)!important
}
.shadow {
box-shadow: 0 .5rem 1rem rgba(0,0,0,.15)!important
}
.shadow-lg {
box-shadow: 0 1rem 3rem rgba(0,0,0,.175)!important
}
.shadow-none {
box-shadow: none!important
}
}
@media (prefers-color-scheme:dark) {
.stretched-link::after {
background-color: rgba(0,0,0,0)
}
}
@media (prefers-color-scheme:dark) {
.text-white {
color: #fff!important
}
.text-primary {
color: #3395ff!important
}
a.text-primary:focus,
a.text-primary:hover {
color: #006fe6!important
}
.text-secondary {
color: #6c757d!important
}
a.text-secondary:focus,
a.text-secondary:hover {
color: #494f54!important
}
.text-success {
color: #28a745!important
}
a.text-success:focus,
a.text-success:hover {
color: #19692c!important
}
.text-info {
color: #17a2b8!important
}
a.text-info:focus,
a.text-info:hover {
color: #0f6674!important
}
.text-warning {
color: #fd7e14!important
}
a.text-warning:focus,
a.text-warning:hover {
color: #c35a02!important
}
.text-danger {
color: #dc3545!important
}
a.text-danger:focus,
a.text-danger:hover {
color: #a71d2a!important
}
.text-light,
.text-themed {
color: #dee2e6!important
}
a.text-light:focus,
a.text-light:hover,
a.text-themed:focus,
a.text-themed:hover {
color: #b2bcc5!important
}
.text-dark,
.text-themed-inverted {
color: #343a40!important
}
a.text-dark:focus,
a.text-dark:hover,
a.text-themed-inverted:focus,
a.text-themed-inverted:hover {
color: #121416!important
}
.text-body {
color: #d3d3d3!important
}
.text-muted {
color: #6c757d!important
}
.text-black-50 {
color: rgba(0,0,0,.5)!important
}
.text-white-50 {
color: rgba(255,255,255,.5)!important
}
.text-hide {
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0
}
.text-reset {
color: inherit!important
}
}
\ No newline at end of file
/*!
* Bootstrap-Dark v4.0.0 (https://github.com/ForEvolve/bootstrap-dark)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
@media (prefers-color-scheme:dark) {body {color: #d3d3d3;background-color: #191d21 }abbr[data-original-title], abbr[title] {border-bottom: 0 }a {color: #adadad;background-color: transparent }a:hover {color: #878787 }a:not([href]):not([class]) {color: inherit }a:not([href]):not([class]):hover {color: inherit }caption {color: #6c757d }fieldset {border: 0 }legend {color: inherit }hr {border: 0;border-top: 1px solid rgba(255,255,255,.1) }.mark, mark {background-color: #fcf8e3 }.blockquote-footer {color: #6c757d }.img-thumbnail {background-color: #fff;border: 1px solid #dee2e6 }.figure-caption {color: #6c757d }code {color: #e83e8c }a > code {color: inherit }kbd {color: #fff;background-color: #212529 }pre {color: #f8f9fa }pre code {color: inherit }}@media (prefers-color-scheme:dark) {.table {color: #d3d3d3 }.table td, .table th {border-top: 1px solid #343a40 }.table thead th {border-bottom: 2px solid #343a40 }.table tbody + tbody {border-top: 2px solid #343a40 }.table-bordered {border: 1px solid #343a40 }.table-bordered td, .table-bordered th {border: 1px solid #343a40 }.table-borderless tbody + tbody, .table-borderless td, .table-borderless th, .table-borderless thead th {border: 0 }.table-striped tbody tr:nth-of-type(odd) {background-color: rgba(0,0,0,.05) }.table-hover tbody tr:hover {color: #d3d3d3;background-color: rgba(0,0,0,.075) }.table-primary, .table-primary > td, .table-primary > th {background-color: #c6e1ff }.table-primary tbody + tbody, .table-primary td, .table-primary th, .table-primary thead th {border-color: #95c8ff }.table-hover .table-primary:hover {background-color: #add4ff }.table-hover .table-primary:hover > td, .table-hover .table-primary:hover > th {background-color: #add4ff }.table-secondary, .table-secondary > td, .table-secondary > th {background-color: #d6d8db }.table-secondary tbody + tbody, .table-secondary td, .table-secondary th, .table-secondary thead th {border-color: #b3b7bb }.table-hover .table-secondary:hover {background-color: #c8cbcf }.table-hover .table-secondary:hover > td, .table-hover .table-secondary:hover > th {background-color: #c8cbcf }.table-success, .table-success > td, .table-success > th {background-color: #c3e6cb }.table-success tbody + tbody, .table-success td, .table-success th, .table-success thead th {border-color: #8fd19e }.table-hover .table-success:hover {background-color: #b1dfbb }.table-hover .table-success:hover > td, .table-hover .table-success:hover > th {background-color: #b1dfbb }.table-info, .table-info > td, .table-info > th {background-color: #bee5eb }.table-info tbody + tbody, .table-info td, .table-info th, .table-info thead th {border-color: #86cfda }.table-hover .table-info:hover {background-color: #abdde5 }.table-hover .table-info:hover > td, .table-hover .table-info:hover > th {background-color: #abdde5 }.table-warning, .table-warning > td, .table-warning > th {background-color: #fedbbd }.table-warning tbody + tbody, .table-warning td, .table-warning th, .table-warning thead th {border-color: #febc85 }.table-hover .table-warning:hover {background-color: #fecda4 }.table-hover .table-warning:hover > td, .table-hover .table-warning:hover > th {background-color: #fecda4 }.table-danger, .table-danger > td, .table-danger > th {background-color: #f5c6cb }.table-danger tbody + tbody, .table-danger td, .table-danger th, .table-danger thead th {border-color: #ed969e }.table-hover .table-danger:hover {background-color: #f1b0b7 }.table-hover .table-danger:hover > td, .table-hover .table-danger:hover > th {background-color: #f1b0b7 }.table-light, .table-light > td, .table-light > th {background-color: #f6f7f8 }.table-light tbody + tbody, .table-light td, .table-light th, .table-light thead th {border-color: #eef0f2 }.table-hover .table-light:hover {background-color: #e8eaed }.table-hover .table-light:hover > td, .table-hover .table-light:hover > th {background-color: #e8eaed }.table-dark, .table-dark > td, .table-dark > th {background-color: #c6c8ca }.table-dark tbody + tbody, .table-dark td, .table-dark th, .table-dark thead th {border-color: #95999c }.table-hover .table-dark:hover {background-color: #b9bbbe }.table-hover .table-dark:hover > td, .table-hover .table-dark:hover > th {background-color: #b9bbbe }.table-active, .table-active > td, .table-active > th {background-color: rgba(0,0,0,.075) }.table-hover .table-active:hover {background-color: rgba(0,0,0,.075) }.table-hover .table-active:hover > td, .table-hover .table-active:hover > th {background-color: rgba(0,0,0,.075) }.table .thead-dark th {color: #dee2e6;background-color: #343a40;border-color: #454d55 }.table .thead-light th {color: #495057;background-color: #e9ecef;border-color: #343a40 }.table-dark {color: #dee2e6;background-color: #343a40 }.table-dark td, .table-dark th, .table-dark thead th {border-color: #454d55 }.table-dark.table-bordered {border: 0 }.table-dark.table-striped tbody tr:nth-of-type(odd) {background-color: rgba(255,255,255,.05) }.table-dark.table-hover tbody tr:hover {color: #fff;background-color: rgba(255,255,255,.075) }}@media (prefers-color-scheme:dark) and (max-width:575.98px) {.table-responsive-sm > .table-bordered {border: 0 }}@media (prefers-color-scheme:dark) and (max-width:767.98px) {.table-responsive-md > .table-bordered {border: 0 }}@media (prefers-color-scheme:dark) and (max-width:991.98px) {.table-responsive-lg > .table-bordered {border: 0 }}@media (prefers-color-scheme:dark) and (max-width:1199.98px) {.table-responsive-xl > .table-bordered {border: 0 }}@media (prefers-color-scheme:dark) {.table-responsive > .table-bordered {border: 0 }.table-primary, .table-primary > td, .table-primary > th {color: #343a40 }.table-hover .table-primary:hover {color: #343a40 }.table-hover .table-primary:hover > td, .table-hover .table-primary:hover > th {color: #343a40 }.table-secondary, .table-secondary > td, .table-secondary > th {color: #343a40 }.table-hover .table-secondary:hover {color: #343a40 }.table-hover .table-secondary:hover > td, .table-hover .table-secondary:hover > th {color: #343a40 }.table-success, .table-success > td, .table-success > th {color: #343a40 }.table-hover .table-success:hover {color: #343a40 }.table-hover .table-success:hover > td, .table-hover .table-success:hover > th {color: #343a40 }.table-info, .table-info > td, .table-info > th {color: #343a40 }.table-hover .table-info:hover {color: #343a40 }.table-hover .table-info:hover > td, .table-hover .table-info:hover > th {color: #343a40 }.table-warning, .table-warning > td, .table-warning > th {color: #343a40 }.table-hover .table-warning:hover {color: #343a40 }.table-hover .table-warning:hover > td, .table-hover .table-warning:hover > th {color: #343a40 }.table-danger, .table-danger > td, .table-danger > th {color: #343a40 }.table-hover .table-danger:hover {color: #343a40 }.table-hover .table-danger:hover > td, .table-hover .table-danger:hover > th {color: #343a40 }.table-light, .table-light > td, .table-light > th {color: #343a40 }.table-hover .table-light:hover {color: #343a40 }.table-hover .table-light:hover > td, .table-hover .table-light:hover > th {color: #343a40 }.table-dark, .table-dark > td, .table-dark > th {color: #343a40 }.table-hover .table-dark:hover {color: #343a40 }.table-hover .table-dark:hover > td, .table-hover .table-dark:hover > th {color: #343a40 }.table-active, .table-active > td, .table-active > th {color: #e9ecef }.table-hover .table-active:hover {color: #e9ecef }.table-hover .table-active:hover > td, .table-hover .table-active:hover > th {color: #e9ecef }.table-dark {color: #dee2e6 }.form-control {color: #dee2e6;background-color: #000;border: 1px solid #6c757d }}@media (prefers-color-scheme:dark) {.form-control::-ms-expand {background-color: transparent;border: 0 }.form-control:focus {color: #dee2e6;background-color: #191d21;border-color: #b3d7ff;box-shadow: 0 0 0 .2rem rgba(0,123,255,.25) }.form-control::-webkit-input-placeholder {color: #6c757d }.form-control::-moz-placeholder {color: #6c757d }.form-control::-ms-input-placeholder {color: #6c757d }.form-control::placeholder {color: #6c757d }.form-control:disabled, .form-control[readonly] {background-color: #343a40 }select.form-control:-moz-focusring {color: transparent;text-shadow: 0 0 0 #dee2e6 }select.form-control:focus::-ms-value {color: #dee2e6;background-color: #000 }.form-control-plaintext {color: #212529;background-color: transparent;border: solid transparent }.form-check-input:disabled ~ .form-check-label, .form-check-input[disabled] ~ .form-check-label {color: #6c757d }.valid-feedback {color: #28a745 }.valid-tooltip {color: #e9ecef;background-color: rgba(40,167,69,.9) }.form-control.is-valid, .was-validated .form-control:valid {border-color: #28a745;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") }.form-control.is-valid:focus, .was-validated .form-control:valid:focus {border-color: #28a745;box-shadow: 0 0 0 .2rem rgba(40,167,69,.25) }.custom-select.is-valid, .was-validated .custom-select:valid {border-color: #28a745;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 .75rem center/8px 10px no-repeat,#000 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(.75em + .375rem) calc(.75em + .375rem) no-repeat }.custom-select.is-valid:focus, .was-validated .custom-select:valid:focus {border-color: #28a745;box-shadow: 0 0 0 .2rem rgba(40,167,69,.25) }.form-check-input.is-valid ~ .form-check-label, .was-validated .form-check-input:valid ~ .form-check-label {color: #28a745 }.custom-control-input.is-valid ~ .custom-control-label, .was-validated .custom-control-input:valid ~ .custom-control-label {color: #28a745 }.custom-control-input.is-valid ~ .custom-control-label::before, .was-validated .custom-control-input:valid ~ .custom-control-label::before {border-color: #28a745 }.custom-control-input.is-valid:checked ~ .custom-control-label::before, .was-validated .custom-control-input:valid:checked ~ .custom-control-label::before {border-color: #34ce57;background-color: #34ce57 }.custom-control-input.is-valid:focus ~ .custom-control-label::before, .was-validated .custom-control-input:valid:focus ~ .custom-control-label::before {box-shadow: 0 0 0 .2rem rgba(40,167,69,.25) }.custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before, .was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before {border-color: #28a745 }.custom-file-input.is-valid ~ .custom-file-label, .was-validated .custom-file-input:valid ~ .custom-file-label {border-color: #28a745 }.custom-file-input.is-valid:focus ~ .custom-file-label, .was-validated .custom-file-input:valid:focus ~ .custom-file-label {border-color: #28a745;box-shadow: 0 0 0 .2rem rgba(40,167,69,.25) }.invalid-feedback {color: #dc3545 }.invalid-tooltip {color: #e9ecef;background-color: rgba(220,53,69,.9) }.form-control.is-invalid, .was-validated .form-control:invalid {border-color: #dc3545;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") }.form-control.is-invalid:focus, .was-validated .form-control:invalid:focus {border-color: #dc3545;box-shadow: 0 0 0 .2rem rgba(220,53,69,.25) }.custom-select.is-invalid, .was-validated .custom-select:invalid {border-color: #dc3545;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 .75rem center/8px 10px no-repeat,#000 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(.75em + .375rem) calc(.75em + .375rem) no-repeat }.custom-select.is-invalid:focus, .was-validated .custom-select:invalid:focus {border-color: #dc3545;box-shadow: 0 0 0 .2rem rgba(220,53,69,.25) }.form-check-input.is-invalid ~ .form-check-label, .was-validated .form-check-input:invalid ~ .form-check-label {color: #dc3545 }.custom-control-input.is-invalid ~ .custom-control-label, .was-validated .custom-control-input:invalid ~ .custom-control-label {color: #dc3545 }.custom-control-input.is-invalid ~ .custom-control-label::before, .was-validated .custom-control-input:invalid ~ .custom-control-label::before {border-color: #dc3545 }.custom-control-input.is-invalid:checked ~ .custom-control-label::before, .was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before {border-color: #e4606d;background-color: #e4606d }.custom-control-input.is-invalid:focus ~ .custom-control-label::before, .was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before {box-shadow: 0 0 0 .2rem rgba(220,53,69,.25) }.custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before, .was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before {border-color: #dc3545 }.custom-file-input.is-invalid ~ .custom-file-label, .was-validated .custom-file-input:invalid ~ .custom-file-label {border-color: #dc3545 }.custom-file-input.is-invalid:focus ~ .custom-file-label, .was-validated .custom-file-input:invalid:focus ~ .custom-file-label {border-color: #dc3545;box-shadow: 0 0 0 .2rem rgba(220,53,69,.25) }}@media (prefers-color-scheme:dark) {.btn {color: #d3d3d3;background-color: transparent;border: 1px solid transparent }}@media (prefers-color-scheme:dark) {.btn:hover {color: #d3d3d3 }.btn.focus, .btn:focus {box-shadow: 0 0 0 .2rem rgba(0,123,255,.25) }.btn-primary {color: #e9ecef;background-color: #3395ff;border-color: #3395ff }.btn-primary:hover {color: #e9ecef;background-color: #0d82ff;border-color: #007bff }.btn-primary.focus, .btn-primary:focus {color: #e9ecef;background-color: #0d82ff;border-color: #007bff;box-shadow: 0 0 0 .2rem rgba(78,162,253,.5) }.btn-primary.disabled, .btn-primary:disabled {color: #e9ecef;background-color: #3395ff;border-color: #3395ff }.btn-primary:not(:disabled):not(.disabled).active, .btn-primary:not(:disabled):not(.disabled):active, .show > .btn-primary.dropdown-toggle {color: #e9ecef;background-color: #007bff;border-color: #0075f2 }.btn-primary:not(:disabled):not(.disabled).active:focus, .btn-primary:not(:disabled):not(.disabled):active:focus, .show > .btn-primary.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(78,162,253,.5) }.btn-secondary {color: #e9ecef;background-color: #6c757d;border-color: #6c757d }.btn-secondary:hover {color: #e9ecef;background-color: #5a6268;border-color: #545b62 }.btn-secondary.focus, .btn-secondary:focus {color: #e9ecef;background-color: #5a6268;border-color: #545b62;box-shadow: 0 0 0 .2rem rgba(127,135,142,.5) }.btn-secondary.disabled, .btn-secondary:disabled {color: #e9ecef;background-color: #6c757d;border-color: #6c757d }.btn-secondary:not(:disabled):not(.disabled).active, .btn-secondary:not(:disabled):not(.disabled):active, .show > .btn-secondary.dropdown-toggle {color: #e9ecef;background-color: #545b62;border-color: #4e555b }.btn-secondary:not(:disabled):not(.disabled).active:focus, .btn-secondary:not(:disabled):not(.disabled):active:focus, .show > .btn-secondary.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(127,135,142,.5) }.btn-success {color: #e9ecef;background-color: #28a745;border-color: #28a745 }.btn-success:hover {color: #e9ecef;background-color: #218838;border-color: #1e7e34 }.btn-success.focus, .btn-success:focus {color: #e9ecef;background-color: #218838;border-color: #1e7e34;box-shadow: 0 0 0 .2rem rgba(69,177,95,.5) }.btn-success.disabled, .btn-success:disabled {color: #e9ecef;background-color: #28a745;border-color: #28a745 }.btn-success:not(:disabled):not(.disabled).active, .btn-success:not(:disabled):not(.disabled):active, .show > .btn-success.dropdown-toggle {color: #e9ecef;background-color: #1e7e34;border-color: #1c7430 }.btn-success:not(:disabled):not(.disabled).active:focus, .btn-success:not(:disabled):not(.disabled):active:focus, .show > .btn-success.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(69,177,95,.5) }.btn-info {color: #e9ecef;background-color: #17a2b8;border-color: #17a2b8 }.btn-info:hover {color: #e9ecef;background-color: #138496;border-color: #117a8b }.btn-info.focus, .btn-info:focus {color: #e9ecef;background-color: #138496;border-color: #117a8b;box-shadow: 0 0 0 .2rem rgba(55,173,192,.5) }.btn-info.disabled, .btn-info:disabled {color: #e9ecef;background-color: #17a2b8;border-color: #17a2b8 }.btn-info:not(:disabled):not(.disabled).active, .btn-info:not(:disabled):not(.disabled):active, .show > .btn-info.dropdown-toggle {color: #e9ecef;background-color: #117a8b;border-color: #10707f }.btn-info:not(:disabled):not(.disabled).active:focus, .btn-info:not(:disabled):not(.disabled):active:focus, .show > .btn-info.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(55,173,192,.5) }.btn-warning {color: #343a40;background-color: #fd7e14;border-color: #fd7e14 }.btn-warning:hover {color: #e9ecef;background-color: #e96b02;border-color: #dc6502 }.btn-warning.focus, .btn-warning:focus {color: #e9ecef;background-color: #e96b02;border-color: #dc6502;box-shadow: 0 0 0 .2rem rgba(223,116,27,.5) }.btn-warning.disabled, .btn-warning:disabled {color: #343a40;background-color: #fd7e14;border-color: #fd7e14 }.btn-warning:not(:disabled):not(.disabled).active, .btn-warning:not(:disabled):not(.disabled):active, .show > .btn-warning.dropdown-toggle {color: #e9ecef;background-color: #dc6502;border-color: #cf5f02 }.btn-warning:not(:disabled):not(.disabled).active:focus, .btn-warning:not(:disabled):not(.disabled):active:focus, .show > .btn-warning.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(223,116,27,.5) }.btn-danger {color: #e9ecef;background-color: #dc3545;border-color: #dc3545 }.btn-danger:hover {color: #e9ecef;background-color: #c82333;border-color: #bd2130 }.btn-danger.focus, .btn-danger:focus {color: #e9ecef;background-color: #c82333;border-color: #bd2130;box-shadow: 0 0 0 .2rem rgba(222,80,95,.5) }.btn-danger.disabled, .btn-danger:disabled {color: #e9ecef;background-color: #dc3545;border-color: #dc3545 }.btn-danger:not(:disabled):not(.disabled).active, .btn-danger:not(:disabled):not(.disabled):active, .show > .btn-danger.dropdown-toggle {color: #e9ecef;background-color: #bd2130;border-color: #b21f2d }.btn-danger:not(:disabled):not(.disabled).active:focus, .btn-danger:not(:disabled):not(.disabled):active:focus, .show > .btn-danger.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(222,80,95,.5) }.btn-light {color: #343a40;background-color: #dee2e6;border-color: #dee2e6 }.btn-light:hover {color: #343a40;background-color: #c8cfd6;border-color: #c1c9d0 }.btn-light.focus, .btn-light:focus {color: #343a40;background-color: #c8cfd6;border-color: #c1c9d0;box-shadow: 0 0 0 .2rem rgba(197,201,205,.5) }.btn-light.disabled, .btn-light:disabled {color: #343a40;background-color: #dee2e6;border-color: #dee2e6 }.btn-light:not(:disabled):not(.disabled).active, .btn-light:not(:disabled):not(.disabled):active, .show > .btn-light.dropdown-toggle {color: #343a40;background-color: #c1c9d0;border-color: #bac2cb }.btn-light:not(:disabled):not(.disabled).active:focus, .btn-light:not(:disabled):not(.disabled):active:focus, .show > .btn-light.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(197,201,205,.5) }.btn-dark {color: #e9ecef;background-color: #343a40;border-color: #343a40 }.btn-dark:hover {color: #e9ecef;background-color: #23272b;border-color: #1d2124 }.btn-dark.focus, .btn-dark:focus {color: #e9ecef;background-color: #23272b;border-color: #1d2124;box-shadow: 0 0 0 .2rem rgba(79,85,90,.5) }.btn-dark.disabled, .btn-dark:disabled {color: #e9ecef;background-color: #343a40;border-color: #343a40 }.btn-dark:not(:disabled):not(.disabled).active, .btn-dark:not(:disabled):not(.disabled):active, .show > .btn-dark.dropdown-toggle {color: #e9ecef;background-color: #1d2124;border-color: #171a1d }.btn-dark:not(:disabled):not(.disabled).active:focus, .btn-dark:not(:disabled):not(.disabled):active:focus, .show > .btn-dark.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(79,85,90,.5) }.btn-outline-primary {color: #3395ff;border-color: #3395ff }.btn-outline-primary:hover {color: #e9ecef;background-color: #3395ff;border-color: #3395ff }.btn-outline-primary.focus, .btn-outline-primary:focus {box-shadow: 0 0 0 .2rem rgba(51,149,255,.5) }.btn-outline-primary.disabled, .btn-outline-primary:disabled {color: #3395ff;background-color: transparent }.btn-outline-primary:not(:disabled):not(.disabled).active, .btn-outline-primary:not(:disabled):not(.disabled):active, .show > .btn-outline-primary.dropdown-toggle {color: #e9ecef;background-color: #3395ff;border-color: #3395ff }.btn-outline-primary:not(:disabled):not(.disabled).active:focus, .btn-outline-primary:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-primary.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(51,149,255,.5) }.btn-outline-secondary {color: #6c757d;border-color: #6c757d }.btn-outline-secondary:hover {color: #e9ecef;background-color: #6c757d;border-color: #6c757d }.btn-outline-secondary.focus, .btn-outline-secondary:focus {box-shadow: 0 0 0 .2rem rgba(108,117,125,.5) }.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {color: #6c757d;background-color: transparent }.btn-outline-secondary:not(:disabled):not(.disabled).active, .btn-outline-secondary:not(:disabled):not(.disabled):active, .show > .btn-outline-secondary.dropdown-toggle {color: #e9ecef;background-color: #6c757d;border-color: #6c757d }.btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(108,117,125,.5) }.btn-outline-success {color: #28a745;border-color: #28a745 }.btn-outline-success:hover {color: #e9ecef;background-color: #28a745;border-color: #28a745 }.btn-outline-success.focus, .btn-outline-success:focus {box-shadow: 0 0 0 .2rem rgba(40,167,69,.5) }.btn-outline-success.disabled, .btn-outline-success:disabled {color: #28a745;background-color: transparent }.btn-outline-success:not(:disabled):not(.disabled).active, .btn-outline-success:not(:disabled):not(.disabled):active, .show > .btn-outline-success.dropdown-toggle {color: #e9ecef;background-color: #28a745;border-color: #28a745 }.btn-outline-success:not(:disabled):not(.disabled).active:focus, .btn-outline-success:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-success.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(40,167,69,.5) }.btn-outline-info {color: #17a2b8;border-color: #17a2b8 }.btn-outline-info:hover {color: #e9ecef;background-color: #17a2b8;border-color: #17a2b8 }.btn-outline-info.focus, .btn-outline-info:focus {box-shadow: 0 0 0 .2rem rgba(23,162,184,.5) }.btn-outline-info.disabled, .btn-outline-info:disabled {color: #17a2b8;background-color: transparent }.btn-outline-info:not(:disabled):not(.disabled).active, .btn-outline-info:not(:disabled):not(.disabled):active, .show > .btn-outline-info.dropdown-toggle {color: #e9ecef;background-color: #17a2b8;border-color: #17a2b8 }.btn-outline-info:not(:disabled):not(.disabled).active:focus, .btn-outline-info:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-info.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(23,162,184,.5) }.btn-outline-warning {color: #fd7e14;border-color: #fd7e14 }.btn-outline-warning:hover {color: #343a40;background-color: #fd7e14;border-color: #fd7e14 }.btn-outline-warning.focus, .btn-outline-warning:focus {box-shadow: 0 0 0 .2rem rgba(253,126,20,.5) }.btn-outline-warning.disabled, .btn-outline-warning:disabled {color: #fd7e14;background-color: transparent }.btn-outline-warning:not(:disabled):not(.disabled).active, .btn-outline-warning:not(:disabled):not(.disabled):active, .show > .btn-outline-warning.dropdown-toggle {color: #343a40;background-color: #fd7e14;border-color: #fd7e14 }.btn-outline-warning:not(:disabled):not(.disabled).active:focus, .btn-outline-warning:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-warning.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(253,126,20,.5) }.btn-outline-danger {color: #dc3545;border-color: #dc3545 }.btn-outline-danger:hover {color: #e9ecef;background-color: #dc3545;border-color: #dc3545 }.btn-outline-danger.focus, .btn-outline-danger:focus {box-shadow: 0 0 0 .2rem rgba(220,53,69,.5) }.btn-outline-danger.disabled, .btn-outline-danger:disabled {color: #dc3545;background-color: transparent }.btn-outline-danger:not(:disabled):not(.disabled).active, .btn-outline-danger:not(:disabled):not(.disabled):active, .show > .btn-outline-danger.dropdown-toggle {color: #e9ecef;background-color: #dc3545;border-color: #dc3545 }.btn-outline-danger:not(:disabled):not(.disabled).active:focus, .btn-outline-danger:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-danger.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(220,53,69,.5) }.btn-outline-light {color: #dee2e6;border-color: #dee2e6 }.btn-outline-light:hover {color: #343a40;background-color: #dee2e6;border-color: #dee2e6 }.btn-outline-light.focus, .btn-outline-light:focus {box-shadow: 0 0 0 .2rem rgba(222,226,230,.5) }.btn-outline-light.disabled, .btn-outline-light:disabled {color: #dee2e6;background-color: transparent }.btn-outline-light:not(:disabled):not(.disabled).active, .btn-outline-light:not(:disabled):not(.disabled):active, .show > .btn-outline-light.dropdown-toggle {color: #343a40;background-color: #dee2e6;border-color: #dee2e6 }.btn-outline-light:not(:disabled):not(.disabled).active:focus, .btn-outline-light:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-light.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(222,226,230,.5) }.btn-outline-dark {color: #343a40;border-color: #343a40 }.btn-outline-dark:hover {color: #e9ecef;background-color: #343a40;border-color: #343a40 }.btn-outline-dark.focus, .btn-outline-dark:focus {box-shadow: 0 0 0 .2rem rgba(52,58,64,.5) }.btn-outline-dark.disabled, .btn-outline-dark:disabled {color: #343a40;background-color: transparent }.btn-outline-dark:not(:disabled):not(.disabled).active, .btn-outline-dark:not(:disabled):not(.disabled):active, .show > .btn-outline-dark.dropdown-toggle {color: #e9ecef;background-color: #343a40;border-color: #343a40 }.btn-outline-dark:not(:disabled):not(.disabled).active:focus, .btn-outline-dark:not(:disabled):not(.disabled):active:focus, .show > .btn-outline-dark.dropdown-toggle:focus {box-shadow: 0 0 0 .2rem rgba(52,58,64,.5) }.btn-link {color: #adadad }.btn-link:hover {color: #878787 }.btn-link.disabled, .btn-link:disabled {color: #6c757d }}@media (prefers-color-scheme:dark) {.dropdown-toggle::after {border-top: .3em solid;border-right: .3em solid transparent;border-bottom: 0;border-left: .3em solid transparent }.dropdown-menu {color: #d3d3d3;background-color: #000;border: 1px solid rgba(255,255,255,.15) }}@media (prefers-color-scheme:dark) {.dropup .dropdown-toggle::after {border-top: 0;border-right: .3em solid transparent;border-bottom: .3em solid;border-left: .3em solid transparent }.dropright .dropdown-toggle::after {border-top: .3em solid transparent;border-right: 0;border-bottom: .3em solid transparent;border-left: .3em solid }.dropleft .dropdown-toggle::before {border-top: .3em solid transparent;border-right: .3em solid;border-bottom: .3em solid transparent }.dropdown-divider {border-top: 1px solid #343a40 }.dropdown-item {color: #f8f9fa;background-color: transparent;border: 0 }.dropdown-item:focus, .dropdown-item:hover {color: #fff;background-color: #212529 }.dropdown-item.active, .dropdown-item:active {color: #000;background-color: #3395ff }.dropdown-item.disabled, .dropdown-item:disabled {color: #ced4da;background-color: transparent }.dropdown-header {color: #ced4da }.dropdown-item-text {color: #f8f9fa }.input-group-text {color: #dee2e6;background-color: #343a40;border: 1px solid #6c757d }.custom-control-input:checked ~ .custom-control-label::before {color: #fff;border-color: #007bff;background-color: #007bff }.custom-control-input:focus ~ .custom-control-label::before {box-shadow: 0 0 0 .2rem rgba(0,123,255,.25) }.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {border-color: #80bdff }.custom-control-input:not(:disabled):active ~ .custom-control-label::before {color: #fff;background-color: #b3d7ff;border-color: #b3d7ff }.custom-control-input:disabled ~ .custom-control-label, .custom-control-input[disabled] ~ .custom-control-label {color: #6c757d }.custom-control-input:disabled ~ .custom-control-label::before, .custom-control-input[disabled] ~ .custom-control-label::before {background-color: #e9ecef }.custom-control-label::before {background-color: #fff;border: 1px solid #adb5bd }.custom-control-label::after {background: 50%/50% 50% no-repeat }.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {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='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e") }.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {border-color: #007bff;background-color: #007bff }.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e") }.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {background-color: rgba(0,123,255,.5) }.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {background-color: rgba(0,123,255,.5) }.custom-radio .custom-control-input:checked ~ .custom-control-label::after {background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e") }.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {background-color: rgba(0,123,255,.5) }.custom-switch .custom-control-label::after {background-color: #adb5bd }}@media (prefers-color-scheme:dark) {.custom-switch .custom-control-input:checked ~ .custom-control-label::after {background-color: #fff }.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {background-color: rgba(0,123,255,.5) }.custom-select {color: #dee2e6;background: #000 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 .75rem center/8px 10px no-repeat;border: 1px solid #6c757d }.custom-select:focus {border-color: #80bdff;box-shadow: 0 0 0 .2rem rgba(0,123,255,.25) }.custom-select:focus::-ms-value {color: #dee2e6;background-color: #000 }.custom-select[multiple], .custom-select[size]:not([size="1"]) {background-image: none }.custom-select:disabled {color: #ced4da;background-color: #343a40 }.custom-select:-moz-focusring {color: transparent;text-shadow: 0 0 0 #dee2e6 }.custom-file-input:focus ~ .custom-file-label {border-color: #80bdff;box-shadow: 0 0 0 .2rem rgba(0,123,255,.25) }.custom-file-input:disabled ~ .custom-file-label, .custom-file-input[disabled] ~ .custom-file-label {background-color: #e9ecef }.custom-file-label {color: #495057;background-color: #fff;border: 1px solid #ced4da }.custom-file-label::after {color: #495057;background-color: #e9ecef;border-left: inherit }.custom-range {background-color: transparent }.custom-range:focus::-webkit-slider-thumb {box-shadow: 0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25) }.custom-range:focus::-moz-range-thumb {box-shadow: 0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25) }.custom-range:focus::-ms-thumb {box-shadow: 0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25) }.custom-range::-moz-focus-outer {border: 0 }.custom-range::-webkit-slider-thumb {background-color: #007bff;border: 0 }}@media (prefers-color-scheme:dark) {.custom-range::-webkit-slider-thumb:active {background-color: #b3d7ff }.custom-range::-webkit-slider-runnable-track {color: transparent;background-color: #dee2e6;border-color: transparent }.custom-range::-moz-range-thumb {background-color: #007bff;border: 0 }}@media (prefers-color-scheme:dark) {.custom-range::-moz-range-thumb:active {background-color: #b3d7ff }.custom-range::-moz-range-track {color: transparent;background-color: #dee2e6;border-color: transparent }.custom-range::-ms-thumb {background-color: #007bff;border: 0 }}@media (prefers-color-scheme:dark) {.custom-range::-ms-thumb:active {background-color: #b3d7ff }.custom-range::-ms-track {color: transparent;background-color: transparent;border-color: transparent }.custom-range::-ms-fill-lower {background-color: #dee2e6 }.custom-range::-ms-fill-upper {background-color: #dee2e6 }.custom-range:disabled::-webkit-slider-thumb {background-color: #adb5bd }.custom-range:disabled::-moz-range-thumb {background-color: #adb5bd }.custom-range:disabled::-ms-thumb {background-color: #adb5bd }}@media (prefers-color-scheme:dark) {.nav-link.disabled {color: #6c757d }.nav-tabs {border-bottom: 1px solid rgba(255,255,255,.125) }.nav-tabs .nav-link {background-color: transparent;border: 1px solid transparent }.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {border-color: #495057 #495057 rgba(255,255,255,.125) }.nav-tabs .nav-link.disabled {color: #6c757d;background-color: transparent;border-color: transparent }.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active {color: #f8f9fa;background-color: #191d21;border-color: #495057 #495057 #191d21 }.nav-pills .nav-link {background: 0 0;border: 0 }.nav-pills .nav-link.active, .nav-pills .show > .nav-link {color: #fff;background-color: #007bff }.navbar-toggler {background-color: transparent;border: 1px solid transparent }.navbar-toggler-icon {background: 50%/100% 100% no-repeat }}@media (prefers-color-scheme:dark) {.navbar-light .navbar-brand {color: rgba(0,0,0,.9) }.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {color: rgba(0,0,0,.9) }.navbar-light .navbar-nav .nav-link {color: rgba(0,0,0,.5) }.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {color: rgba(0,0,0,.7) }.navbar-light .navbar-nav .nav-link.disabled {color: rgba(0,0,0,.3) }.navbar-light .navbar-nav .active > .nav-link, .navbar-light .navbar-nav .nav-link.active, .navbar-light .navbar-nav .nav-link.show, .navbar-light .navbar-nav .show > .nav-link {color: rgba(0,0,0,.9) }.navbar-light .navbar-toggler {color: rgba(0,0,0,.5);border-color: rgba(0,0,0,.1) }.navbar-light .navbar-toggler-icon {background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") }.navbar-light .navbar-text {color: rgba(0,0,0,.5) }.navbar-light .navbar-text a {color: rgba(0,0,0,.9) }.navbar-light .navbar-text a:focus, .navbar-light .navbar-text a:hover {color: rgba(0,0,0,.9) }.navbar-dark .navbar-brand, .navbar-themed .navbar-brand {color: #fff }.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover, .navbar-themed .navbar-brand:focus, .navbar-themed .navbar-brand:hover {color: #fff }.navbar-dark .navbar-nav .nav-link, .navbar-themed .navbar-nav .nav-link {color: rgba(255,255,255,.5) }.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover, .navbar-themed .navbar-nav .nav-link:focus, .navbar-themed .navbar-nav .nav-link:hover {color: rgba(255,255,255,.75) }.navbar-dark .navbar-nav .nav-link.disabled, .navbar-themed .navbar-nav .nav-link.disabled {color: rgba(255,255,255,.25) }.navbar-dark .navbar-nav .active > .nav-link, .navbar-dark .navbar-nav .nav-link.active, .navbar-dark .navbar-nav .nav-link.show, .navbar-dark .navbar-nav .show > .nav-link, .navbar-themed .navbar-nav .active > .nav-link, .navbar-themed .navbar-nav .nav-link.active, .navbar-themed .navbar-nav .nav-link.show, .navbar-themed .navbar-nav .show > .nav-link {color: #fff }.navbar-dark .navbar-toggler, .navbar-themed .navbar-toggler {color: rgba(255,255,255,.5);border-color: rgba(255,255,255,.1) }.navbar-dark .navbar-toggler-icon, .navbar-themed .navbar-toggler-icon {background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") }.navbar-dark .navbar-text, .navbar-themed .navbar-text {color: rgba(255,255,255,.5) }.navbar-dark .navbar-text a, .navbar-themed .navbar-text a {color: #fff }.navbar-dark .navbar-text a:focus, .navbar-dark .navbar-text a:hover, .navbar-themed .navbar-text a:focus, .navbar-themed .navbar-text a:hover {color: #fff }.card {background-color: #212529;border: 1px solid rgba(255,255,255,.125) }.card > .list-group {border-top: inherit;border-bottom: inherit }.card > .card-header + .list-group, .card > .list-group + .card-footer {border-top: 0 }.card-header {background-color: rgba(255,255,255,.03);border-bottom: 1px solid rgba(255,255,255,.125) }.card-footer {background-color: rgba(255,255,255,.03);border-top: 1px solid rgba(255,255,255,.125) }.card-header-tabs {border-bottom: 0 }}@media (prefers-color-scheme:dark) and (min-width:576px) {.card-group > .card + .card {border-left: 0 }}@media (prefers-color-scheme:dark) {.accordion > .card:not(:last-of-type) {border-bottom: 0 }.breadcrumb {background-color: #343a40 }.breadcrumb-item + .breadcrumb-item::before {color: #ced4da }.breadcrumb-item.active {color: #ced4da }.page-link {color: #adadad;background-color: #000;border: 1px solid #495057 }.page-link:hover {color: #878787;background-color: #343a40;border-color: #495057 }.page-link:focus {box-shadow: 0 0 0 .2rem rgba(0,123,255,.25) }.page-item.active .page-link {color: #000;background-color: #3395ff;border-color: #3395ff }.page-item.disabled .page-link {color: #ced4da;background-color: #000;border-color: #495057 }}@media (prefers-color-scheme:dark) {.badge-primary {color: #e9ecef;background-color: #3395ff }a.badge-primary:focus, a.badge-primary:hover {color: #e9ecef;background-color: #007bff }a.badge-primary.focus, a.badge-primary:focus {box-shadow: 0 0 0 .2rem rgba(51,149,255,.5) }.badge-secondary {color: #e9ecef;background-color: #6c757d }a.badge-secondary:focus, a.badge-secondary:hover {color: #e9ecef;background-color: #545b62 }a.badge-secondary.focus, a.badge-secondary:focus {box-shadow: 0 0 0 .2rem rgba(108,117,125,.5) }.badge-success {color: #e9ecef;background-color: #28a745 }a.badge-success:focus, a.badge-success:hover {color: #e9ecef;background-color: #1e7e34 }a.badge-success.focus, a.badge-success:focus {box-shadow: 0 0 0 .2rem rgba(40,167,69,.5) }.badge-info {color: #e9ecef;background-color: #17a2b8 }a.badge-info:focus, a.badge-info:hover {color: #e9ecef;background-color: #117a8b }a.badge-info.focus, a.badge-info:focus {box-shadow: 0 0 0 .2rem rgba(23,162,184,.5) }.badge-warning {color: #343a40;background-color: #fd7e14 }a.badge-warning:focus, a.badge-warning:hover {color: #343a40;background-color: #dc6502 }a.badge-warning.focus, a.badge-warning:focus {box-shadow: 0 0 0 .2rem rgba(253,126,20,.5) }.badge-danger {color: #e9ecef;background-color: #dc3545 }a.badge-danger:focus, a.badge-danger:hover {color: #e9ecef;background-color: #bd2130 }a.badge-danger.focus, a.badge-danger:focus {box-shadow: 0 0 0 .2rem rgba(220,53,69,.5) }.badge-light {color: #343a40;background-color: #dee2e6 }a.badge-light:focus, a.badge-light:hover {color: #343a40;background-color: #c1c9d0 }a.badge-light.focus, a.badge-light:focus {box-shadow: 0 0 0 .2rem rgba(222,226,230,.5) }.badge-dark {color: #e9ecef;background-color: #343a40 }a.badge-dark:focus, a.badge-dark:hover {color: #e9ecef;background-color: #1d2124 }a.badge-dark.focus, a.badge-dark:focus {box-shadow: 0 0 0 .2rem rgba(52,58,64,.5) }.jumbotron {background-color: #343a40 }}@media (prefers-color-scheme:dark) {.alert {border: 1px solid transparent }.alert-heading {color: inherit }.alert-dismissible .close {color: inherit }.alert-primary {color: #1b4e85;background-color: #d6eaff;border-color: #c6e1ff }.alert-primary .alert-link {color: #12355b }.alert-secondary {color: #383d41;background-color: #e2e3e5;border-color: #d6d8db }.alert-secondary .alert-link {color: #202326 }.alert-success {color: #155724;background-color: #d4edda;border-color: #c3e6cb }.alert-success .alert-link {color: #0b2e13 }.alert-info {color: #0c5460;background-color: #d1ecf1;border-color: #bee5eb }.alert-info .alert-link {color: #062c33 }.alert-warning {color: #84420a;background-color: #ffe5d0;border-color: #fedbbd }.alert-warning .alert-link {color: #552a06 }.alert-danger {color: #721c24;background-color: #f8d7da;border-color: #f5c6cb }.alert-danger .alert-link {color: #491217 }.alert-light, .alert-themed-inverted {color: #737678;background-color: #f8f9fa;border-color: #f6f7f8 }.alert-light .alert-link, .alert-themed-inverted .alert-link {color: #5a5c5e }.alert-dark, .alert-themed {color: #1b1e21;background-color: #d6d8d9;border-color: #c6c8ca }.alert-dark .alert-link, .alert-themed .alert-link {color: #040505 }@-webkit-keyframes progress-bar-stripes {from {background-position: 1rem 0 }to {background-position: 0 0 }}@keyframes progress-bar-stripes {from {background-position: 1rem 0 }to {background-position: 0 0 }}.progress {background-color: #e9ecef }.progress-bar {color: #fff;background-color: #007bff }}@media (prefers-color-scheme:dark) {.progress-bar-striped {background-image: linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent) }}@media (prefers-color-scheme:dark) {.list-group-item-action {color: #dee2e6 }.list-group-item-action:focus, .list-group-item-action:hover {color: #dee2e6;background-color: #212529 }.list-group-item-action:active {color: #d3d3d3;background-color: #343a40 }.list-group-item {background-color: rgba(25,29,33,.05);border: 1px solid rgba(255,255,255,.125) }.list-group-item.disabled, .list-group-item:disabled {color: #ced4da;background-color: rgba(25,29,33,.05) }.list-group-item.active {color: #000;background-color: #3395ff;border-color: #3395ff }}@media (prefers-color-scheme:dark) {.list-group-item-primary {color: #1b4e85;background-color: #c6e1ff }.list-group-item-primary.list-group-item-action:focus, .list-group-item-primary.list-group-item-action:hover {color: #1b4e85;background-color: #add4ff }.list-group-item-primary.list-group-item-action.active {color: #fff;background-color: #1b4e85;border-color: #1b4e85 }.list-group-item-secondary {color: #383d41;background-color: #d6d8db }.list-group-item-secondary.list-group-item-action:focus, .list-group-item-secondary.list-group-item-action:hover {color: #383d41;background-color: #c8cbcf }.list-group-item-secondary.list-group-item-action.active {color: #fff;background-color: #383d41;border-color: #383d41 }.list-group-item-success {color: #155724;background-color: #c3e6cb }.list-group-item-success.list-group-item-action:focus, .list-group-item-success.list-group-item-action:hover {color: #155724;background-color: #b1dfbb }.list-group-item-success.list-group-item-action.active {color: #fff;background-color: #155724;border-color: #155724 }.list-group-item-info {color: #0c5460;background-color: #bee5eb }.list-group-item-info.list-group-item-action:focus, .list-group-item-info.list-group-item-action:hover {color: #0c5460;background-color: #abdde5 }.list-group-item-info.list-group-item-action.active {color: #fff;background-color: #0c5460;border-color: #0c5460 }.list-group-item-warning {color: #84420a;background-color: #fedbbd }.list-group-item-warning.list-group-item-action:focus, .list-group-item-warning.list-group-item-action:hover {color: #84420a;background-color: #fecda4 }.list-group-item-warning.list-group-item-action.active {color: #fff;background-color: #84420a;border-color: #84420a }.list-group-item-danger {color: #721c24;background-color: #f5c6cb }.list-group-item-danger.list-group-item-action:focus, .list-group-item-danger.list-group-item-action:hover {color: #721c24;background-color: #f1b0b7 }.list-group-item-danger.list-group-item-action.active {color: #fff;background-color: #721c24;border-color: #721c24 }.list-group-item-light {color: #737678;background-color: #f6f7f8 }.list-group-item-light.list-group-item-action:focus, .list-group-item-light.list-group-item-action:hover {color: #737678;background-color: #e8eaed }.list-group-item-light.list-group-item-action.active {color: #fff;background-color: #737678;border-color: #737678 }.list-group-item-dark {color: #1b1e21;background-color: #c6c8ca }.list-group-item-dark.list-group-item-action:focus, .list-group-item-dark.list-group-item-action:hover {color: #1b1e21;background-color: #b9bbbe }.list-group-item-dark.list-group-item-action.active {color: #fff;background-color: #1b1e21;border-color: #1b1e21 }.close {color: #fff;text-shadow: 0 1px 0 #000 }.close:hover {color: #fff }button.close {background-color: transparent;border: 0 }.toast {background-color: rgba(0,0,0,.85);border: 1px solid rgba(255,255,255,.1);box-shadow: 0 .25rem .75rem rgba(255,255,255,.1) }.toast-header {color: #ced4da;background-color: rgba(0,0,0,.85);border-bottom: 1px solid rgba(255,255,255,.05) }}@media (prefers-color-scheme:dark) {.modal-content {background-color: #191d21;border: 1px solid rgba(255,255,255,.2) }.modal-backdrop {background-color: #000 }.modal-header {border-bottom: 1px solid #343a40 }.modal-footer {border-top: 1px solid #343a40 }}@media (prefers-color-scheme:dark) {.tooltip {text-shadow: none }.tooltip .arrow::before {border-color: transparent }.tooltip-inner {color: #fff;background-color: #000 }.popover {text-shadow: none;background-color: #fff;border: 1px solid rgba(0,0,0,.2) }.popover .arrow::after, .popover .arrow::before {border-color: transparent }.bs-popover-auto[x-placement^=bottom] .popover-header::before, .bs-popover-bottom .popover-header::before {border-bottom: 1px solid #f7f7f7 }.popover-header {background-color: #f7f7f7;border-bottom: 1px solid #ebebeb }.popover-body {color: #212529 }}@media (prefers-color-scheme:dark) {.carousel-control-next, .carousel-control-prev {color: #fff;background: 0 0;border: 0 }}@media (prefers-color-scheme:dark) {.carousel-control-next:focus, .carousel-control-next:hover, .carousel-control-prev:focus, .carousel-control-prev:hover {color: #fff }.carousel-control-next-icon, .carousel-control-prev-icon {background: 50%/100% 100% no-repeat }.carousel-control-prev-icon {background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e") }.carousel-control-next-icon {background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e") }.carousel-indicators li {background-color: #fff;border-top: 10px solid transparent;border-bottom: 10px solid transparent }}@media (prefers-color-scheme:dark) {.carousel-caption {color: #fff }@-webkit-keyframes spinner-border {to {transform: rotate(360deg) }}@keyframes spinner-border {to {transform: rotate(360deg) }}.spinner-border {border: .25em solid currentcolor }@-webkit-keyframes spinner-grow {0% {transform: scale(0) }50% {opacity: 1;transform: none }}@keyframes spinner-grow {0% {transform: scale(0) }50% {opacity: 1;transform: none }}.spinner-grow {background-color: currentcolor }}@media (prefers-color-scheme:dark) {.bg-primary {background-color: #3395ff!important }a.bg-primary:focus, a.bg-primary:hover, button.bg-primary:focus, button.bg-primary:hover {background-color: #007bff!important }.bg-secondary {background-color: #6c757d!important }a.bg-secondary:focus, a.bg-secondary:hover, button.bg-secondary:focus, button.bg-secondary:hover {background-color: #545b62!important }.bg-success {background-color: #28a745!important }a.bg-success:focus, a.bg-success:hover, button.bg-success:focus, button.bg-success:hover {background-color: #1e7e34!important }.bg-info {background-color: #17a2b8!important }a.bg-info:focus, a.bg-info:hover, button.bg-info:focus, button.bg-info:hover {background-color: #117a8b!important }.bg-warning {background-color: #fd7e14!important }a.bg-warning:focus, a.bg-warning:hover, button.bg-warning:focus, button.bg-warning:hover {background-color: #dc6502!important }.bg-danger {background-color: #dc3545!important }a.bg-danger:focus, a.bg-danger:hover, button.bg-danger:focus, button.bg-danger:hover {background-color: #bd2130!important }.bg-light, .bg-themed-inverted {background-color: #dee2e6!important }a.bg-light:focus, a.bg-light:hover, a.bg-themed-inverted:focus, a.bg-themed-inverted:hover, button.bg-light:focus, button.bg-light:hover, button.bg-themed-inverted:focus, button.bg-themed-inverted:hover {background-color: #c1c9d0!important }.bg-dark, .bg-themed, .navbar-themed {background-color: #343a40!important }a.bg-dark:focus, a.bg-dark:hover, a.bg-themed:focus, a.bg-themed:hover, a.navbar-themed:focus, a.navbar-themed:hover, button.bg-dark:focus, button.bg-dark:hover, button.bg-themed:focus, button.bg-themed:hover, button.navbar-themed:focus, button.navbar-themed:hover {background-color: #1d2124!important }.bg-white {background-color: #fff!important }.bg-transparent {background-color: transparent!important }.border {border: 1px solid #343a40!important }.border-top {border-top: 1px solid #343a40!important }.border-right {border-right: 1px solid #343a40!important }.border-bottom {border-bottom: 1px solid #343a40!important }.border-left {border-left: 1px solid #343a40!important }.border-0 {border: 0!important }.border-top-0 {border-top: 0!important }.border-right-0 {border-right: 0!important }.border-bottom-0 {border-bottom: 0!important }.border-left-0 {border-left: 0!important }.border-primary {border-color: #3395ff!important }.border-secondary {border-color: #6c757d!important }.border-success {border-color: #28a745!important }.border-info {border-color: #17a2b8!important }.border-warning {border-color: #fd7e14!important }.border-danger {border-color: #dc3545!important }.border-light {border-color: #dee2e6!important }.border-dark {border-color: #343a40!important }.border-white {border-color: #fff!important }}@media (prefers-color-scheme:dark) {.embed-responsive .embed-responsive-item, .embed-responsive embed, .embed-responsive iframe, .embed-responsive object, .embed-responsive video {border: 0 }}@media (prefers-color-scheme:dark) {@supports ((position:-webkit-sticky) or (position:sticky)) {.sticky-top {position: -webkit-sticky;position: sticky;top: 0;z-index: 1020 }}.sr-only {border: 0 }.shadow-sm {box-shadow: 0 .125rem .25rem rgba(0,0,0,.075)!important }.shadow {box-shadow: 0 .5rem 1rem rgba(0,0,0,.15)!important }.shadow-lg {box-shadow: 0 1rem 3rem rgba(0,0,0,.175)!important }.shadow-none {box-shadow: none!important }}@media (prefers-color-scheme:dark) {.stretched-link::after {background-color: rgba(0,0,0,0) }}@media (prefers-color-scheme:dark) {.text-white {color: #fff!important }.text-primary {color: #3395ff!important }a.text-primary:focus, a.text-primary:hover {color: #006fe6!important }.text-secondary {color: #6c757d!important }a.text-secondary:focus, a.text-secondary:hover {color: #494f54!important }.text-success {color: #28a745!important }a.text-success:focus, a.text-success:hover {color: #19692c!important }.text-info {color: #17a2b8!important }a.text-info:focus, a.text-info:hover {color: #0f6674!important }.text-warning {color: #fd7e14!important }a.text-warning:focus, a.text-warning:hover {color: #c35a02!important }.text-danger {color: #dc3545!important }a.text-danger:focus, a.text-danger:hover {color: #a71d2a!important }.text-light, .text-themed {color: #dee2e6!important }a.text-light:focus, a.text-light:hover, a.text-themed:focus, a.text-themed:hover {color: #b2bcc5!important }.text-dark, .text-themed-inverted {color: #343a40!important }a.text-dark:focus, a.text-dark:hover, a.text-themed-inverted:focus, a.text-themed-inverted:hover {color: #121416!important }.text-body {color: #d3d3d3!important }.text-muted {color: #6c757d!important }.text-black-50 {color: rgba(0,0,0,.5)!important }.text-white-50 {color: rgba(255,255,255,.5)!important }.text-hide {color: transparent;text-shadow: none;background-color: transparent;border: 0 }.text-reset {color: inherit!important }}
\ No newline at end of file
/*
Copyright (C) Federico Zivolo 2019
Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
*/(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function i(e){return e&&e.referenceNode?e.referenceNode:e}function r(e){return 11===e?re:10===e?pe:re||pe}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:'top',o='top'===t?'scrollTop':'scrollLeft',n=e.nodeName;if('BODY'===n||'HTML'===n){var i=e.ownerDocument.documentElement,r=e.ownerDocument.scrollingElement||i;return r[o]}return e[o]}function f(e,t){var o=2<arguments.length&&void 0!==arguments[2]&&arguments[2],n=l(t,'top'),i=l(t,'left'),r=o?-1:1;return e.top+=n*r,e.bottom+=n*r,e.left+=i*r,e.right+=i*r,e}function m(e,t){var o='x'===t?'Left':'Top',n='Left'==o?'Right':'Bottom';return parseFloat(e['border'+o+'Width'],10)+parseFloat(e['border'+n+'Width'],10)}function h(e,t,o,n){return ee(t['offset'+e],t['scroll'+e],o['client'+e],o['offset'+e],o['scroll'+e],r(10)?parseInt(o['offset'+e])+parseInt(n['margin'+('Height'===e?'Top':'Left')])+parseInt(n['margin'+('Height'===e?'Bottom':'Right')]):0)}function c(e){var t=e.body,o=e.documentElement,n=r(10)&&getComputedStyle(o);return{height:h('Height',t,o,n),width:h('Width',t,o,n)}}function g(e){return le({},e,{right:e.left+e.width,bottom:e.top+e.height})}function u(e){var o={};try{if(r(10)){o=e.getBoundingClientRect();var n=l(e,'top'),i=l(e,'left');o.top+=n,o.left+=i,o.bottom+=n,o.right+=i}else o=e.getBoundingClientRect()}catch(t){}var p={left:o.left,top:o.top,width:o.right-o.left,height:o.bottom-o.top},s='HTML'===e.nodeName?c(e.ownerDocument):{},d=s.width||e.clientWidth||p.width,a=s.height||e.clientHeight||p.height,f=e.offsetWidth-d,h=e.offsetHeight-a;if(f||h){var u=t(e);f-=m(u,'x'),h-=m(u,'y'),p.width-=f,p.height-=h}return g(p)}function b(e,o){var i=2<arguments.length&&void 0!==arguments[2]&&arguments[2],p=r(10),s='HTML'===o.nodeName,d=u(e),a=u(o),l=n(e),m=t(o),h=parseFloat(m.borderTopWidth,10),c=parseFloat(m.borderLeftWidth,10);i&&s&&(a.top=ee(a.top,0),a.left=ee(a.left,0));var b=g({top:d.top-a.top-h,left:d.left-a.left-c,width:d.width,height:d.height});if(b.marginTop=0,b.marginLeft=0,!p&&s){var w=parseFloat(m.marginTop,10),y=parseFloat(m.marginLeft,10);b.top-=h-w,b.bottom-=h-w,b.left-=c-y,b.right-=c-y,b.marginTop=w,b.marginLeft=y}return(p&&!i?o.contains(l):o===l&&'BODY'!==l.nodeName)&&(b=f(b,o)),b}function w(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=e.ownerDocument.documentElement,n=b(e,o),i=ee(o.clientWidth,window.innerWidth||0),r=ee(o.clientHeight,window.innerHeight||0),p=t?0:l(o),s=t?0:l(o,'left'),d={top:p-n.top+n.marginTop,left:s-n.left+n.marginLeft,width:i,height:r};return g(d)}function y(e){var n=e.nodeName;if('BODY'===n||'HTML'===n)return!1;if('fixed'===t(e,'position'))return!0;var i=o(e);return!!i&&y(i)}function E(e){if(!e||!e.parentElement||r())return document.documentElement;for(var o=e.parentElement;o&&'none'===t(o,'transform');)o=o.parentElement;return o||document.documentElement}function v(e,t,r,p){var s=4<arguments.length&&void 0!==arguments[4]&&arguments[4],d={top:0,left:0},l=s?E(e):a(e,i(t));if('viewport'===p)d=w(l,s);else{var f;'scrollParent'===p?(f=n(o(t)),'BODY'===f.nodeName&&(f=e.ownerDocument.documentElement)):'window'===p?f=e.ownerDocument.documentElement:f=p;var m=b(f,l,s);if('HTML'===f.nodeName&&!y(l)){var h=c(e.ownerDocument),g=h.height,u=h.width;d.top+=m.top-m.marginTop,d.bottom=g+m.top,d.left+=m.left-m.marginLeft,d.right=u+m.left}else d=m}r=r||0;var v='number'==typeof r;return d.left+=v?r:r.left||0,d.top+=v?r:r.top||0,d.right-=v?r:r.right||0,d.bottom-=v?r:r.bottom||0,d}function x(e){var t=e.width,o=e.height;return t*o}function O(e,t,o,n,i){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf('auto'))return e;var p=v(o,n,r,i),s={top:{width:p.width,height:t.top-p.top},right:{width:p.right-t.right,height:p.height},bottom:{width:p.width,height:p.bottom-t.bottom},left:{width:t.left-p.left,height:p.height}},d=Object.keys(s).map(function(e){return le({key:e},s[e],{area:x(s[e])})}).sort(function(e,t){return t.area-e.area}),a=d.filter(function(e){var t=e.width,n=e.height;return t>=o.clientWidth&&n>=o.clientHeight}),l=0<a.length?a[0].key:d[0].key,f=e.split('-')[1];return l+(f?'-'+f:'')}function L(e,t,o){var n=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null,r=n?E(t):a(t,i(o));return b(o,r,n)}function S(e){var t=e.ownerDocument.defaultView,o=t.getComputedStyle(e),n=parseFloat(o.marginTop||0)+parseFloat(o.marginBottom||0),i=parseFloat(o.marginLeft||0)+parseFloat(o.marginRight||0),r={width:e.offsetWidth+i,height:e.offsetHeight+n};return r}function T(e){var t={left:'right',right:'left',bottom:'top',top:'bottom'};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function C(e,t,o){o=o.split('-')[0];var n=S(e),i={width:n.width,height:n.height},r=-1!==['right','left'].indexOf(o),p=r?'top':'left',s=r?'left':'top',d=r?'height':'width',a=r?'width':'height';return i[p]=t[p]+t[d]/2-n[d]/2,i[s]=o===s?t[s]-n[a]:t[T(s)],i}function D(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function N(e,t,o){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===o});var n=D(e,function(e){return e[t]===o});return e.indexOf(n)}function P(t,o,n){var i=void 0===n?t:t.slice(0,N(t,'name',n));return i.forEach(function(t){t['function']&&console.warn('`modifier.function` is deprecated, use `modifier.fn`!');var n=t['function']||t.fn;t.enabled&&e(n)&&(o.offsets.popper=g(o.offsets.popper),o.offsets.reference=g(o.offsets.reference),o=n(o,t))}),o}function k(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=L(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=O(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=C(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?'fixed':'absolute',e=P(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function W(e,t){return e.some(function(e){var o=e.name,n=e.enabled;return n&&o===t})}function B(e){for(var t=[!1,'ms','Webkit','Moz','O'],o=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<t.length;n++){var i=t[n],r=i?''+i+o:e;if('undefined'!=typeof document.body.style[r])return r}return null}function H(){return this.state.isDestroyed=!0,W(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.position='',this.popper.style.top='',this.popper.style.left='',this.popper.style.right='',this.popper.style.bottom='',this.popper.style.willChange='',this.popper.style[B('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function A(e){var t=e.ownerDocument;return t?t.defaultView:window}function M(e,t,o,i){var r='BODY'===e.nodeName,p=r?e.ownerDocument.defaultView:e;p.addEventListener(t,o,{passive:!0}),r||M(n(p.parentNode),t,o,i),i.push(p)}function F(e,t,o,i){o.updateBound=i,A(e).addEventListener('resize',o.updateBound,{passive:!0});var r=n(e);return M(r,'scroll',o.updateBound,o.scrollParents),o.scrollElement=r,o.eventsEnabled=!0,o}function I(){this.state.eventsEnabled||(this.state=F(this.reference,this.options,this.state,this.scheduleUpdate))}function R(e,t){return A(e).removeEventListener('resize',t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener('scroll',t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}function U(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=R(this.reference,this.state))}function Y(e){return''!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function V(e,t){Object.keys(t).forEach(function(o){var n='';-1!==['width','height','top','right','bottom','left'].indexOf(o)&&Y(t[o])&&(n='px'),e.style[o]=t[o]+n})}function j(e,t){Object.keys(t).forEach(function(o){var n=t[o];!1===n?e.removeAttribute(o):e.setAttribute(o,t[o])})}function q(e,t){var o=e.offsets,n=o.popper,i=o.reference,r=$,p=function(e){return e},s=r(i.width),d=r(n.width),a=-1!==['left','right'].indexOf(e.placement),l=-1!==e.placement.indexOf('-'),f=t?a||l||s%2==d%2?r:Z:p,m=t?r:p;return{left:f(1==s%2&&1==d%2&&!l&&t?n.left-1:n.left),top:m(n.top),bottom:m(n.bottom),right:f(n.right)}}function K(e,t,o){var n=D(e,function(e){var o=e.name;return o===t}),i=!!n&&e.some(function(e){return e.name===o&&e.enabled&&e.order<n.order});if(!i){var r='`'+t+'`';console.warn('`'+o+'`'+' modifier is required by '+r+' modifier in order to work, be sure to include it before '+r+'!')}return i}function z(e){return'end'===e?'start':'start'===e?'end':e}function G(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=he.indexOf(e),n=he.slice(o+1).concat(he.slice(0,o));return t?n.reverse():n}function _(e,t,o,n){var i=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+i[1],p=i[2];if(!r)return e;if(0===p.indexOf('%')){var s;switch(p){case'%p':s=o;break;case'%':case'%r':default:s=n;}var d=g(s);return d[t]/100*r}if('vh'===p||'vw'===p){var a;return a='vh'===p?ee(document.documentElement.clientHeight,window.innerHeight||0):ee(document.documentElement.clientWidth,window.innerWidth||0),a/100*r}return r}function X(e,t,o,n){var i=[0,0],r=-1!==['right','left'].indexOf(n),p=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=p.indexOf(D(p,function(e){return-1!==e.search(/,|\s/)}));p[s]&&-1===p[s].indexOf(',')&&console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');var d=/\s*,\s*|\s+/,a=-1===s?[p]:[p.slice(0,s).concat([p[s].split(d)[0]]),[p[s].split(d)[1]].concat(p.slice(s+1))];return a=a.map(function(e,n){var i=(1===n?!r:r)?'height':'width',p=!1;return e.reduce(function(e,t){return''===e[e.length-1]&&-1!==['+','-'].indexOf(t)?(e[e.length-1]=t,p=!0,e):p?(e[e.length-1]+=t,p=!1,e):e.concat(t)},[]).map(function(e){return _(e,i,t,o)})}),a.forEach(function(e,t){e.forEach(function(o,n){Y(o)&&(i[t]+=o*('-'===e[n-1]?-1:1))})}),i}function J(e,t){var o,n=t.offset,i=e.placement,r=e.offsets,p=r.popper,s=r.reference,d=i.split('-')[0];return o=Y(+n)?[+n,0]:X(n,p,s,d),'left'===d?(p.top+=o[0],p.left-=o[1]):'right'===d?(p.top+=o[0],p.left+=o[1]):'top'===d?(p.left+=o[0],p.top-=o[1]):'bottom'===d&&(p.left+=o[0],p.top+=o[1]),e.popper=p,e}var Q=Math.min,Z=Math.floor,$=Math.round,ee=Math.max,te='undefined'!=typeof window&&'undefined'!=typeof document&&'undefined'!=typeof navigator,oe=function(){for(var e=['Edge','Trident','Firefox'],t=0;t<e.length;t+=1)if(te&&0<=navigator.userAgent.indexOf(e[t]))return 1;return 0}(),ne=te&&window.Promise,ie=ne?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},oe))}},re=te&&!!(window.MSInputMethodContext&&document.documentMode),pe=te&&/MSIE 10/.test(navigator.userAgent),se=function(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')},de=function(){function e(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,'value'in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),ae=function(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},le=Object.assign||function(e){for(var t,o=1;o<arguments.length;o++)for(var n in t=arguments[o],t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},fe=te&&/Firefox/i.test(navigator.userAgent),me=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'],he=me.slice(3),ce={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'},ge=function(){function t(o,n){var i=this,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};se(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(i.update)},this.update=ie(this.update.bind(this)),this.options=le({},t.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=o&&o.jquery?o[0]:o,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(le({},t.Defaults.modifiers,r.modifiers)).forEach(function(e){i.options.modifiers[e]=le({},t.Defaults.modifiers[e]||{},r.modifiers?r.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return le({name:e},i.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(t){t.enabled&&e(t.onLoad)&&t.onLoad(i.reference,i.popper,i.options,t,i.state)}),this.update();var p=this.options.eventsEnabled;p&&this.enableEventListeners(),this.state.eventsEnabled=p}return de(t,[{key:'update',value:function(){return k.call(this)}},{key:'destroy',value:function(){return H.call(this)}},{key:'enableEventListeners',value:function(){return I.call(this)}},{key:'disableEventListeners',value:function(){return U.call(this)}}]),t}();return ge.Utils=('undefined'==typeof window?global:window).PopperUtils,ge.placements=me,ge.Defaults={placement:'bottom',positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,o=t.split('-')[0],n=t.split('-')[1];if(n){var i=e.offsets,r=i.reference,p=i.popper,s=-1!==['bottom','top'].indexOf(o),d=s?'left':'top',a=s?'width':'height',l={start:ae({},d,r[d]),end:ae({},d,r[d]+r[a]-p[a])};e.offsets.popper=le({},p,l[n])}return e}},offset:{order:200,enabled:!0,fn:J,offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var o=t.boundariesElement||p(e.instance.popper);e.instance.reference===o&&(o=p(o));var n=B('transform'),i=e.instance.popper.style,r=i.top,s=i.left,d=i[n];i.top='',i.left='',i[n]='';var a=v(e.instance.popper,e.instance.reference,t.padding,o,e.positionFixed);i.top=r,i.left=s,i[n]=d,t.boundaries=a;var l=t.priority,f=e.offsets.popper,m={primary:function(e){var o=f[e];return f[e]<a[e]&&!t.escapeWithReference&&(o=ee(f[e],a[e])),ae({},e,o)},secondary:function(e){var o='right'===e?'left':'top',n=f[o];return f[e]>a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),ae({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=le({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]<r(n[d])&&(e.offsets.popper[d]=r(n[d])-o[a]),o[d]>r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-u<s[m]&&(e.offsets.popper[m]-=s[m]-(d[c]-u)),d[m]+u>s[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},ae(n,m,$(v)),ae(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ce.FLIP:p=[n,i];break;case ce.CLOCKWISE:p=G(n);break;case ce.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)<f(l.right)||'top'===n&&f(a.bottom)>f(l.top)||'bottom'===n&&f(a.top)<f(l.bottom),h=f(a.left)<f(o.left),c=f(a.right)>f(o.right),g=f(a.top)<f(o.top),u=f(a.bottom)>f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=le({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottom<o.top||t.left>o.right||t.top>o.bottom||t.right<o.left){if(!0===e.hide)return e;e.hide=!0,e.attributes['x-out-of-boundaries']=''}else{if(!1===e.hide)return e;e.hide=!1,e.attributes['x-out-of-boundaries']=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var o=t.x,n=t.y,i=e.offsets.popper,r=D(e.instance.modifiers,function(e){return'applyStyle'===e.name}).gpuAcceleration;void 0!==r&&console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');var s,d,a=void 0===r?t.gpuAcceleration:r,l=p(e.instance.popper),f=u(l),m={position:i.position},h=q(e,2>window.devicePixelRatio||!fe),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=le({},E,e.attributes),e.styles=le({},m,e.styles),e.arrowStyles=le({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ge});
//# sourceMappingURL=popper.min.js.map